我用ADS1100做AD采集,发现采集到的两个字节永远是0XFF,IIC发现ADS1100没有应答,纠结了好几天了,自己没有办法解决这个问题了,不知道问题在哪。使用的单片机是STC15W408AS 晶振是内部设置18.432MHZ 以下是代码。 会不会是速率问题,我觉得问题可能在IIC上,但是IIC应该没有问题了,delay_us我仿真下来是0.89us 延时也应该没有问题,不知道问题在哪,单片机换过了,ADS1100也换过了,请前辈们抽点时间帮小弟看看,不甚感激啊!附上ADS1100资料
#include "ads1100.h"
#include "delay.h"
#include "usart.h"
#include <intrins.h>
#include "typeconst.h"
//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的配置函数和读取函数,得不到数据,从机没有应道,请大神帮我看看啊。
IO口设置成开漏和双向都是这个问题。
此帖出自
小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>