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.

[参考译文] F2.8377万 SCI Rx FIFO中断超时

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/571886/f28377-sci-rx-fifo-interrupt-timeout

您好,

我处理的是F2.8377万中的SCI通信,发现此MCU中没有接收FIFO超时。

因此,我需要使用额外的计时器(如cputimer1)来实现超时。

但是,如果使用两个sci通道(scia和scib)进行通信,则会出现问题。

这是否意味着我需要为每个sci使用两个计时器(cputimer1和2)?

如果答案是"是",那么我如何避免此问题?

因为我还需要一个计时器来做另一件事,而不仅仅是为了sci通信。

 

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

    舒恩

    您能否向我解释什么是"接收 FIFO超时",以及您为什么需要它?  也许我们可以为您找到解决方案。


    此致,
    科迪

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

    我正在使用Rx FIFO,没有超时,并设置阈值RXFFIL = 8 (每8字节数据会导致中断并提取)。

    但是,在发射期间MCU会获取虚拟数据(例如 2字节数据),因此Rx FIFO将接收总共10字节数据。

    因此,这些伪数据将导致MCU在第一次Rx中断后的每个中断中提取错误的8字节数据。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    有人能给我什么建议吗?
    谢谢!
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    舒恩

    1.我是否从左到右阅读您的图表? 还是从右到左?

    1.1 对我来说,虚拟数据似乎发生在第一个RX中断结束时,这是正确的吗?

    2虚拟数据何时出现? 是否仅传输一次?

    我不知道您系统的确切细节,但您应该配置设备以捕获虚拟数据和真实数据,然后丢弃虚拟数据。

    此致,
    科迪

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

    1.1
    是的。 对于本示例,虚拟数据将出现在8字节数据之后。

    二.
    虚拟数据可能随时发生(在数据之前或在8字节数据之内),而不仅仅是在传输数据之后。
    这可能是由于周围有高功率设备(100kW或以上)的环境噪音造成的。
    如果sci通信没有时间轴(接收数据的数量触发Rx FIFO中断),则无法确定合法传输的时间。
    而之前传输留下的虚拟数据将影响下一次传输,以提取错误的数据。

    我有必要大致解释我的沟通。 SCI由MODBUS协议实施,从属设备需要从主设备获得正确的8字节命令数据,以便在特定地址执行数据写入(06)或数据读取(03)。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    舒恩

    您需要在设备之间进行某种握手,因为 UART不会检查 意外帧。  这可以通过多种方式完成,您可以添加校验和,或添加 通信帧的起始和结束,或者如果数据更重要,您可以对收到的帧进行回声并验证其正确性。

    当您检测到一些“虚拟数据”时,您可以使用SCIFFRX寄存器的“RXFIFO”位来重置RX FIFO。 清除此位将重置RX FIFO, 可在 技术参考手册中找到完整说明

    另请注意,随机噪声看起来像UART帧的情况很少见。 通常,噪音显示为错误时,您应检查SCIRXST的RXERROR位。 有关详细说明,也可在上面链接的技术参考手册中找到。

    此致,
    科迪

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

    在我的sci通信中使用MODBUS协议时,我确实使用CRC检查每8个字节是否正确接收数据。 在我的案例中,如果数据始终错误(CRC不匹配),则无法解决问题,然后我的sci通信将陷入此循环。
    如果接收到错误的数据,我尝试在RXFIFO中断中设置RXFIFO。

    SciaRegs.SCIFFRX.Bit.RXFIFORESET =0;//将FIFO指针重置为零
    SciaRegs.SCIFFRX.Bit.RXFIFORESET =1;//重新启用接收FIFO

    在我的代码中,当接收CRC与传输CRC不匹配时,我会添加这两个设置,然后无论RXFIFO中还有多少数据,我都应该清除RXFIFO。 但是,当接收到8字节以上的数据时,这些设置不会清除RXFIFO,当然,RXFFST不等于零。

    RX FIFO中断不足以处理意外情况(如果数据小于或大于FFIL)。 我使用计数器在我以前的sci通信中每隔一段时间(如轮询)接收数据。 至少,我不必担心数据大小是10字节或2字节。 如果计时器超时,它将通过从RXFIFO提取所有数据来清除RXFIFO,然后检查CRC是否正确。 我的方法的缺点是,即使没有收到数据,它也必须每隔一段时间检查一次RXFFST。 这对于MCU来说不是很有效,尤其是在我的项目中,sci只是一个部分。 无论如何,我希望RX FIFO中断可以改善我的sci通信。 我在sci通信中使用它似乎不太好。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    舒恩

    如果您担心计时器在不需要时运行,则应在数据的第一个字节后启动计时器,并在收到CRC并匹配后停止计时器。 这将阻止计时器在未发送数据时运行。

    其次,有许多方法可以解决此同步问题,我建议在出现CRC错误时,您应该与主设备进行F2.8377万握手,这会导致 两个设备在短时间内都无法清除 缓冲区并 重新同步。

    您还可以定义一个“传输开始”帧,从中可以确定CRC在帧中的位置。 注意: 要使用 此方法,您需要考虑数据帧看起来像传输帧的起点的可能性,但这只有在您检测到CRC错误时才有关系。

    希望它有所帮助,
    科迪