标题: 51单片机I2C总线初始化为什么要加延时? [打印本页]

作者: 沧兴电子    时间: 2020-7-13 15:01
标题: 51单片机I2C总线初始化为什么要加延时?
在郭老师51单片机教材中,关于 51单片机I2C总线初始化时,SCL=1;delay();//几微妙延时;SDA=1;delay();//几微妙延时。这两个几微妙延时函数有作用吗?特别是第一个延时函数感觉没有任何作用。初学小白希望各位师傅指导。

作者: xuyaqi    时间: 2020-7-13 15:49
对照手册时序图看程序就会明白,权威不一定样样都是对的。
作者: 草草111111    时间: 2020-7-13 16:08
看时序图就知道了呀,这是为了保证在时钟线为高电平的情况下,然后把数据线拉高
作者: heaver    时间: 2020-7-13 16:11
延时是保证拉高拉低时间大于设备接口时序要求的时间,因为时序要求高低保持时间是有要求的,如果你执行太快,设备还没检测到,就过去了,那就错了。
追问
它的作用是什么呢:
(1)延迟一会才执行下一条语句。
(2)保持上一条语句一会儿。
作用是哪一条呢?(1)还是(2)?
追答
作用主要是(2),使上一条指令保持时间够了,再执行下一条语句
加不加延时和你的I2C设备的反应速度有关系,一般都是要加的,普通i2c设备的start时间为几个uS,保持时间也是几个us,主要要保持i2c总线是时序时间是合理的,比如pcf8583这个芯片他开始时序的SDA=1升起时间是4.7uS,SDA=1保持时间是4uS,然后才能使SCL=1,然后将SDA=0,这时设备接收到这过程就认为开始。
作者: Y_G_G    时间: 2020-7-13 20:52
1:delay();是C语言中的几,而不是实际指令的几,编译之后可能是10或者是8,没玩过,就不确定,delay();与实际执行时间没有等号关系

2:就算是5uS,那也是是足够了,你看一下延时的函数在一个时钟中是有两次的,整个时钟的周期加上指令周期,它是大于十几uS的,对于标准的IIC时钟(100KHZ),就足够了

3:加延时的目的是让IIC器件有时间响应数据,IIC读取数据是要一定时间的,时间不足够,就可能出现错误,具体参数可以随便找个24C01来看一下就知道了
作者: 权威人物    时间: 2020-7-15 11:23
https://blog.csdn.net/super828/article/details/91345151
仔细认真理解你就知道了




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1