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.

[参考译文] MSP430F67751A:DMA 传输问题

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1173530/msp430f67751a-problems-on-dma-transfers

器件型号:MSP430F67751A

大家好、

在大规模生产中长时间使用 MSP430F67751A 系列微控制器。 但在某些产品中、我们开始看到特定的 DMA 传输问题。

我们使用一种算法、其中"Timer1 A1 Interrupt"触发10位 ADC 通道的自动扫描、自动扫描4个不同通道、然后触发 DMA 操作。 问题是、我们开始在某些产品的读数中看到"0"值。 为 ADC 操作添加条件语句时忽略"0"值,最终导致 UART 和 I2C 通道中缺少数据。 在 UART 外设中、我们使用轮询方法、如果知道的话。 此外、如果我们开始使用"Timer3 A1中断"、这是我们软件中开始增加并行处理器负载的关键点。

检查勘误表(请参阅 :https://www.ti.com/lit/er/slaz590v/slaz590v.pdf)、了解我们遇到的与"DMA7"代码相关的特定问题。 勘误表指出 DMA 传输可能会导致中断丢失。 但为什么我们的所有产品都没有发生这种情况。 由于我们在"Timer1 A1中断"末尾调用 ADC 扫描、因此如果我们不对该特定外设进行读写操作、DMA 操作可能会导致中断丢失。 此外、在读取时如何设置 DMA 和 ADC 外设的所有成功标志也是完全错误的。 我们还使用示波器检查了输入信号、没有看到尖峰或在其处切断。

谢谢、此致。

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

    ADC 可能有问题。 是否可以在没有 DMA 的情况下执行一些 ADC 检测测试?

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

    请参阅本文档、检查问题是否相同。 www.ti.com/lit/pdf/snaa354  

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

    大家好、感谢您伊斯天的帮助。

    [引用 userid="372580" URL"~/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1173530/msp430f67751a-problems-on-dma-transfers/4416896 #4416896"]不带 D

    我们检查了您共享的文档。 但我们认为这不是我们的情况、因为与文档表3.1中提供的数据不同、我们只在 ADC 上读取0值。 我们通常每2秒就会看到它。 在操作的每个步骤中都看不到故障结果。 因此、当处理器负载较低且某些中断未使用时、ADC 工作正常。

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

    对于 DMA7、它将导致损耗中断。 您是否认为如果 DMA 1次或2次不起作用、则会导致其中一个通道结果为0? 您可以更改采样时间还是其他内容吗? 我想您可以在 CPU 中读取中断标志、看看它是否是 DMA7故障。

     2.看来并非所有产品都能解决这个问题。 你能提供一个数字吗?

    3.重新出现此问题似乎很容易。 您可以通过调试模式来实现它吗?

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

    您好、伊斯天、

    1、我降低了采样周期、没有发生任何变化。 我还启用了 ADC10中断、我认为这会阻止 DMA 传输、并在我的所有读数中导致"0"值。 此外、我还为中断调用方提供了一个日志表、以了解中断的丢失情况、并且我在一些 ADC 读数之间没有看到 DMA 传输中断。 (例如、Timer1_A1 (在系统和不可屏蔽中断之后、它是软件中的最高优先级中断)启动 ADC 转换。 我倾向于在两个 Timer1_A1中断之间进行 DMA 中断调用、但有时我在该日志中看不到它。 但我无法确定日志的可靠性、因为较高优先级的中断可能会导致较低优先级的中断被削减、并且可能会在稍后返回。 无法在日志中检查这些条件。)

    2.我们在1000件产品中的比率约为2,这是个问题。

    3.我们无法用工作产品制造出此问题。 但是、可以在调试模式下看到它。 此外、长时间在调试模式下检查、即使我不在 DMA 进程中停止软件、也会使读数变得更糟。

    我找不到检查 DMA 传输的原始 ADC 数据的正确方法。 由于问题在调试模式下随机发生、我没有机会检查原始传输数据、因为当我看到错误读取的影响时、它总是太晚了、新的转换会完成、数据会被消除。

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

    我认为如果 DMA 传输0数据、则不应在 DMA 未命中触发时发生。 当 ADC 未准备数据时、应会发生这种情况。 您能否再次检查它?

    如果正确、您可能可以使用一个计时器来触发 DMA、使用一个计时器来触发 ADC。

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

    您好、伊斯天、


    很抱歉耽误你的回答。 我尝试检查您说过的内容、我得出结论认为 DMA 和 ADC 工作正常且精确。 我在调试时创建了一个具有蛮力的日志表、并检查了 DMA 输出的 ADC 读数的最后8秒。 一切都很好、正如您所猜测的。 但错误行为背后的原因有点复杂。


    我们在项目中使用线程式结构。 Timer1_A1中断为通用函数处理部分的每个中断触发一个1mil 的标志。 根据这个1ms 标志、这个通用结构处理不同的线程。 有几个临时事件是可以预料的,但这对我们来说不是问题,因为我们的项目不必是实时的。 同时还有几个并行中断。


    问题是、我们从 Timer1_A1中断对 ADC 读数进行采样、该中断还会为类似线程的结构触发1ms 标志。 我们在调用 ADC 线程之前对80个读数进行采样、该线程在函数中进行累积求和。 在错误的器件中、我检查了在错误的 ADC 数据处理之前、该线程在150个或更多个样本之后被调用。 这意味着处理程序调用线程。 在过程开始时、会发生中断、这会创建一个"Shiftstorm"并最终得到80个以上的样本。 无问题更多采样更准确的数据、但由于采集了150个采样(超过 ADC 线程调用时间的4倍、也是最高优先级的线程之一)、处理程序自动开始再次运行 ADC 线程、而无需查找其他线程。 因此、ADC 线程无需任何采样即可工作。 我插入了许多条件检查以防止这种行为、结果更糟。 此时、其他线程爆炸。


    此外、我们使用嵌套中断、但仅用于一个特定中断。 它是串行通信的一部分。 激活其中一个中断中的全局中断、是否为所有中断启用嵌套? 我认为不是因为我在调试时无法检查这种情况。 您可能认为这是一种非常具体且难以解决的情况。 此问题可能有多个原因。 但这让我感到非常疯狂、1000个产品在完全相同的条件下工作正常、没有任何问题。 但这2种产品具有这种行为。 减少线程或优化中断是我对这个问题的第一个想法。 但是、软件如何改变其工作行为并启动某些产品的溢出? 对于调试这种结构或嵌套中断、您有什么建议吗?


    感谢您的帮助、祝您愉快

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

    简单的猜测可能是由导致问题的时钟频率决定的。 也许您可以对该器件进行一些检查。

    2、听到这一消息是真的。 为了了解您的问题、我还会花一些时间。 最好的解决方案是了解每个线程的时间序列。 但是、这确实很难做到、因为它仅发生在某些器件上。 我想您是否可以忽略 ADC 空结果?

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

    您好、Selim、

    为了对嵌套中断问题进行注释、当进入一个 ISR 时、MSP430自动清零 GIE 位、从而禁用在一个 ISR 期间被中断的能力。 在中断内部通过启用 GIE 位来启用嵌套 ISR 功能。 此时、系统中启用的任何中断都可以并且将中断您、从而嵌套。 虽然在技术上是可能的、但不建议在 MSP430器件中使用嵌套中断。  

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

    您好 Jace、


    谢谢您、我们正在使用您描述的相同过程来执行此操作、但我要求确认中断第一个 ISR 的第二个 ISR 也会再次清除 GIE 位。 是真的吗?

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

    是的、事实是: