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.

[参考译文] MSP430FR5969:具有 ADC 的 DMA 可绕过勘误表 ADC43

Guru**** 2484615 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1223822/msp430fr5969-dma-with-adc-to-work-around-errata-adc43

器件型号:MSP430FR5969

你(们)好!

我尝试使用 DMA 以{ADC 通道0_Sample0、 ADC 通道1_Sample0、ADC 通道2_Sample0、ADC 通道2_Sample0、  ADC 通道 0_Sample1、 ADC 通道0_Sample1、ADC 通道1_Sample1的格式将 ADC 样本从三个 通道传输到一个阵列    ADC 通道 2_Sample1、 ...}

在注意到勘误表43时、我尝试使用 dma 来实现这一点、第一个是针对阵列大小进行块修复、另一个是针对在循环3中更改源地址。 IE:{0x0860、0x0862、0x0864}

但对于我的情况、它永远不会起作用。 即使在调试会话中、我看到第一个 DMA 通道的 SA 寄存器 实际上已更新为我需要的值、但移动到阵列的数据始终来自 DMA 初始化过程中设置的 ADC 通道。

这意味着一旦 DMA 被设置、它将不再获取 DMAxSA 或 DMAxDA 中的值。 我发现用户手册第11.2.2.2章的说法是" DMAxSA、DMAxDA、DMAxSZ 寄存器被复制到临时寄存器... "

我想知道大家是如何通过使用两个 DMA 在他们的项目中实现这些目标的。

 

Br、

Jason

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

    你(Jason)好

    请考虑通过使用00b =单通道、单次转换或10b = ADC12CTL1寄存器的 ADC12CONSEQx 上的重复单通道来避免 ADC43。

    谢谢!

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

    但我需要以相同的采样率对三个通道进行采样。 我必须使用通道序列模式。 还有其他建议吗?

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

    你(Jason)好  

    我想知道您是否可以接受通过软件而不是 DMA 处理 ADC 转换数据?

    谢谢!

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

    当我读取 ADC43时、它表示每个序列将获得3个触发器、而不是用户指南(SLAU367P)第11.2.1节建议的1个触发器。  

    推荐不要使用3个字的块传输(DMADT=1)、而是使用3个字的单次传输(DMADT=0)。 单次传输意味着每个触发一次(字)传输、 因此3个触发器将传输整个序列。  

    您如何配置 DMA?

    [编辑:次要澄清。]

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

    尊敬的 Xiaodong:

    我倾向于尽可能多地在后台工作。

    谢谢

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

    Bruce、您好!

    按照您的建议、我只能获取数据格式 {ADC 通道0_Sample0、 ADC 通道1_Sample0、ADC  通道2_Sample0 }

    但我更喜欢它可以填充510长的阵列、从三个通道滚动数据。  

    {ADC 通道0_Sample0、 ADC 通道1_Sample0、  ADC 通道 2_Sample0、 ADC 通道0_Sample1、ADC 通道1_Sample1、     ADC 通道 2_Sample1、 ... ADC 通道0_Sample169、 ADC 通道1_Sample169、ADC  通道2_Sample169 }

    有什么建议吗? 非常感谢。

    Jason

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

    我想我现在明白你的想法了。 我不清楚其他线程中描述的方法是如何工作的、因为(a)正如您观察到的、当 DMA 通道处于活动状态(DMAEN=1)时不能更改 SA/DA/SZ 寄存器、(b) DMA 可以非常轻松地单步执行 MEMx 寄存器数组(0x860-0x864)(DMADT=0)。 可能有我缺失的东西吗?

    ADC43的烦恼是:在单模式下、您需要让 DMA 同时递增源地址和目标地址、但使用不同的调制(3与510)。 块传输(您不能使用)将不会使源递增、因此可以重复使用。 (也许这就是 Ryan 在另一句话中所说的。)  

    如果您的目标是在没有 CPU 干预的情况下收集数据、请记住、在 CONSEQ=1时、每个 ADC 突发后必须切换 ENC (=0、 然后=1)要启用下一个突发[请参考用户指南(SLAU367P)第34.2.8.2节]、因此 CPU 在任何情况下都必须对每个突发进行干预。 一旦您采取(DMA)中断来切换 ENC、这是一项小附加功能、用于更新 DA ( 在您的阵列中移动)并重新启用通道。

    您提到需要固定速率采样(假设您使用的是计时器)、但一个可分离的问题是您是否需要在各个通道之间(准)同步转换突发;在某些应用中、我想要前者、但实际上不在乎后者。 如果是这种情况、您可以尝试使用 CONSEQ=3和 MSC=0、并将触发速率提高三倍。 这为每个通道提供了固定的速率、但序列中的通道会偏移周期的1/3。 如果 CONSEQ=3、则无需在周期之间切换 ADC12ENC。 由于突发随后是自定进度的、因此您可以考虑将整个 ADC12MEMx 阵列用作 DMA 源。 这会使您在干预之间的32/3=10个信道周期、不是170个、但这是个问题。

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

    谢谢。 最后、我必须在每个采样序列完成后复位目标地址。 但我认为这是我的场景的唯一方法。