I2C总线原理及其应用
第9章 I2C 总线原理及其应用
9.1 I2C 总线概述
9.1.1 I2C总线特点
对于嵌入式系统来说,其微处理器通常是通用型的,为了满足特殊应用,通常需要扩展一些外设。最常见的扩展方法是采用微控制器的内存映射通过并行总线来扩展这些外设,由于并行总线数量较多,通常还需要译码器电路进行地址分配,这样使得整个系统逻辑结果变得非常复杂。
事实上相当一部分外设并不需要很高的速度。I2C通过数据线(SDA)和时钟线(SCL)两根线来完成数据的传输和外围团见的扩展,器件地址采用软件寻址方式。
I2C的特点总结如下:
- I2C只包含一根数据线和时钟线,总线接口已经集成在芯片上,使用I2C很容易模块化;
- I2C是一个真正的多主机总线,如果两个或多个主机同时初始化数据传输,可以通过冲突检测和仲裁防止数据破坏,每个连接到总线上的器件都有唯一的地址,任何器件既可以作为主机又可以作为从机,但任意时刻只能允许有一个主机。数据传输和地址设定由软件设置,总线上器件的增加和删除不影响其他器件正常工作;
- I2C可以通过外部连线进行在线检测;
- 连接到相同总线的IC数量只受总线最大电容的限制
- 总线具有极低的电流消耗,抗高噪声干扰。
9.2 I2C总线原理
9.2.2 位传输
-
数据有效性
I2C总线以串行方式传输数据,时钟线每产生一个时钟脉冲,数据线就传输一位数据;
-
起始条件和停止条件
I2C总线协议规定:SCL时钟线为高电平且SDA为下降沿表示起始信号,SCL时钟线为高电平且SDA为上升沿表示停止信号。
-
重复开始信号
在I2C总线上,由主机发送一个起始位开始数据传输,在发送停止位之前,由主机再发送一个起始位,它可以帮助主机在不丧失总线控制权的前提下改变数据传输方向或切换到其他从机通信。
-
应答信号(ACK)与非应答信号(NACK)
I2C总线协议规定,发送器每发送一个字节的数据,接收器必须产生一个应答信号或非应答信号。实现方法为,发送器发送完8位数据后,第9个时钟信号将数据线置高电平,接收器根据通信状态可以将数据线拉低,产生一个应答信号;或者保持数据线为高电平,产生一个非应答信号。
9.2.3 数据传输格式
一般情况下,一个标准的I2C通信由四部分组成:起始信号、从机地址传输、数据传输、停止信号。
I2C通信由主机发送一个起始信号来启动,然后由主机对从机寻址来决定数据传输方向。I2C传输数据的最小单位是一个字节,每发送完一个字节,接受端必须发送一个应答位,如果接受端来不及处理数据,可以通过拉低时钟线来通知发送端暂停数据传输。
-
I2C总线寻址约定
I2C总线采用了独特的寻址约定,规定了起始信号后的第一个字节为寻址字节,用来寻址被控器件,并规定数据传输方向。目前I2C支持7位寻址模式和10位寻址模式。
在7位寻址模式中,寻址字节由从机的7位地址位和以为读写位(D0)组成,当读写位=0时,表示从下一个字节起主机将数据传送给从机;当读写位=1时,表示主机从下一个字节起从从机读取数据。
主机作为被控器时,其7位地址在I2C总线地址寄存器给出,为纯软件地址;而非单片机类型的外围地址完全由器件类型和引脚电平给定。
-
数据传输模式
9.3 STM32 I2C 模块原理
9.3.3 STM32 I2C 模块的通信原理
-
I2C 主模式
通过START位在总线上产生起始条件,设备就进入了主模式。为了使用I2C模块,需要编程 I2C_CR1 寄存器使能外设模块,在I2C_CR2 寄存器中设定该模块的输入时钟以产生正确的时序。标准模式下至少为:2MHz,快速模式下至少为:4MHz