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
- 最大主设备数:无限制;
- 最大从机数:理论上,1008个从节点,寻址模式的最大节点数为2的7次方或2的10次方,但有16个地址保留用于特殊用途。
I2C有16个保留I2C地址。这些地址对应于以下两种模式之一:0000 XXX或1111 XXX。下表显示了为特殊目的而保留的I2C地址。
| I2C 节点地址 | R/W | 位功能描述 |
| 0000 000 | 0 | 广播地址 |
| 0000 000 | 1 | 起始字节 |
| 0000 001 | X | CBUS 地址 |
| 0000 010 | X | 保留用于不同总线格式 |
| 0000 011 | X | 保留供未来使用 |
| 0000 1XX | X | 高速模式主代码 |
| 1111 1XX | X | 保留供未来使用 |
| 1111 0XX | X | 10位节点地址 |
I2C还有两个变体,分别专注于系统和电源应用,称为系统管理总线(SMBus)和电源管理总线(PMBus)。
2、物理特性
I2C 总线使用连接设备的 "SDA"( 串行数据总线)和"SCL"( 串行时钟总线 ) 来传送信息。
I2C 总线内部使用漏极开路输出驱动器,因此
SDA和
SCL
可以被拉低为低电平,但是不能被驱动为高电平,所以每条线上都要使用一个上拉电阻,默认情况下将其保持在高电平。
I2C 总线上拉电阻阻值取决于系统应用,TI 官方手册推荐使用以下公式来计算上拉电阻值:
根据上表,这里不难发现需要在做电阻选择需要满足几个条件:
- 灌电流最大值为3mA;
- 低电平输出电压设置了最大值为0.4V。
所以根据上述公式可以计算,对于5V的电源,每个上拉电阻阻值至少1.53kΩ,而对于3.3V的电源,每个电阻阻值至少967Ω。
如果觉得计算电阻值比较麻烦,也可以使用典型值 4.7kΩ。若各位想了解更多可直接参见手册说明。
3、通讯特性
通常情况下,一个完整的I2C通信过程包括以下 4 部分:
- 开始条件
- 地址传送
- 数据传送
- 停止条件
主机在 SCL 线上输出串行时钟信号,数据在 SDA 线上进行传输,每传输一个字节(最高位 MSB 开始传输)后面跟随一个应答位,一个 SCL 时钟脉冲传输一个数据位。
标准的I2C时序如下图所示:
3.1、开始和停止条件
当总线上的主机都不驱动总线,总线进入空闲状态, SCL 和 SDA 都为高电平。总线空闲状态下总线上设备都可以通过发送开始条件启动通信。
当 SCL 线为高时,SDA 线上出现由高到低的信号,表明总线上产生了起始信号。 SDA 线上出现由低到高的信号,表明总线上产生了停止信号,如下图所示:
当两个起始信号之间没有停止信号时,即产生了重复起始信号。主机采用这种方法与另一个从机或相同的从机以不同传输方向进行通信(例如:从写入设备到从设备读出)而不释放总线。如下图所示:
3.2、地址传送
开始条件或者重新开始条件后面的帧是地址帧(一个字节),用于指定主机通信的对象地址,在发送停止条件之前,指定的从机一直有效。
I2C通讯支持:7 位寻址和10 位寻址两种模式。
7 位寻址模式,地址帧(8bit)的高 7 位为从机地址,地址帧第 8 位来决定数据帧传送的方向:7 位从机地址
- 1位 读/写位,读/写位控制从机的数据传输方向(0:写; 1:读) 。帧格式如下所示:
10 位寻址模式,主机发送帧,第一帧 发送头序列(11110XX0,其中 XX 表示 10 位地址的高 两位),然后第二帧发送低八位从机地址。 主机接收帧 ,第一帧发送头序列(11110XX0,其中 XX 表示 10 位地址的高两位),然后第二帧发送低八位从机地址。接下来会发送一个重新开始条件,然后再发送一帧头序列(11110XX1 ,其中 XX 表示 10 位地址的高两位)帧格式如下所示:
解析如下:
- S :表示开始条件;
- SLA :表示从机地址;
- R/W#:表示发送和接收的方向。当 R/W# 为“1” 时,将数据从从机发送到主机;当 R/W#为“0” 时,将数据从主机发送到从机;
- Sr :表示重新开始条件;
- DATA :表示发送和接收的数据;
- P :表示停止条件。
3.3、数据传送
地址匹配一致后,总线上的主机根据 R/W 定义的方向一帧一帧的传送数据。 所有的地址帧后传送的数据都视为数据帧。即使是 10 位地址格式的低 8 位地址也视为数据帧。
数据帧的长度是 8 位。 SCL 的低电平 SDA 变化, SCL 的高电平 SDA 保持,每个时钟周期发送一位数据。数据帧后的第 9 个时钟是应答位,是接收方向发送方传送的握手信号。
如果总线上从机接收数据,在第 9 个时钟周期不响应主机,从机必须发送 NACK。如果总线上主机接收数据,第 9 个周期发送 NACK,从机接收到 NACK,从机停止发送数据。
无论主机还是从机发送了 NACK,数据传送终止。主机可以做下列任一动作:
- 发送停止条件释放总线 ;
- 发送重新开始条件开始一个新的通信。
以华大MCU(HC3F4A0系列)为例,在主机接收模式中,主机输出 SCL 时钟,接收从机数据并返回应答。主机接收数据的运行时序例如下图所示:
7 位地址格式的主机发送数据时序图
在主机接收模式中,主机输出 SCL 时钟,接收从机数据并返回应答。主机接收数据的运行时序例如下图所示:
7 位地址格式的主机接收数据的时序图
在从机发送模式中,接收来自主机的 SCL 时钟,本产品为从机发送数据,并且接收主机返回应答。从机发送数据的运行时序例如下图所示:
7 位地址格式的从机发送模式时序图
在从机接收模式中,接收来自主机的 SCL 时钟和数据,接收完数据后返回应答。从机接收数据的运行时序例如下图所示:
7 位地址格式从机接收模式时序图
3.4、总线应答
每传输一个字节,后面跟随一个应答位。通过将 SDA 线拉低,来允许接收端回应发送端。ACK 为 一个低电平信号,当时钟信号为高时, SDA 保持低电平则表明接收端已成功接收到发送端的数据。
当主机作为发送器件时,如果从机上产生无响应信号(NACK) ,主机可以产生停止信号来退出数据传输,或者产生重复起始信号开始新一轮的数据传输。当主机作为接收器件时,发生无响应信号(NACK) ,从机释放 SDA 线,使主机产生停止信号或重复起始信号。
I2C 总线上应答信号
3.5、总线仲裁
I2C 总线上的仲裁分为两个部分: SCL 线上的同步和 SDA 线上的仲裁。
- SCL 线上的同步(时钟同步)
由于 I2C 总线具有线“与”的逻辑功能, SCL 线上只要有一个节点发送低电平,总线上就表现低电平。当所有的节点都发送高电平时,总线才能表现为高电平。所以,时钟低电平的时间由时钟电平期最长的器件决定,而时钟的高电平时间由时钟高电平期最短的器件决定。
由于 I2C 这种特性,当多个主机同时发送时钟信号时,在总线上表示的是统一的时钟信号。如果从机希望主机降低传送速度可以通过将 SCL 主动拉低延长其低电平时间来通知主机,当主机在准备下一次传送时发现 SCL 的电平被拉低时进行等待,直到从机完成操作并释放 SCL 线的控制权。
- SDA 线上的仲裁
SDA 线上的仲裁也是由于 I2C 总线具有线“与”的逻辑功能。主机在发送数据后,通过比较总线上的数据来决定是否退出竞争。丢失仲裁的主机立即切换到未被寻址的从机状态,以确保自身能被仲裁胜利的主机寻址到。仲裁失败的主机继续输出时钟脉冲(在 SCL 上),直到发送完当前的串行字节。通过这种原理可以保证 I2C 总线在多个主机企图控制总线时保证数据的不丢失。
I2C 总线上的仲裁
解析如下:
(1)另一器件发送串行数据;
(2)另一器件通过拉低 SDA 先撤消了该 I2C 主机发送的一个逻辑 1 (虚线)。仲裁丢失,I2C 进入从接收模式;
(3)此时 I2C 处于从接收模式,但仍产生时钟脉冲,直至发送完当前字节。 I2C 将不为下个字节的传输产生时钟脉冲。一旦赢得仲裁,SDA 上的数据传输由新的主机来启动。
3.6、时钟同步/时钟延展
I2C规范没有为时钟同步规定任何超时条件,也就是说,任何器件都可以根据需要保持SCL。
在I2C通信协议中,时钟速度和信号始终由主器件产生。I2C主器件产生的信号提供主器件和节点连接之间的同步。
在某些情况下,节点或子节点不是以全状态工作,在接收主器件生成的时钟之前,需要减慢速度。这是通过一种称为"时钟同步/时钟延展"的机制来实现的。
在时钟同步/时钟延展期间,为了降低总线速度,允许节点压低时钟。而在主器件方面,在其变为高电平状态后,必须回读时钟信号。然后,它必须等待,直至线路达到高电平状态。
通过时钟同步/时钟延展,I2C节点器件可以强制主器件进入等待状态。当节点器件需要更多时间来管理数据时,例如存储接收到的数据或准备发送另一字节的数据时,它可能会执行时钟同步/时钟延展。这通常发生在节点器件接收并确认收到一个字节的数据之后。
是否需要时钟延展取决于节点器件的功能。这里有两个例子:
- 处理器件(如微处理器或微控制器)可能需要额外的时间来处理中断,接收和管理数据,以及执行适当的功能;
- 较简单的器件(如EEPROM)不在内部处理数据,因此不需要时钟延展来执行任何功能。
4、通信时序和协议
说起I2C通信协议必然离不开通信时序,主器件和从节点必须遵守I2C时序规格才能正确传输数据。
下表显示了时序规格表上给出的符号和参数。
| 符号 | 参数 | 单位 |
| fSCL | SCL 时钟频率 | kHz |
| tHD(STA) | (重复)起始条件的保持时间 | µs |
| tLOW | 引脚的低电平周期 | µs |
| tHIGH | 引脚的高电平周期 | µs |
| tSU(STA) | 重复起始条件的建立时间 | µs |
| tHD(DAT) | 数据保持时间 | µs |
| tSU(DAT) | 数据建立时间 | ns |
| tr | SDA 信号的上升时间 | ns |
| tf | SDA 信号的下降时间 | ns |
| tSU(STO) | 停止条件的建立时间 | µs |
4.1、起始条件
起始条件总是在传输开始时出现,并由主器件发起。这样做是为了唤醒总线上的空闲节点器件。SDA线从高电平切换到低电平,然后SCL线从高电平切换到低电平。时序和协议如下图所示:
4.2、重复起始条件
在不发出停止条件的情况下,起始条件可以在传输期间重复。这是一种特殊情况,称为重复起始,用于改变数据读、写传输方向、重复尝试传输、同步多个IC,甚至控制串行存储器等。如下图所示:
4.3、地址帧
地址帧包含7位或10位序列,具体取决于可用性(参见数据手册)。如下图所示:
收集整理了一份《2024年最新物联网嵌入式全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升的朋友。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人
都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!