文章目录
I²C协议介绍
I²C(Inter-Integrated Circuit)协议是一种串行通信协议,用于在微控制器和其他外围设备之间进行低速数据传输。它由飞利浦公司(现为恩智浦半导体公司)在20世纪80年代初开发,广泛应用于各种嵌入式系统。
I²C协议的主要特点包括:
- 双线通信:I²C协议使用两根线进行通信,一根是数据线(SDA),另一根是时钟线(SCL)。这两条线是双向的,可以同时进行发送和接收数据。
- 多主多从:I²C总线上可以有多个主设备和多个从设备。主设备是发起通信并控制时钟信号的设备,而从设备则响应主设备的请求。
- 地址唯一性:每个从设备都有一个唯一的地址,这使得主设备能够与总线上特定的从设备进行通信。
- 同步通信:数据传输由时钟信号同步,主设备生成时钟信号,从设备按时钟信号的节奏传输数据。
- 速度和灵活性:I²C支持标准模式(100 kbps)、快速模式(400 kbps)和高速模式(3.4 Mbps)等不同的通信速度。
I²C协议常用于传感器、显示器、EEPROM、实时时钟和其他外围设备的通信,因为它只需要两条通信线,简化了电路设计和连接。
I²C硬件框架
I²C Controller
I²C控制器(I²C Controller)是实现I²C协议功能的硬件模块或软件组件,用于管理I²C总线上的通信。I²C控制器可以位于主设备或从设备中,是微控制器或其他嵌入式系统的一部分。其主要职责包括生成时钟信号、管理数据传输、处理从设备地址、控制信号的方向(读/写)、以及处理通信中的各种协议细节。
主设备中的I²C控制器生成SCL(时钟线)的时钟信号,以同步数据传输。时钟信号的频率由控制器设置,常见的有标准模式(100 kbps)、快速模式(400 kbps)和高速模式(3.4 Mbps)等。
SCL 和SDA放置3.3V电阻原因
在I²C协议中,SCL(时钟线)和SDA(数据线)是开漏或开排(open-drain)类型的信号线。这意味着线上的设备只能拉低信号线电平(将其连接到地),而不能主动将信号线拉高。因此,需要外部电路来将信号线拉高到逻辑高电平。
为此,SCL和SDA线需要上拉电阻来确保它们在没有设备拉低时能保持在逻辑高电平。以下是一些关键原因和作用:
- 维持逻辑高电平:在I²C总线上,当没有设备主动拉低SCL或SDA线时,上拉电阻将信号线拉到逻辑高电平(通常是3.3V或5V,取决于系统的工作电压)。这样,信号线在空闲状态下总是保持高电平。
- 避免电平漂移:如果没有上拉电阻,SCL和SDA线在未被拉低时可能会处于不确定的状态,导致电平漂移,这会干扰通信的可靠性。
- 节能:开漏配置和上拉电阻的组合有助于降低功耗,因为设备只需要在传输低电平信号时消耗电流,而高电平状态由上拉电阻维持。
- 兼容性:上拉电阻的使用确保了多个设备可以共享同一条SCL和SDA线,而不会因为某个设备的高电平输出能力不足而导致通信错误。
I²C 双向数据传输
传输数据时,我们需要发数据,从主设备发送到从设备上去;也需要把数据从从设备传送到主设备上去,数据涉及到双向传输。
举个栗子
体育老师:可以把球发给学生,也可以把球从学生中接过来。
① 发球:
- 老师说:注意了(start);
- 老师对A学生说,我要球发给你(A就是地址);
- 老师就把球发出去了(传输);
- A收到球之后,应该告诉老师一声(回应);
- 老师说下课(停止)。
② 接球:
- 老师说注意了(start);
- 老师说:B把球发给我(B是地址);
- B就把球发给老师(传输);
- 老师收到球之后,给B说一声,表示收到球了(回应);
- 老师说下课(停止)。
我们就使用这个简单的例子,来解释一下I²C 的传输协议:
- 老师说注意了,表示开始信号(start)
- 老师告诉某个学生,表示发送地址(address)
- 老师发球/接球,表示数据的传输
- 老师/学生收到球,回应表示:回应信号(ACK)
- 老师说下课,表示I2C传输接受§
I²C 数据传输格式
写操作
流程如下:
- 主芯片要发一个start信号
- 然后发出一个设备地址(用来确定是往哪个芯片写数据),方向(0代表写,1代表读)
- 从设备回应,用来确定这个设备是否存在,然后就可以传输数据
- 主设备发送一个字节数据给从设备,等待回应
- 每传输一字节数据,接收方都要有一个回应信号,确定数据是否传输完成,然后再传输下一个数据
- 数据发送完之后,主芯片就会发送一个信号
白色背景 表示 主到从 ,灰色设备代表 从到主
读操作
流程如下:
- 主芯片要发一个start信号
- 然后发出一个设备地址(用来确定是往哪个芯片写数据),方向(0代表写,1代表读)
- 从设备回应,用来确定这个设备是否存在,然后就可以传输数据
- 从设备发送一个字节数据给主设备,等待回应
- 每传输一字节数据,接收方都要有一个回应信号,确定数据是否传输完成,然后再传输下一个数据
- 数据发送完之后,主芯片就会发送一个信号
I²C 信号
1. SDA(数据线)
SDA用于在主设备和从设备之间传输数据。它是一条双向信号线,可以由任何一个设备驱动。由于I²C采用开漏/开排结构,数据线通常由上拉电阻拉到高电平。设备只能拉低SDA线,以表示数据的传输。
- 空闲状态:在空闲状态下,SDA保持高电平。
- 数据位传输:每个数据位在SCL的高电平期间稳定。数据变化在时钟信号的低电平期间进行。
- 应答信号(ACK/NACK):在每个字节传输后的第9个时钟周期,接收设备(无论是主设备还是从设备)拉低SDA线以发送应答信号(ACK)。如果SDA线保持高电平,则表示非应答(NACK)。
2. SCL(时钟线)
SCL由主设备驱动,为I²C通信提供时钟信号。所有数据传输和控制信号都与SCL同步。
- 空闲状态:在空闲状态下,SCL保持高电平。
- 时钟信号:SCL在数据传输期间生成时钟脉冲,每个脉冲对应一个数据位的传输。
- 起始和停止条件的检测:SCL的高电平期间对SDA线的变化敏感,用于检测起始和停止条件。
3. 起始条件(Start Condition)
起始条件标志着I²C通信的开始。主设备通过以下方式生成起始条件:
- SDA线从高电平变为低电平,而SCL线保持高电平。
起始条件是通信过程中唯一的,它通知所有从设备准备接收数据或指令。
4. 停止条件(Stop Condition)
停止条件标志着I²C通信的结束。主设备通过以下方式生成停止条件:
- SDA线从低电平变为高电平,而SCL线保持高电平。
停止条件也是通信过程中唯一的,它通知所有设备当前传输已经完成。
5. 重复起始条件(Repeated Start Condition)
重复起始条件与起始条件类似,但在发送数据的过程中使用,而不是在通信的开头。它用于在不产生停止条件的情况下改变通信方向或切换到另一个设备。
- SDA线在SCL为高电平时从高电平变为低电平。
6. 数据位传输
I²C协议中,每个数据位都在SCL高电平时保持稳定,数据线在时钟信号的低电平期间可以变化。
- 数据位传输时序:
- SCL为低电平时,SDA可以改变状态。
- SCL为高电平时,SDA必须保持稳定,数据位被接收。
7. 应答信号(ACK/NACK)
每传输一个字节(8位)数据后,接收设备需要发送一个应答信号:
- ACK(应答):接收设备将SDA拉低,表示成功接收到数据。
- NACK(非应答):SDA保持高电平,表示接收设备未能接收数据或传输结束。
应答信号发生在第9个时钟周期,由接收设备发送。
I²C协议中的信号包括SCL(时钟线)和SDA(数据线),它们的状态和变化决定了数据的传输和通信控制。