#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),请各位高手给予指点,谢谢! |