单片机 - I2C 总线
一、IIC(I2C) 线的作用
UART总线
PC端(CPU) <----------> 开发板(STM32U575RIT6)
IIC总线
主控芯片(STM32U575RIT6) <---------> 传感器驱动芯片(SHT20/SI7006空气温湿度传感器)
二、I2C 总线的概念
![]()
图 1 I2C 总线示意图 ![]()
图 2 多主机多从机模式示意图
I2C 总线也称为 IIC 总线,中文名:集成电路总线。
I2C 总线由飞利浦公司设计,是 串行、同步、半双工总线。
I2C 总线硬件连接为:2 根线(I2C_SCL 时钟线、I2C_SDA 数据线),都为双向,如图 1 所示,SCL 时钟线和 SDA 数据线都会 外接一个上拉电阻。
I2C 总线的通信速率:
低速:100 kbps
中速:400 kbps
高速:3.4 Mbps
I2C 总线的应用场景:传感器、OLED 屏……
I2C 总线支持 主从机模式 (Master / Slaver),支持多主机多从机的模式,一般使用单主机多从机。
发送器:用于发送数据的设备
接收器:用于接收数据的设备
主机:主动发起数据通信 或者 主动结束数据通信的设备
从机:被动发起数据通信 或者 被动结束数据通信的设备
每个挂载在 I2C 总线上的设备,都有一个自己唯一的 7 位设备地址(7 位从机地址)
三、I2C 总线的硬件连接
3.1 硬件连接
![]()
图 3 I2C 总线硬件连接示意图
I2C 总线有 2 根线 ---> I2C_SCL 时钟线、I2C_SDA 数据线
- SCL 时钟线:用于将挂载在 I2C 总线上的设备的时钟进行同步
- SDA 数据线:用于挂载在 I2C 总线上的设备进行数据传输
I2C 总线的 SCL 时钟线和 SDA 数据线都外接一个上拉电阻
作用:
- I2C 总线在没用进行数据通信,即 I2C 总线处于空闲的状态时,SCL 时钟线和 SDA 数据线处于高电平状态
- 外接上拉电阻后,可以一定程度上稳定电路,减少 I2C 总线传输数据的损耗
3.2 单主机多从机的模式
主机:STM32U575RIT6
从机 1:E2PROM --- 0x10
从机 2:A / D 模数转换器 --- 0x20
从机 3:时钟日历 --- 0x30
从机 4:空气温湿度传感器SHT20 --- 0x40
1)问题
主机想要获取从机 4 的数据(主机和从机 4 进行数据通信),由于存在 4 个从机设备,主机如何找到从机 4 空气温湿度传感器?
2)解释
- 每个挂载在 I2C 总线上的设备,都有自己的一个唯一的 7 位设备地址(7 位从机地址)
- 主机会向挂载在 I2C 总线上的每个从机设备发送想要通信的从机的设备地址
- 每个从机都获取到主机发送的从机地址,和自己的从机地址作比较,如果相等就进行通信,不相等就不通信
- 7 位从机地址不是理论上的内存地址(不占用内存空间),只是一个标识符(数字、ID 号)
3.3 多主机多从机的模式
主机 1:STM32U575RIT6 --- 0x01
主机 2:STM32MP157AAA --- 0x02
从机 1:E2PROM --- 0x10
从机 2:A/D模数转换器 --- 0x20
从机 3:时钟日历 --- 0x30
从机 4:空气温湿度传感器SHT20 --- 0x40
1)举例
直接编程控制 U5,U5 先给 MP157A 发送数据(命令:让 MP157A 回复数据),当 MP157A 收到命令后,又会回复数据给 U5
主机:STM32U575RIT6
从机:STM32MP157AAA
- STM32U575RIT6 -> STM32MP157AAA (U5 是发送器,MP157A 是接收器)
- STM32MP157AAA -> STM32U575RIT6 (MP157A 是发送器,U5 是接收器)
主机和从机都可以担任发送器和接收器的角色,只是区别在于一个是主动、一个是被动
3.3 空气温湿度实验
直接编程控制 -> STM32U575RIT6
获取空气温湿度数据 -> SHT20 / SI7006
通过IIC总线发送命令 STM32U575RIT6 ---------------------> SHT20/SI7006
通过IIC总线发送空气温湿度数值 UART总线 SHT20/SI7006 ------------------------------> STM32U575RIT6 -------------> PC端的串口工具
四、I2C 总线的时序图
时序图:随着时钟线的变化顺序,数据线也产生对应变化 / 操作的图
4.1 起时信号与终止信号的时序图

如图所示:
起始信号(S):当 SCL 时钟信号处于高电平期间,SDA 数据线从高电平变为低电平 -> 产生一个下降沿信号时,标志着一次 IIC 总线通信的开始;
终止信号(P):当 SCL 时钟信号处于高电平期间,SDA 数据线从低电平变为高电平 -> 产生一个上升沿信号时,标志着一次 IIC 总线通信的结束。
注意:
- 当产生一个起时信号后,IIC 总线处于占用状态,此时,IIC 总线的 SLC 时钟线处于低电平状态
- 当产生一个终止信号后,IIC 总线处于空闲状态,此时,IIC 总线的 SLC 时钟线处于高电平状态
- 起时信号和终止信号只能由主机产生
4.2 数据传输信号的时序图

如上图所示,为数据传输信号时序图:
- 数据接收信号:当 SCL 时钟线处于高电平状态时,SDA 数据线上的数据要求稳定,不允许发生变化,此时接收器从 IIC 总线上读取数据;
- 数据发送信号:当 SCL 时钟线处于低电平状态时,SDA 数据线上的数据允许发生变化,此时发送器可以向 IIC 总线上发送数据。
IIC 总线传输数据时,数据的最小单位为字节(8 位)
时钟周期:一个高电平 + 一个低电平组成的时钟信号的时间
想要完成一次最小单位的数据收发,需要 8 个时钟周期
4.3 应答信号 / 非应答信号的时序图

