sbit AD7799_CS=P1^4; sbit AD7799_RDY=P1^6; //SPCR SPI控制寄存器 //SPSR SPI狀態(tài)寄存器 //SPDAT SPI數(shù)據(jù)寄存器 void SPI_init(void) { SPCR=0x5e;//SPI控制寄存器,中斷禁止,SPI使能,高位在前,主機模式,時鐘空閑時為高,后沿觸發(fā)移位,時鐘分頻64 SPSR=0x00;//清中斷標志位 } /*-------------------------------------------- 寫AD7799寄存器函數(shù) WriteData:要寫的數(shù)據(jù) ----------------------------------------------*/ void WriteByteToAd7799(unsigned char WriteData) { SPDAT= WriteData; while(~SPSR&0x80); //等待數(shù)據(jù)發(fā)送完 SPSR=0x00; //清中斷標志位 } /*-------------------------------------------- 防止時序混亂,實現(xiàn)再同步 ----------------------------------------------*/ 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初始化函數(shù) ----------------------------------------------*/ void AD7799_init(void) { AD7799_CS=0; /*------------------------增益為128,通道0----------------------------------------*/ WriteByteToAd7799(0x10); //寫通信寄存器設(shè)置下一個操作為寫配置寄存器 WriteByteToAd7799(0x37); //增益為128 WriteByteToAd7799(0x30); //通道0 /*------------------- 寫模式寄存器初始化零值校準------------------------------------*/ WriteByteToAd7799(0x08); //寫通信寄存器設(shè)置下一個操作為寫模式寄存器 WriteByteToAd7799(0x80); WriteByteToAd7799(0x0A); WaiteRDY(); //Wait for RDY pin to go low to indicate end of calibration cycle*/ /*------------------寫模式寄存器初始化全值校準-------------------------------------*/ WriteByteToAd7799(0x08); //寫通信寄存器設(shè)置下一個操作為寫模式寄存器 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); //寫通信寄存器設(shè)置下一個操作為寫模式寄存器 WriteByteToAd7799(0x00); WriteByteToAd7799(0x0A); } unsigned long ReadAd7799ConversionData(void) { unsigned long ConverData; unsigned char ADSAT ; unsigned char ErrNUM=0; WaiteRDY(); WriteByteToAd7799(0x40); //寫通信寄存器設(shè)置下一個操作為讀狀態(tài)STATUS寄存器 WriteByteToAd7799(0xff); //偽寫通信寄存器,為讀狀態(tài)寄存器提供時鐘 ADSAT=SPDAT; //讀取接收到的數(shù)據(jù) while((ADSAT&0x40)||(!(ADSAT&0x08))) //出錯或者讀寫異常 { //reset ad7799 WriteByteToAd7799(0xff); WriteByteToAd7799(0xff); /*----------防止時序混亂,重新同步----------*/ WriteByteToAd7799(0xff); WriteByteToAd7799(0xff); //------------------------------------------------------------------------------------- AD7799_init(); WaiteRDY(); WriteByteToAd7799(0x40); //寫通信寄存器設(shè)置下一個操作為讀狀態(tài)STATUS寄存器 WriteByteToAd7799(0xff); //偽寫通信寄存器,為讀狀態(tài)寄存器提供時鐘 ADSAT=SPDAT; //讀取接收到的數(shù)據(jù) ErrNUM++; if(ErrNUM>5)break; } WriteByteToAd7799(0x58); //寫通信寄存器設(shè)置下一個操作為連續(xù)讀數(shù)據(jù)寄存器 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); //偽寫通信寄存器,為讀數(shù)據(jù)寄存器寄存器提供時鐘 ConverData=SPDAT; ConverData=ConverData<<8 ; WriteByteToAd7799(0xff); //偽寫通信寄存器,為讀數(shù)據(jù)寄存器寄存器提供時鐘 ConverData=ConverData+SPDAT; ConverData=ConverData<<8 ; WriteByteToAd7799(0xff); //偽寫通信寄存器,為讀數(shù)據(jù)寄存器寄存器提供時鐘 ConverData=ConverData+SPDAT; } if(ErrNUM>5)return(0); else return(ConverData); }
|