| 
 
| #include <avr/io.h> #include <avr/delay.h>
 #include <avr/signal.h>
 #include <avr/interrupt.h>
 #include <avr/pgmspace.h>
 //===================AD==========================
 #define sbi(sfr,bit) (_SFR_BYTE(sfr)|=_BV(bit))
 #define cbi(sfr,bit) (_SFR_BYTE(sfr)&=~_BV(bit))
 #define RESET_out() sbi(DDRE,PE1);//SERET--->output
 #define RESET_out_1() sbi(PORTE,PE1);//SERET--->1
 #define RESET_out_0() cbi(PORTE,PE1);//SERET--->0
 #define SCLK_out() sbi(DDRE,PE0);//sclk--->output
 #define SCLK_out_1() sbi(PORTE,PE0);//sclk--->1
 #define SCLK_out_0() cbi(PORTE,PE0);//sclk--->0
 #define CS_out() sbi(DDRF,PF0);//cs--->output
 #define CS_out_1() sbi(PORTF,PF0);//cs--->1
 #define CS_out_0() cbi(PORTF,PF0);//cs--->0
 #define DIN_out()   sbi(DDRF,PF3)//din--->output
 #define DIN_out_1() sbi(PORTF,PF3)//din--->1
 #define DIN_out_0() cbi(PORTF,PF3)//din--->0
 #define DOUT_in()   cbi(DDRF,PF2)//dout--->input
 #define RDY_in()   cbi(DDRF,PF1)//rdy--->input
 //--------------AD转换--------------------
 uint32_t convert(void)
 {
 uint8_t i,j;
 uint32_t adrd_data;
 //----------------
 RESET_out_0();//RESET=0
 delay_us(1);
 write_ad7718(0x03);//filter寄存器
 write_ad7718(0xff);
 
 write_ad7718(0x02);//control寄存器
 write_ad7718(0x5f);//使用芯片上的AIN6通道,单极性2.56V的电压输入范围
 
 write_ad7718(0x01);//mode寄存器
 write_ad7718(0x23);//CHOP=0,REF2(+)-REF2(-)=5V的参考电源,连续时钟模式
 
 while((PINF&0x01)!=1)//等待转换完成
 {
 //delay_us(1);
 }
 write_ad7718(0x44);//读DATA寄存器
 delay_us(10);
 CS_out_0();//cs=0
 adrd_data=0;
 SCLK_out_1();//SCLK=1
 for(i=0;i<=23;i++)
 {
 SCLK_out_0();//SCLK=0
 delay_us(1);
 adrd_data=adrd_data<<1;
 adrd_data=adrd_data|(PINF&(1<<PF2));//DOUT
 delay_us(1);
 SCLK_out_1();//SCLK=1
 delay_us(1);
 }
 CS_out_1();//cs=1
 adrd_data=adrd_data&0x00ffffff;//数据修正
 return adrd_data;
 }
 //---------------延时--------------------
 void delay_us(uint16_t x)  //x=1对应3.03us
 {
 while(x)
 {
 x--;
 }
 }
 //-----------AD写数据------------------------
 void write_ad7718(uint8_t data)
 {
 uint8_t i;
 CS_out_0();//cS=0
 SCLK_out_1();//SCLK=1
 for(i=0;i<=7;i++)
 {
 
 SCLK_out_0();//SCLK=0
 delay_us(1);
 if(data&0x80)
 DIN_out_1();//DIN=1
 else
 DIN_out_0();//DIN=0
 data<<=1;
 delay_us(1);
 SCLK_out_1();//SCLK=1
 delay_us(1);
 }
 CS_out_1();//cS=1
 }
 void main(void)
 {
 //----ad----
 uint32_t t;
 uint8_t i;
 DIN_out();//DIN输出
 DOUT_in();//DOUT输入
 RDY_in();//RDY输入
 CS_out();//CS输出
 RESET_out();//RESET输出
 SCLK_out();//SCLK输出
 for(i=0;i<100;i++)
 {
 t=convert();
 }
 while(1)
 {
 ;
 }
 
 }
 
 我用的是Atmega128控制24位的AD7718,将AD7718配置为8通道的输入模式,我选2.5V和0V的输入通道进行转换,运行上述程序,结果转换出来的值t一直是1677212(0xFFFFFC),请各位高手给予指点,谢谢!
 | 
 |