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.

[参考译文] MSPM0G3507:设置 ADC DMA -中断?

Guru**** 2394305 points
Other Parts Discussed in Thread: SYSCONFIG

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1499387/mspm0g3507-setting-up-adc-dma---interrupts

器件型号:MSPM0G3507
主题:SysConfig 中讨论的其他器件

工具/软件:

你好。

正在尝试从 ADC 到 SPI 的 DMA ...我想一次执行一次 DMA 64次转换...似乎没有开始。

我已经设置了 below..see snip。

再说一次(来自上一个线程)我对 dma...的中断项感到困惑

DMA 触发器是第一次转换到 MEM0。"MEM0结果加载的中断"..... 但我不想发生中断!?

谢谢

Phil

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

    与另一个线程类似、最好将"中断"寄存器视为路由机制。 同样、DMA_TRIG 组具有这些位的子集。

    我假设您希望对单个通道(至少)进行64次采样、并让 DMA 将它们捕获到一个数组中。 是这样的

    1)传输模式"单",

    2)"固定->块"、

    3)长度(同时用于两个)字(32位)、

    4)源:非增量,目标:增量,

    5)传送大小64(项目)。

    6)"DMA Samples"(DMA 样本计数)适用于 FIFO 使用情况、因此将其设置为=1 [参考 TRM 第 12.2.12.3]小节。

    SysConfig 不会声明您的结果数组(上面的"块")、因此您需要 在代码中调用 DL_DMA_setDestAddr (dma、2、&sample_array[0]);。

    似乎您应该得到一个样本;如何设置"采样模式->触发源"?

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

    感谢您的回复。。

    我想通过 DMA 从 ADC 传输到 SPI ...

    我已通过 SysConfig 设置所有内容、此外还提供:

    DL_DMA_setDestAddr (DMA、DMA_CH2_CHAN_ID、(uint32_t)(&SPI_0_INST->TXDATA));
    ADC 由 GPIO 的外部事件触发...看起来正常。
    我对这里的宽度有点困惑:
    1.我认为 ADC 宽度是两个字节
    2. SPI 宽度为16位
    不确定从 ADC 到 SPI 的映射是否适用于 DMA。
    --
    Phil
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    ADC (MEMRES)寄存器是32位的、即使只定义了16位;将它们读取为32位会使地址增量保持正确(我想您可以使用 STRIDE_2)。

    我很确定您可以获取(源)一个32位字、并将其存储(目标)为16位半字(截断为低半字)。

    我想不出 DMA ADC[MEMRES]->SPI[TXDATA]不会成功的原因、假设您已经确定了时序。

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

    谢谢...仍然不能得到 DMA 启动..我的计划是 DMA 到 SPI 但现在尝试一个阵列.

    我在 sys cfg...see snip 中设置了 DMA。

    奇怪的是 DMA 源地址为零(请参阅寄存器)...我是否必须在代码中显式设置?

    如果是...对于 ADC0..、memres0的地址是什么? (我找不到)

    DL_DMA_setDestAddr (DMA、DMA_CH1_CHAN_ID、(uint32_t)缓冲器);
    DL_DMA_setSrcAddr (DMA、DMA_CH1_CHAN_ID、(uint32_t)???);
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尝试:

    > DL_DMA_setSrcAddr (DMA、DMA_CH1_CHAN_ID、 DL_ADC12_getMemResultAddress (ADC0、 DL_ADC12_MEM_IDX_0));

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

    谢谢...仍然无法启动 DMA ...更多详情:

    从外部事件触发 ADC 转换。

    具体思路是、写入 memres0时会发生 DMA。

    两者都有冲突吗????

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

    我不知道有什么冲突。 您是否相当确定 ADC 正在运行? 您看到 MEMRES0更改了吗?

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

    您好、谢谢。

    如果关闭 DMA 并启用 ADC 中断、我可以看到计数器递增:

    void ADC12_0_INST_IRQHandler (void)
    ADC_COUNT_+;
    }
    当然、只有当我的触发器正常工作时才会发生这种 情况...(来自 GPIO 事件)。
    但是,计数只能达到一个,尽管有六十四个触发器。
    我已按照下面的中所示设置 ADC。
    对于触发模式(以粉色标记)...由于我只有一个内存、因此我使用的内容是否重要?
    谢谢
    Phil
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您似乎尚未设置"启用重复模式"复选框。 触发器模式对于重复+单次触发很重要、您需要"有效触发器将步进"。 您选择的选项[Ref TRM 第12.2.10]节。

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

    您好、谢谢您修复了它。

    DMA 正在工作、但正在提前终止 -执行十六个事务、而不是六十四个。

    我在 CH1上有 ADC DMA:

    这两者之间的区别是什么?

    DL_DMA_enableChannel (DMA、DMA_CH1_CHAN_ID);
    DL_ADC12_enableDMA (ADC12_0_INST);
    是否需要两者?
    此致
    Phil
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    DL_ADC12_enableDMA ()允许 ADC12发出 DMA 请求(到 DMA 通道)[CTL2:DMAEN]。  

    DL_DMA_enableChannel()允许 DMA 通道运行、即接受 DMA 请求[DMACTL:DMAEN]。

    您如何判断只有16笔交易? [DMASZ 与 POCI 的示波器跟踪?]

    您是否仍在直接从 ADC12 [MEMRES]运行 DMA 到 SPI [TXDATA]、或者是否使用中间缓冲器? 如果是前者、如果时间安排不当、FIFO 溢出似乎是可能的。

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

    明白了、谢谢。

    如果我查看逻辑分析仪、可以看到(我在每个 DMA 上切换一个引脚)

    while ((DL_DMA_isChannelEnabled (DMA、DMA_CH1_CHAN_ID)==true))
    ;
    等待七个 DMA、然后退出。
    我的理解是、在此模式下、一旦 DMA 完成、通道为 disabled...below、即到 SPI TX 的 ADC0 DMA (memres0)
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    此外...如果我设置了大小然后设置断点、则 DMA_DMASZ 不会设置????

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

    事实上,似乎也不能启用它???? 螺母...

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

     在启用通道之前设置传输大小。  

    1)启用 DMASZ=0的通道会立即完成。 (我认为这就是您在上面观察到的。)

    2)我怀疑在通道启用时 DMASZ (以及其他)为只读状态。 [有一天我尝试在 TRM 中找到这一点、但没有。 这基于与 MSP430 DMA 的相似性。]

    您如何在每次转账上切换 PIN? 我仍然想知道您是否超出(SPI) FIFO。

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

    谢谢...我可能会直接放弃 DMA ADC 到 SPI ...对我来说有太多问题。

    我想要速度、但可能必须执行 DMA ADC 来缓冲、然后将 DMA 缓冲器缓冲到 SPI。

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

    根据 DMA 触发的来源、流控制也来自

    A) Tx FIFO (可用空间)或

    B) ADC (数据已就绪)

    但不能同时使用。

    在某些时候、主器件最终 处于 通过 GPIO 触发器和 起搏 SPI (请求)帧远程对流控制进行微管理的位置。 使用 中间(速度匹配)缓冲器、它只需唤醒 GPIO 64次、然后在突发中读取结果。

    我(个人)会支付128B、所以我不必担心。

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

    再次感谢...图片下面试图解释我试图做什么.

    CCK 通过事件(正边沿和负边沿)从 MOSI 复制到驱动部分系统(由于各种原因、我无法使用物理多路复用器)。

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

    当 DMA 停止时、DMASZ=0吗? 这将区分失速是 DMA 还是 ADC (或其他)。

    您似乎已经计算了 (ADC 与 MOSI)时序、但它"应该"起作用。  一个实验是减慢 SPI (SCK)、看看是否将其切得太近[我已经看到了在繁忙期间触发 ADC 时 ADC 会起到作用的系统]。

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

    尊敬的 Phil:

    实际上似乎也无法启用它??? 正在运转的螺母.

     启用重复模式时、DMA 具有用于其通道配置的临时寄存器:

    而且、SPI 只有四个 FIFO 条目、使用 MOSI 触发 ADC 可能会导致 SPI FIFO 溢出并随机丢失数据。

    若要检查 DMA 是否完成、也许您可以检查 ADC 中断寄存器.RIS 并查看 DMA 完成是否置为有效。

    B.R.

    Sal