tigeroser 发表于 2015-7-7 19:56:24

DSP SCI串口中断总结

调了两天程序,终于在串口外打通了。我竟然没注意到这两个问题:

1,接收中断
   如果想要循环进接收中断,那么每次进入接收中断都要对RXBUF进行读操作。//这个大家应该都知道的

2,发送中断
    如果想利用发送中断,仅通过串口TXBUF发送一个是进不了中断的,还要ScicRegs.SCIFFTX.bit.TXFFINTCLR=1;把中断标志位清0才能进中断。
   或者直接ScicRegs.SCIFFTX.bit.TXFFINTCLR=1;把发送中断位清0,也能促使 进入 发送中断

虽然感觉这么不可信,但这是调试结果。

有感兴趣的话,可以上程序讨论一下。。。

steaven2000 发表于 2015-7-7 20:53:56

1、每次接收完一个数据产生中断,不把数据从RXBUF读出来那你进接收中断干嘛?好玩么?
2、表示不开FIFO的话从来不需要对TXFFINTCLR清零。

tigeroser 发表于 2015-7-8 20:06:41

steaven2000 发表于 2015-7-7 20:53
1、每次接收完一个数据产生中断,不把数据从RXBUF读出来那你进接收中断干嘛?好玩么?
2、表示不开FIFO的话 ...

1,对,你说的对,接收中断不对RXBUF操作,是没意义的
2,我开了FIFO但是不知怎么取里面的数据 ,还是把RXBUF中的数据一个一个的接收进来的,
程序主要功能:接收一串数据,然后进 “发送中断函数” 中再把它发送出去      程序如下(用的是5.5)



//以下是中断函数
interrupt void SCIRXINTC_ISR(void)   // SCI-C
{
      DINT;
                int i;
                //从RXBUF中一个一个接收接收
                for(i=0;i<8;i++){
                        buffer=ScicRegs.SCIRXBUF.all;
                }
            /////////////////TXFFINTCLR=1,就是用这句话,等接收中断程序执行完后立即触发发送中断
       
                        ScicRegs.SCIFFTX.bit.TXFFINTCLR=1;

                //复位
                ScicRegs.SCIFFRX.bit.RXFIFORESET=0;
                ScicRegs.SCIFFRX.bit.RXFIFORESET=1;

                //接收中断标志位清0,以便下次还能进入接收中断
                ScicRegs.SCIFFRX.bit.RXFFINTCLR=1;
               
                PieCtrlRegs.PIEACK.all=PIEACK_GROUP8;
        EINT;
}

以下是初始化函数

#include "DSP2833x_Device.h"   // DSP2833x Headerfile Include File
#include "DSP2833x_Examples.h"   // DSP2833x Examples Include File
#include "string.h"

void scic_echoback_init(void);
void scic_fifo_init(void);


// FIFO BUFFER
char buffer ;
// Global counts used in this example
Uint16 LoopCount;
Uint16 ErrorCount;

void main(void)
{

    Uint16 ReceivedChar;
    char *msg;
    Uint16 i, j,k;
   InitSysCtrl();
   InitSciGpio();
   InitXintf16Gpio();

   DINT;//禁止全局中断
   InitPieCtrl();
   IER = 0x0000;
   IFR = 0x0000;
   InitPieVectTable();
   

        PieCtrlRegs.PIECTRL.bit.ENPIE = 1;          // Enable the PIE block
        PieCtrlRegs.PIEIER8.bit.INTx6=1;            //EnableSCI-C TX
      PieCtrlRegs.PIEIER8.bit.INTx5=1;            //Enable SCI-RRX
           IER |= M_INT8;                                    //Enable the cpu interrupt
    EINT;//使能全局中断
    ERTM;//开全局实时中断

    LoopCount = 0;
    ErrorCount = 0;


    scic_echoback_init();// Initalize SCI for echoback


   for(k=0;k<8;k++){
            buffer=0;
    }

   while(1);

}



void scic_echoback_init()
{


        ScicRegs.SCICCR.all =0x0007;   // 1 stop bit,No loopback
                                 // No parity,8 char bits,
                                 // async mode, idle-line protocol
        ScicRegs.SCICTL1.bit.RXENA=1;// enable TX, RX, internal SCICLK,// Disable RX ERR, SLEEP, TXWAKE
        ScicRegs.SCICTL1.bit.TXENA=1;
      
      //在这开了FIFO中断
        ScicRegs.SCICTL2.bit.TXINTENA = 1;
        ScicRegs.SCICTL2.bit.RXBKINTENA =1;


        #if (CPU_FRQ_150MHZ)
              ScicRegs.SCIHBAUD    =0x0001;// 9600 baud @LSPCLK = 37.5MHz.
              ScicRegs.SCILBAUD    =0x00E7;
        #endif
        #if (CPU_FRQ_100MHZ)
      ScicRegs.SCIHBAUD    =0x0001;// 9600 baud @LSPCLK = 20MHz.
      ScicRegs.SCILBAUD    =0x0044;
        #endif

/******SCI FIFO Initialize******/

    ScicRegs.SCIFFTX.bit.TXFIFOXRESET=1;
    ScicRegs.SCIFFTX.bit.SCIFFENA=1;
    ScicRegs.SCIFFTX.bit.TXFFST=0;
    ScicRegs.SCIFFTX.bit.TXFFINT=0;//////////
    ScicRegs.SCIFFTX.bit.TXFFINTCLR=1;
    ScicRegs.SCIFFTX.bit.TXFFIENA=1;
    ScicRegs.SCIFFTX.bit.TXFFIL=0;

    ScicRegs.SCIFFRX.bit.RXFFOVF=0;
    ScicRegs.SCIFFRX.bit.RXFFOVRCLR=1;
    ScicRegs.SCIFFRX.bit.RXFIFORESET=1;
    ScicRegs.SCIFFRX.bit.RXFFST=0;
    ScicRegs.SCIFFRX.bit.RXFFINT=0;
    ScicRegs.SCIFFRX.bit.RXFFINTCLR=1;
    ScicRegs.SCIFFRX.bit.RXFFIENA=1;
    ScicRegs.SCIFFRX.bit.RXFFIL=8;

    ScicRegs.SCICTL1.bit.SWRESET=1;// Relinquish SCI from Reset
   
}

//===========================================================================
// No more.
//===========================================================================


从书上看,我的理解是:开FIFO后,接收BUF不起作用了,数据直接进入了FIFO的16级缓冲器中的,当中断来时,可心直接从FIFO的缓冲器中读出来
调试了一天也没弄出来,最后还是用一般的方法接收一串数据,并且这个BUF明显也起作用了

特来请教一下,非常感谢。


596142041 发表于 2015-7-11 23:49:51

发送的FIFO未用过接收的FIFO使用还不错的,但是他的中断标志位有点奇怪。。
页: [1]
查看完整版本: DSP SCI串口中断总结