完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
大家伙,我最近用ADS1100采集电压的时候遇到采集不了的问题,两个字节发送到串口上一直显示0xff,也就是说根本没有数据,调试了好几天都没有结果,郁闷至极。
IIC我觉得也没有问题,仿真delay_us(1)是0.89us,延时应该没有问题,我用的是STC15W408AS 晶振是内部的18.432MHZ。请前辈们帮我看看代码,小弟不甚感激啊! #include "ads1100.h" #include "delay.h" #include "usart.h" #include #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资料。
|
|
相关推荐
2个回答
|
|
遇到问题要找问题,排除硬件问题先,加DEBUG信息输出。
|
|
|
|
一步步的看哪个IIC设备有没有应答
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
644 浏览 0 评论
求助一下关于51系列单片机的Timer0的计时问题,TH0、TL0+1的时间是怎么算的?
1819 浏览 1 评论
【RA-Eco-RA4E2-64PIN-V1.0开发板试用】开箱+Keil环境搭建+点灯+点亮OLED
1262 浏览 0 评论
【敏矽微ME32G070开发板免费体验】使用coremark测试敏矽微ME32G070 跑分
1136 浏览 0 评论
【敏矽微ME32G070开发板免费体验】开箱+点灯+点亮OLED
1357 浏览 2 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
12024 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-24 05:32 , Processed in 0.771072 second(s), Total 75, Slave 57 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号