一文搞懂I2C总线通信
目录
本来不打算写这篇文章,因为网上关于I2C总线通信的资料很多很全。但是最近刚换工作,主要做驱动开发,第一个驱动就是I2C通信,想了想还是结合网上的资料再整理下思路,方便今后的查阅和温习。
1、简介
I2C(集成电路总线),由Philips公司(2006年迁移到NXP)在1980年代初开发的一种简单、双线双向的同步串行总线,它利用一根时钟线和一根数据线在连接总线的两个器件之间进行信息的传递,为设备之间数据交换提供了一种简单高效的方法。每个连接到总线上的器件都有唯一的地址,任何器件既可以作为主机也可以作为从机,但同一时刻只允许有一个主机。
I2C 标准是一个具有冲突检测机制和仲裁机制的真正意义上的多主机总线,它能在多个主机同时请求控制总线时利用仲裁机制避免数据冲突并保护数据。作为嵌入式开发者,使用I2C总线通信的场景有很多,例如驱动FRAM、E2PROM、传感器等。
总结来说,I2C总线具有以下特点:
- 只需要SDA、SCL两条总线;
- 没有严格的波特率要求;
- 所有组件之间都存在简单的主/从关系,连接到总线的每个设备均可通过唯一地址进行软件寻址;
- I2C是真正的多主设备总线,可提供仲裁和冲突检测;
- 传输速度分为四种模式:
- 标准模式(Standard Mode):100 Kbps
- 快速模式(Fast Mode):400 Kbps
- 高速模式(High speed mode):3.4 Mbps
- 超快速模式(Ultra fast mode):5 Mbps
- 最大主设备数:无限制;
- 最大从机数:理论上是127。
2、物理特性
I2C 总线上拉电阻阻值取决于系统应用,TI 官方手册推荐使用以下公式来计算上拉电阻值:
根据上表,这里不难发现需要在做电阻选择需要满足几个条件:
- 灌电流最大值为3mA;
- 低电平输出电压设置了最大值为0.4V。
所以根据上述公式可以计算,对于5V的电源,每个上拉电阻阻值至少1.53kΩ,而对于3.3V的电源,每个电阻阻值至少967Ω。
如果觉得计算电阻值比较麻烦,也可以使用典型值 4.7kΩ。若各位想了解更多可直接参见手册说明。
3、通讯时序
通常情况下,一个完整的I2C通信过程包括以下 4 部分:
- 开始条件
- 地址传送
- 数据传送
- 停止条件
主机在 SCL 线上输出串行时钟信号,数据在 SDA 线上进行传输,每传输一个字节(最高位 MSB 开始传输)后面跟随一个应答位,一个 SCL 时钟脉冲传输一个数据位。
标准的I2C时序如下图所示:
3.1、开始和停止条件
3.2、地址传送
- S :表示开始条件;
- SLA :表示从机地址;
- R/W#:表示发送和接收的方向。当 R/W# 为“1” 时,将数据从从机发送到主机;当 R/W#为“0” 时,将数据从主机发送到从机;
- Sr :表示重新开始条件;
- DATA :表示发送和接收的数据;
- P :表示停止条件。
3.3、数据传送
如果总线上从机接收数据,在第 9 个时钟周期不响应主机,从机必须发送 NACK。如果总线上主机接收数据,第 9 个周期发送 NACK,从机接收到 NACK,从机停止发送数据。
无论主机还是从机发送了 NACK,数据传送终止。主机可以做下列任一动作:
- 发送停止条件释放总线 ;
- 发送重新开始条件开始一个新的通信。
在主机接收模式中,主机输出 SCL 时钟,接收从机数据并返回应答。主机接收数据的运行时序例如下图所示:
3.4、总线应答
3.5、总线仲裁
- SCL 线上的同步(时钟同步)
- SDA 线上的仲裁
解析如下:
4、工作过程
最后整体叙述一下I2C通讯过程,本小节内容整理来源于:微信公众号:小麦大叔,作者菜刀和小麦。
第1步:起始条件
主设备通过将SDA线从高电平切换到低电平,再将SCL线从高电平切换到低电平,来向每个连接的从机发送启动条件,如下图所示:
第2步:发送从设备地址
主设备向每个从机发送要与之通信的从机的7位或10位地址,以及相应的读/写位,如下图所示:
第3步:接收应答
每个从设备将主设备发送的地址与其自己的地址进行比较。如果地址匹配,则从设备通过将SDA线拉低一位以表示返回一个ACK位。
如果来自主设备的地址与从机自身的地址不匹配,则从设备将SDA线拉高,表示返回一个NACK位。
第4步:收发数据
主设备发送或接收数据到从设备,如下图所示:
第5步:接收应答
在传输完每个数据帧后,接收设备将另一个ACK位返回给发送方,以确认已成功接收到该帧,如下图所示:
第6步:停止通信
为了停止数据传输,主设备将SCL切换为高电平,然后再将SDA切换为高电平,从而向从机发送停止条件,如下图所示:
4.1、单个主设备连接多个从机
I2C总线上的主设备使用7位地址对从设备进行寻址,可以使用128(2的7次方)个从机地址,如下图所示:
4.2、多个主设备连接多个从机
多个主设备可以连接到一个或多个从机。
当两个主设备试图通过SDA线路同时发送或接收数据时,同一系统中的多个主设备就会出现问题。
为了解决这个问题,每个主设备都需要在发送消息之前检测SDA线是低电平还是高电平;
- 如果SDA线为低电平,则意味着另一个主设备可以控制总线,并且主设备应等待发送消息;
- 如果SDA线为高电平,则可以安全地发送消息。
拓展学习:
1、I2C Bus
2、https://www.nxp.com.cn/docs/en/application-note/AN10216.pdf
3、https://www.ti.com/lit/an/slva689/slva689.pbeiz、
文章来源: handsome-man.blog.csdn.net,作者:不脱发的程序猿,版权归原作者所有,如需转载,请联系作者。
原文链接:handsome-man.blog.csdn.net/article/details/123673285
- 点赞
- 收藏
- 关注作者
评论(0)