有哪位大虾用过TI公司的AD采集芯片ADS1211,能否提供开发资料或一些经验!
我MSN:kernel21cn@sohu.com . 现有的设计是参考网上一些资料:资料如下:
将电路设置为从动方式,增益GAIN选为1,加速因子TMR为16,fXIN选择10MHz,抽取率(DR)为312(即100111000 ,相当于0X38),fDATA为10MHz并选择单极性输入和半自动校准方式,同时选择通道输入1,具体的初始化,测量程序和读写延时子程序如下:
★★★★★★★★现在遇到情况是:SDOUT没有输出!!!!!★★★★★★★★
说明:ARM7的 P1.14 接 ADS1211的 DRDY ARM7的 P1.27 接 ADS1211的 SDOUT ARM7的 P1.16 接 ADS1211的 SDIO ARM7的 P1.17 接 ADS1211的 SCLK
★★★★★★★★★★ADS1211芯片初始化 的代码:★★★★★★★★★★ //2008年1月14号,先等待DRDY变高,再等它变低 while((IOPIN1&(1<<14))==0X00) {}; //说明,DRDY接的是我用的ARM7芯片的P1.14脚 while((IOPIN1&(1<<14))!=0X00) {};//等待DRDY到由高电平跳变到低电平为止 for (i=0; i<300; i++) {};//大概延时35us write_byte_ads2(0x64); //设置INSR 指令寄存器,设置ADS1211芯片等会写 CMR //从第0X03个字节开始 for (i=0; i<300; i++) {};//大概延时35us write_byte_ads2(0x52);//设置写最高字节 for (i=0; i<300; i++) {};//大概延时35us
write_byte_ads2(0x20);//选择半自动校准模式,增益PGA为1,通道1 for (i=0; i<300; i++) {};//大概延时35us write_byte_ads2(0x81);//根据抽取率=fxin*TMR/(Fdata*512);计算抽取率 for (i=0; i<300; i++) {};//大概延时35us
write_byte_ads2(0x38); //TMR设置为为16;Fdata为1000;Fxin为10M,得到抽取率为312.5
★★★★★★★★★★★读SDOUT输出数据的 代码:★★★★★★★★★★★★
/******************************************************************** ** 函数名称 read_byte_ads2(void) ** 函数功能 :读出ADS1211寄存器中数据 ** 入口参数 :输入数字量 ** 出口参数 :无 **************************************************************/ INT8U read_byte_ads2(void) { INT8U read_data; static INT8U i; static INT8U j; static INT32U k; static INT32U m=0; static INT16U n; m=0; read_data=0; for(i=8;i>0;i--) { j=i-1; IOSET1=1<<17;//sclk=1;ADS1211的SCLK置位 for (n=0; n<30; n++) //2008--1--22 {};//大概延时60us k=IOPIN1;
//说明,ARM7芯片的P1.27引脚接ADS1211的SDOUT m=(INT8U)((k&0x08000000)>>27);//读取SDOUT/2;P1.27 read_data|=(m<<j); IOCLR1=1<<17;//sclk2=0;ADS1211/2的SCLK清零 for (n=0; n<30; n++) //2008--1--22 {};//大概延时60us } return(read_data); }
★★★★★★★★★★★通过SDIO引脚往ADS1211写 的代码:★★★★★★★★
void write_byte_ads2(INT8U in_data) { static INT8U i; static INT8U j; static INT32U k; static INT16U m; IOCLR1=1<<17; //说明我用的ARM7引脚P1.17接ADS1211芯片的SCLK for (m=0; m<300; m++) {};//大概延时35us for(i=8;i>0;i--) { j=i-1; IOSET1=1<<17;//sclk2=1;ADS1211的SCLK置位 for (m=0; m<30; m++) {};//大概延时3.5us k=IOPIN1; IOPIN1=((k&(~(1<<16)))|(((in_data>>j)&0X01)<<16)); //说明:我用的ARM7引脚P1.16接ADS1211芯片的SDIO
for (m=0; m<30; m++) {};//大概延时3.5us IOCLR1=1<<17; for (m=0; m<30; m++) {};//大概延时3.5us } }
★★★★★★★★★每次读取ADS1211进行AD转换后数据代码:★★★★★★★ { INT16U volatile i; //2008年1月14号,改先等待DRDY变高,再等它变低 while((IOPIN1&(1<<14))==0X00) {}; while((IOPIN1&(1<<14))!=0X00) {};//DRDY/2等待到由高电平跳变到低电平为止 for (i=0; i<300; i++) {};//大概延时30us write_byte_ads2(0xc0);//此条指令,意思是读DOR寄存器中值,读3个字节 for (i=0; i<300; i++) {};//大概延时35us ad_data[ad_num][0]=read_byte_ads2();//最高字节部分
for (i=0; i<300; i++) {};//大概延时35us ad_data[ad_num][1]=read_byte_ads2();//中间字节部分 for (i=0; i<300; i++) {};//大概延时35us ad_data[ad_num][2]=read_byte_ads2();//最低字节部分 }
|