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.

[参考译文] CCS/TMS320F28377S:SCI FIFO 问题

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/730652/ccs-tms320f28377s-sci-fifo-problem

器件型号:TMS320F28377S

工具/软件:Code Composer Studio

您好!

我实施 Modbus 协议、我在用 FIFO 中断 RX 时遇到问题。 

在我的应用中、传入的帧具有不同的长度(一旦帧的长度为12字节、第二次的长度为8字节)。 我在中断中接收到帧。
当我设置 RXFFIL = 7且帧长度为13时、会出现错误标志、例如 PE 和 FE。

总结如何设置中断,以便能够接收长度不同(只要 FIFO 大小允许,帧就会一样长)的帧而不会出现错误?

感谢你的帮助
此致
Szymon
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Suzy、

    请参阅 e2e.ti.com/.../496489

    这在一定程度上取决于应用程序以及响应消息所需的速度。 您可以在后台循环中处理接收到的消息、将 RX FIFO 中的任何内容拉至其他存储器。 在执行此操作时、您可以检查消息是否已完成。 为了防止 FIFO 溢出、您可以在 RX FIFO 已满时触发 ISR、以立即将所有字节复制到汇编消息的存储器中。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Devin、

    感谢您的回答。

    根据您的建议、我将 FIFO 级别设置为8、当8字节的帧到来时、一切都很完美。
    但是、当一个12字节的帧出现时、我只读取8个字节、5个字节丢失。 如何避免丢失帧的一部分?
    当 RX FIFO 满时、我无法调用 ISR、因为这样我将得到整个第一个帧(8字节)和下一个帧(13字节帧的8字节)、这在我的应用中是不可接受的。

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

    您好!

     我添加了设置

    中断 void scicRxFifoIsr (void)
    {
    uint32 i = 0;
    while (ScicRegs.SCIFFRX.bit.RXFFST!= 0){
    RxMODBUS[I]=ScicRegs.SCIRXBUF.ALL;
    i++;//读取数据}
    }
    
    GpioDataRegs.GPASET.bit.GPIO19=1;
    
    ScicRegs.SCIFFRX.bit.RXFFOVRCLR=1;//清除溢出标志
    scicRegs.SCIFFRX.bit.RXFFINTCLR=1;//清除中断标志
    
    PieCtrlRegs.PIEACK.All|=0x80; //发出 PIE ACK
    }
    
    void scia_fifo_init()
    {
    ScicRegs.SCICCR.all = 0x0067; // 1停止位,无环回
    //无奇偶校验,8个字符位,
    //异步模式,空闲线协议
    ScicRegs.SCICTL1.all = 0x0003; //启用 TX、RX、内部 SCICLK、
    //禁用 RX ERR、SLEEP、TXWAKE
    ScicRegs.SCICT2.bit.TXINTENA=0;
    ScicRegs.SCICT2.bit.RXBUKINTENA=1;
    ScicRegs.SCIHBAUD.ALL = 0x0000;
    ScicRegs.SCILBENA.ALL = 0x00A2;ScicRegs.SCICCR.OAUD = 0.PO.AUD
    = 0x0000 //启用环回
    ScicRegs.SCIFFTX.ALL = 0xC021;
    ScicRegs.SCIFFRX.ALL = 0x0028;
    ScicRegs.SCIFFCT.ALL = 0x00;
    
    ScicRegs.SCICTL1.ALL = 0x0023; //从复位
    ScicRegs.SCIFFTX.bit.TXFIFORESET 中撤回 SCI = 1;
    ScicRegs.SCIFFRX.bit.RXFIFORESET = 1;
    }
    

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

    无论 FIFO 大小如何、都无法使用特定的 ISR 来指示消息的结束、因为消息大小是可变的。 大概是消息中有一些也表示大小的信息? 在这种情况下、您可以连续地将 RX FIFO 中的任何字节(在后台循环中或在周期性 ISR 中)下拉至某个中间存储器。 然后、您将在每次从 FIFO 中提取一个字节时检查消息是否已完成。 您可以在 RX FIFO 已满时启用 ISR、以防止后台循环太慢时发生溢出。

    如果邮件中没有任何有关邮件长度的信息、则可能需要逐个接收每个字节。 当您获得第一个字节时、启动一个 ePWM 或 CPU 定时器来检测超时(消息末尾)。 每次您获得新字节时、重新启动超时计时器。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    感谢你的帮助。  
    我还有一个问题。

    您是否有用于实现所写内容的示例代码?

    此致

    Szymon

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

    遗憾的是、我们没有这方面的示例。