大家好,我最近用ADS1100采集电压的时候遇到采集不了的问题,两个字节发送到串口上一直显示0xff,也就是说根本没有数据,调试了好几天都没有结果,郁闷至极。
IIC我觉得也没有问题,delay_us(1)是0.89us,延时应该没有问题,我用的是STC15W408AS 晶振是内部的18.432MHZ。请前辈们帮我看看代码,小弟不甚感激啊!
#include "ads1100.h"
#include "delay.h"
#include "usart.h"
#include <intrins.h>
#include "typeconst.h"
bit KK;
//iic总线初始化
void iic_init(void)
{
SDA=1; //数据线拉高
SCL=1; //时钟线拉高
}
//产生START信号
void iic_start(void)
{
SDA = 1; //需在SCL之前设定
delay_us(5);
SCL = 1; //硬件进入SDA检测状态
delay_us(6); //延时至少4.7us
SDA = 0; //SDA由1->0,产生开始信号
delay_us(5); //延时至少4us
// SCL = 0; //SCL变为无效
}
//产生STOP信号
void iic_stop(void)
{
SDA = 0; //在SCL之前拉低
delay_us(5);
SCL = 1; //硬件进入SDA检测状态
delay_us(6); //至少延时4us
SDA = 1; //SDA由0->1,产生结束信号
delay_us(5); //延时至少4.7us
}
//从机应答信号
void iic_respons() //应答,在数据传送8 位后,等待或者发送一个应答信号
{
uchar i;
SCL=1;
delay_us(6);
while((SDA==1)&&(i<250))i++;
SCL=0;
delay_us(6);
}
//写IIC总线写1个字节
void iic_write_byte(uchar dat)
{
uchar loop = 8; //必须为一个字节
while(loop--){
SDA = dat&0x80; //从MSb开始逐位写入
SCL = 1;
delay_us(5); //延时至少4us
SCL = 0;
dat <<= 1; //低位向高位移动
delay_us(5);
}
}
//从IIC总线读取1个字节
uchar iic_read_byte(void)
{
uchar loop = 8; //必须为一个字节
uchar ret = 0;
while(loop--){
SDA = 1; //8051内部电阻上拉
SCL = 1;
delay_us(5); //延时至少4us
ret <<= 1;
ret |= SDA; //读取1位
SCL = 0 ;
delay_us(5);
}
return ret;
}
//由主向从发送应答码
//0-ACK,1-NAK
void iic_send_ack(bit ack)
{
SDA = ack; //产生应答电平
SCL = 1; //发送应答信号
delay_us(5); //延时至少4us
SCL = 0; //整个期间保持应答信号
}
//取得由从到主的应答码 0:OK 1:NG
bit iic_get_ack(void)
{
bit ret; //用来接收返回值
SDA = 1; //电阻上拉,进入读(8051)
SCL = 1; //进入应答检测
delay_us(6); //至少延时4us
ret = SDA; //保存应答信号
SCL = 0;
return ret;
}
//ads1100部分 16位AD采集器件 通过IIC与单片机交换数据
//写器件配置字
void wr_ads1100_cfg(void)
{
iic_start();
iic_write_byte(0x90); //写地址:1001 000 0 固定码:1001,地址为000,写命令为0
while(iic_get_ack()); //等待应答
iic_write_byte(0x8c); //写配置字:连续转换,转换速率为8SPS,增益为1 1000 1100
while(iic_get_ack()); //等待应答
iic_stop(); //结束
}
//从ads1100中读数据
//返回值为双字节数据
uint rd_ads1100_data(void)
{
uint result;
uchar TMR1H; //输出高8位
uchar TMR1L; //输出低8位
uchar TMR2; //控制寄存器
iic_start();
iic_write_byte(0x91); //写地址:1001 000 1 固定码:1001,地址为000,读命令为1
iic_respons();
TMR1H=iic_read_byte();
iic_send_ack(0); //发送应答
TMR1L=iic_read_byte();
iic_send_ack(0); //发送应答
TMR2=iic_read_byte();
iic_send_ack(1); //不发送应答
iic_stop();
result=TMR1H*256+TMR1L;
return result;
}
主函数就是调用ADS1100的配置函数和读取函数,主机发送数据到IIC上一直没有回答,奇怪啊。ADS1100地址为0.
特附上ADS1100资料。
|