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.

[参考译文] TMS320F280025C:SCI 通信:AT 命令响应超过16个字符的 Rx FIFO 读取问题(Rx 溢出)

Guru**** 2460850 points
Other Parts Discussed in Thread: C2000WARE

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1072494/tms320f280025c-sci-communication-rx-fifo-reading-issue-for-an-at-command-response-of-more-than-16-characters-rx-overflow

部件号:TMS320F280025C
“线程:C2000WARE”中讨论的其它部件

你好!

我使用 F280025C UC 作为主中继器,通过 SCI (UART)与 WiFi 模块进行通信,以发送和接收 AT 命令及其响应。

我正在使用 Tx FIFO 和 Rx FIFO 中断实现相同的结果。 由于 AT 通信及其对应的响应是一组字符,因此我已  为我的应用程序修改了 SCI_writeCharArray 和 SCI_ReadCharArray。  

只要长度n´t 超过最大 FIFO 长度(即16),中断函数和对 AT 通信的响应就可以正常工作。 当响应超过16个字符(大多数情况下)时,会出现 FIFO 溢出,并且我只能读取丢失第一个字符的最后16个字符。  

Rx 中断如下所示:

__interrupt void sciaRXISR(void)
{
    //ESTOP0;

    uint16_t i;

    for(i = 0U; i < 100 ; i++)
    {
        FifoFromWlanUart[FifoFromWlanUartWritePointer] = (uint16_t)
                   (HWREGH(SCIA_BASE + SCI_O_RXBUF) & SCI_RXBUF_SAR_M);
        delay(30000);
        
        if(++FifoFromWlanUartWritePointer>=FifoFromWlanUartLength)
            FifoFromWlanUartWritePointer=0;
        if((FifoFromWlanUart[i-3] == 0x4F && FifoFromWlanUart[i-2] == 0x4B && FifoFromWlanUart[i-1] == 0xD && FifoFromWlanUart[i] == 0xA) ||
                (FifoFromWlanUart[i-6] == 0x45 && FifoFromWlanUart[i-5] == 0x52 && FifoFromWlanUart[i-4] == 0x52 && FifoFromWlanUart[i-3] == 0x4F &&
                        FifoFromWlanUart[i-2] == 0x52 && FifoFromWlanUart[i-1] == 0xD && FifoFromWlanUart[i] == 0xA))
        {
            break;
        }
     }


    SCI_clearOverflowStatus(SCIA_BASE);
    SCI_clearInterruptStatus(mySCIA_BASE, SCI_INT_RXFF);
    //SCI_clearInterruptStatus(mySCIA_BASE, SCI_INT_RXRDY_BRKDT);
    
    Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP9);
}

所以我的问题是, 如何在不出现溢出问题的情况下阅读完整的回答? 有关如何在不出现 FIFO 溢出的情况下读取 Wifi 模块的完整响应的解决方案和建议将非常有帮助。 现在我一直在这个问题上,我真的很希望能有任何帮助。 谢谢你们!!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,

    感谢您的提问! 所以,看一下代码片段,我有一些问题和一些潜在的解决方案:

    1.您启用了哪些中断? 此 FIFO 中断是否为中断,如果是,该中断配置为在哪个 FIFO 级别触发?

    2.延迟(30000);呼叫可能是错误的。 输入中断时,您希望尽快清空整个 FIFO (FIFO)(FIFO)(因为 FIFO 中应该已有字词)。 因此,在本例中,延迟读取实际上会有问题。

    3.实际上,100次循环迭代在单个中断中是不可能的。 由于 FIFO 最大深度为16,因此任何时候都只需要从 FIFO 读取16个字。 这让我想到了下面的第四名。

    4.我将重新构建中断,以仅处理将16个 FIFO 字符移动到内存中的问题。 然后在主菜单中使用一个函数定期检查该内存阵列的长度,以查看您是否已达到预期的字符数。 这将完全避免任何溢出情形,因为中断将只处理从 FIFO 中移出的字节。 这将使中断反应时间保持非常快。

    请告诉我这些建议是否有助于解决您所看到的问题!

    此致,

    文斯

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好,Vince,

    感谢您的回复。

    1.您启用了哪些中断? 此 FIFO 中断是否为中断,如果是,该中断配置为在哪个 FIFO 级别触发?

    我正在使用问题中提到的 Tx 和 Rx FIFO 中断。 Rx FIFO = 6和 Tx FIFO = 16。  

    2.延迟(30000);呼叫可能是错误的。 输入中断时,您希望尽快清空整个 FIFO (FIFO)(FIFO)(因为 FIFO 中应该已有字词)。 因此,在本例中,延迟读取实际上会有问题。

    我已删除我的延迟。

    3.实际上,100次循环迭代在单个中断中是不可能的。 由于 FIFO 最大深度为16,因此任何时候都只需要从 FIFO 读取16个字。 这让我想到了下面的第四名。

    4.我将重新构建中断, 以仅 处理将16个 FIFO 字符移动到内存中的问题。 然后在主菜单中使用一个函数定期检查该内存阵列的长度,以查看您是否已达到预期的字符数。 这将完全避免任何溢出情形,因为中断将只处理从 FIFO 中移出的字节。 这将使中断反应时间保持非常快。

    即使我尝试一次只移动16个字符到内存中,它也不起作用。 我仍然只能有最后16个字符的溢出响应。 这里的事情是,我不知道要检查的响应字符的实际长度,正如你所建议的那样。

    我有办法向你发送我的代码文件,以便你对我的代码有一个正确的了解。 由于某些原因,我不能在此处附加我的代码。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好,拉希

    由于特殊用例中出现的支持困难,我们试图在论坛上调试大量代码,因此我将提供您问题的可能解决方案:

    假设您的 RX FIFO 深度为6,我们需要按如下方式更改 ISR 代码(这与 C2000Ware 中的“sci_ex2_loopback_interrups.c”示例相同,但对 FIFO 深度为6进行了修改):

    //
    // sciaRXFIFOISR - SCIA Receive FIFO ISR
    //
    __interrupt void sciaRXFIFOISR(void)
    {
        uint16_t i;
    
        SCI_readCharArray(SCIA_BASE, rDataA, 6);
    
        //
        // Check received data
        //
        for(i = 0; i < 6; i++)
        {
            // do what you need to do with the data here
            // move to memory as needed, and handle that
            // memory in the main function
        }
    
        // additional cleanup can go here
        
        
        // now clear the interrupt and return
    
        SCI_clearOverflowStatus(SCIA_BASE);
    
        SCI_clearInterruptStatus(SCIA_BASE, SCI_INT_RXFF);
    
        //
        // Issue PIE ack
        //
        Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP9);
    }

    如果这不能解决您的问题,请返回到 C2000Ware 的“sci_ex2_loopback_interrups.c”示例,查看该示例在默认情况下是否有效。 如果没有,则必须解决一个大问题(可能是硬件或软件系统中的其他位置)。

    我在调试这些问题时编写的本指南可能有助于:

    https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1031947/faq-my-c2000-sci-is-not-transmitting-and-or-receiving-data-correctly-how-do-i-fix-this

    此致,

    文斯