This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

F28335 串口通讯丢失数据



F28335的配置代码如下

void SCIControlInit()
{
    SciaRegs.SCICCR.all = 0x0007; //1个停止位、无奇偶校验、无Loop模式、空闲线模式、8位数据
    ScibRegs.SCICCR.all = 0x0007; //1个停止位、无奇偶校验、无Loop模式、空闲线模式、8位数据
    ScicRegs.SCICCR.all = 0x0007; //1个停止位、无奇偶校验、无Loop模式、空闲线模式、8位数据

    SciaRegs.SCICTL1.all = 0x0003; //接收中断错误禁用、发送器唤醒禁用、休眠禁用、发送器使能、接收器使能
    ScibRegs.SCICTL1.all = 0x0003; //接收中断错误禁用、发送器唤醒禁用、休眠禁用、发送器使能、接收器使能
    ScicRegs.SCICTL1.all = 0x0003; //接收中断错误禁用、发送器唤醒禁用、休眠禁用、发送器使能、接收器使能

    SciaRegs.SCIHBAUD = 0x0028; //SCIA:115200波特率,实际11433波特率
    SciaRegs.SCILBAUD = 0x0000;

    ScibRegs.SCIHBAUD = 0x0001; //SCIB:9600波特率
    ScibRegs.SCILBAUD = 0x00E7;

    ScicRegs.SCIHBAUD = 0x0001; //SCIC:9600波特率
    ScicRegs.SCILBAUD = 0x00E7;

    SciaRegs.SCICTL1.bit.SWRESET = 1;   //复位
    ScibRegs.SCICTL1.bit.SWRESET = 1;   //复位
    ScicRegs.SCICTL1.bit.SWRESET = 1;   //复位

    SciaRegs.SCIPRI.bit.SOFT = 1;
    SciaRegs.SCIPRI.bit.FREE = 1;
    ScibRegs.SCIPRI.bit.SOFT = 1;
    ScibRegs.SCIPRI.bit.FREE = 1;
    ScicRegs.SCIPRI.bit.SOFT = 1;
    ScicRegs.SCIPRI.bit.FREE = 1;
    //SciXRegs.SCIRXST.all = 0x0000;    //接收状态标志位

}

在使用Scib与PC机进行串口调试时,用的代码如下:

ScibSendEnable();   //发送使能
        for(j=0;j<7;j++)
        {
           while (ScibRegs.SCICTL2.bit.TXRDY != 1) { }//等待发送缓存清空
           ScibRegs.SCITXBUF = BBitReadTX[j]; //BBitReadTX 为unsigned char 类型字符数组
        }

        ScibReceiveEnable();   //接收使能

如果单步调试,PC机能收到正确的数据。但连续执行时,PC总是只收到5个Byte的数据(理应是7个)。

这是什么原因呢?是不是相SCITXBUF中写数据时,应该加延时哇?

这个程序无需用到FIFO。

  • 换了2个串口调试助手都是一样的,怀疑是28335这边的问题。
  • 解决了。SCI写入发送BUF之后,不能立即改成接收,要等移位寄存器真正发送完毕后才能改成接收,否则会丢失数据。
    加了行代码就解决了。

            ScibSendEnable();   //发送使能
            for(j=0;j<7;j++)
            {
               while (ScibRegs.SCICTL2.bit.TXRDY != 1) { }//等待发送缓存清空
               ScibRegs.SCITXBUF = (Uint16)BBitReadTX[j]; //BBitReadTX 为unsigned char 类型字符数组
            }
            while(ScibRegs.SCICTL2.bit.TXEMPTY==0); //必须全部发送后才能接收,否则会出现错误。 //加了这行代码
            ScibReceiveEnable();   //接收使能

    话说,国内有本翻译TI官方数据手册的书,把TXEMPTY=0或1的含义给搞反了。

    本来写的是TXEMPTY==1,但是感觉很奇怪,从字面上意思不对,后来查TI官方数据手册发现是弄反了。

  • 额,非常感谢你的反馈!