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.

[参考译文] TMS320F280037:关于使用 DMA 实现 ADC 的查询

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1445353/tms320f280037-inquiry-for-implementation-of-adc-with-dma

器件型号:TMS320F280037

工具与软件:

尊敬的专家:

我的客户使用 DMA 1CH 将 ADC 结果传送到缓冲器。
ADCA:3eA (结果0、1、2)
ADCB:3eA (结果0、1、2)

ADCA 结果0、1、2和 ADCB 结果0、1通常传输到缓冲器、但 ADCB 结果2不传输到缓冲器。

我已附加 DMA 配置文件。

您能否指出错误。

e2e.ti.com/.../280037-DMA.TXT

谢谢

此致

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

    你好、Robin、

    只是为了确保我理解、他们是否 在尝试让 CPU 计时器定期触发 DMA、以便将数据从 ADCA 和 ADCB ADCRESULT0 -ADCRESULT15寄存器移动到  tADC 结构中每个元素的最后一个字段(替换 NULL)? 一些潜在问题:

    • 为什么  目标 地址从 tADC[eADC_Max]开始(不应该从结构中的第一个元素开始)? 此外、EADC_Max 等于什么?
    • 为什么使用传输源步骤29?
    • 还请记住、启用一次性模式意味着只有来自 CPU 计时器模块的一个触发器将移动整个传输-因此一次6个16位值。

    我对他们希望如何将数据放入其结构有点困惑、请提供一个示例、说明他们希望随每个触发器移动的内容。

    此致、

    Delaney

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

    尊敬的 Delaney:

    将代码移到这里时出错了。 目标地址起始地址为 tADC[0].RawADCValue。 这是我想要的。

    第一个触发器->传输0 (突发单次触发(ADCAResults0 / ADCAResults1 / ADCAResults2)->传输1 (突发单次触发(ADCBResults0 / ADCBResults1 / ADCBResults2)

    第二次触发->重复

    预期的结果是

    ADCAResults0 -> tADC[0].RawADCValue

    ADCAResults1 -> tADC[1].RawADCValue

    ADCAResults2 -> tADC[2].RawADCValue

    ADCBResults0 -> tADC[3].RawADCValue

    ADCBResults1 -> tADC[4].RawADCValue

    ADCBResults2 -> tADC[5].RawADCValue

     

    因此、我将突发和传输源步长设置为29 (ADCB_BASE - ADCA_BASE - 3)(大小设置为3 /步长1)。

    正如我在中设置的那样。 TXT、单稳态只用于突发不传输。 我按如下所示进行设置。

    DMA_CONFIGMode (DMA_CH1_BASE、DMA_TRIGGER_TINT0、(DMA_CFG_Oneshot_enable | DMA_CFG_CONTINUOUS_ENABLE | DMA_CFG_SIZE_16BIT));

    我仍然在努力,但无法找到我错过的东西。 我的代码的当前结果如下所示。

    ADCAResults0 -> tADC[0].RawADCValue //已传输

    ADCAResults1 -> tADC[1].RawADCValue //已传输

    ADCAResults2 -> tADC[2].RawADCValue //已传输

    ADCBResults0 -> tADC[3].RawADCValue //已传输

    ADCBResults1 -> tADC[4].RawADCValue //已传输

    ADCBResults2 -> tADC[5].RawADCValue //未传输。

    谢谢!

    此致、

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

    你好、Robin、

    我对延误深表歉意;我正在研究这一问题、明天应该给你一个答复。

    此致、

    Delaney

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

    你好、Robin、

    明白了、感谢您的澄清。 除了0目标传输步骤之外、您的设置对您尝试实现的目标效果很好。 我认为您也希望将其更改为 sizeof (stADC)、因为这将是每次突发之间递增的地址数量。  请尝试此操作、看看是否能解决问题。 否则、请 在触发发生后查看并发送 DMA CH1控制寄存器的状态字段。 如果您尝试进行多次传输并在 stADC 结构中连续存储数据、则可能还会显示出您想要进行某种绕线操作(我假设如果您启用了连续模式、就会这样)。  

    此致、

    Delaney

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

    尊敬的 Delaney:

    如您所述、sizeof 设置无效。  

    谢谢