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 对4个通道进行采样、并通过 DMA 进行读取

Guru**** 2463330 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1476050/mspm0g3507-adc-sample-4-channels-and-read-via-dma

器件型号:MSPM0G3507

工具与软件:

您好!

我有 mspsm0g 的 Launchpad。
我希望使用10位数据将来自4个通道的数据采样到环形缓冲器(uint16)中。 我将 mem0设置为3.3V、并在 GND 上设置 MEM1-3。 所以我做的是:
1) 1)配置传输大小> 0 (本例中为60)
2) 2)配置 DMA 样本数= 6 (= 12 x 16位)->总共60*12 = 720个样本
3) 3)在加载 MEM11结果时的 DMA 触发
4) 4)在  DL_ADC12_IIDX_DMA_DONE 上、我设置下一个地址并重新启用 DMA (DMA 单模式-如乒乓示例)

当达到 ADC 输入时(在 DL_ADC12_IIDX_DMA_DONE 上)、我只会看到写入缓冲区的值~120。

这些值如300,1020、0、0,300,1020、0、0。

我将扩展1020、0、0、0、0、10、20、0、0、以此类推

问题:

1) 1)是否有适合我的用例的示例? 我已经看了 ADC 乒乓示例(单通道)
2) 2)在配置了单次传输或 ALLE 传输后、何时触发 DL_ADC12_IIDX_DMA_DONE?

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

    尊敬的 Kai:

    请分享整个 DMA 设置 屏幕截图,我想再次检查它的设置。

    [报价 userid="642874" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1476050/mspm0g3507-adc-sample-4-channels-and-read-via-dma ]4)在  DL_ADC12_IIDX_DMA_DONE 上我设置下一个地址并重新启用 DMA (DMA 单模式—如乒乓示例)
    [报价]

    为什么不首先检查 transfer size =1 /2、查看输出是否正确。

    Unknown 说:
    2)何时触发 DL_ADC12_IIDX_DMA_DONE?何时在配置了单次传输或 ALLE 传输之后?

    在传输大小递减到0后将触发它。

    B.R.

    SAL

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

    请查看下面的屏幕截图和一些已删除的代码以了解我正在执行的操作。

    对我原来的帖子进行了更新:"错误"值(300)消失了、但当我在 DMA 中断后第一次中断时、mem0仍然不是第一个条目。

    关于传输大小、我注意到将传输大小设置为缓冲区大小的一半、我得到了一个已填充的缓冲区、但顺序似乎仍然错误。 由于这意味着我的 DMA 样本计数为1、我在 main ()中添加了 sampls 计数的显式设置、仍然是相同的结果。 是否忽略了 DMA 采样计数?



    int main(void) {
    
      SYSCFG_DL_init();
    
      /* Configure DMA source, destination and size */
      DL_ADC12_setDMASamplesCnt(ADC12_0_INST,6);
      DL_DMA_setSrcAddr(DMA, DMA_CH0_CHAN_ID, (uint32_t)DL_ADC12_getFIFOAddress(ADC12_0_INST));
      DL_DMA_setDestAddr(DMA, DMA_CH0_CHAN_ID, (uint32_t)pool.getNext());
      DL_DMA_setTransferSize(DMA, DMA_CH0_CHAN_ID, transferSize); 
      DL_DMA_enableChannel(DMA, DMA_CH0_CHAN_ID);
    
      /* Setup interrupts on device */
      NVIC_EnableIRQ(ADC12_0_INST_INT_IRQN);
      
      /* The ADC is configured for Repeat Single Conversion,
       * so the ADC will continue until DL_ADC12_disableConversions() is called */
      DL_ADC12_startConversion(ADC12_0_INST);
    
      while (true) {
        // Check if the currently configured buffer is full
        if(g_adcBufferFilled){
            auto ptr = // get next prt code;
            DL_DMA_setSrcAddr(DMA, DMA_CH0_CHAN_ID, DL_ADC12_getFIFOAddress(ADC12_0_INST));
            DL_DMA_setDestAddr(DMA, DMA_CH0_CHAN_ID, reinterpret_cast<uint32_t>(ptr));
            DL_DMA_setTransferSize(DMA, DMA_CH0_CHAN_ID, transferSize); 
            DL_DMA_enableChannel(DMA, DMA_CH0_CHAN_ID);
            DL_ADC12_enableDMA(ADC12_0_INST);
            g_adcBufferFilled = false;
        }
    }
    
    extern "C" void ADC12_0_INST_IRQHandler() {
        const auto pendingInt = DL_ADC12_getPendingInterrupt(ADC12_0_INST);
        switch (pendingInt) {
            case DL_ADC12_IIDX_DMA_DONE:
            {
                g_adcBufferFilled = true;
                break;
            }
            default:
            break;
    }

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

    尊敬的 Kai:

    查看下面的屏幕截图和我正在执行的操作的一些精简代码。

    错误信息:

    您需要将 DMA 触发器设置为 MEMRES11。

    我注意到将传输大小设置为缓冲区大小的一半

    正确。 您启用了 FIFO、FIFO 数据是32位的、它在一个数据中包含两个采样结果(高16位和低16位)。

    您需要在软件中手动处理该数据、或者您需要选择 16位源/目标长度。

    B.R.

    SAL

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

    您好!

    您需要将 DMA 触发器设置为 MEMRES11.

    我摆弄了它、因为我进行了1.2MHz 采样(总体-每通道400kHz)、我看到过我们的 DMA 太慢、需要他提前触发。

    因此、样本总数不是使用计算的

    Samples = TransferSize * DMA Samples Count * 2

    它很简单

    样本=传输大小* 2.

    那么、您需要何时设置 DMA 样本计数?

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

    另一个更新:
    我更改了 ADC 乒乓示例、这样它能与我想要的功能相匹配、就能提供我想要的结果。

    我比较了 syscfg 文件、与我的项目没有区别。 唯一的区别是我的项目在 C++中。

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

    尊敬的 Kai:

    [报价 userid="642874" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1476050/mspm0g3507-adc-sample-4-channels-and-read-via-dma/5672220 #5672220"]由于我有1.2MHz 的采样(总体-每通道400kHz)、我已经看到过我们的 DMA 太慢、需要他提前触发的帖子。

    好的、因为我们需要传输鱼体10数据、然后传输最后两个数据、所以可以这样做。

    您什么时候需要设置 DMA 样本数?

    对于16位传输长度、您需要将 采样计数设置为12。

    传输大小是决定要传输总共12个通道数据的次数的变量。

    我比较了 syscfg 文件、与我的项目没有区别。 唯一的区别是我的项目在 c++中。

    不知道在这里。

    B.R.

    SAL

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    传输大小是一个变量、用于确定您要传输总共12个通道数据的次数。

    如果将"Transfer Size (传输大小)"设置为缓冲区的一半、则情况并非如此、对吧?

    样本计数以触发事件(加载 memresx)后的 DMA 触发数为准。 待发送数目随每次触发递减。 FIFO 模式下的1次传输- 1次传输- 2次采样。

    我想,我能明白我的想法。 我在一个结构中具有缓冲区、该结构还具有一个布尔标志作为成员。 这会导致对齐问题。

    我的错

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

    尊敬的 Kai:

    示例计数 ist 触发事件后的 DMA 触发次数(已加载 memresx)。 每次触发后、传输数据大小都会递减。[/QUOT]

    是的、这是正确的。

    我的声明是:

    由于您将"样本数"设置为6、因此它将按您的预期包含32位传输长度的12个转换数据。

    在这种情况下、传输大小意味着"您希望传输总共12个通道的数据的次数"。  

    我很高兴您找到了这些问题、我将关闭该主题。

    B.R.

    SAL