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.

[参考译文] MSPM0G1507:UART-DMA:在执行 RIS 寄存器轮询以检测传输结束事件而不是使用中断例程时、在发送时跳过字节

Guru**** 2393275 points
Other Parts Discussed in Thread: MSPM0G1507, SYSCONFIG, MSPM0G3519

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1514665/mspm0g1507-uart-dma-bytes-skipped-on-transmitting-when-doing-ris-register-poll-for-end-of-transmission-event-detection-instead-of-using-interrupt-routine

部件号:MSPM0G1507
Thread 中讨论的其他器件: SysConfigMSPM0G3519

工具/软件:

大家好:

我们已经开发了嵌入了 MSPM0G1507 MCU 的 PCB。 我们现在正在为其编写代码、并在从 MCU 传输消息期间 UART 模块存在一些奇怪的问题。

首先、我们使用 Code Composer Studio 12.8.1开发工程、并使用 TI DriverLib 和 SysConfig 作为代码库和 GCC 编译器。

我先简单介绍一下这个问题。 我们开发了 PCB、旨在成为许多各种机器项目的通用控制板、因此 MCU 中使用了许多元件。 此外、我们使用3个 UART 模块。 因此、我们的意图是将几乎所有 DMA 通道用于各种模块。 因此、我们必须为每个 UART 模块使用一个 DMA 通道、当我们需要通过 UART 模块在发送和接收数据之间切换时、对其进行重新配置。 此外、为了避免大量 CPU 中断、我们尝试轮询每个 UART 模块的 CPU 原始中断状态寄存器。 特别是对于发送、我们会检查 CPU_INT.RIS 寄存器中是否设置了传输结束标志、这样会检查数据传输是否完成。

最初、我们看到它运行正常。 当我们检测到设置到 CPU_INT.RIS 寄存器中的标志后、我们也会通过 ICLR 寄存器将其清除、并继续执行我们的程序、但我们只是遇到了一些问题。 在我们的一个项目中、我们必须定期(例如每秒发送一次)发送机器状态、现在我们看到在 UART 线路上偶尔会跳过(未发送)一些字节。 我们发送的数据包为10个字节、偶尔会跳过1个字节(每次发生时、可能会跳过1个字节)。 这种情况通常发生在5-10%的时间、而不是特定的时间段或顺序。 我们进行了 大量 测试来尝试找到原因、99%的员工都能确定它与此 RIS 寄存器轮询方法(而不仅仅是 UART 模块)有某种关系。

状态字符串作为 char 数组启动、在程序主循环中仅修改其中3个字符。  我们尝试的测试之一是禁用编译器的代码优化级别、这只是将问题减少到大约1%的错误出现。 我们尝试的另一个测试是用与状态字符串匹配的静态字符串替换状态字符串变量、而这里实际上没有错误、无论代码优化级别如何。  在这里、我们认为必须以某种方式将其与可变用途连接起来。

然后、我们进行了测试、在传输事件结束时实际运行中断例程、这里实际上也没有错误。 但是... 在我们的主工程中、我们还运行了 ADC 模块。 在这里、 我们要为 ADC 执行 DMA 乒乓概念、在主程序循环中、我们调用一个函数、在该函数中、我们轮询 ADC 模块的 CPU_INT.RIS 寄存器、并在 ping 和 pong 存储器位置之间切换时检查是否设置了 DMA_DONE 中断标志。 我编写 ADC 概念的原因是在 ADC 和 UART 中断标志轮询之间实现并行、然后表明 即使我们在 UART 模块上使用标准中断例程、但我们在其他某个模块上使用 RIS 寄存器轮询例程、在通过 UART 模块传输时恰好会跳过一些字节。

最后、我必须添加、当我们设置传输结束标志时、也会设置 DMA_DONE_TX 标志。 此外、我们还使用数据记录器连接到 UART 模块发送线、可以确认字节确实被跳过(不仅仅是该字节长度的低压线路或高压线路)。

