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


产业气象站|一篇文章讲透I2C总线协议
文章图片
3、我们再读一个长一点的:下图为读取24C02任意地址一个字节数据的时序图 。 开始信号+设备地址(7位)+写(1位)+等待从机应答+数据地址(8位)+等待从机应答 。 前面这一步为假写 , 目的是告诉24C02要读哪个地址的数据 。 继续 , 开始信号+设备地址(7位)+读(1位)+等待从机应答+读到的数据(8位)+等待主机(接收机)应答+终止信号 。
产业气象站|一篇文章讲透I2C总线协议
文章图片
补点干货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短路了;但是开漏就不会有这个问题 , 如下图示:
产业气象站|一篇文章讲透I2C总线协议
文章图片
第二个原因是“线与” , 我们想个场景:如果总线上的一个A设备将SDA拉高 , 这时总线上另一个B设备已将SDA拉低 , 这时由于1&amp0=0 , 所以A设备检查SDA的时候会发现不是高电平而是低电平 , 这就表明总线上已经有其他设备占用总线了 , A只好放弃 , 如果检测是高电平那就可以使用 。 如下图示为24C02芯片内部图 , 可以看到状态检测脚 。
产业气象站|一篇文章讲透I2C总线协议
文章图片
总结【产业气象站|一篇文章讲透I2C总线协议】I2C总线作为一个常见的总线协议 , 是非常值得我们来仔细研究琢磨的 , 通透以后我们再使用任意I2C接口的设备时就可以信手拈来了 。 我一直觉得在学习的过程中 , “会使用”不一定就是我们追求的终点 , 会用的同时把一些更深的东西搞懂搞透会收获意想不到的喜悦 。


推荐阅读