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.

请教SCI的FIFO接收问题

1、手册上说“With the FIFO enabled, TXSHF is directly loaded after an optional delay value (SCIFFCT), TXBUF is not used.”意思是使能发送FIFO之后,TXSHF直接装载数据而不使用TXBUF,是说从FIFO直接装载吗?这样的话TXBUF这个寄存器就用不到了,但是我看TI的例程里仍然把要发送的数据先放到SCITXBUF这个寄存器里,而FIFO里并没有一个专门用来装载要发送数据的地方,这是为什么?接收FIFO也有同样的问题,还是都要从SCIRXBUF中读取。

2、我自己写了一个用FIFO接收的程序,用串口调试助手给SCI重复发送同一个数比如12,当RXFIFO中的值大于6时开始读FIFO的值,也就是想一次性读6次的值,但是从初始化完成到RXFFST中的值大于等于6,观察SCIRXBUF的值全部是0XFF,根本没有变过,请问这里我要读FIFO的数据应该怎么读,SCIRXBUF中的值一直是0XFF有可能是什么原因造成的?代码如下
   初始化程序:
   //Resume FIFO, enable FIFO, enable TXFIFO, 0 TXFIFO level
    ScibRegs.SCIFFTX.all=0xE040;
    //Enable RXFIFO, 0 TXFIFO level, 15 RXFIFO level
    ScibRegs.SCIFFRX.all=0x004F;
    //No auto-baud, 0 FIFO transfer delay
    ScibRegs.SCIFFCT.all=0x0;
    // one stop bit, No parity, No loopback, 8 char bits, idle-line protocol
    ScibRegs.SCICCR.all = 0x0007;
    // Disable RX ERR, TXWAK, SLEEP, Eenable TX, RX
    ScibRegs.SCICTL1.all = 0x0003;
    // 9600 baud @LSPCLK = 37.5MHz.
    ScibRegs.SCIHBAUD = 0x0001;
    ScibRegs.SCILBAUD = 0x00E7;
    // Relinquish SCI from Reset
    ScibRegs.SCICTL1.all =0x0023;
    //Re-enable TX and RX FIFO
    ScibRegs.SCIFFTX.bit.TXFIFOXRESET = 1;
    ScibRegs.SCIFFRX.bit.RXFIFORESET = 1;
主查询程序如下:
        if(ScibRegs.SCIFFRX.bit.RXFFST >= 6)
        {
                for(i = 0; i < 6; i++)
                {
                        u16RXBuff[i] = ScibRegs.SCIRXBUF.all;
                }
        }

  • 我在进入主程序后在for语句处设置断点能够进入,说明RXFIFO确实已经接收到6个数据了,但是从SCIRXBUF中读出的6次数据全部是0XFF也就是255,我觉得是不是RXFIFO没有使能所以接收到的数据并没有写入FIFO中?但是RXFFST的数据确实能够变化,比如我用串口调试助手点一次发送RXFFST就增加1,除非我发送的数据确实是255?那如何判定我发送的数据对不对呢?

  • 你用芯片上的SCIA给SCIB发送数据看接收正常吗。

  • 我找到原因了,是因为所用的485收发芯片需要另外对发送和接收使能进行分别控制,控制了之后就能够接收了。

    但是又发现偶尔会接收到错误的信息,比如应该接收4个数分别是12、34、56、78,结果可能接收到了0X8015这样很大数,或者可能4个数的接收顺序有错乱。对于像0x8015这样的数,最高位是1,按照SCIRXBUF的位定义是发生了帧错误。

    请问对于以上两种情况应该如何解决?

  • 现在我的SCI采用FIFO接收的模式,设置当FIFO中接收到的数据即RXFFST位大于等于3时进入读取数据,因为发送方发送过来的数据也是3个,所以RXFFST设置了3个,而且发送方是每1s发一次这3个数据,也采用FIFO发送。我用带着仿真器软仿真的方法看SCI接收的数据,在程序中设置断点,刚开始能够正常进入接收程序,而且接收到的数据也是对的,但是过了几次之后就不能进入接收程序了,在接收程序入口处设置断点,观察每次RXFFST都等于0,也就是相当于没有接收到数据,但是连接在同一总线上的串口调试助手却能够正常接收。

    请问这个问题可能是什么原因导致的?和我总是设置断点让程序停止有关系吗?有没有什么好的解决方法或者测试问题出在哪的方法?

    if(ScibRegs.SCIFFRX.bit.RXFFST >= 3)
    {
          for(i = 0; i < 3; i++)
         {
               u16RXBuff[i] = ScibRegs.SCIRXBUF.bit.RXDT;
         } 
        u16SlaveMCW = u16RXBuff[0] + (u16RXBuff[1] << 8); //Master MCW
        u16485TxCount = u16RXBuff[2]; //Slave number
    }
    ScibRegs.SCIFFRX.bit.RXFIFORESET = 0;
    ScibRegs.SCIFFRX.bit.RXFIFORESET = 1;

  • 你将断点设置在“if(ScibRegs.SCIFFRX.bit.RXFFST >= 3)”的下一行,看能不能进入中断。不要设置在当前行。