标题:
ad7799单片机驱动程序
[打印本页]
作者:
微风寒
时间:
2017-3-13 17:42
标题:
ad7799单片机驱动程序
例子一:
sbit AD7799_CS=P1^4;
sbit AD7799_RDY=P1^6;
//SPCR SPI控制寄存器
//SPSR SPI状态寄存器
//SPDAT SPI数据寄存器
void SPI_init(void)
{
SPCR=0x5e;//SPI控制寄存器,中断禁止,SPI使能,高位在前,主机模式,时钟空闲时为高,后沿触发移位,时钟分频64
SPSR=0x00;//清中断标志位
}
/*--------------------------------------------
写AD7799寄存器函数
WriteData:要写的数据
----------------------------------------------*/
void WriteByteToAd7799(unsigned char WriteData)
{
SPDAT= WriteData;
while(~SPSR&0x80); //等待数据发送完
SPSR=0x00; //清中断标志位
}
/*--------------------------------------------
防止时序混乱,实现再同步
----------------------------------------------*/
void WaiteRDY(void)
{
unsigned int count=0 ;
while(AD7799_RDY)
{
count++;
if(count>20000)
{
//reset ad7799
WriteByteToAd7799(0xff);
WriteByteToAd7799(0xff);
/*----------防止时序混乱,重新同步----------*/
WriteByteToAd7799(0xff);
WriteByteToAd7799(0xff);
AD7799_init();
break ;
}
}
}
/*--------------------------------------------
AD7799初始化函数
----------------------------------------------*/
void AD7799_init(void)
{
AD7799_CS=0;
/*------------------------增益为128,通道0----------------------------------------*/
WriteByteToAd7799(0x10); //写通信寄存器设置下一个操作为写配置寄存器
WriteByteToAd7799(0x37); //增益为128
WriteByteToAd7799(0x30); //通道0
/*------------------- 写模式寄存器初始化零值校准------------------------------------*/
WriteByteToAd7799(0x08); //写通信寄存器设置下一个操作为写模式寄存器
WriteByteToAd7799(0x80);
WriteByteToAd7799(0x0A);
WaiteRDY(); //Wait for RDY pin to Go low to indicate end of calibration cycle*/
/*------------------写模式寄存器初始化全值校准-------------------------------------*/
WriteByteToAd7799(0x08); //写通信寄存器设置下一个操作为写模式寄存器
WriteByteToAd7799(0xA0);
WriteByteToAd7799(0x0A);
WaiteRDY(); // Wait for RDY pin to go low to indicate end of calibration cycle
/*------------------模式0,Continuous-Conversion Mode,Fadc=16.7HZ------------------*/
WriteByteToAd7799(0x08); //写通信寄存器设置下一个操作为写模式寄存器
WriteByteToAd7799(0x00);
WriteByteToAd7799(0x0A);
}
unsigned long ReadAd7799ConversionData(void)
{
unsigned long ConverData;
unsigned char ADSAT ;
unsigned char ErrNUM=0;
WaiteRDY();
WriteByteToAd7799(0x40); //写通信寄存器设置下一个操作为读状态STATUS寄存器
WriteByteToAd7799(0xff); //伪写通信寄存器,为读状态寄存器提供时钟
ADSAT=SPDAT; //读取接收到的数据
while((ADSAT&0x40)||(!(ADSAT&0x08))) //出错或者读写异常
{
//reset ad7799
WriteByteToAd7799(0xff);
WriteByteToAd7799(0xff);
/*----------防止时序混乱,重新同步----------*/
WriteByteToAd7799(0xff);
WriteByteToAd7799(0xff);
//-------------------------------------------------------------------------------------
AD7799_init();
WaiteRDY();
WriteByteToAd7799(0x40); //写通信寄存器设置下一个操作为读状态STATUS寄存器
WriteByteToAd7799(0xff); //伪写通信寄存器,为读状态寄存器提供时钟
ADSAT=SPDAT; //读取接收到的数据
ErrNUM++;
if(ErrNUM>5)break;
}
WriteByteToAd7799(0x58); //写通信寄存器设置下一个操作为连续读数据寄存器
WaiteRDY();
/* Wait for RDY pin to go low to indicate end of calibration cycle*/
if(!AD7799_RDY)
{
ConverData=0 ;
/*-----------------Read Conversion Result from AD7799's Data Register----------------*/
WriteByteToAd7799(0xff); //伪写通信寄存器,为读数据寄存器寄存器提供时钟
ConverData=SPDAT;
ConverData=ConverData<<8 ;
WriteByteToAd7799(0xff); //伪写通信寄存器,为读数据寄存器寄存器提供时钟
ConverData=ConverData+SPDAT;
ConverData=ConverData<<8 ;
WriteByteToAd7799(0xff); //伪写通信寄存器,为读数据寄存器寄存器提供时钟
ConverData=ConverData+SPDAT;
}
if(ErrNUM>5)return(0);
else return(ConverData);
}
复制代码
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1