一、I²C 协议的特点
-
仅需两根线
- I²C 总线只需要两根线即可实现设备之间的通信,这两根线分别是串行数据线(SDA)和串行时钟线(SCL)。
- SDA 用于传输数据,SCL 用于同步数据传输的时钟信号。
-
多主多从架构
- I²C 协议支持多主多从架构,即多个主设备可以同时与多个从设备进行通信。
- 在多主模式下,当多个主设备同时尝试控制总线时,通过仲裁机制来确定哪个主设备获得总线控制权。
-
7 位或 10 位地址寻址
- 每个连接到 I²C 总线上的设备都有一个唯一的地址,用于在通信中被主设备寻址。
- 地址可以是 7 位或 10 位,具体取决于设备的要求。
-
简单灵活
- I²C 协议的实现相对简单,只需要少量的硬件资源即可实现。
- 同时,该协议也非常灵活,可以根据不同的应用需求进行配置和扩展。
二、I²C 协议的工作原理
-
起始和停止条件
- 起始条件:当 SCL 为高电平时,SDA 从高电平变为低电平,表示开始一次数据传输。
- 停止条件:当 SCL 为高电平时,SDA 从低电平变为高电平,表示结束一次数据传输。
-
数据传输格式
- I²C 协议的数据传输以字节为单位,每个字节为 8 位。
- 在数据传输过程中,SCL 信号用于同步数据的传输,SDA 信号在 SCL 的每个时钟周期内传输一位数据。
- 数据传输时,先传输最高位(MSB),最后传输最低位(LSB)。
-
应答信号
- 在每个字节传输完成后,接收方需要发送一个应答信号(ACK)给发送方,表示数据已经成功接收。
- 应答信号在 SCL 的第 9 个时钟周期由接收方将 SDA 拉低来表示。如果接收方没有发送应答信号,则表示数据传输出现错误。
-
地址传输
- 在开始一次数据传输之前,主设备需要先发送一个起始条件,然后发送要访问的从设备地址。
- 从设备地址由 7 位或 10 位组成,具体取决于设备的要求。
- 地址传输完成后,从设备会发送一个应答信号给主设备,表示地址已经被成功接收。
-
数据传输方向
- 在地址传输完成后,主设备可以选择数据传输的方向,即读操作或写操作。
- 如果是写操作,主设备将数据发送给从设备;如果是读操作,主设备从从设备读取数据。
三、I²C 协议的应用场景
-
传感器连接
- I²C 协议常用于连接各种传感器,如温度传感器、湿度传感器、压力传感器等。
- 通过 I²C 总线,单片机可以方便地读取传感器的数据,并进行相应的处理。
-
存储器扩展
- I²C 协议也可以用于扩展单片机的存储器,如 EEPROM、FRAM 等。
- 通过 I²C 总线,单片机可以与外部存储器进行数据交换,实现数据的存储和读取。
-
显示设备控制
- I²C 协议还可以用于控制各种显示设备,如液晶显示屏、OLED 显示屏等。
- 通过 I²C 总线,单片机可以向显示设备发送控制命令和数据,实现显示内容的更新。
I2C通信协议层:
一、物理层
- 引脚定义
- SDA(Serial Data Line):串行数据线,用于传输数据。这是一个双向引脚,数据在该线路上以串行方式逐位传输。
- SCL(Serial Clock Line):串行时钟线,由主设备产生时钟信号,用于同步数据传输。
- 电气特性
- 通常工作在低电压,如 3.3V 或 5V 逻辑电平。它是开漏输出结构,所以需要外接上拉电阻,一般上拉电阻的值在 1.8 - 10kΩ 之间。这一特性允许多个设备连接到同一总线上,实现多主多从的通信架构。
二、数据传输层
- 位传输
- 在 I2C 总线上,数据传输以位为单位。在 SCL 时钟信号的高电平期间,SDA 线上的数据必须保持稳定,只有在 SCL 时钟信号为低电平时,SDA 线上的数据才允许发生变化。这一规则确保了数据传输的稳定性和准确性。
- 字节传输
- 每次传输以字节(8 位)为单位。传输顺序是先高位(MSB)后低位(LSB)。在一个字节传输完成后,会有一个应答位(ACK)来确认接收是否成功。
- 应答机制
- 发送器发送完一个字节后,会释放 SDA 线(将 SDA 线置为高电平),接收器在接收到这个字节后,会在第 9 个时钟周期将 SDA 线拉低(发送应答信号 ACK)表示接收成功;如果接收器不拉低 SDA 线(保持高电平),则表示非应答信号(NACK),通常表示传输出现错误或者接收器希望结束数据传输。
三、协议层的操作模式
- 主从模式
- 主设备(Master)
- 主设备负责发起数据传输、产生时钟信号(SCL)以及控制传输的开始和结束。在总线上可以有多个主设备,但同一时刻只能有一个主设备进行数据传输操作。
- 主设备通过发送起始条件(Start Condition)来开始一次传输,起始条件是在 SCL 为高电平时,SDA 由高电平变为低电平。然后主设备发送从设备地址(7 位或 10 位地址),其中第 8 位(对于 7 位地址模式)或第 11 位(对于 10 位地址模式)用来表示数据传输方向(读或写)。
- 从设备(Slave)
- 从设备响应主设备的操作。从设备有唯一的地址,当从设备检测到主设备发送的地址与自己的地址匹配时,会根据数据传输方向进行相应操作。如果是写操作,从设备接收主设备发送的数据;如果是读操作,从设备向主设备发送数据。
- 主设备(Master)
- 多主模式
- 多个主设备可以连接到 I2C 总线上。当多个主设备同时想要控制总线时,会通过仲裁机制来决定哪个主设备获得总线控制权。仲裁机制是基于在 SCL 时钟信号的高电平期间,比较各个主设备在 SDA 线上发送的数据位来实现的。如果一个主设备发送的电平与总线上检测到的电平不匹配,这个主设备就会失去仲裁,停止数据传输操作。
四、协议层的传输速度
- 标准模式(Standard - mode)
- 传输速度可达 100 kbps。这种模式适用于对速度要求不是特别高的应用场景,如一些简单的传感器与微控制器之间的通信。
- 快速模式(Fast - mode)
- 传输速度可以达到 400 kbps。能满足大多数中等速度要求的设备间通信需求,如一些小型的嵌入式系统内部模块之间的通信。
- 高速模式(High - speed mode)
- 传输速度能够达到 3.4 Mbps。主要用于对数据传输速度要求较高的应用,如某些高速数据采集设备与处理器之间的通信。
软硬件I2C协议
①软件模拟协议:使用CPU直接控制通讯引脚的电平,产生出符合通讯协议标准的逻辑。
②硬件实现协议:由STM32的IIC片上外设专门负责实现IIC通讯协议,只要配置好该外设,它就会自动根据协议要求产生通讯信号,收发数据并缓存起来,CPU只要检测该外设的状态和访问数据寄存器,就能完成数据收发。这种由硬件外设处理IIC协议的方式减轻了CPU的工作,且使软件设计
更加简单。
I2C协议功能框图:
通过软件控制引脚电平实现I2C协议,也就是利用IO复用功能重映射
当 “12C1 REMAP = 0” 时,I2C1 的 SCL(串行时钟线)为 PB6,SDA(串行数据线)为 PB7
当 “12C1 REMAP = 1” 时,I2C1 的 SCL 变为 PB8,SDA 变为 PB9
其二者主要的区别就是引脚的不同
初始化I2C的结构体
typedef struct
{
uint32_t I2C_ClockSpeed; //设置时钟频率,必须低于400000
uint16_t I2C_Mode; //指定工作模式,可选IIC模式及SMBUS模式
uint16_t I2C_DutyCycle; //时钟占空比,可选LOW/HIGH,2:0或16:9
uint16_t I2C_OwnAddress1; //自身的IIC设备地址
uint16_t I2C_Ack; //使能或关闭相应,一般为使能
uint16_t I2C_AcknowledgedAddress; //指定地址长度,可为7或10
}I2C_InitTypeDef;
uint32_t I2C_ClockSpeed
: