关于DSP2812的FIFO问题

2019-07-31 19:07发布

我用hellodsp进行试验,发现有几个问题没搞懂?我用的是hellodsp的例程,程序的目的是用串口调试助手发送"hellodsp给dsp,然后在由dsp发回给串口调试助手"如下:
interrupt void SCIRXINTA_ISR(void)     // SCI-A接收中断函数
{
    int i;
     for(i=0;i<8;i++)
    {
            buffer = SciaRegs.SCIRXBUF.all; //接收数据        
  }        
    if(strcmp(buffer,"hellodsp")==0)
        {
       SciaRegs.SCIFFTX.bit.TXINTCLR=1; //清除发送中断标志位,使其响应新的中断
        }
    SciaRegs.SCIFFRX.bit.RXFIFORESET=0;//接收FIFO的指针复位为0
    SciaRegs.SCIFFRX.bit.RXFIFORESET=1;//通过将RXFIFORESET置位来重新启动FIFO队列的接收操作
        SciaRegs.SCIFFRX.bit.RXFFINTCLR=1;//清除接收中断标志位(FIFO需要手动清除)
    PieCtrl.PIEACK.all=0x0100;  //使得同组其他中断能够得到响应
    EINT;  //开全局中断vcc
   
}

/****************************************************************************
*
*名    称:SCITXINTA_ISR()
*
*功    能:发送中断函数
*
*入口参数:无
*
*出口参数:无
*
****************************************************************************/

interrupt void SCITXINTA_ISR(void)     // SCI-A发送中断函数
{
    int i;

        for(i=0;i<8;i++)
        {
            SciaRegs.SCITXBUF=buffer; //发送数据
        }
//        SciaRegs.SCIFFTX.bit.TXINTCLR=1; //清除发送中断标志位,使其响应新的中断
    PieCtrl.PIEACK.all=0x0100;  //使得同组其他中断能够得到响应
    EINT;  //开全局中断

}
SCI初始化为void InitSci(void)
{
        SciaRegs.SCICCR.bit.STOPBITS=0;        //1位停止位
        SciaRegs.SCICCR.bit.PARITYENA=0;       //禁止极性功能
        SciaRegs.SCICCR.bit.LOOPBKENA=0;       //禁止回送测试模式功能
        SciaRegs.SCICCR.bit.ADDRIDLE_MODE=0;   //空闲线模式
        SciaRegs.SCICCR.bit.SCICHAR=7;         //8位数据位
        
        SciaRegs.SCICTL1.bit.TXENA=1;          //SCIA模块的发送使能
        SciaRegs.SCICTL1.bit.RXENA=1;          //SCIA模块的接收使能
        
        SciaRegs.SCIHBAUD=0;
        SciaRegs.SCILBAUD=0xF3;                //波特率为19200        

        SciaRegs.SCIFFTX.bit.TXFIFOXRESET=1; //重新使能发送FIFO的操作
        SciaRegs.SCIFFTX.bit.SCIFFENA=1;     //使能SCI FIFO的功能
        SciaRegs.SCIFFTX.bit.TXFFST=0;       //发送FIFO队列为空
        SciaRegs.SCIFFTX.bit.TXFFINT=0;      //没有产生发送FIFO中断
        SciaRegs.SCIFFTX.bit.TXINTCLR=0;     //没有清除TXFFINT的标志位
        SciaRegs.SCIFFTX.bit.TXFFIENA=1;     //使能发送FIFO中断
        SciaRegs.SCIFFTX.bit.TXFFILIL=0;     //发送中断级别为0,也就是当发送FIFO为空时发生中断

        SciaRegs.SCIFFRX.bit.RXFFOVF=0;      //接收FIFO没有溢出
        SciaRegs.SCIFFRX.bit.RXOVF_CLR=1;    //对RXFFOVF标志位没有影响
        SciaRegs.SCIFFRX.bit.RXFIFORESET=1;  //重新使能接收FIFO的操作
        SciaRegs.SCIFFRX.bit.RXFIFST=0;      //接收FIFO队列为空
        SciaRegs.SCIFFRX.bit.RXFFINT=0;      //没有产生接收中断
        SciaRegs.SCIFFRX.bit.RXFFINTCLR=1;   //清除接收中断标志位
        SciaRegs.SCIFFRX.bit.RXFFIENA=1;     //使能FIFO接收中断
        SciaRegs.SCIFFRX.bit.RXFFIL=8;       //FIFO接收中断级别为8.也就是说当接收FIFO中有8个字符时发生中断

        SciaRegs.SCICTL1.bit.SWRESET=1;        //重启SCI

}
有以下疑问:(1)
为什么在接收中断中清除发送中断位, if(strcmp(buffer,"hellodsp")==0)
        {
       SciaRegs.SCIFFTX.bit.TXINTCLR=1; //清除发送中断标志位,使其响应新的中断
        }
难道是清除发送中断位就可以相应发送中断吗?为什么不把这句话SciaRegs.SCIFFTX.bit.TXINTCLR=1; 放在发送中断函数中呢?每次进入接收中断应该是清除中断标志位的啊,这里在发送中断中却没有将FIFO发送中断标志位TXINTCLR清零。那岂不是程序会一直不断的进入发送中断函数?但事实上,如果我将SciaRegs.SCIFFTX.bit.TXINTCLR=1; 放在发送中断函数中,我只运行数据,并没有用串口给DSP发数据,会发现串口调试助手不断的接到00(因为buffer初始化为0),请问这是怎么回事?
(2)进入发送中断的条件是什么?是FIFO中剩余的 字符数和预设的发送中断级位TXFFIL相等时,导致标志位TXFFINT被置位,从而进入发送中断?那如果再发送中断中没有将发送中断标志位TXINTCLR清零,会是什么情况呢?
0条回答

一周热门 更多>