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.

请教28335里ADC启动DMA的问题.



Controlsuite中关于28335的例程里面,有一个adc_dma的例子

其中主程序Example_2833xAdcToDMA.c有一段软件启动ADC然后用DMA传输数据的程序.

// Start SEQ1
AdcRegs.ADCTRL2.bit.SOC_SEQ1 = 0x1;
for(i=0;i<10;i++){
for(j=0;j<1000;j++){}
AdcRegs.ADCTRL2.bit.SOC_SEQ1 = 1; //Normally ADC will be tied to ePWM, or timed routine
} //For this example will re-start manually

请问为什么SEQ1的启动语句要在循环里面执行了10次?

是不是在程序里单独运行一次  AdcRegs.ADCTRL2.bit.SOC_SEQ1 = 1;  可能启动不了ADC?

我现在的程序用两个DMA通道分别传输SEQ1,SEQ2就碰到启动不了ADC的问题.

  • 再说一下我的问题:

    我现在需要AD对AIN0A和AIN0B,AIN1A和AIN1B两组信号分别进行同步的连续采样,速率5X2MSPS分别生成2个队列,SEQ1通过DMA的CH1进行传输,SEQ2通过DMA的CH2进行传输到一个数组

    ADC设置如下:

    void Adc_SetA(Uint16 ADC_SHCLK, Uint16 ADC_CKPS)
    {
    // ADC setup for Adc_Set()
    AdcRegs.ADCTRL1.bit.CPS = 0; // no core pre scale
    AdcRegs.ADCTRL1.bit.ACQ_PS = ADC_SHCLK; // Simultaneous: Sample rate = 1/[(3+ACQ_PS)*ADC clock in ns]
    // = 1/(5*40ns) =5MHz
    // If Simultaneous mode enabled: Sample rate = 1/[(3+ACQ_PS)*ADC clock in ns]
    AdcRegs.ADCTRL3.bit.ADCCLKPS = ADC_CKPS;
    AdcRegs.ADCTRL3.bit.SMODE_SEL = 1; // Enable Simultaneous mode同步采样
    AdcRegs.ADCTRL1.bit.SEQ_CASC = 0; // 1 Cascaded mode
    AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x0;

    AdcRegs.ADCTRL1.bit.CONT_RUN = 1; // Setup continuous run
    AdcRegs.ADCTRL1.bit.SEQ_OVRD = 0; // Enable Sequencer override feature
    AdcRegs.ADCREFSEL.bit.REF_SEL = 2; //external reference 1.500V on ADCREFIN
    AdcRegs.ADCOFFTRIM.bit.OFFSET_TRIM = 0; //offset trim value

    AdcRegs.ADCTRL2.bit.INT_MOD_SEQ1 = 0; //INT_SEQ1 is set at the end of SEQ1
    AdcRegs.ADCTRL2.bit.INT_MOD_SEQ2 = 0; //INT_SEQ2 is set at the end of SEQ1
    AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 0x1; //Enable SEQ1 interrupt
    AdcRegs.ADCTRL2.bit.INT_ENA_SEQ2 = 0x1; //Enable SEQ2 interrupt

    AdcRegs.ADCMAXCONV.bit.MAX_CONV1 = 7; // convert and store in 8 results registers
    AdcRegs.ADCMAXCONV.bit.MAX_CONV2 = 7;

    AdcRegs.ADCCHSELSEQ1.all = 0x1010; // Initialize all ADC channel selects to A0
    AdcRegs.ADCCHSELSEQ2.all = 0x1010;
    AdcRegs.ADCCHSELSEQ3.all = 0x1010;
    AdcRegs.ADCCHSELSEQ4.all = 0x1010;
    }

    首先打开DMACH1和DMACH2,然后用

    AdcRegs.ADCTRL2.all |= 0x2000;启动SEQ1时,ADC和DMA工作正常

    AdcRegs.ADCTRL2.all |= 0x0020;启动SEQ2时,ADC和DMA工作正常

    但是用

    AdcRegs.ADCTRL2.all |= 0x2020;同时启动SEQ1和SEQ2时,就只有SEQ1工作了,SEQ2根本没有启动

    我把下面这项设置

    AdcRegs.ADCTRL1.bit.SEQ_CASC = 0; // 1 Cascaded mode

    改成1后,ADC的16个ADCRESULT倒是都存了数据,但是DMACH2好像没有启动,内存数组里只有前8个采样数据.

    请问如何设置能让两个队列同时工作?

    以上设置的主要原因是我需要连续稳定的采样数据,采样间隔一致,中间不能丢数.

  • 再说简单点,就是ADC在连续,同步采样模式下,怎么让队列在ADCRESULT7处产生SEQ1中断,在ADCRESULT15处产生SEQ2中断.

  • 您好

    你的代码中AdcRegs.ADCTRL1.bit.CONT_RUN = 1; // Setup continuous run用了连续采样的模式。所以Sequencer 1一旦开始就停不下来。Sequencer 2没有机会去采样。


  • 多谢指教,那么在连续采样模式下,没法设置成Sequencer1和Sequencer2交替(或者说轮流)工作?