产业气象站|一篇文章讲透I2C总线协议( 二 )

文章图片
3、我们再读一个长一点的:下图为读取24C02任意地址一个字节数据的时序图 。 开始信号+设备地址(7位)+写(1位)+等待从机应答+数据地址(8位)+等待从机应答 。 前面这一步为假写 , 目的是告诉24C02要读哪个地址的数据 。 继续 , 开始信号+设备地址(7位)+读(1位)+等待从机应答+读到的数据(8位)+等待主机(接收机)应答+终止信号 。

文章图片
补点干货1、设备的地址 。 I2C设备的地址为8位 , 但是时序操作时最后一位不属于地址 , 而是读or写状态位 。 这就是为什么arduino的SH1106库里操作的地址不是0x7-而是0x3- , 因为有用的是前7位 , 地址整体右移一位处理了 。 再一个设备地址的前四位是固定死的 , 是厂家用来表示设备类型的 , 比如接口为I2C的温度传感器类设备地址前四位一般为1001即9X、EEPROM存储器地址前四位一般为1010即AX、oled屏地址前四位一般为0111即7X等等 。
2、I2C接口的致命缺点就是传输距离近同时速度慢 。 大家在使用I2C总线接口的时候切记不要长线传输 , 尽量只在PCB板内传输 , 不然偶尔丢数据甚至读不到数据会让人崩溃 , 不要问我是怎么知道的 , 问只有眼泪 。
3、关于两线为什么设计成开漏 , 这个问题我记得我之前在写《STM32单片机I/O的8种工作模式》时给大家埋下过伏笔 。 今天就来说一下具体原因 。 主要有两点①防止短路:大家想想如果不设为开漏 , 而设为推挽 , 几个设备连在同一条总线上 , 这时某一设备的某个IO输出高电平 , 另有一台设备的某一个IO输出低电平 , 这时你会发现这两个IO的VCC和GND短路了;但是开漏就不会有这个问题 , 如下图示:

文章图片
第二个原因是“线与” , 我们想个场景:如果总线上的一个A设备将SDA拉高 , 这时总线上另一个B设备已将SDA拉低 , 这时由于1&0=0 , 所以A设备检查SDA的时候会发现不是高电平而是低电平 , 这就表明总线上已经有其他设备占用总线了 , A只好放弃 , 如果检测是高电平那就可以使用 。 如下图示为24C02芯片内部图 , 可以看到状态检测脚 。

文章图片
总结【产业气象站|一篇文章讲透I2C总线协议】I2C总线作为一个常见的总线协议 , 是非常值得我们来仔细研究琢磨的 , 通透以后我们再使用任意I2C接口的设备时就可以信手拈来了 。 我一直觉得在学习的过程中 , “会使用”不一定就是我们追求的终点 , 会用的同时把一些更深的东西搞懂搞透会收获意想不到的喜悦 。
推荐阅读
- 产业气象站|5G基站太耗电!三大运营商正式官宣:将智能化关闭5G基站节约电费
- 产业气象站|他从不打无准备之仗,华为联手哈工大究竟想干啥?依任总性格
- 产业气象站|G是否影响健康?,张朝阳用手机保持30厘米
- 爱集微APP|“芯”势力助推游戏产业发展,芯片成为ChinaJoy的关键词之一
- 产业气象站|电力机器人“小白”上岗巡检
- 产业气象站|苏宁智能宣布五项Biu+共享政策,从生态赋能到生态共享
- 产业气象站|点赞“中国芯里的南大智慧”!华为公司CEO任正非一行访问南京大学
- 产业气象站|花多少钱收购,微软正在谈判收购TikTok美国业务
- 产业气象站|包括王兴,马云创办支付宝的本质不是为了支付,很多人没理解
- 上观新闻|半导体产业如何发展?嘉定举办的这个论坛指明了方向
