#include<reg52.h>
#include<ad7705.h>
#include<intrins.h>
/*--- 延时程序,大约微秒级别 ---*/
void Delay_Us(unsigned int us)
{
for(;us>0;us--);
}
/*--- 延时程序,大约毫秒级别 ---*/
void Delay_Ms(unsigned int ms)
{
for(;ms>0;ms--)
Delay_Us(300);
}
/*--- 软件模拟SPI的时序,单片机写数据函数 ---*/
//dat-->要发送的数据
//void SPISendByte(unsigned char dat) //SPI发送
//{
// unsigned char i;
//// CS = 0; ,CS接地了,一直是低
// SCLK=1;
// SCLK=1;
//
// for(i=0;i<8;i++) //8位数据
// {
// DIN = dat&0x80;
// SCLK = 0;//时钟,低电平时给数据
// SCLK = 0;
// SCLK = 1;
// dat = dat<<1; //移位,下一位移到最高位做准备
// SCLK=1;
// }
//}
void SPISendByte(unsigned char dat)
{
unsigned char a;
SCLK = 1;
for (a=0; a<8; a++)
{
SCLK=0;
if(dat & 0x80)
DIN=1;
else
DIN=0;
_nop_();
_nop_();
SCLK=1;
_nop_();
_nop_();
dat<<=1;
}
DIN=1;
}
/*--- 软件模拟SPI,读数据的程序 ---*/
/*--- 入口参数:无
返回参数:接收的数据,一个字节8位 ---*/
//unsigned char SPIRecvByte(void) //SPI接收
//{
// unsigned char dat = 0;
// unsigned char i;
//// CS = 0;
//
// for(i=0;i<8;i++) //8位满了就跳出
// {
// dat = dat<<1;//接收到的放在最低位,再移到高位,空出第一位
//
// SCLK = 1;
// SCLK = 1;
// SCLK = 0; //低电平的时候读取数据
// SCLK = 0;
//
// if(DOUT)
// dat = dat | 0x01;//SO给的1就写1到dat最低位
// else
// dat = dat & 0xFE;//SO给的0就写0到dat最低位,其他位要移出的不管
// }
//
// SCLK = 1;
// return dat;
//}
/*--- 软件模拟SPI,读数据的程序 ---*/
/*--- 入口参数:无
返回参数:接收的数据,16位 ---*/
unsigned int SPIRecv16bit(void) //SPI接收
{
unsigned int dat = 0;
unsigned char i;
// CS = 0;
for(i=0;i<16;i++) //8位满了就跳出
{
dat = dat<<1;//接收到的放在最低位,再移到高位,空出第一位
SCLK = 1;
SCLK = 1;
SCLK = 0; //低电平的时候读取数据
SCLK = 0;
if(DOUT)
dat = dat | 0x0001;//SO给的1就写1到dat最低位
else
dat = dat & 0xFFFE;//SO给的0就写0到dat最低位,其他位要移出的不管
}
SCLK = 1;
return dat;
}
/*---------------------------------------------------------------------------- */
//函数:reset_AD7705
//功能:AD7705串行接口失步后将其复位。复位后要延时500us再访问
//参数:无
//返回:无
//变量:无
//备注: DIN高电平的写操作持续足够长的时间,至少32个串行时钟周期AD7705将会回到默认状态
//----------------------------------------------------------------------------
void reset_AD7705(void)
{
unsigned char i;
SPISendByte(0x01);//下一步写操作
DIN=1;
for(i=0; i<36; i++)
{
SCLK=0;
SCLK=0;
SCLK=1;
}
Delay_Us(160);//500US
}
//配置芯片通道1,并开始校准
void AD7705_init1(void)
{
reset_AD7705();
// Delay_Ms(1);
SPISendByte(0x20);//0X21择通道2,0x20通道1,下一步写时钟寄存器
SPISendByte(0x04); //主时钟使能,更新率25HZ
SPISendByte(0x10);//0X11选择通道2,0x10选择通道1.下一步写设置寄存器
SPISendByte(0x44); //自校准模式,单极性,不使用缓冲器。开始转换
while(DRDY);
}
//配置芯片通道2,并开始校准
void AD7705_init2(void)
{
reset_AD7705();
// Delay_Ms(1);
SPISendByte(0x21);//0X21择通道2,0x20通道1,下一步写时钟寄存器
SPISendByte(0x06); //主时钟使能,更新率250HZ
SPISendByte(0x11);//0X11选择通道2,0x10选择通道1.下一步写设置寄存器
SPISendByte(0x44); //自校准模式,单极性,不使用缓冲器。开始转换
while(DRDY);
}
//读取一次16位data
unsigned int Read_datareg1(void)
{
unsigned int n=0;
// while(DRDY);
SPISendByte(0x38);//0X39下一步读通道2数据寄存器,0x38读通道1数据
while(DRDY);
n = SPIRecv16bit();
return n;
}
unsigned int Read_datareg2(void)
{
unsigned int n=0;
// while(DRDY);
SPISendByte(0x39);//0X39下一步读通道2数据寄存器,0x38读通道1数据
while(DRDY);
n = SPIRecv16bit();
return n;
}
//unsigned char Read_tongxinreg(void)
//{
// unsigned char m;
// while(DRDY);
// SPISendByte(0x08);//0X09下一步读通道2通信寄存器 0x08读通道1
// m = SPIRecvByte();
// return m;
//}