首页 » 通讯 » 一篇文章讲透I2C总线协议_暗记_旗子

一篇文章讲透I2C总线协议_暗记_旗子

萌界大人物 2024-11-10 05:40:31 0

扫一扫用手机浏览

文章目录 [+]

I2C由两条双向开漏线组成,这是一个很大的上风,接线大略。
两条线利用上拉电阻将电位上拉。
范例电位为+3.3V或+5V。
标准传输速率为100Kb/s,低速模式10Kb/s。

物理层

下图为I2C总线的物理拓扑图,大家可以看到一共只有两条总线,一条SDA(serial data)数据线用来承载数据、一条SCL(serial clock line)时钟线用来掌握数据收发时序。
所有I2C设备的SDA都接到了总线的SDA上,SCL都接到了总线的SCL上。
每个设备都有自己的唯一地址,以担保设备之间访问的准确性。

一篇文章讲透I2C总线协议_暗记_旗子 通讯

I2C总线的物理拓扑图

I2C在物理层的连接可以说是非常大略,这也是它最大的上风,事理便是通过掌握SDA和SCL线的高低电平时序,来产生I2C总线协议所须要的旗子暗记进行数据传输。
在总线处于空闲状态时SCL和SDA被上拉电阻拉高,保持高电平。

须要把稳的是I2C的通讯办法为半双工,由于只有一条数据线,某一时候只可能单向通讯。
这也解释了I2C不适宜大数据量的传输运用。

对付主机、从机的区分很大略,发布紧张命令的便是主机,接管命令的便是从机,同一条I2C总线许可多个主机的存在。

协议层

作为根本我们先来理解几个主要的小观点。

1、初始状态(即空闲状态):SDA与SCL均为上拉电阻所致的高电平时为初始状态;2、开始旗子暗记:当SCL为高电平的时候,SDA被拉低,此为开始旗子暗记,表明通讯开始。
3、终止旗子暗记:当SCL为高电平的时候,SDA被拉高,此为终止旗子暗记,表明本次通讯结束。

到这里大家有没有创造点什么?当SCL处于高电平的时候,SDA电平一旦变革就会是一种旗子暗记,要么开始要么是终止。
以是在数据传输过程中,SCL处于高电平时,SDA必须保持状态稳定,只有SCL处于低电平时SDA才可以变革。

4、应答旗子暗记:当发送器向吸收器发送完一个字节/8位数据后,第9个时钟周期内,吸收器必须给发送器一个应答旗子暗记,这样数据才算传输成功。
高电平表非应答,低电平表应答。

我们理解这几个旗子暗记状态后,来一步一步看看数据是如何传输的。

1、向从机设备的某一个寄存器写一个字节数据:开始旗子暗记+设备地址(7位)+读/写(1位)+等待从机应答+寄存器地址(8位)+等待从机应答+要写的数据(8位)+等待从机应答+终止旗子暗记。
下图为24C02 EEPROM存储器写数据的时序图。

2、写我们见识了,那读一个试试:下图为读取24C02当前地址一个字节数据的时序图,是不是一览无余了。
值得把稳的是当读的时候地址7位后的读写状态位为1。
这里说一下为什么末了是NO ACK,在“读”这个操作下,主机为吸收器,主机的NO ACK表示停滞吸收24C02的数据,不然24C02会连续发。

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接口的设备时就可以信手拈来了。
我一贯以为在学习的过程中,“会利用”不一定便是我们追求的终点,会用的同时把一些更深的东西搞懂搞透会收成意想不到的喜悦。

PS.近期会有开源项目推出,敬请期待~

「创作不易」

希望大家随手点个赞

这是对我最大的支持和鼓励你们的支持便是我连续创作的动力

标签:

相关文章

VCC和GND短路怎么快速找问题?_芯片_电容

做硬件的小伙伴该当都有这样的经历,都会碰着VCC和GND短路情形。本日就跟大家分享碰着这种情形时,我们一样平常都是怎么来找问题的。...

通讯 2025-01-18 阅读0 评论0

单片机硬件设计经验总结_电路_单片机

(1 在元器件的布局方面,该当把相互有关的元件只管即便放得靠近一些,例如,时钟发生器、晶振、CPU的时钟输入端都易产生噪声,在放...

通讯 2025-01-18 阅读0 评论0