Thread 中讨论的其他器件:controlSUITE
您好!
我们尝试在 F28069 (EVM)上测试 ADC Ping Pong/连续采样。
我们尝试从以下网站导入 F2802x 的示例代码。
e2e.ti.com/.../2060564
但该代码不适用于 F28069,ADC 无法对输入信号进行采样...
请告诉我、如果要在上面的源代码中添加或修改任何其他内容、以便在 F28069上工作吗?
void ADC_Config (void);
void setup_ADC (void);
void take 样片(uint16、uint16*);
//此示例中使用的全局变量:
uint16 bufferA[100];
MAIN ()
{
#ifdef _flash
memcpy (&RamfuncsRunStart、&RamfuncsLoadStart、(size_t)&RamfuncsLoadSize);
#endif
//步骤1. 初始化系统控制:
// PLL、安全装置、启用外设时钟
//此示例函数位于 F2802x_sysctrl.c 文件中。
InitSysCtrl();
//步骤2. 初始化 GPIO:
//此示例函数位于 F2802x_GPIO.c 文件和中
//说明了如何将 GPIO 设置为其默认状态。
// InitGpio(); //针对此示例跳过
//步骤3. 清除所有中断并初始化 PIE 矢量表:
//禁用 CPU 中断
Dint;
//将 PIE 控制寄存器初始化为默认状态。
//默认状态为禁用所有 PIE 中断和标志
//被清除。
//此函数位于 F2802x_PIECTRL.c 文件中。
InitPieCtrl();
//禁用 CPU 中断并清除所有 CPU 中断标志:
IER = 0x0000;
IFR = 0x0000;
//使用指向 shell 中断的指针初始化 PIE 矢量表
//服务例程(ISR)。
//这将填充整个表,即使是中断也是如此
//在本例中未使用。 这对于调试很有用。
//可以在 F2802x_DefaultIsr.c 中找到 shell ISR 例程
//此函数可在 F2802x_PieVect.c 中找到
InitPieVectTable();
//此示例中使用的中断被重新映射到
//此文件中的 ISR 函数。
EALLOW; //这是写入 EALLOW 受保护寄存器所必需的
EDIS; //这是禁止写入 EALLOW 受保护寄存器所必需的
//步骤4. 初始化所有器件外设:
InitAdc (); //对于此示例,初始化 ADC
AdcOffsetSelfCal();
//步骤5. 特定于用户的代码、启用中断:
//在 PIE 中启用 ADCINT1
PieCtrlRegs.PIEIER1.bit.INTx1 = 1; //在 PIE 中启用 INT 1.1
IER |= M_INT1; //启用 CPU 中断1
EINT; //启用全局中断 INTM
ERTM; //启用全局实时中断 DBGM
//函数调用以设置用于乒乓的 ADC
Setup_adc();
对于(;;)//call sample function、每50000us 重复执行一次。
{
//take 样本(100、bufferA、bufferB);
take _samples (100、bufferA);
DELAY_US (50000);
}
}
void setup_adc ()
{
//启用带隙、时钟、上电等
EALLOW;
AdcRegs.ADCCTL2.bit.CLKDIV2EN = 1; //设置 ADC 时钟分频*
AdcRegs.ADCCTL2.bit.CLKDIV4EN = 0; //设置 ADC 时钟分频*
//将所有 SOC 设置为指向通道 A4
AdcRegs.ADCCTL2.bit.ADCNONOVERLAP = 0;//将 ADCNONOVERLAP 控制位设置 为允许*
AdcRegs.ADCSOC0CTL.bit.CHSEL = 4; //将 SOC0通道选择设置为 ADCINA4*/
AdcRegs.ADCSOC1CTL.bit.CHSEL = 4; //将 SOC1通道选择设置为 ADCINA4*/
AdcRegs.ADCSOC2CTL.bit.CHSEL = 4; //将 SOC2通道选择设置为 ADCINA4*/
AdcRegs.ADCSOC3CTL.bit.CHSEL = 4; //将 SOC3通道选择设置为 ADCINA4*/
AdcRegs.ADCSOC4CTL.bit.CHSEL = 4; //将 SOC4通道选择设置为 ADCINA4*/
AdcRegs.ADCSOC5CTL.bit.CHSEL = 4; //将 SOC5通道选择设置为 ADCINA4*/
AdcRegs.ADCSOC6CTL.bit.CHSEL = 4; //将 SOC6通道选择设置为 ADCINA4*/
AdcRegs.ADCSOC7CTL.bit.CHSEL = 4; //将 SOC7通道选择设置为 ADCINA4*/
AdcRegs.ADCSOC8CTL.bit.CHSEL = 4; //将 SOC8通道选择设置为 ADCINA4*/
AdcRegs.ADCSOC9CTL.bit.CHSEL = 4; //将 SOC9通道选择设置为 ADCINA4*/
AdcRegs.ADCSOC10CTL.bit.CHSEL = 4; //将 SOC10通道选择设置为 ADCINA4*/
AdcRegs.ADCSOC11CTL.bit.CHSEL = 4; //将 SOC11通道选择设置为 ADCINA4*/
AdcRegs.ADCSOC12CTL.bit.CHSEL = 4; //将 SOC12通道选择设置为 ADCINA4*/
AdcRegs.ADCSOC13CTL.bit.CHSEL = 4; //将 SOC13通道选择设置为 ADCINA4*/
AdcRegs.ADCSOC14CTL.bit.CHSEL = 4; //将 SOC14通道选择设置为 ADCINA4*/
AdcRegs.ADCSOC15CTL.bit.CHSEL = 4; //将 SOC15通道选择设置为 ADCINA4*/
//在每个 SOC 上设置7个周期的最小采集时间
AdcRegs.ADCSOC0CTL.bit.ACQPS = 6; //将 SOC0 S/H 窗口设置为7个 ADC 时钟周期*/
AdcRegs.ADCSOC1CTL.bit.ACQPS = 6; //将 SOC1 S/H 窗口设置为7个 ADC 时钟周期*/
AdcRegs.ADCSOC2CTL.bit.ACQPS = 6; //将 SOC2 S/H 窗口设置为7个 ADC 时钟周期*/
AdcRegs.ADCSOC3CTL.bit.ACQPS = 6; //将 SOC3 S/H 窗口设置为7个 ADC 时钟周期*/
AdcRegs.ADCSOC4CTL.bit.ACQPS = 6; //将 SOC4 S/H 窗口设置为7个 ADC 时钟周期*/
AdcRegs.ADCSOC5CTL.bit.ACQPS = 6; //将 SOC5 S/H 窗口设置为7个 ADC 时钟周期*/
AdcRegs.ADCSOC6CTL.bit.ACQPS = 6; //将 SOC6 S/H 窗口设置为7个 ADC 时钟周期*/
AdcRegs.ADCSOC7CTL.bit.ACQPS = 6; //将 SOC7 S/H 窗口设置为7个 ADC 时钟周期*/
AdcRegs.ADCSOC8CTL.bit.ACQPS = 6; //将 SOC8 S/H 窗口设置为7个 ADC 时钟周期*/
AdcRegs.ADCSOC9CTL.bit.ACQPS = 6; //将 SOC9 S/H 窗口设置为7个 ADC 时钟周期*/
AdcRegs.ADCSOC10CTL.bit.ACQPS = 6; //将 SOC10 S/H 窗口设置为7个 ADC 时钟周期*/
AdcRegs.ADCSOC11CTL.bit.ACQPS = 6; //将 SOC11 S/H 窗口设置为7个 ADC 时钟周期*/
AdcRegs.ADCSOC12CTL.bit.ACQPS = 6; //将 SOC12 S/H 窗口设置为7个 ADC 时钟周期*/
AdcRegs.ADCSOC13CTL.bit.ACQPS = 6; //将 SOC13 S/H 窗口设置为7个 ADC 时钟周期*/
AdcRegs.ADCSOC14CTL.bit.ACQPS = 6; //将 SOC14 S/H 窗口设置为7个 ADC 时钟周期*/
AdcRegs.ADCSOC15CTL.bit.ACQPS = 6; //将 SOC15 S/H 窗口设置为7个 ADC 时钟周期*/
//ADCINT 1和2被启用
AdcRegs.INTSEL1N2.bit.INT1E = 1; //启用/禁用 ADCINT1中断*
AdcRegs.INTSEL1N2.bit.INT2E = 1; //启用/禁用 ADCINT2中断*
//ADCINT 1和2等待确认
AdcRegs.INTSEL1N2.bit.INT1CONT = 0; //启用/禁用 ADCINT1连续模式*/
AdcRegs.INTSEL1N2.bit.INT2CONT = 0; //启用/禁用 ADCINT2连续模式*/
//SOC 6将触发 ADCINT1
AdcRegs.INTSEL1N2.bit.INT1SEL = 6; //设置 EOC6以触发 ADCINT1触发*
//SOC 14将触发 ADCINT2
AdcRegs.INTSEL1N2.bit.INT2SEL = 14; //设置 EOC14以触发 ADCINT2触发*/
//ADCINT2将触发前8个 SOC
AdcRegs.ADCINTSOCSEL.bit.SOC0 = 2; /* SOCx ADCINT2中断触发选择。*
AdcRegs.ADCINTSOCSEL1.bit.SOC1 = 2;
AdcRegs.ADCINTSOCSEL1.bit.SOC2 = 2; /* SOCx ADCINT2中断触发选择。*/
AdcRegs.ADCINTSOCSEL1.bit.SOC3 = 2;
AdcRegs.ADCINTSOCSEL1.bit.SOC4 = 2; /* SOCx ADCINT2中断触发选择。*/
AdcRegs.ADCINTSOCSEL1.bit.SOC5 = 2;
AdcRegs.ADCINTSOCSEL.bit.SOC6 = 2; /* SOCx ADCINT2中断触发选择。*
AdcRegs.ADCINTSOCSEL1.bit.SOC7 = 2;
//ADCINT1将触发第二个8个 SOC
AdcRegs.ADCINTSOCSEL2.bit.SOC8 = 1; /* SOCx ADCINT1中断触发选择。*
AdcRegs.ADCINTSOCSEL2.bit.SOC9 = 1;
AdcRegs.ADCINTSOCSEL2.bit.SOC10 = 1; /* SOCx ADCINT1中断触发选择。*/
AdcRegs.ADCINTSOCSEL2.bit.SOC11 = 1;
AdcRegs.ADCINTSOCSEL2.bit.SOC12 = 1; /* SOCx ADCINT1中断触发选择。*/
AdcRegs.ADCINTSOCSEL2.bit.SOC13 = 1;
AdcRegs.ADCINTSOCSEL2.bit.SOC14 = 1; /* SOCx ADCINT1中断触发选择。*/
AdcRegs.ADCINTSOCSEL2.bit.SOC15 = 1;
EDIS;
}
void take 样片(uint16 sample_size、uint16*缓冲区)
{
uint16索引= 0;
//启用乒乓采样所需的 adcint1和 adcint2
AdcRegs.INTSEL1N2.bit.INT1E = 1; //启用/禁用 ADCINT1中断*
AdcRegs.INTSEL1N2.bit.INT2E = 1; //启用/禁用 ADCINT2中断*
AdcRegs.ADCSOCFRC1.ALL = 0x00FF;//软件强制前8个 SOC 挂起标志
while (index < sample_size){
while (AdcRegs.ADCINTFlG.bit.ADCINT1 =0){/*等待、不执行任何操作*/}
AdcRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;//清除 ADCINT1
//ADCINT1由 SOC6结束时触发。
//由于完成了这些操作,因此将 SOC0-SOC7读取到缓冲器中
//(这假设将通过转换 SOC7
//代码到达它以放入缓冲区的时间)。
//另请注意、SOC6触发了 ADCINT1
//然后触发 SOC8-SOC15挂起。
//这些新挂起的 SOC 将开始转换
//在 SOC7完成后立即执行。
Buffer[index++]= AdcResult.ADCRESULT0;
Buffer[index++]= AdcResult.ADCRESULT1;
Buffer[index++]= AdcResult.ADCRESULT2;
Buffer[index++]= AdcResult.ADCRESULT3;
Buffer[index++]= AdcResult.ADCRESULT4;
Buffer[index++]= AdcResult.ADCRESULT5;
Buffer[index++]= AdcResult.ADCRESULT6;
Buffer[index++]= AdcResult.ADCRESULT7;
while (AdcRegs.ADCINTFlG.bit.ADCINT2 ==0){/*等待、不执行任何操作*/}
AdcRegs.ADCINTFLGCLR.bit.ADCINT2 = 1;//清除 ADCINT2
//ADCINT2由 SOC14结束触发。
//完成后,将 SOC8-SOC15读取到缓冲区中
//(这假设 SOC15将由完成转换
//代码到达它以放入缓冲区的时间)。
//另请注意、SOC14触发了 ADCINT2
//然后触发 SOC0-SOC7挂起。
//这些新挂起的 SOC 将开始转换
//在 SOC15完成后立即执行。
Buffer[index++]= AdcResult.ADCRESULT8;
Buffer[index++]= AdcResult.ADCRESULT9;
Buffer[index++]= AdcResult.ADCRESULT10;
Buffer[index++]= AdcResult.ADCRESULT11;
Buffer[index++]= AdcResult.ADCRESULT12;
Buffer[index++]= AdcResult.ADCRESULT13;
Buffer[index++]= AdcResult.ADCRESULT14;
Buffer[index++]= AdcResult.ADCRESULT15;
}
//禁用 adcint1和 adcint2以停止乒乓采样
AdcRegs.INTSEL1N2.bit.INT1E = 0;
AdcRegs.INTSEL1N2.bit.INT2E = 0;
}
此致
库米