Part Number:TMS320F28379DOther Parts Discussed in Thread:C2000WARE
您好!
我配置了ADCA的SOC0和ADCB的SOC0来进行同步采样,用DMA进行数据的搬移,目前遇到一个问题:只有一个数据被搬移了,而我需要采样32个数据
配置的代码如下:
#pragma DATA_SECTION(AdcaDataU, "ramgs0"); #pragma DATA_SECTION(AdcbDataI, "ramgs0"); Uint16 AdcaDataU[RESULTS_BUFFER_SIZE] = {100}; // 电压采样值 Uint16 AdcbDataI[RESULTS_BUFFER_SIZE] = {100}; // 电流采样值 // ADCINA0、1-->电压U // ADCINB2、3-->电流I void Adc_Init() {EALLOW;// Write prescale configurations// ADC max clock == 50MHzAdcaRegs.ADCCTL2.bit.PRESCALE = 6; // Set ADCCLK divider to /4AdcbRegs.ADCCTL2.bit.PRESCALE = 6; // set ADCCLK divider to /4// Set mode(16位差分输入)AdcSetMode(ADC_ADCA, ADC_RESOLUTION_16BIT, ADC_SIGNALMODE_DIFFERENTIAL);AdcSetMode(ADC_ADCB, ADC_RESOLUTION_16BIT, ADC_SIGNALMODE_DIFFERENTIAL);// SOC0 will convert ADCINA0/A1(ADC_CHANNEL_0/ADC_CHANNEL_1)AdcaRegs.ADCSOC0CTL.bit.CHSEL = ADC_CHANNEL_0;AdcaRegs.ADCSOC0CTL.bit.TRIGSEL = 5; // 配置EPWM1A触发AdcaRegs.ADCSOC0CTL.bit.ACQPS = 39;// 采样时间40 ADC Clock Cycles, (39 ACQPS plus 1)AdcaRegs.ADCCTL1.bit.INTPULSEPOS = 1; // Set pulse positions to late////////////////////ADC中断设置////////////////////AdcaRegs.ADCINTSEL1N2.bit.INT1SEL = 0; //end of SOC0 will set INT1 flagAdcaRegs.ADCINTSEL1N2.bit.INT1E = 1;//enable INT1 flagAdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1; //make sure INT1 flag is cleared// SOC0 will convert ADCINB2/B3(ADC_CHANNEL_2/ADC_CHANNEL_3)AdcbRegs.ADCSOC0CTL.bit.CHSEL = ADC_CHANNEL_2;AdcbRegs.ADCSOC0CTL.bit.TRIGSEL = 5; // 配置EPWM1A触发AdcbRegs.ADCSOC0CTL.bit.ACQPS = 39;// 采样时间40 ADC Clock Cycles, (39 ACQPS plus 1)AdcbRegs.ADCCTL1.bit.INTPULSEPOS = 1;AdcaRegs.ADCCTL1.bit.ADCPWDNZ = 1; // Power up the ADCAdcbRegs.ADCCTL1.bit.ADCPWDNZ = 1;EDIS;// Delay for 1ms to allow ADCs time to power upDELAY_US(1000);///////////////////////// DMA配置 ///////////////////////// DMAInitialize - This function initializes the DMA to a known state.DMAInitialize();// DMA1// 配置目标地址和源地址DMACH1AddrConfig(AdcaDataU, &AdcaResultRegs.ADCRESULT0);// 每次burst配置成传输1个16bit word,每个word传输完成后,源地址和目标地址都递增0DMACH1BurstConfig(0, 0, 0);//每次Teransfer传输RESULTS_BUFFER_SIZE-1个burst,每次burst传输完成后源地址和目标地址递增1DMACH1TransferConfig((RESULTS_BUFFER_SIZE - 1),1, 1);DMACH1ModeConfig(DMA_ADCAINT1,// Source selectPERINT_ENABLE,// Peripheral interrupt enableONESHOT_DISABLE, // Oneshot diaableCONT_ENABLE,// Continuous enableSYNC_DISABLE,SYNC_SRC,OVRFLOW_DISABLE, // Disable the overflow interruptSIXTEEN_BIT,// 16-bit data size transfersCHINT_END,// Generate interrupt to CPU at end of transferCHINT_DISABLE// Channel Interrupt to CPU disable);// DMA2DMACH2AddrConfig(AdcbDataI, &AdcbResultRegs.ADCRESULT0);DMACH2BurstConfig(0, 0, 0);DMACH2TransferConfig((RESULTS_BUFFER_SIZE - 1), 1, 1);DMACH2ModeConfig(DMA_ADCAINT1,PERINT_ENABLE,ONESHOT_DISABLE,CONT_ENABLE,SYNC_DISABLE,SYNC_SRC,OVRFLOW_DISABLE,SIXTEEN_BIT,CHINT_END,CHINT_ENABLE);// ADC采样触发(EPWM1SOCA)EALLOW;EPwm1Regs.ETSEL.bit.SOCASEL = ET_CTR_ZERO;EPwm1Regs.ETSEL.bit.SOCAEN = 1;// Enable SOC on A groupEPwm1Regs.ETPS.bit.SOCAPRD = ET_1ST; // Generate pulse on 1st eventEDIS;// Start DMAStartDMACH1();StartDMACH2(); } void dmach2_isr(void) {while(1){__asm(" NOP");}//PieCtrlRegs.PIEACK.all = PIEACK_GROUP7; }
通过调试发现只有第一次的采样结果正确的保存了,如下所示:
我猜是第一次采样后ADC产生中断标志位后,再触发了DMA的数据转移,一个burst后,由于中断的标志位没有给清除,就没进行下次的数据转移了??
我现在的问题就是:怎么样能够再每次的ADC中断后触发后产生DMA的数据搬移呢?
感谢您的回答!
Green Deng:
你好,你的采样似乎是单次模式的?
程序里面没看到ADC中断是怎么配置的,方便的话页给出一下
,
user6311038:
您好,我有配置ADC中断(上面代码的25-28行),但是没有使能adc的PIE中断(没有中断服务函数)。
,
user6311038:
user6311038 说:我猜是第一次采样后ADC产生中断标志位后,再触发了DMA的数据转移,一个burst后,由于中断的标志位没有给清除,就没进行下次的数据转移了??
每次burst都要清除ADC中断标志位,才能继续下一个Burst吗?
,
Green Deng:
抱歉对DMA不太了解,你看一下这个链接中的内容是否有帮助,如果还是无法解决的话我帮你升级英文E2E论坛
https://bbs.elecfans.com/jishu_900708_1_1.html
,
user6311038:
抱歉这个我之前看过了,还是和我的问题有点区别
,
Green Deng:
你好,我这边基于C2000WARE中的ADC&DMA例程,将你帖子中的代码替换了ADC init和DMA init后是可以看到整个队列被更新了的。
你可以尝试替换一下,或者可能要你上传一下完整的主程序