TI E2E™ 设计支持论坛将于 5 月 30 日至 6 月 1 日进行维护。如果您在此期间需要技术支持,请联系 TI 的客户支持中心寻求帮助。

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.

[参考译文] CCS/TMS320F28377D:28377 ADC 至 DMA 配置

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/840935/ccs-tms320f28377d-28377-adc-to-dma-configure

器件型号:TMS320F28377D
主题中讨论的其他器件:C2000WARE

工具/软件:Code Composer Studio

我想将 ADCIN0~ADCIN3配置为对电流进行采样、并使用 DMACH1将 ADCResult 移动到数据库。 我的问题如下所示、这让我困惑了几天。

我在 adcISR 中读取 ADCResult、但无法获取数据。

2. dmaISR 只输入一次。

有人有一个相对示例?  

非常感谢。

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

    您好!

    希望您已在 \C2000Ware_X_XX_XX_XX\driverlib\f2837xd\examples\cpu1\adc 中引用示例

    或 ADC 示例、位于 \C2000Ware_X_XX_XX\device_support\f2837xd\examples\CPU1

    谢谢、

    Katta

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

    是的、我参考了该示例。

    C:\ti\C2000Ware_2_00_00_02_Software\device_support\f2837xd\examples\CPU1\ADC_SoC_Continuous_DMA

    下面是我的 adTask 代码。 请帮助检查问题所在。

    如果我注释四条红线代码、adcISR 只会触发一次、我可以获取 ADC 值。

    但是、如果我取消注释这四条红线、adcISR 可以重新触发、数据为零、而 dmaISR 只会触发一次

    uint16结果[40];
    #pragma CODE_SECTION (AdcResults、".TI.ramfunc");
    void adca1ISR (void)

    AdcaResult[0]= AdcaResultRegs.ADCRESULT0;
    AdcaResult[1]= AdcaResultRegs.ADCRESULT1;
    AdcaResult[2]= AdcaResultRegs.ADCRESULT2;
    AdcaResult[3]=AdcaResultRegs.ADCRESULT3;
    AdcaResults[4]= AdcaResultRegs.ADCRESULT4;
    PieCtrlRegs.PIEACX.ALL = PIEACK_Group1;

    void dma1ISR (void)

    EALLOW;
    //清除任何杂散标志:
    DmaRegs.ch1.control.bit.PERINTCLR = 1;//清除任何寄生中断标志
    DmaRegs.CH1.control.bit.ERRCLR = 1;//清除任何伪同步错误标志
    DmaRegs.CH1.control.bit.RUNSTS = 1;
    EDIS;

    PieCtrlRegs.PIEACX.ALL = PIEACK_group7;

    空配置 ADC (空)

    EALLOW;
    AdcaRegs.ADCCTL2.bit.prescale = 6;//将 ADCCLK 分频器设置为/4
    AdcSetMode (ADC_ADCA、ADC_resolution_12位、ADC_SIGNALMODE_SINGLE);
    AdcaRegs.ADCCTL1.bit.INTPULSEPOS = 1;//在传输完成后设置 ADC 中断
    AdcaRegs.ADCCTL1.bit.ADCPWDNZ = 1;
    延迟(1000);
    EDIS;

    //设置 ADC 在一个通道上连续转换
    void SetupADCContinu模糊(void)

    uint16 acqps;

    //根据分辨率确定最小采集窗口(在 SYSCLKS 中)
    if (adc_resolution_12bit = AdcaRegs.ADCCTL2.bit.resolution){
    acqps = 14;//75ns

    否则{//分辨率为16位
    acqps = 63;//320ns

    EALLOW;
    AdcaRegs.ADCSOC0CTL.bit.CHSEL = 0;/SOC 将在通道上转换
    AdcaRegs.ADCSOC1CTL.bit.CHSEL = 1;//SOC 将在通道上转换
    AdcaRegs.ADCSOC2CTL.bit.CHSEL = 2;/SOC 将在通道上进行转换
    AdcaRegs.ADCSOC3CTL.bit.CHSEL = 3;/SOC 将在通道上进行转换
    AdcaRegs.ADCSOC0CTL.bit.ACQPS = acqps;//采样窗口为 acqps + 1个 SYSCLK 周期
    AdcaRegs.ADCSOC1CTL.bit.ACQPS = acqps;//采样窗口为 acqps + 1个 SYSCLK 周期
    AdcaRegs.ADCSOC2CTL.bit.ACQPS = acqps;//采样窗口为 acqps + 1个 SYSCLK 周期
    AdcaRegs.ADCSOC3CTL.bit.ACQPS = acqps;//采样窗口为 acqps + 1个 SYSCLK 周期
    AdcaRegs.ADCINTSEL1N2.bit.INT1CONT = 1;无论标志位是否被清零、只要一个 EOC 脉冲被生成、就会产生//ADCINT1脉冲
    AdcaRegs.ADCINTSEL1N2.bit.INT1SEL = 3;// SOC3结束将设置 INT1标志
    AdcaRegs.ADCINTSEL1N2.bit.INT1E = 1;//启用 INT1标志
    AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;//确保 INT1标志被清除
    AdcaRegs.ADCINTSOCSEL1.bit.SOC0 = 1;
    AdcaRegs.ADCINTSOCSEL1.bit.SOC1 = 1;
    AdcaRegs.ADCINTSOCSEL1.bit.SOC2 = 1;
    AdcaRegs.ADCINTSOCSEL1.bit.SOC3 = 1;
    EDIS;

    void adcTaskInit (void)

    Hwi_Params HwiParams;
    hwi_handle dma1Hwi;
    ERROR_Block EB;

    ERROR_INIT (&EB);
    Hwi_Params_init (hwiParams);

    Hwi_handle adcahwi;
    adcaHwi = hwi_create (32、adca1ISR、&hwiParams、&EB);
    if (adcahwi =空)
    system_abort ("Hwi 创建失败");
    dma1Hwi = hwi_create (80、dma1ISR、&hwiParams、&EB);
    if (dma1Hwi =空)
    system_abort ("Hwi 创建失败");

    //配置 ADC 并为其加电
    ConfigureADC();

    //Setup the ADC for continuous Conversions on channel 0
    SetupADCContinuime();

    //初始化结果缓冲区
    memset (AdcResults、0、40);
    Hwi_enableInterrupt (32);
    Hwi_enableInterrupt (80);


    空 DMAInit (空)

    DMAInitialize();
    DMACH1AddrConfig (AdcaResults、&AdcaResultRegs.ADCRESULT0);
    DMACH1BurstConfig (3、1、1);
    DMACH1TransferConfig (9、-3、1);
    DMACH1WrapConfig (100、1、100、1);
    DMACH1ModeConfig (
    DMA_ADCAINT1、
    PERINT_ENABLE、
    OneShot_disable、
    CONT_DISABLE、
    //CONT_ENABLE、
    SYNC_DISABLE、
    SYNC_SRC、
    OVRFLOW_DISABLE、
    //32位、
    16位、
    Chint_end、
    Chint_enable
    );

    void adcTaskFxn (void)

    adcTaskInit();
    DMAInit();
    StartDMACH1();
    AdcaRegs.ADCSOCFRC1.ALL = 0x000F;

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

    ADCRESULT 寄存器中的数据为零还是由于传输未触发而在 DMA 目标缓冲区中仅为零? 我正在尝试弄清楚哪个部分被破坏了- ADC 转换或 DMA 传输。 您能澄清一下吗? 如果注释掉所有 DMA 代码、ADC 是否按预期工作?

    .TI.ramfunc 用于需要从 RAM 中执行的函数、因此将 AdcResults 放在那里有点奇怪。 我不确定这一定会成为一个问题、只要它位于 DMA 可访问的存储器区域中、但这是需要注意的问题。

    惠特尼

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

    ADC 和 DMA 似乎都异常。

    首先、介绍 ADC。 我将 DMA 排除在任务之外。

    条件1。 取消注释四条红线、adcaISR 周期输入、我将数据传输到 AdcaResults、数据值为零。 这是异常的。

    void adca1ISR (void)

    AdcaResult[0]= AdcaResultRegs.ADCRESULT0;
    AdcaResult[1]= AdcaResultRegs.ADCRESULT1;
    AdcaResult[2]= AdcaResultRegs.ADCRESULT2;
    AdcaResult[3]=AdcaResultRegs.ADCRESULT3;
    AdcaResults[4]= AdcaResultRegs.ADCRESULT4;
    PieCtrlRegs.PIEACX.ALL = PIEACK_Group1;
    }。

    条件2。 注释 四条红线、adcaISR 只输入一次。 数据是正确的。 这似乎是第一次进行 ADC 转换。

    好的、关于 DMA。

    我在任务中包含 DMA、根据上述条件1、dmaISR 只进入一次、为什么 DMA 只进入三次触发一次? 请帮助检查 DMA 配置。

    谢谢。

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

    条件2是合理的。 由于禁用了再次触发 SOC 的功能、因此您不会再收到任何中断。 我在您的代码中看不到任何东西会解释为什么条件1会导致数据为零-除了触发源之外、所有设置都是相同的。

    ADC_SoC_Continuous_DMA 示例是否适用于您的硬件?

    惠特尼