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.

TMS320F28035: 关于cla_adc例程的疑问

Part Number: TMS320F28035
Other Parts Discussed in Thread: CONTROLSUITE

\ti\controlSUITE\device_support\f2803x\v130\DSP2803x_examples_ccsv5\cla_adc

该例程在调试时发现一个问题 和大家分享一下

在CLA初始化之前,先调用了AdcOffsetSelfCal()函数修正ADC Offset寄存器数值,这个偏置校准函数利用ADCINT1、ADCINT2互相触发的方式对ADCLO进行采集。

而CLA的默认触发条件为ADCINTn,因此当调用AdcOffsetSelfCal()函数后,会发现CLA的MIFR及MIOVF均为0x0003

MIFR为0x0003,是因为AdcOffsetSelfCal()函数触发了ADCINT1、ADCINT2中断,从产生了CLA Task1级Task2的触发信号

MIOVF为0x0003,是因为AdcOffsetSelfCal()函数多次触发了Task1、Task22中断,但是CLA并没有处理,从而造成中断溢出,这应该算是一种异常状态。

因此在当配置完CLA并使能对应的MIER后,会发现MIFR变为0x0001,因为之前的Task2对应的MIFR标志位置1,此时CLA任务应该执行了一次,这应该也可以算是一种异常执行。

而MIOVF因为无法自动清零将使用标记中断溢出

综上所述,如果要使用CLA及片上ADC,在执行AdcOffsetSelfCal()函数后,应向MICLR及MICLROVF写1用以清除MIFR及MIOVF的异常位。

TRM手册10.4.2章节 Typical CLA Initilization Sequence的最后一步

6.Initial other peripherals中有如下描述

Initialize any peripheral(such as ePWM ADC and others) that will generate interrupt triggers for enabled CAL tasks

问题1. 按照这里的描述,初始化CLA是不是应该放在最后,从而避免误触发CLA task

第二个问题是关于校准函数的

while( index < SampleSize ){

//Wait for ADCINT1 to trigger, then add ADCRESULT0-7 registers to sum
while (AdcRegs.ADCINTFLG.bit.ADCINT1 == 0){}
AdcRegs.ADCINTFLGCLR.bit.ADCINT1 = 1; //Must clear ADCINT1 flag since INT1CONT = 0
Sum += AdcResult.ADCRESULT0;
Sum += AdcResult.ADCRESULT1;
Sum += AdcResult.ADCRESULT2;
Sum += AdcResult.ADCRESULT3;
Sum += AdcResult.ADCRESULT4;
Sum += AdcResult.ADCRESULT5;
Sum += AdcResult.ADCRESULT6;
// Wait for SOC9 conversion to start, which gives time for SOC7 conversion result
while( AdcRegs.ADCSOCFLG1.bit.SOC9 == 1 ){}
Sum += AdcResult.ADCRESULT7;

//Wait for ADCINT2 to trigger, then add ADCRESULT8-15 registers to sum
while (AdcRegs.ADCINTFLG.bit.ADCINT2 == 0){}
AdcRegs.ADCINTFLGCLR.bit.ADCINT2 = 1; //Must clear ADCINT2 flag since INT2CONT = 0
Sum += AdcResult.ADCRESULT8;
Sum += AdcResult.ADCRESULT9;
Sum += AdcResult.ADCRESULT10;
Sum += AdcResult.ADCRESULT11;
Sum += AdcResult.ADCRESULT12;
Sum += AdcResult.ADCRESULT13;
Sum += AdcResult.ADCRESULT14;
// Wait for SOC1 conversion to start, which gives time for SOC15 conversion result
while( AdcRegs.ADCSOCFLG1.bit.SOC1 == 1 ){}
Sum += AdcResult.ADCRESULT15;

index+=16;

} // end data collection

上述代码为ADCLO过采样的部分,

// Setup ADCINT1 and ADCINT2 trigger source
AdcRegs.INTSEL1N2.bit.INT1SEL = 6; //EOC6 triggers ADCINT1
AdcRegs.INTSEL1N2.bit.INT2SEL = 14; //EOC14 triggers ADCINT2

问题2.我目前的理解是,6结束后,触发ADCINT1中断,从而触发8~15采样,此时是7与8同时采样,7由SHA采样保持电路处理,8由SHB采样保持电路处理,因此要在9开始采样时才能读取到7的采样值

// Wait for SOC1 conversion to start, which gives time for SOC15 conversion result”于此类似,这样做是为了使SHA及SHB的衔接更加紧密吗?不知道我的理解对不对

问题3.论坛中有人问过,如果改为7结束触发ADCINT1,15结束触发ADCINT2也可以完成校准采集吗?Eric没有答复,5年前的帖子

  • 你好

    1、TRM所列的Typical CLA Initialization Sequence确实没仔细研究过,不过这句话我的理解是应该在最后将其他可能触发CLA任务的外设中断进行初始化。也就是说,先使能CLA,再初始化外设中断。下面的一段中也介绍了:

    The CLA is now ready to service interrupts and the message RAMs can be used to pass data between the CPU and the CLA. 

    2&3,这两个问题我需要咨询一下其他工程师,还请耐心等待。

  • 2、这是为了避免可能出现一个或多个时钟周期的空闲状态,这是由于 ADC 的架构造成的。

    3、是的,仍然可以完成,但很小的概率会在 EOC7/SOC8 和/或 EOC15/SOC0 之间可能存在一个或多个空闲时间时钟周期。