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.

TMS320F28035: 28035 的 SCI FIFO接收中断是否有BUG?

Part Number: TMS320F28035

设置FIFO接收深度为4级, 发送深度0级;

用串口调试助手发送数据 01 03 00 00 00 02 C4 0B 共8个bytes, 示波器波形如下图

上图中,第一个为串口调试助手发送数据, 第二个波形为DSP回复数据.

注意看第一个波形持续时间为4.52ms, 波特率为19200, 可以计算1/19200*11*8=4.583ms,这与示波器波形相符,说明发送数据正确;如果是12个字节的话1/19200*11*12 = 6.875ms,这两个时间差示波器能轻易区分.

再看CCS监测数据

reDtat为接收数据,完全正确

但是 reciveCounter 为进接收中断次数,串口助手发送8个字节按理应该进中断为 8 / 4 = 2次, 监测数据为进了3次;re_data_counter = 12, 12 = 4 * 3, 接收了12个数据, 每进一次中断都读取了FIFO有几个数据再读取;如下面这段代码

Fullscreen
1
2
3
4
5
6
7
dataNum = mo->SCIFFRX.bit.RXFFIL;
for (i = 0; i < dataNum; i++)
{
· · md->reDtat[md->re_data_counter] = mo->SCIRXBUF.all;
· · md->re_data_counter++;
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

很明显串口调试助手只发送了8个数据,按理FIFO尝试为4级的情况下只需进2次中断读8个字节;而实际28035却进了3次中断,读取了12个字节。并且示波器监测发送数据完全正确,28035读取数据也完全正确。但是进的中断次数却错了。

因此,在串口助手发送前我把reDtat[9]~reDtat[11]的数值手动改成其他数据,再用串口助手发送同样的数据,果然reDtat[9]~reDtat[11] 全部变为0。也就是说SCI在接收完毕后,在没有数据的情况下多进了一次中断,多接收了4个数据,且数据全为0.

目前, 我没有找到原因, 请各位大侠帮忙,如果需要我可以奉上代码.

  • 你好,内容比较多,我整理了一下,大概意思是说:

    F28035的SCI启用FIFO的情况下接收8个字节的消息进入了3次中断,而且最后一次中断接收的是全为00的4个数据。是这样吗?

    上面概述没问题的话可能还是要给出一下SCI & FIFO的配置代码查看一下。

  • LZ,我遇到了同样的问题。FIFO发送中断可以正常工作,接收中断总是无法接收到正常的数据

    初始化接收FIFO深度8

    Fullscreen
    1
    2
    3
    4
    5
    6
    /**SCIFFRX: FIFO receive register
    * bit0-4.RXFFIL:8,RX FIFO,8 Byte,Modbus8
    * bit5.RXFFIENA:1,RX FIFO
    * bit13.RXFIFORESET:0,RX FIFO
    */
    sciRegs->SCIFFRX.all = 0x0028;
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    接收中断:

    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    __interrupt void SCIbRxISR(void)
    {
    SCIRxISR_Call(1);
    ScibRegs.SCIFFRX.bit.RXFFOVRCLR = 1;
    ScibRegs.SCIFFRX.bit.RXFFINTCLR = 1;
    PieCtrlRegs.PIEACK.all = PIEACK_GROUP9;
    }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    /**
    * @brief FIFO,
    *
    * @param sciNo: SCI,0:SCI-A;!=0:SCI-B
    */
    void SCIRxISR_Call(Uint16 sciNo)
    {
    if (sciNo > 1) return;
    volatile struct SCI_REGS *sciRegs;
    /** sciNo使*/
    sciRegs = sciNo ? &ScibRegs : &SciaRegs;
    Uint16 i = 0;
    Uint16 rxRemained = sciRegs->SCIFFRX.bit.RXFFST;
    //RX8
    while(rxRemained-- > 0)
    {
    SCI_RX_Buffer[sciNo][SCI_RX_Length[sciNo]++] = sciRegs->SCIRXBUF.all & 0xFF;
    }
    //,
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    定时器1ms调用的函数:

    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    /**
    * @brief (1ms),
    * ,Modbus3.5
    * Ttimeout = 3.5*11/
    * 9.6K : T = 4ms
    * 19.2K : T = 2ms
    * 115.2K : T = 0.4ms
    * ,5ms
    * @param sciNo: SCI,0:SCI-A;!=0:SCI-B
    */
    void SCI_OnTimer(Uint16 sciNo)
    {
    if(sciNo > 1) return;
    volatile struct SCI_REGS *sciRegs;
    /** sciNo使*/
    sciRegs = sciNo ? &ScibRegs : &SciaRegs;
    //1
    if(SCI_RX_FirstChar[sciNo])
    {
    //
    if(++SCI_RX_TimeCounter[sciNo] > SCI_RX_TIMEOUT)
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    串口调试助手发送8个字节

    第一次接入接收中断时,SCIFFRX.bit.RXFFST = 4(此值不固定,但总是不等于8),RXFFOVF=1,但是SCIRXBUF中连续4次读出的数据均不正确

    在接收超时处理函数中,SCIFFRX.bit.RXFFST = 3,能够完整接收串口助手发来的最后3个字节

    请问该如何处理接收FIFO中断呢?

  • 我这个问题处理方法找到了,将接收深度RXFFIL设置成4之后,就能够正常接收数据了。

    我昨天调试发送FIFO的时候也遇到同样的问题:刚开始想一次往FIFO中写入16个字节,后来改成8个字节,都不能正确发送数据。

    后来在发送中断中一次发送不多于4个字节,就可以了

    现在怀疑TI的文档中说的FIFO深度16是不准确的,很有可能16是指16bits,而非16bytes

  • 四级深度, 这个我的没问题

    我的问题是设置四级深度, 比如供8个字节按理只需进2次中断即可完成, 在第2次进中断的时候把接收使能关闭,同时关闭接收中断,但还是会第3次进中断, 这时又没有发数据,接收到的是四个0