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.

[参考译文] TMS320F28335:ADC 至 DMA 数据传输问题

Guru**** 2589265 points
Other Parts Discussed in Thread: TMS320F28335

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/652740/tms320f28335-adc-to-dma-data-transfer-issue

器件型号:TMS320F28335

您好!

我将使用示例代码对 DMA 和 ADC 进行小型实验。 示例代码名为  Example_2833xAdcToDMA 、这将在 SEQ1中将 ADC 通道0转换为4并将其传输到 DMA。  

现在、我已通过将 ADC 通道选择从8更改为4来更改代码小位。 此外、我还对 DMA 配置进行了如下必要的更改、

InitAdc ();//对于此示例,初始化 ADC

//此示例的特定 ADC 设置:
AdcRegs.ADCTRL1.bit.ACQ_PS = ADC_SHCLK;
AdcRegs.ADCTRL3.bit.ADCCLKPS = ADC_CKPS;
AdcRegs.ADCTRL1.bit.SEQ_CAS0_CASQ // 0非级联模式
AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 0x1;
AdcRegs.ADCTRL2.bit.RST_SEQ1 = 0x1;
AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x0;
AdcRegs.ADCCHSEVQ1 = 0x02
;ADCCVSEQ1 = 0x1;ADCCONVREG1.ADC0001.ADC0001.ADCCVSEQ1 = 0x2;ADCONSELQ1 = 0x2
AdcRegs.ADCCHSELSEQ1.bit.CONV03 = 0x3;
AdcRegs.ADCMAXCONV.BIT.MAX_CONV1 = 3;//设置 ADC 为每个 SOC 执行4次转换

//步骤5。 用户特定代码,启用中断:
//初始化 DMA
DMAInitialize();

