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.

[参考译文] TMDXRM57LHDK:串行中断缓冲器损坏?

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/574067/tmdxrm57lhdk-serial-interrupt-buffer-gets-corrupted

器件型号:TMDXRM57LHDK

大家好、

我无法理解设备的崩溃。 我将尝试详细解释它。

我的计划的作用:

  • 它每隔67ms 在异步模式下通过串行读取传感器数据。
  • 当整个串行封装到达时、它会在主循环中处理它并检查数据本身是否有错误
  • 它通过 TCP 将原始数据和错误状态发送到 PC (我正在使用 LwIP 1.4.1)。 电路板是服务器、PC 是客户端。
  • 客户端只是一个 GUI、用于可视化传感器数据和状态错误。

注:串行接口以异步模式接收数据。 这意味着、当主循环正在处理并通过 TCP 发送最后接收到的数据时、它也会通过串行方式接收新数据。

问题:

  • 当只有串行接口处于活动状态(不通过 TCP 发送数据)时、所有内容都能完美运行。 数据处理的状态错误为 NO_ERROR。
  • 如果 EMAC 和串行接口都处于活动状态、GUI 上的图像将开始"跳转"。 错误状态始终存在。 跳转每2秒或更短时间发生一次。 有时几分钟内没有人,但他们总是回来。

想法:

  • 起初、我以为 TCP 设置出了问题、这些设置在某种程度上破坏了某些 TCP 帧、甚至丢失了这些帧、但后来我注意到错误状态、并意识到接收到的数据"是错误的/损坏的"。
  • 然后、我认为 EMAC TX 中断正在中断我的串行例程、并且在程序返回到串行例程时、数据缓冲区具有"较新/损坏"的数据。 但是根据 这个线程、即使出现一个更高优先级的 IRQ、它也不能中断当前的 IRQ。 因此、情况并非如此。
  • 我现在的理论是、串行中断在 EMAC 例程被处理时被触发、因此它必须等待。 在等待时、新数据将到达、缓冲区将被覆盖或新数据丢失。 这对你们来说有道理吗?

从参考手册中、我知道有两个接收缓冲器: SCIRXSHF 和 SCIRD。 第一个帧会获取所有的传入数据、当一个帧完全接收到后、数据会传输到第二个帧。这里的帧是什么? 当该传输发生时、RXRDY 标志置位、并产生接收中断

如果在程序处于 TCP 中断中时生成串行中断、 SCIRXSHF 上的新数据会发生什么情况? 我想 、SCIRXSHF 会不断获取数据以避免丢失某些数据、对吧? 即使最后一个中断尚未被处理、这个新数据是否会被复制到 SCIRD (因为已接收到一个完整的帧)?  

如果我设置多缓冲模式(mbuf_mode ->设置全局控制寄存器的位10)、我想了解 TI 的行为是如何的。 但我没有把它设置好。 我在 Code Composer Studio 的寄存器窗口中看不到它。 我在 SCI_init 函数中使用此函数:

//尝试1
sciREG3->GCR1 |= 0x400U;

//尝试2
sciREG3->GCR1 |=(uint32)((uint32) 1U <<10U) 

我被困在这里了。 我可以使用一些帮助。  

谢谢、此致、

Julio

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

    多缓冲模式 SCI 配置中使用的帧长度(SCIFORMAT、1~8字节)是多少? 您是否尝试使用 DMA 模式进行 SCI 数据传输?

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

    感谢您的帮助。

    在我的 SCI 配置中、帧长度为8字节。 SCI 配置缓冲模式是否相关? 如果使用多缓冲模式、是否有其他配置需要注意? 更重要的是、在我的案例中、这是否有助于避免数据丢失? 我甚至不确定我的理论是否正确、我只是想测试程序在多缓冲模式下的行为。 您认为问题是什么?

    否、我尚未尝试 DMA 模式进行 SCI 数据传输。 在我的情况下、DMA 是否有助于避免数据丢失?