我用的是AD7799BRUZ芯片,打算应用于称重。<br />电路连接参照数据手册(Rev.0) 27页的那个电路,<br />我只用了AIN1一个通道,其余未用。<br /><br />出现的问题是:采不出数据。<br /><br />进行满量程校准后读出的数据全为FF,读状态寄存器有错误标志。把REF_DEC置位后有NOREF错误标志,可是我的参考电压接是是正5V啊,是不是AD7799内部的参考电压电路部分损坏了啊!!<br />#include <intrins.h> /* use _nop_() function */<br />/*<br />AD7799写寄存器函数<br />WriteData:要写的数据<br />*/<br />void WriteByteToAd7799(unsigned char WriteData)<br />{<br /> unsigned char i;<br /> //AD7799_CS=0;<br /> for(i=0;i<8;i++)<br /> {<br /> AD7799_SCLK=0;<br /> if(WriteData&0x80)AD7799_DIN=1;<br /> else AD7799_DIN=0;<br /> WriteData=WriteData<<1;<br /> AD7799_SCLK=1;<br /> }<br /> //AD7799_CS=1;<br />}<br /><br />/*<br />AD7799读寄存器函数<br />*/<br />unsigned char ReadByteFromAd7799(void)<br />{<br /> unsigned char i;<br /> unsigned char ReadData;<br /> //AD7799_CS=0;<br /> ReadData=0;<br /> for(i=0;i<8;i++)<br /> {<br /> AD7799_SCLK=0;<br /> ReadData=ReadData<<1;<br /> if(AD7799_DOUT)ReadData+=1;<br /> AD7799_SCLK=1;<br /> }<br /> //AD7799_CS=1;<br /> return(ReadData);<br />}<br /><br />void WaiteRDY(void)<br />{<br /> unsigned int iint;<br /> iint=0;<br /> while(AD7799_RDY)<br /> {<br /> iint++;<br /> if(iint>20000)<br /> {<br /> //reset ad7799<br /> WriteByteToAd7799(0xff);<br /> WriteByteToAd7799(0xff);<br /> WriteByteToAd7799(0xff);<br /> WriteByteToAd7799(0xff);<br /> for(iint=0;iint<1000;iint++)<br /> {<br /> _nop_();<br /> _nop_();<br /> }<br /> Ad7799_Ini(0);<br /> break;<br /> }<br /> }<br />}<br /><br />void Ad7799_Ini(unsigned char ChannelNum)<br />{<br /> <br /> WriteByteToAd7799(0x10);//b0000 1000<br /> /* Writes to Communications Register Setting Next Operation as Write to<br /> CONFIGURATION Register*/<br /> WriteByteToAd7799(0x00); //增益为0<br /> WriteByteToAd7799(0x10+ChannelNum); //1通道<br /> /*CONFIGURATION REGISTER[00,BO(0),U/B(0),<br /> 0(0),G2(1),G1(1),G0(1),0,0,REF_DET(0),BUF(1),0(0),CH2(0),CH1(0),CH0(0)]*/<br /><br /> WriteByteToAd7799(0x08); //b0000 1000<br /> /* Writes to Communications Register Setting Next Operation as Write to<br /> Mode Register*/<br /> WriteByteToAd7799(0x80);<br /> WriteByteToAd7799(0x0a);<br /> /* Writes to Mode Register Initiating Internal Zero-Scale Calibration*/<br /> WaiteRDY();<br /> /* Wait for RDY pin to go low to indicate end of calibration cycle*/<br /> WriteByteToAd7799(0x08);<br /> /* Writes to Communications Register Setting Next Operation as Write to<br /> Mode Register*/<br /> WriteByteToAd7799(0xa0);<br /> WriteByteToAd7799(0x0a);<br /> /* Writes to Mode Register Initiating Internal Full-Scale Calibration*/<br /> WaiteRDY();<br /> /* Wait for RDY pin to go low to indicate end of calibration cycle*/<br /><br /><br /><br /> WriteByteToAd7799(0x08); //b0000 1000<br /> /* Writes to Communications Register Setting Next Operation as Write to<br /> Mode Register*/<br /> WriteByteToAd7799(0x00);<br /> WriteByteToAd7799(0x0A);<br /> /* Mode Register[MD2(0),MD1(0),MD0(0),PSW(0),0(0),0(0),0(0),0(0),<br /> (0),(0),0(0),0(0),FS3(1),FS2(0),FS1(1),FS0(0)]*/<br /> /*模式0 Continuous-Conversion Mode.,Fadc=16.7HZ;*/<br />}<br /><br />long ReadAd7799ConversionData(void)<br />{<br /> long ConverData;<br /> unsigned char ADSAT;<br /> unsigned int iint;<br /><br /> WaiteRDY();<br /> WriteByteToAd7799(0x40);<br /> ADSAT=ReadByteFromAd7799();<br /> if((ADSAT&0x40)||(ADSAT& 0x08)==0) //出错或者读写异常<br /> {<br /> WriteByteToAd7799(0xff);<br /> WriteByteToAd7799(0xff);<br /> WriteByteToAd7799(0xff);<br /> WriteByteToAd7799(0xff);<br /> for(iint=0;iint<3000;iint++)<br /> {<br /> _nop_();<br /> }<br /> Ad7799_Ini(0);<br /> return(0);<br /> }<br /> else<br /> {<br /> WriteByteToAd7799(0x58);<br /><br /> /* Writes to Communications Register Setting Next Operation as Continuous<br /> Read From Data Register*/<br /> WaiteRDY();<br /> /* Wait for RDY pin to go low to indicate end of calibration cycle*/<br /> if(!AD7799_RDY)<br /> {<br /> ConverData=0;<br /> ConverData=ReadByteFromAd7799();<br /> ConverData=ConverData<<8;<br /> ConverData=ReadByteFromAd7799()+ConverData;<br /> ConverData=ConverData<<8;<br /> ConverData=ReadByteFromAd7799()+ConverData;<br /> }<br /> /* Read Conversion Result from AD7730's Data Register*/<br /><br /><br /><br /> return(ConverData);<br /><br /> }<br />}<br /><br />#include <reg52.h><br />#include "ad7799.h"<br /><br />idata long addata;<br /><br />main()<br />{<br /> Ad7799_Ini(0);<br /> while(1)<br /> {<br /> addata=ReadAd7799ConversionData();<br /> }<br />}<br /> |
|