AD采集读不到数据,急!

2019-03-24 17:03发布

     我用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口设置成开漏和双向都是这个问题。


此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
4条回答
zhangjun16
1楼-- · 2019-03-24 22:47
你有用示波器看波性吗?延时设置宽裕点试试,祝你好运
ienglgge
2楼-- · 2019-03-25 04:35
 精彩回答 2  元偷偷看……
mengxinhui123
3楼-- · 2019-03-25 06:45
zhangjun16 发表于 2016-5-20 18:00
你有用示波器看波性吗?延时设置宽裕点试试,祝你好运

已经解决了,延时时间没问题  是读写里边逻辑的问题
budong627
4楼-- · 2019-03-25 11:05
怎么解决的,我也遇到同样的问题

一周热门 更多>