如图所示:
主机每 1 个时钟周期向 I2C 总线上传输 1 bit 的数据,I2C 总线的最小传输单位为字节(8 bit)
I2C 总线每完成一次最小单位的数据传输(需要 8 个时钟周期),接收器在第 9 个时钟周期需要向发送器回复一个应答 / 非应答信号
- 应答信号(1 bit):0
- 非应答信号(1 bit):1
存在 2 种情况:
1. 主机发,从机收:
主机:发送器从机:接收器
当主机发送完 1 个字节(8 位)的数据后:
主机:接收器
从机:发送器
从机回复应答信号
2. 主机收,从机发:
主机:接收器
从机:发送器
当从机发送完 1 个字节(8 位)的数据后:
主机:发送器从机:接收器
主机回复应答信号
4.4 寻址信号(一种特殊的数据传输信号)

寻址信号:主机发送的用于寻找需要通信的从机的地址信号
- 寻址信号一定由主机发送,必须跟在起时信号后
- 从机地址是 7 位,而 I2C 总线最小传输单位为 8 位,需要添加 1 位,才可以发送
- 添加的 1 位是 R / W 位:
W(0):写标志位,代表主机向 IIC 总线上写入数据
R(1):读标志位,代表主机要从 IIC 总线上读取数据
主机想要找到0x40的从机 -----> 主机想要IIC总线上的SDA数据线发送0x40 -------> 寻址信号最低位需要为W(0)
从机的设备地址为:0x40
主机发,从机收:寻址信号 -> (0x40 << 1) | 0
主机收,从机发:寻址信号 -> (0x40 << 1) | 1
五、IIC 总线的协议格式
IIC 总线协议的组成:起时信号、终止信号、寻址信号、数据传输信号、应答 / 非应答信号
5.1 主机向从机发送 1 个字节数据的协议格式

首先主机发送一个起时信号后,紧接着发送一个 7 位从机地址和 1 个 W(0)组合的 8 位寻址信号,收到 1 bit 对应从机的 ACK 信号,再接着发送一个 8 位的寄存器地址寻问从机是否有对应地址寄存器,若有,则从机发送一个 ACK 信号,接着主机再发送 8 位的实际数据,从机接收到后发送一个 ACK 信号,接着由主机发送一个上升沿终止信号结束此次 I2C 通信。
5.2 主机向从机发送多个字节数据的协议格式
1)寄存器地址连续

与发送单个数据不同的是,在发送完第 1 个 8 位实际数据后,在收到从机的 ACK 后,主机会继续发送下一个 8 位数据,数据自动存入 REG + 1 的寄存器中,数据全部发送完毕后,主机发送一个上升沿终止信号结束此次 I2C 通信。
2)寄存器地址不连续

当寄存器地址不连续时,由于要存的新的 8 位寄存器地址是特殊的数据,跟在寻址信号后,而寻址信号必须在起时信号后,所以要存入新寄存器的话,必须先发送终止信号,随后重新发送起始信号、寻址信号以及新的 8 位寄存器地址。
5.3 主机从从机读取一个字节数据的协议格式

主机从从机读取数据时,为什么要读写转换,即先写后读,不能直接读?
- 首先主机要先找到从机,向每个从机发送 7 位从机地址,既是发送,就是要先写;
- 主机找到从机后,要询问从机是否有可用的寄存器地址空间,把 8 位寄存器地址发送给从机,从机判断;
- 只有找到了从机,并且确认寄存器地址存在,才开始从从机中读取数据。
使用 IIC 总线读取数据时,为什么主机结束通信前要给从机发送一个 NACK 非应答信号?
这是由主机和从机的特性决定
- 主机:主动发起数据通信或者主动结束数据通信的设备,具备主动性
- 从机:被动接收数据通信或者被动结束数据通信的设备,具备被动性
如果从机开始给主机发送数据,不让从机停止发送,他会一直发送,就需要主机给从机发送一个NACK信号,告诉从机结束发送。
5.4 主机从从机读取多个字节数据的协议格式

六、分析电路图
6.1 查找引脚
1)找到空气温湿度传感器 SHT20 / SI7006 芯片进行 IIC 总线通信的引脚?

I2C1_SCL ---> PB6
I2C1_SDA ---> PB7
七、分析芯片手册(SHT20 / SI7006)
7.1 查找手册的目的
1)查找信息
- SHT20 / SI7006 从机的从机地址
- 存储空气温度数据和空气湿度数值的寄存器地址
- 知道当前空气温湿度传感器支持的检测精度
- 将空气温湿度模拟量和空气温湿度数字量转换的公式
- 空气温湿度传感器的工作环境范围
7.2 框图分析
1)总体框图

2)使用 IIC 外设控制器框图

3)GPIO引脚直接模拟IIC总线协议的时序

7.3 手册分析



1)7 位设备地址和读写标志位


2)8 位寄存器地址

hold master:保持主机占用模式(单主机模式)
no hold master:不保持主机占用模式(多主机模式)存储空气温度数字量的寄存器 --- 0xE3
存储空气湿度数字量的寄存器 --- 0xE5
3)测量精度设置

向用户寄存器中的第 7 和第 0 位写入 0b00
指定空气湿度的测量结果为 12 位的数据
指定空气温度的测量结果为 14 位的数据
4)温湿度测量并转化需要的时间

5)温湿度数字量和模拟量转换公式

