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); }
|