//清除表
(i=0;i 

其余代码和设置相同。 我在这里面临的问题是、ADC 转换在第1次触发时正确放置在 RAM 中、而在第2次触发时、它放置了之前的 ADC 数据。 因此,ADC 结果在每次备用触发时都放置在 DMA RAM 中 。 可能的原因是什么? 是否可以仅将 ADC 用于前4次转换、在下一次触发时、转换将从 CH0开始?

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

    我们已指派 TI 工程师来帮助解决您的问题。 由于假期,答复可能会延迟。 感谢您的耐心等待。

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

    Pritesh、

    在我看来、在该示例中、SOC_SEQ2从未触发、因此 DMA 可能已配置为仅处理 SOC_SEQ1上的4个转换。

    Tommy

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

    嗨、Tommy、

    感谢您的回答。

    无论如何、我不会触发 SEQ2。 我所说的是 ADC 到 DMA 的默认示例和代码(即示例代码的微小变化)。

    第1次触发到 ADC 意味着软件触发到 SEQ1、类似地、第2次触发到 ADC 意味着软件触发到 SEQ1。 正如我们在示例代码中看到的、所有触发器都使用 for loop 以较小的延迟运行。

    谢谢、

    Pritesh

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

    我相信该示例已经配置为按照您的意愿处理 SEQ1上的4个转换。 如果为 true,则不需要修改任何 DMA 设置。

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

    嗨、Tommy、

    你是对的! 已为4通道配置示例代码。 但我的问题是、是否可以仅为 SEQ1分配4个通道而不是全部8个通道? 这有助于在核心层面了解 DMA 和 ADC。

    根据我的理解、示例代码按如下方式分配了所有 ADCCHSEQ、

    AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x0;
    AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0x1;
    AdcRegs.ADCCHSELSEQ1.bit.CONV02 = 0x2;
    AdcRegs.ADCCHSELSEQ1.bit.V04
    = 0x3;ADCCONV03 = 0x02 = 0x2;ADCCHSELSEQ2.ADCCONVREQ = 0x3;ADCCOL
    AdcRegs.ADCCHSELSEQ2.bit.CONV05 = 0x1;
    AdcRegs.ADCCHSELSEQ2.bit.CONV06 = 0x2;
    AdcRegs.ADCCHSELSEQ2.bit.CONV07 = 0x3; 

    其中、首次触发到 ADC 时将执行转换0-3、而第二次触发则执行转换4-7、然后 DMA 中的源地址换行 到 ADCRESULT0。

    对于 DMA 和 ADC 的核心理解、我只想按如下方式为 ADCCHSELSEQ 分配4个通道、

    AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x0;
    AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0x1;
    AdcRegs.ADCCHSELSEQ1.bit.CONV02 = 0x2;
    AdcRegs.ADCCHSELSEQ1.bit.V03 = 0x3; 

    其中、首次触发到 ADC 时将执行转换0-3、 然后 DMA 中的源地址换至  ADCRESULT0。 因此、如果不能与上述情况不同、我希望在每次 ADC 触发时按照我的设置对 DMA 源地址进行换行。

    谢谢、

    Pritesh

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

    Pritesh、

    对于 ADC、您只需使用 CONT_RUN 启用连续运行、以便每个 SOC 从 CONV00启动。

    Tommy  

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

    尊敬的 Tommy:

    我已经尝试了 CONT_RUN、但它无法解决我的问题。 此外、给定的解决方案仅关注 ADC 配置、而不是总体问题、以及示例。 我希望您的团队能够查看所提到的问题、并有足够的时间回来。

    谢谢、

    Pritesh

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

    我不清楚您说的问题是什么。 它是看起来没有正确换行的源地址吗? 如果是这样、也许您可以禁用换行(将源换行大小设置为全1)并使用负源传输步骤(-3?) 以使您返回 ADCRESULT0? 由于您希望它在每次突发时发生、并且您始终返回到相同的地址、因此不需要使用换行。

    或者我是否误解了问题? 它是否看起来是触发器本身的问题、而不是 DMA 递增/打包地址的方式?

    惠特尼
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我应该提到的是、我实际上没有看到您目前配置 DMA 的方式有什么问题、但我认为如果不按照我的上述方法进行包装、尝试它可能是一个不错的实验。

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

    尊敬的惠特尼:
    感谢您的回应和建议的解决方案。
    "源地址是否看起来没有正确换行?"

    是的、我可以说源地址不会包装到 ADCRESULT0。 现在、我无法识别由于 ADC 或 DMA 而导致的天气? 相关顶部显示的 ADC 和 DMA 配置。  

    "也许您可以禁用换行(将源代码换行大小设置为全1)并使用负源代码传输步骤(-3?)  "
    我通过将 DMA 配置为以下方式来完成此操作

    DMACH1TransferConfig (9、-3、0);
    DMACH1WrapConfig (65535、0、1); 

    在建议的将源代码换行和源代码传输步骤禁用为-3的解决方案之后、其行为与之前相同。 为了更好地理解、我附加了 DMA 缓冲区结果、我们可以在下面看到、ADC 的数据在每次 ADC 的交替触发时(而不是每次触发时)在 DMA 存储器中更新。

    我不确定这是因为 TMS320F28335中的 ADC 架构、还是因为我们可以通过配置 DMA 来实现结果。 我是否误解了任何内容? 希望您能清楚地了解这种情况下的问题? 您是否可以仅运行示例代码和我的更新代码? 如果我不能解释的话,这可能会给人一个清晰的理解。

    谢谢  

    Pritesh

     它是看起来没有正确换行的源地址吗?  

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

    感谢您提供内存快照。 这很有帮助。 您几乎会为每个序列获得两个 DMA 触发器。 你同意吗?

    我需要跟踪 F28335板以尝试您的 ADC 代码、但我确实在另一个板上运行了您的 DMA 代码(在所有 C2000器件上、DMA 几乎都是一样的)、并且它的运行符合我的预期。

    惠特尼

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

    您好 Pritesh、

    您是否能够找到此问题的解决方案?

    编辑:我将关闭该主题、因为我们尚未收到您的回复、但如果您仍需要帮助、请随时发表评论以重新打开。

    惠特尼