只需一步,快速开始
热门: 51单片机 | 24小时必答区 | 单片机教程 | 单片机DIY制作 | STM32 | Cortex M3 | 模数电子 | 电子DIY制作 | 音响/功放 | 拆机乐园 | Arduino | 嵌入式OS | 程序设计
这东西搞了两天了 ,好生郁闷
一个字节的数据传完后 要返回一个ack
void respons() //应答{ uchar i; scl=1; delay(); while((sda==1)&&(i<250))i++; scl=0; delay();}
这个返回里并没有对返回值操作呀 难道是器件自发的返回ack? 如果返回的标志是sda=0 那为什么有一定的时间限制呢? 求解答。。
使用道具 举报
SCL=1;
准备读取ACK
先不考虑I
如果这个时候SDA==1为假,也就是说有ACK信号了,那么跳过后面的语句,直接SCL=0
ACK信号读取成功
在考虑I
如果SDA==1为真,也就是SDA是高,没有收到ACK,这个时候通过I来做一段延时, 延时到再退出
如果在一定的时间内没有读到ACK,说明通讯失败,在你上面的程序里,没有标记失败的变量,是按照正常情况来退出的,一般来说I2C器件都不会出现这种失败的情况,但为了程序的可靠性,应该在以上一段程序后增加STOP,不知道你没有帖出来的程序里时候有
以上仅供参考!
谢谢耐心的解答 , 不过i2c不是clk高电平读取数据 低电平是准备阶段吗 低电平的时候允许sda改变 还有个新问题 有人写延时函数的时候是
void delay(){; ;}这是不是和{_nop_();_nop_(); }是一样的意思??百度不让查这个符号 麻烦大神解答一下。
本版积分规则 发表回复 回帖后跳转到最后一页
手机版|小黑屋|51黑电子论坛 | 管理员QQ:125739409;技术交流QQ群281945664
Powered by 单片机教程网