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.

[参考译文] TMS320F28377D:有关 ADC ex6 soc 连续 DMA 示例的混淆

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1589621/tms320f28377d-confusion-on-adc-ex6-soc-continuous-dma-example

器件型号: TMS320F28377D

尊敬的专家:  

我对 ADC ex6 soc 连续 DMA 示例有一些限制。

首先介绍 ADCA 触发。

SCO0 似乎由 PWM 触发、SOC 的其余部分由软件触发。

    //
    // Configure SOCs channel no. & acquisition window.
    // Trigger SCO0 from EPWM2SOCA.
    // Trigger all other SOCs from INT1 (EOC on SOC0).
    //
    ADC_setupSOC(adcBase, ADC_SOC_NUMBER0, ADC_TRIGGER_EPWM2_SOCA,
                 (ADC_Channel)channel, acqps);
    ADC_setupSOC(adcBase, ADC_SOC_NUMBER1, ADC_TRIGGER_SW_ONLY,
                 (ADC_Channel)channel, acqps);
    ADC_setupSOC(adcBase, ADC_SOC_NUMBER2, ADC_TRIGGER_SW_ONLY,
                 (ADC_Channel)channel, acqps);
    ADC_setupSOC(adcBase, ADC_SOC_NUMBER3, ADC_TRIGGER_SW_ONLY,
                 (ADC_Channel)channel, acqps);
    ADC_setupSOC(adcBase, ADC_SOC_NUMBER4, ADC_TRIGGER_SW_ONLY,
                 (ADC_Channel)channel, acqps);
    ADC_setupSOC(adcBase, ADC_SOC_NUMBER5, ADC_TRIGGER_SW_ONLY,
                 (ADC_Channel)channel, acqps);
    ADC_setupSOC(adcBase, ADC_SOC_NUMBER6, ADC_TRIGGER_SW_ONLY,
                 (ADC_Channel)channel, acqps);
    ADC_setupSOC(adcBase, ADC_SOC_NUMBER7, ADC_TRIGGER_SW_ONLY,
                 (ADC_Channel)channel, acqps);
    ADC_setupSOC(adcBase, ADC_SOC_NUMBER8, ADC_TRIGGER_SW_ONLY,
                 (ADC_Channel)channel, acqps);
    ADC_setupSOC(adcBase, ADC_SOC_NUMBER9, ADC_TRIGGER_SW_ONLY,
                 (ADC_Channel)channel, acqps);
    ADC_setupSOC(adcBase, ADC_SOC_NUMBER10, ADC_TRIGGER_SW_ONLY,
                 (ADC_Channel)channel, acqps);
    ADC_setupSOC(adcBase, ADC_SOC_NUMBER11, ADC_TRIGGER_SW_ONLY,
                 (ADC_Channel)channel, acqps);
    ADC_setupSOC(adcBase, ADC_SOC_NUMBER12, ADC_TRIGGER_SW_ONLY,
                 (ADC_Channel)channel, acqps);
    ADC_setupSOC(adcBase, ADC_SOC_NUMBER13, ADC_TRIGGER_SW_ONLY,
                 (ADC_Channel)channel, acqps);
    ADC_setupSOC(adcBase, ADC_SOC_NUMBER14, ADC_TRIGGER_SW_ONLY,
                 (ADC_Channel)channel, acqps);
    ADC_setupSOC(adcBase, ADC_SOC_NUMBER15, ADC_TRIGGER_SW_ONLY,
                 (ADC_Channel)channel, acqps);

在注释中、我假设这些 SOC 由 ISR 中的 SW 触发、但是我在 ADC ISR 中没有看到 ADC 触发  

//
// adcA1ISR - This is called after the very first conversion and will disable
//             the ePWM SOC to avoid re-triggering problems.
//
#pragma CODE_SECTION(adcA1ISR, ".TI.ramfunc");
__interrupt void adcA1ISR(void)
{
    //
    // Remove ePWM trigger
    //
    EPWM_disableADCTrigger(EPWM2_BASE, EPWM_SOC_A);

    //
    // Disable this interrupt from happening again
    //
    Interrupt_disable(INT_ADCA1);

    //
    // Acknowledge interrupt
    //
    Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP1);
}

那么、SOC1-SOC15 是如何触发的呢?

 

第二种方法是 DMA。 配置如下所示:

    DMA_configAddresses(DMA_CH1_BASE, (uint16_t *)&adcADataBuffer,
                        (uint16_t *)ADCARESULT_BASE);

    //
    // Perform enough 16-word bursts to fill the results buffer. Data will be
    // transferred 32 bits at a time hence the address steps below.
    //
    DMA_configBurst(DMA_CH1_BASE, 16, 2, 2);
    DMA_configTransfer(DMA_CH1_BASE, (RESULTS_BUFFER_SIZE >> 4), -14, 2);
    DMA_configMode(DMA_CH1_BASE, DMA_TRIGGER_ADCA2,
                   (DMA_CFG_ONESHOT_DISABLE | DMA_CFG_CONTINUOUS_DISABLE |
                    DMA_CFG_SIZE_32BIT));

从 src_addr 和 dest_addr 中、我假设此 DMA 将 ADC 结果寄存器与缓冲区相匹配。 ADC 结果寄存器为 16 位*16 (result0-result15)、但字长设置为 32 位、Brust 大小为 16、在每个 Brust 中、src_addr 将覆盖 32 位*16 的范围、这与 ADC 结果长度不对齐。

传递步骤也会令人困惑。 在每个突发中、src_addr 向前移动 (16-1)*2 = 30、如果我们要在每次突发后将 src_addr 复位为 ADC 结果 t0、则应将 transfer_step 设置为–30、对吧? 但在示例中设置为–14。 我想不出为什么它设置为–14。

您能帮助澄清上述混淆吗?

此致、

挂起

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

    您好


    我正在努力。 我将在几天后作出答复。

    谢谢你  

    Amir Hussain

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

    您好

    您是对的。 SoC 配置为从 SW 触发、但不提供 SW 命令来触发 SoC。 因此、它基本上不是由 SW 触发的。 其余 SoC 由 ADCINT2 触发(请参阅代码中的第 196-199 行)。 该中断会执行 SoC 的连续转换。 另请参阅 TRM 的第 1591 页。

    谢谢你  

    Amir Hussain

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

    您好 Hang、

    该专家目前已离职、将在本周返回时立即联系您。 请期待回复延迟、谢谢。

    此致、

    Aishwarya

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

    您好 Hang、

    在示例中回答您有关 DMA 的问题:

    尽管采用 16 位或 32 位配置、突发大小实际上始终以 16 位字为单位、请参阅下面的一些 TRM 寄存器说明:

    因此、16 是为突发大小选择的正确值。  示例使用 32 位设置、因此 每次突发将是 32 位(2 个 ADCRESULT 寄存器)的数据。 这就是 src 和目标突发阶跃的阶跃都为 2 的原因。 在完整传输结束时(所有 16 * 16 位寄存器都已复制完毕)、我们想回到开头、因此我们将 SRC 指针递减 14(移回 14 个 ADC 结果寄存器地址)。

    基本上、指针算术/步长与 MODE.DATASIZE 选择的任何值相关联。 而突发和传输大小始终基于 16 位值的数量。 如果这是合理的,请支持投票。

    此致、

    Delaney