打印

求助AD采集采集不到的问题

[复制链接]
998|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
孟新辉|  楼主 | 2016-5-20 16:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,我最近用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资料。

相关帖子

沙发
icefox225| | 2016-5-20 23:03 | 只看该作者
应该还是时序问题,示波器看下波形

使用特权

评论回复
板凳
孟新辉|  楼主 | 2016-5-21 10:48 | 只看该作者
icefox225 发表于 2016-5-20 23:03
应该还是时序问题,示波器看下波形

已经解决  是读写函数的逻辑时序问题,很微妙还是查出来解决了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

3

帖子

0

粉丝