分享

DSP2812 SCI FIFO模式调试心得

 梦竹轩 2012-08-21

1、SCI通信格式中数据位数1~8与FIFO深度1~16

SCI通信格式中的数据位数是指采用SCI传输数据时一帧数据的位数,一帧传输1~8位,则两帧传输2~16位;FIFO深度是指有多少数据存入到FIFO中时会产生中断请求事件,FIFO的深度设定时当然要大于所定义的数据格式的位数,数据位数一定的情况下,深度越大所发生的中断请求频率越低。

2、实际测试

当波特率设定为19200时,以串口调试软件“xfcom21.exe”测试数据位分别为1~8,深度分别为1~16。

串口调试软件截图

结果为:

数据位<7位时,无论FIFO深度为多少,传输均错误,数据位为7或8位时,FIFO深度在大于数据位的情况下,传输均正确;且当数据位=深度时,传输的数据在自行设定的buffer数组中各位始终保持不变,稳定传输,当数据位小于8位时,buffer数组中各位轮流变换传输,且变换与FIFO深度与数据位数有关系。

说明对于FIFO堆栈深度的设定只影响中断产生事件的频率,SCI串口传输时设定数据位数为7或8位传输较为稳定。

3、测试所用程序

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=0xC2;                //波特率为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

}

DSP28_DefaultIsr.c文件下相应中断函数处:

interrupt void SCIRXINTA_ISR(void)     // SCI-A接收中断函数
{
    int i;

    for(i=0;i<8;i++)
    {
     buffer[i] = SciaRegs.SCIRXBUF.all; //接收数据 
 } 
 
// if(strncmp(buffer,"hellodsp",8)==0)
// {
       SciaRegs.SCIFFTX.bit.TXINTCLR=1; //清除发送中断标志位,使其响应新的中断
// }
   
    SciaRegs.SCIFFRX.bit.RXFIFORESET=0;
    SciaRegs.SCIFFRX.bit.RXFIFORESET=1;
 SciaRegs.SCIFFRX.bit.RXFFINTCLR=1;
    PieCtrl.PIEACK.all=0x0100;  //使得同组其他中断能够得到响应
    EINT;  //开全局中断vcc

}

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

 for(i=0;i<8;i++)
 {
     SciaRegs.SCITXBUF=buffer[i]; //发送数据
 }

    PieCtrl.PIEACK.all=0x0100;  //使得同组其他中断能够得到响应
    EINT;  //开全局中断

}

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多