因此、我们的结论是、如果我们在任何 MCU 模块的代码中的任何位置使用轮询的 RIS 寄存器、在 UART 传输期间会跳过字符数组变量中的某个字节。 如果我们要发送 statis 字符串、或者我们不使用 RIS 寄存器轮询、那么就不会跳过字节。 根据 RIS 寄存器和调试信息、我们可以看到数据正确地传递到 DMA 模块、并且 DMA 模块将请求的字节数传输到 UART 模块、并且 UART 模块似乎没有对 UART 发送线上的所有数据进行序列化。

那么、现在我联系您寻求帮助来解决一个问题:是否可以通过 RIS 寄存器轮询(而不是使用某些特定 MCU 配置 或过程的常规中断例程)成功结束传输检测、并对通过 UART 总线发送的所有数据执行此操作? 如果需要、我可以提供测试项目。

提前感谢、祝您好运!

Jovan

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

    请参阅 勘误表中的 DMA_ERR_01。

    https://www.ti.com/lit/pdf/slaz742

    需要确认:

    1.CPU/MCLK/PD1的运行频率高于 PD0 / ULPCLK。

    2. DMA 和 CPU 同时访问 PD0。

    如果双方都从您这边确认、则此数据丢失问题是由  DMA_ERR_01引起的。

    如何修复:

    1.设置在40MHz 上运行的 CPU/PD1和 PD0。

     2. CPU 和 DMA 不应同时访问 PD0外设。

    3.在 PD1中选择 UART3以处理最重的通信任务

    4.请勿使用 CPU 轮询来读取 PD0寄存器。

    选择不多、但我可以考虑改用 G1518、G1518  中没有 DMA_ERR_01。

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

    您好、Helic、

    非常感谢您的支持。 你把它钉死了!

    我可以确认、我们已将 CPU/MCLK/PD1频率设置为来自 SYSPLLX2的80MHz、而 ULPCLK/PD0在40MHz 工作、并且我们的代码使 DMA 和 CPU 同时使用 PD0 (DMA 正在将数据移动到 UART1、CPU 正在轮询 UART1模块的 CPU_INT.RIS 寄存器、可能在同一时间访问 PD0)。

    根据您的建议、我们将 CPU/MCLCK_PD1频率降低到40MHz、这足以解决问题。 我们知道我们不应让 CPU 和 DMA 同时使用 PD0外设、但在我们的情况下、根据您的建议更改、这似乎不再是问题。 我们将 UART3用于最重的通信任务、但我们还需要使用 UART1或 UART0来执行一些额外的、而不是繁重的通信任务。

    我将使用此消息指向一些非相关主题。 我不知道这是否是错误或者什么、但我查看了勘误表文档、您在响应中也提到了我、在 DMA_ERR_01部分中、写了"ADC 是 PD0外设"、但在 MSPM0G1507数据表中、MSPM0G150x MCU 的功能方框图上、ADC 模块连接到 PD1。 这两者之间的正确之处是什么?

    另一个问题与您建议的 MCU 更换相关。 我曾在 TI 网站上找到有关此 MCU 的一些信息、但没有关于该特定 MCU 型号的信息。 我找到了一个与此 MCU 所属的一组 MCU 相关的数据表、从该组中、仅提供了有关 MSPM0G3519 MCU 的页面、但有信息表明此 MCU 仍未量产。 您能详细介绍一下这些 MCU、它们是否还在售、或者是否即将上市?

    再次感谢您的支持!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    但在 MSPM0G1507数据表的 MSPM0G150x MCU 功能方框图上、ADC 模块连接到 PD1。 这两者之间的正确之处是什么?

    在 MSPM0Gx50x 器件中、ADC 属于 PD0、尽管 ADC 具有 PD1访问端口、但 ADC 寄存器的大多数访问端口都来自 PD0。

    您能告诉我有关这些 MCU 的更多信息、它们是否已上市、或者它们是否即将上市?

    他们将很快可用。

    而且,并非我回复的所有提示都需要考虑,只有一个是可以的,取决于你的要求。

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

    再次感谢您的支持和所有已回答的问题!