找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2965|回复: 5
收起左侧

51单片机I2C总线初始化为什么要加延时?

[复制链接]
ID:748096 发表于 2020-7-13 15:01 | 显示全部楼层 |阅读模式
在郭老师51单片机教材中,关于 51单片机I2C总线初始化时,SCL=1;delay();//几微妙延时;SDA=1;delay();//几微妙延时。这两个几微妙延时函数有作用吗?特别是第一个延时函数感觉没有任何作用。初学小白希望各位师傅指导。
回复

使用道具 举报

ID:94031 发表于 2020-7-13 15:49 | 显示全部楼层
对照手册时序图看程序就会明白,权威不一定样样都是对的。
回复

使用道具 举报

ID:733205 发表于 2020-7-13 16:08 | 显示全部楼层
看时序图就知道了呀,这是为了保证在时钟线为高电平的情况下,然后把数据线拉高
回复

使用道具 举报

ID:801890 发表于 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,这时设备接收到这过程就认为开始。

评分

参与人数 1黑币 +30 收起 理由
admin + 30 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:401564 发表于 2020-7-13 20:52 | 显示全部楼层
1:delay();是C语言中的几,而不是实际指令的几,编译之后可能是10或者是8,没玩过,就不确定,delay();与实际执行时间没有等号关系

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

3:加延时的目的是让IIC器件有时间响应数据,IIC读取数据是要一定时间的,时间不足够,就可能出现错误,具体参数可以随便找个24C01来看一下就知道了
回复

使用道具 举报

ID:311846 发表于 2020-7-15 11:23 | 显示全部楼层
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表