找回密码
 注册会员
搜索附件  
MCU资讯论坛 附件中心 单片机论坛 51单片机论坛 SST89x554-564_CN_Rev3.pdf

SST89x554-564_CN_Rev3.pdf

 

16位的ADS1110(AD转换),程序编好,出现问题,望高手指:
先简单说一下ADS1110,它是基于I2C总线的16位高精度AD转换芯片,我用的是贴片的.详细的资料在附件中..可以看看

我用的SST 89X516RD,也是51的

我编好了程,硬件也接好,开始调试,但就是结果.......

程序的思路大概是这样的,我定义P1.4,P1.5分别为SDA,SCL. 定义了一个全局数组rbuf[2]

因为它是16位输出,所以rbuf[2]用来装读到的2个字节的转换数值(2进制)

这个器件的地址按照手册是1001 001#,最后一为是读/写位.

按照手册先发送address byte 在发送命令字节,我给的是0X92(向从件写) ,后面给的是0X93(读从件)

之后我直接读它的OUTREGISTER16位的,我分了2次读,并放到rubf[2]中.

之后我调用显示程序,我用四个数码管分别显示rbuf[0]中的高4位,低4位和rbuf [1]中的高4位,低4位.....ADS1110的量程是2.048V到--2.048V;

按照我命令字节的设置,如果电压是0V,它应该显示0000.如果是2.048V,它应该显示7FFF,但显示显示很乱

而且显示之后就不在变化,(比如现在一运行它就显示0302,之后就一直不动)我是连续采样,连续读值..

我用高精度示波器观察SDA,SCL,发现也有波形啊,但不是很理想.我也不能完全判断是对是错...显示是用的周立功的7289.应该没有问题.

应该是时序的问题,但我搞了很久还是不行.



希望有人告诉我,问题出在哪里,怎么判断,如何解决..不甚感激



#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; //这边设置的2个口合适吗?
sbit SCL = P1^5;


uchar rbuf[ 2 ]; //用于存放2个字节的转换结果
bit bdata NACK;
bit bdata nackFlag;


/****************************************

延时子函数delay ( );

****************************************/
void delay ( uchar t )
{
while( t-- );
}




/****************************************

起始条件子函数

****************************************/
void start ( void )
{
SDA = 1;
SCL = 1;
delay ( 8 );
SDA = 0;
delay ( 20 );
SCL = 0;
}




/***************************************

停止条件子函数

***************************************/
void stop ( void )
{
SDA = 0;
SCL = 1;
delay ( 8 );
SDA =1;
delay ( 20 );
SCL = 0;
}



/***************************************

发送应答子函数

***************************************/
void ack ( void )
{
SDA = 0;
delay ( 8 );
SCL = 1;
delay ( 20 );
SCL = 0;
delay ( 8 );
}


/***************************************

发送非应答子函数

***************************************/
void n_ack ( void )
{
SDA = 1;
delay ( 8 );
SCL = 1;
delay ( 20 );
SCL = 0;
delay ( 8 );
}



/***************************************

应答位检查子函数

***************************************/
void checkack (void )
{
SDA = 1;
delay ( 8 );
SCL = 1;
nackFlag = 0;
if( SDA == 1 )
{
nackFlag = 1;
}
SCL = 0;
}



/***************************************

函数名:void sendbyte( uchar *ch )
参数: ch
返回值: 无
功能描述: 发送一个字节的数据

***************************************/
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;
}

}


/****************************************

接收一个字节数据子函数

****************************************/
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;
}


/****************************************

发送N字节数据子程序

****************************************/
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字节数据子程序

****************************************/
void recnbyte ( uchar addr, uchar n )
{

uchar *point;
start ( );
sendbyte ( addr ); //addr = 0x93 读
checkack ( );

if ( nackFlag == 1)
{
NACK = 1;
return; //执行这句后程序跳到哪里???
}

point = rbuf ;

while ( n -- )
{
recbyte ( point );
ack ( ); //主机应答
point++;
}

n_ack ( ); //主机不应答
stop ( );

}


/****************************************

函数名:void main ( void )
参数: 无
返回值: 无
功能描述:DA转换

****************************************/
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 ); //至此转换完的2字节数据已经装如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个数码管显示,不显示小数点,显示的数(0--F)
ZLG7289_Download( 1, 2, 0, value2 );
ZLG7289_Download( 1, 1, 0, value3 );
ZLG7289_Download( 1, 0, 0, value4 );

}

}





QQ|手机版|MCU资讯论坛 ( 京ICP备18035221号-2 )|网站地图

GMT+8, 2024-12-24 07:08 , Processed in 0.041700 second(s), 8 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

返回顶部