16位的ADS1110(AD轉(zhuǎn)換),程序編好,出現(xiàn)問題,望高手指:先簡單說一下ADS1110,它是基于I2C總線的16位高精度AD轉(zhuǎn)換芯片,我用的是貼片的.詳細(xì)的資料在附件中..可以看看
我用的SST 89X516RD,也是51的
我編好了程,硬件也接好,開始調(diào)試,但就是結(jié)果.......
程序的思路大概是這樣的,我定義P1.4,P1.5分別為SDA,SCL. 定義了一個全局?jǐn)?shù)組rbuf[2]
因為它是16位輸出,所以rbuf[2]用來裝讀到的2個字節(jié)的轉(zhuǎn)換數(shù)值(2進(jìn)制)
這個器件的地址按照手冊是1001 001#,最后一為是讀/寫位.
按照手冊先發(fā)送address byte 在發(fā)送命令字節(jié),我給的是0X92(向從件寫) ,后面給的是0X93(讀從件)
之后我直接讀它的OUTREGISTER16位的,我分了2次讀,并放到rubf[2]中.
之后我調(diào)用顯示程序,我用四個數(shù)碼管分別顯示rbuf[0]中的高4位,低4位和rbuf [1]中的高4位,低4位.....ADS1110的量程是2.048V到--2.048V;
按照我命令字節(jié)的設(shè)置,如果電壓是0V,它應(yīng)該顯示0000.如果是2.048V,它應(yīng)該顯示7FFF,但顯示顯示很亂
而且顯示之后就不在變化,(比如現(xiàn)在一運(yùn)行它就顯示0302,之后就一直不動)我是連續(xù)采樣,連續(xù)讀值..
我用高精度示波器觀察SDA,SCL,發(fā)現(xiàn)也有波形啊,但不是很理想.我也不能完全判斷是對是錯...顯示是用的周立功的7289.應(yīng)該沒有問題.
應(yīng)該是時序的問題,但我搞了很久還是不行.
希望有人告訴我,問題出在哪里,怎么判斷,如何解決..不甚感激
#define uchar unsigned char
#define uint unsigned int
#include "ZLG7289.H"
#include< reg52.h >
void ZLG7289_Download(unsigned char mod, char x, bit dp, char dat);
void ZLG7289_Init(unsigned char t);
sbit SDA = P1^4; //這邊設(shè)置的2個口合適嗎?
sbit SCL = P1^5;
uchar rbuf[ 2 ]; //用于存放2個字節(jié)的轉(zhuǎn)換結(jié)果
bit bdata NACK;
bit bdata nackFlag;
/****************************************
延時子函數(shù)delay ( );
****************************************/
void delay ( uchar t )
{
while( t-- );
}
/****************************************
起始條件子函數(shù)
****************************************/
void start ( void )
{
SDA = 1;
SCL = 1;
delay ( 8 );
SDA = 0;
delay ( 20 );
SCL = 0;
}
/***************************************
停止條件子函數(shù)
***************************************/
void stop ( void )
{
SDA = 0;
SCL = 1;
delay ( 8 );
SDA =1;
delay ( 20 );
SCL = 0;
}
/***************************************
發(fā)送應(yīng)答子函數(shù)
***************************************/
void ack ( void )
{
SDA = 0;
delay ( 8 );
SCL = 1;
delay ( 20 );
SCL = 0;
delay ( 8 );
}
/***************************************
發(fā)送非應(yīng)答子函數(shù)
***************************************/
void n_ack ( void )
{
SDA = 1;
delay ( 8 );
SCL = 1;
delay ( 20 );
SCL = 0;
delay ( 8 );
}
/***************************************
應(yīng)答位檢查子函數(shù)
***************************************/
void checkack (void )
{
SDA = 1;
delay ( 8 );
SCL = 1;
nackFlag = 0;
if( SDA == 1 )
{
nackFlag = 1;
}
SCL = 0;
}
/***************************************
函數(shù)名:void sendbyte( uchar *ch )
參數(shù): ch
返回值: 無
功能描述: 發(fā)送一個字節(jié)的數(shù)據(jù)
***************************************/
void sendbyte ( uchar temp )
{
uchar n = 8;
while ( n-- )
{
if( ( temp & 0x80 ) == 0x80 )
{
SDA = 1;
delay ( 8 );
SCL = 1;
delay ( 20 );
SCL = 0;
}
else
{
SDA = 0;
delay ( 8 );
SCL = 1;
delay ( 20 );
SCL = 0;
}
temp = temp << 1;
}
}
/****************************************
接收一個字節(jié)數(shù)據(jù)子函數(shù)
****************************************/
void recbyte( uchar *ch )
{
uchar n = 8;
uchar temp = 0;
SDA = 1; //這里的SDA作為輸入口,所以先置1
while( n-- )
{
SCL = 1;
temp = temp << 1;
if( SDA == 1 )
{
temp = temp | 0x01;
}
else
{
temp = temp & 0xFE;
}
SCL = 0;
}
*ch = temp;
}
/****************************************
發(fā)送N字節(jié)數(shù)據(jù)子程序
****************************************/
void sendnbyte ( uchar addr, uchar n )
{
start ( );
sendbyte ( addr ); //addr = 0x92 寫
checkack ( );
if ( nackFlag == 1 )
{
NACK = 1;
return; //程序跳到哪里???
}
while ( n -- )
{
sendbyte ( 0x8C );
checkack ( );
if ( nackFlag == 1)
{
NACK = 1;
return;
}
}
stop ( );
}
/****************************************
接收N字節(jié)數(shù)據(jù)子程序
****************************************/
void recnbyte ( uchar addr, uchar n )
{
uchar *point;
start ( );
sendbyte ( addr ); //addr = 0x93 讀
checkack ( );
if ( nackFlag == 1)
{
NACK = 1;
return; //執(zhí)行這句后程序跳到哪里???
}
point = rbuf ;
while ( n -- )
{
recbyte ( point );
ack ( ); //主機(jī)應(yīng)答
point++;
}
n_ack ( ); //主機(jī)不應(yīng)答
stop ( );
}
/****************************************
函數(shù)名:void main ( void )
參數(shù): 無
返回值: 無
功能描述:DA轉(zhuǎn)換
****************************************/
void main ( void )
{
uchar Value_H;
uchar Value_L;
uchar value1;
uchar value2;
uchar value3;
uchar value4;
ZLG7289_Init(4);
delay ( 100 );
while( 1 )
{
sendnbyte ( 0x92, 1 );
delay ( 8 );
recnbyte ( 0x93, 2 ); //至此轉(zhuǎn)換完的2字節(jié)數(shù)據(jù)已經(jīng)裝如rbuf[0],rbuf[1]中
Value_H = rbuf[ 0 ]; //存放16位輸出值的高8位
Value_L = rbuf[ 1 ]; //存放16位輸出值的低8位
value1 = Value_H >> 4;
value2 = Value_H & 0x0F ;
value3 = Value_L >> 4;
value4 = Value_L & 0x0F ;
ZLG7289_Download( 1, 3, 0, value1 ); 括號里面分別代表顯示方式1,在第3個數(shù)碼管顯示,不顯示小數(shù)點,顯示的數(shù)(0--F)
ZLG7289_Download( 1, 2, 0, value2 );
ZLG7289_Download( 1, 1, 0, value3 );
ZLG7289_Download( 1, 0, 0, value4 );
}
}