
目录
[1. 基础概念题](#1. 基础概念题)
[1.1 什么是 IIC 协议?它的主要特点是什么?](#1.1 什么是 IIC 协议?它的主要特点是什么?)
[1.2 IIC 总线的两根线分别是什么?它们的作用是什么?](#1.2 IIC 总线的两根线分别是什么?它们的作用是什么?)
[1.3 IIC 通信的基本流程是什么?](#1.3 IIC 通信的基本流程是什么?)
[1.4 为什么 IIC 总线需要上拉电阻?为什么使用开漏输出?](#1.4 为什么 IIC 总线需要上拉电阻?为什么使用开漏输出?)
[1.4.1 上拉电阻](#1.4.1 上拉电阻)
[1.4.2 开漏输出](#1.4.2 开漏输出)
[1.5 上拉电阻的阻值如何选择?](#1.5 上拉电阻的阻值如何选择?)
[1.6 什么是 IIC 的起始信号和停止信号?如何产生?](#1.6 什么是 IIC 的起始信号和停止信号?如何产生?)
[1.7 IIC 的数据位是如何传输的?](#1.7 IIC 的数据位是如何传输的?)
[1.8 什么是应答信号 (ACK) 和非应答信号 (NACK)?它们的作用是什么?](#1.8 什么是应答信号 (ACK) 和非应答信号 (NACK)?它们的作用是什么?)
[1.9 IIC 的地址格式有哪几种?](#1.9 IIC 的地址格式有哪几种?)
[1.10 7 位地址是如何在总线上传输的?](#1.10 7 位地址是如何在总线上传输的?)
[1.11 什么是总线仲裁?IIC 是如何实现仲裁的?](#1.11 什么是总线仲裁?IIC 是如何实现仲裁的?)
[1.12 什么是时钟同步?IIC 是如何实现时钟同步的?](#1.12 什么是时钟同步?IIC 是如何实现时钟同步的?)
[1.13 什么是时钟拉伸 (Clock Stretching)?它的作用是什么?](#1.13 什么是时钟拉伸 (Clock Stretching)?它的作用是什么?)
[2. 实际应用题](#2. 实际应用题)
[2.1 什么是多主机通信?IIC 支持多主机的关键是什么?](#2.1 什么是多主机通信?IIC 支持多主机的关键是什么?)
[2.2 IIC 通信失败的常见原因有哪些?](#2.2 IIC 通信失败的常见原因有哪些?)
[2.3 什么是 IIC 总线死锁?如何解决?](#2.3 什么是 IIC 总线死锁?如何解决?)
[2.4 如何提高 IIC 通信的可靠性?](#2.4 如何提高 IIC 通信的可靠性?)
[2.5 硬件 IIC 和软件模拟 IIC 各有什么优缺点?](#2.5 硬件 IIC 和软件模拟 IIC 各有什么优缺点?)
[2.6 什么是 IIC 的快速模式加 (Fm+)?它有什么特点?](#2.6 什么是 IIC 的快速模式加 (Fm+)?它有什么特点?)
[2.7 IIC 协议中,主机如何读取从机的数据?简述一下](#2.7 IIC 协议中,主机如何读取从机的数据?简述一下)
[2.8 IC 总线最多可以连接多少个从机?](#2.8 IC 总线最多可以连接多少个从机?)
[2.9 什么是 IIC 的热插拔?如何实现?](#2.9 什么是 IIC 的热插拔?如何实现?)
[2.10 如何调试 IIC 通信问题?](#2.10 如何调试 IIC 通信问题?)
[2.11 如何计算I2C总线上拉电阻的合适值?](#2.11 如何计算I2C总线上拉电阻的合适值?)
[2.11.1 最小值 Rp (min):灌电流限制](#2.11.1 最小值 Rp (min):灌电流限制)
[2.11.2 最大值 Rp (max):上升时间限制](#2.11.2 最大值 Rp (max):上升时间限制)
[2.11.3 不同速度模式的标准参数](#2.11.3 不同速度模式的标准参数)
[2.11.4 总线电容 Cb 的估算方法](#2.11.4 总线电容 Cb 的估算方法)
[2.11.5 举个例子](#2.11.5 举个例子)
1. 基础概念题
1.1 什么是 IIC 协议?它的主要特点是什么?
IIC 是飞利浦公司开发的两线式串行总线,用于连接微控制器与外围芯片。
- 核心特点:仅需两根线 (SDA 串行数据线、SCL 串行时钟线)
- 多主机架构:支持多个主机和多个从机共存
- 半双工通信:同一时间只能单向传输
- 同步通信:数据传输由时钟信号同步
- 地址寻址:每个从机有唯一的 7 位或 10 位地址
- 总线仲裁:多个主机同时发送时通过仲裁决定总线控制权
- 速度等级:标准模式 (100kbps)、快速模式 (400kbps)、高速模式 (3.4Mbps)

1.2 IIC 总线的两根线分别是什么?它们的作用是什么?
- SDA(Serial Data):串行数据线,用于传输实际的数据和地址信息
- SCL(Serial Clock):串行时钟线,由主机产生,用于同步数据的收发
1.3 IIC 通信的基本流程是什么?
- 主机发送起始信号 (START)
- 主机发送从机地址(7 位)+读写位(1 位)
- 被寻址的从机发送应答信号 (ACK)
- 数据传输阶段 (主机或从机发送数据,对方应答)
- 主机发送停止信号 (STOP),释放总线
1.4 为什么 IIC 总线需要上拉电阻?为什么使用开漏输出?
1.4.1 上拉电阻
**定义逻辑高电平:**IIC总线上的设备是通过拉低(逻辑0)和不拉低(逻辑1)SDA和SCL线来通信的。上拉电阻确保当设备不主动拉低线时(即释放线),线路会被上拉到逻辑高电平(通常是Vcc或3.3V),从而保证了逻辑高的定义和通信的准确性。
**信号线的回复位:**IIC总线采用的是开漏输出,这意味着在逻辑0时设备可以拉低线路,而在逻辑1时,设备不对线路施加电平,而是释放线路。上拉电阻确保即使设备释放线路,线路上也会保持逻辑高电平,而不会漂浮。
简单来说,上拉电阻的作用是当IIC总线在空闲状态,使SDA和SCL处于高电平状态,并且使总线在处于开漏输出状态下时可以完成高低电平之间的转换。
1.4.2 开漏输出
开漏输出指的是设备在输出高电平时,其输出端口处于高阻抗状态(即不拉高),而在输出低电平时则拉低输出端口,这种输出的优势包括:
**① 多主机系统兼容性:**在I2C总线中,允许多个设备共享同一条总线。开漏输出使得多个设备可以以一种非干扰的方式共享总线,因为设备只需拉低线路来发送逻辑0,而不会直接推高电平。
**② 容错能力:**开漏输出增强了总线的容错能力。如果多个设备同时尝试拉低线路,总线会被拉到逻辑0。当设备释放线路时,上拉电阻确保线路上升到逻辑高电平。
**③ 电平适配能力:**允许设备以不同电平(例如3.3V或5V)进行通信,因为线路的逻辑高电平由上拉电阻确定,而不受单个设备的输出电平影响。
1.5 上拉电阻的阻值如何选择?
上拉电阻的阻值范围通常在1kΩ~10kΩ之间,选择依据:
- 通信速度:速度越高,阻值应越小 (减少上升时间)
- 总线电容:总线电容越大,阻值应越小
- 功耗:阻值越大,功耗越低
- 器件数量:总线上器件越多,阻值应越小
1.6 什么是 IIC 的起始信号和停止信号?如何产生?
起始信号 (START):SCL 为高电平时,SDA 由高变低:

停止信号 (STOP):SCL 为高电平时,SDA 由低变高:

特性:
- 起始信号和停止信号都由主机产生
- 起始信号表示一次通信的开始
- 停止信号表示一次通信的结束,释放总线
- 重复起始信号 (Repeated START):在不发送停止信号的情况下再次发送起始信号,用于切换读写方向
1.7 IIC 的数据位是如何传输的?
- 数据在 SCL 的下降沿被发送到总线上
- 数据在 SCL 的上升沿被接收方采样
- 每个字节传输 8 位,高位在前 (MSB first)
- 每个字节后面跟随 1 位应答位
**发送一个字节:**SCL低电平期间,主机将数据位依次放到SDA线上(高位先行),然后释放SCL,从机将在SCL高电平期间读取数据位,所以SCL高电平期间SDA不允许有数据变化,依次循环上述过程8次,即可发送一个字节:

**接收一个字节:**SCL低电平期间,从机将数据位依次放到SDA线上(高位先行),然后释放SCL,主机将在SCL高电平期间读取数据位,所以SCL高电平期间SDA不允许有数据变化,依次循环上述过程8次,即可接收一个字节(主机在接收之前,需要释放SDA):

1.8 什么是应答信号 (ACK) 和非应答信号 (NACK)?它们的作用是什么?
- 应答信号 (ACK):接收方在第 9 个时钟周期将 SDA 拉低,表示成功接收了一个字节
- 非应答信号 (NACK):接收方在第 9 个时钟周期保持 SDA 为高,表示接收失败或不需要继续接收
**发送应答:**主机在接收完一个字节之后,在下一个时钟发送一位数据,数据0表示应答,数据1表示非应答:

**接收应答:**主机在发送完一个字节之后,在下一个时钟接收一位数据,判断从机是否应答,数据0表示应答,数据1表示非应答(主机在接收之前,需要释放SDA):

1.9 IIC 的地址格式有哪几种?
- 7 位地址:最常用,地址范围 0x00~0x7F
- 10 位地址:扩展地址,地址范围 0x000~0x3FF
1.10 7 位地址是如何在总线上传输的?
7 位地址加上 1 位读写位组成一个字节进行传输:
- 第 1~7 位:从机地址 (高位在前)
- 第 8 位:读写位 (0 表示写,1 表示读)
1.11 什么是总线仲裁?IIC 是如何实现仲裁的?
总线仲裁是当多个主机同时尝试控制总线时,决定哪个主机获得总线控制权的机制。IIC 采用线与 (Wired-AND) 机制实现仲裁:
- 当多个主机同时发送数据时,发送 "1" 的主机会发现 SDA 被拉低 (因为另一个主机发送了 "0")
- 发现冲突的主机立即停止发送,退出竞争
- 仲裁过程不会丢失任何数据
1.12 什么是时钟同步?IIC 是如何实现时钟同步的?
时钟同步是当多个主机同时产生时钟时,使总线上的时钟信号保持一致的机制。IIC 通过线与机制实现时钟同步:
- 所有主机的 SCL 输出通过线与连接在一起
- 只要有一个主机将 SCL 拉低,总线就处于低电平
- 所有主机都释放 SCL 时,总线才回到高电平
- 最终的 SCL 时钟是所有主机时钟的 "与" 结果
1.13 什么是时钟拉伸 (Clock Stretching)?它的作用是什么?
时钟拉伸是从机将 SCL 拉低,迫使主机等待的机制:
- 从机需要更多时间处理接收到的数据
- 从机需要更多时间准备要发送的数据
- 实现从机对通信速度的控制
原理:从机在接收到一个字节后,将 SCL 拉低,直到准备好继续通信后再释放 SCL。主机检测到 SCL 被拉低时,会暂停发送时钟。
2. 实际应用题
2.1 什么是多主机通信?IIC 支持多主机的关键是什么?
多主机通信是指总线上可以有多个主机,任何一个主机都可以发起通信。IIC 支持多主机的关键是:
- 总线仲裁机制:解决多个主机同时发送的冲突
- 时钟同步机制:使多个主机的时钟保持一致
- 开漏输出结构:实现线与逻辑
2.2 IIC 通信失败的常见原因有哪些?
-
硬件问题:
- 上拉电阻缺失或阻值不合适
- SDA/SCL 线接反
- 总线短路或开路
- 电平不匹配
- 电源不稳定
-
软件问题:
- 从机地址错误
- 时序错误 (起始 / 停止信号、数据采样时机)
- 应答信号处理错误
- 时钟速度过快
- 总线被某个器件锁住
2.3 什么是 IIC 总线死锁?如何解决?
总线死锁是指 SDA 或 SCL 被某个器件持续拉低,导致总线无法使用的情况。
常见原因:
- 从机在传输过程中复位,导致 SDA 被拉低
- 主机在传输过程中复位,导致从机一直等待时钟
- 电磁干扰导致时序错误
解决方法:
- 软件复位:主机发送 9 个时钟脉冲,使从机释放 SDA
- 硬件复位:复位所有从机设备
- 增加总线监控电路,检测并恢复死锁
2.4 如何提高 IIC 通信的可靠性?
-
硬件方面:
- 合理选择上拉电阻阻值
- 缩短总线长度,减少总线电容
- 增加滤波电容,抑制电磁干扰
- 使用屏蔽线
- 避免总线分支过多
-
软件方面:
- 增加数据校验 (如 CRC)
- 实现超时机制
- 总线死锁检测与恢复
- 通信失败重试机制
2.5 硬件 IIC 和软件模拟 IIC 各有什么优缺点?
| 特性 | 硬件 IIC | 软件模拟 IIC |
|---|---|---|
| CPU 占用 | 低 (由硬件控制器完成) | 高 (需要 CPU 模拟时序) |
| 速度 | 高 (可达最高速度) | 低 (受 CPU 速度限制) |
| 可靠性 | 高 (硬件实现时序) | 低 (易被中断打断) |
| 灵活性 | 低 (只能使用指定引脚) | 高 (可使用任意 GPIO) |
| 资源占用 | 需要硬件 IIC 控制器 | 不需要 |
2.6 什么是 IIC 的快速模式加 (Fm+)?它有什么特点?
快速模式加 (Fm+) 是 IIC 协议的扩展,最高速度可达 1Mbps。
- 更高的驱动能力 (最高 20mA)
- 支持更长的总线长度
- 兼容标准模式和快速模式
- 允许更多的器件连接到总线上
2.7 IIC 协议中,主机如何读取从机的数据?简述一下
- 主机发送起始信号
- 主机发送从机地址 + 写位 (0)
- 从机应答
- 主机发送要读取的寄存器地址
- 从机应答
- 主机发送重复起始信号
- 主机发送从机地址 + 读位 (1)
- 从机应答
- 从机发送数据字节
- 主机应答 (如果要继续读取) 或非应答 (如果读取结束)
- 主机发送停止信号
2.8 IC 总线最多可以连接多少个从机?
理论上,7 位地址的 IIC 总线最多可以连接 127 个从机 (0x08~0x7F)。但实际上,受限于总线电容和驱动能力,通常最多连接几十个从机。
2.9 什么是 IIC 的热插拔?如何实现?
热插拔是指在系统运行过程中,可以安全地插入或拔出 IIC 设备,而不会导致系统崩溃或总线损坏。实现方法:
- 使用专门的 IIC 热插拔控制器 (如 PCA9511)
- 增加总线隔离电路
- 软件上实现总线检测和设备枚举
2.10 如何调试 IIC 通信问题?
-
硬件检查:
- 用万用表测量 SDA 和 SCL 的电平,确认有上拉
- 检查接线是否正确
- 检查电源是否稳定
-
使用逻辑分析仪:
- 捕获 SDA 和 SCL 的波形
- 分析起始 / 停止信号、地址、数据和应答
- 检查时序是否符合规范
-
软件调试:
- 逐步执行代码,检查每个步骤的返回值
- 增加调试信息,输出发送和接收的数据
- 尝试降低通信速度
2.11 如何计算I2C总线上拉电阻的合适值?
I2C 上拉电阻的选择不是一个固定值,而是一个范围值,需要同时满足灌电流限制(最小值)和上升时间限制(最大值)两个约束条件。以下是基于 NXP 官方 I2C 规范 UM10204 的完整计算方法和工程实践指南。
2.11.1 最小值 Rp (min):灌电流限制
公式:
Rp(min) = (VDD - VOL(max)) / IOL
- VDD:I2C 总线的供电电压(如 3.3V、5V)
- VOL(max):器件输出低电平的最大允许电压(I2C 标准规定为 0.4V)
- IOL:器件低电平输出时的最小灌电流能力
物理意义:当器件将总线拉低时,电流从 VDD 经上拉电阻流入器件引脚。如果电阻太小,电流会超过器件的灌电流能力,导致低电平电压升高(超过 0.4V),甚至损坏器件。
2.11.2 最大值 Rp (max):上升时间限制
公式:
Rp(max) = tr / (0.8473 × Cb)
- tr:I2C 规范规定的信号最大上升时间(从 0.3VDD 到 0.7VDD 的时间)
- Cb:总线总电容(包括 PCB 走线电容、连接器电容和所有器件的引脚输入电容)
- 0.8473:从 RC 充电曲线推导出来的精确系数,用于计算 0.3VDD 到 0.7VDD 的上升时间
物理意义:I2C 信号从低电平到高电平是通过上拉电阻对总线电容充电实现的。电阻越大,充电时间越长,上升沿越缓。如果上升时间超过规范要求,会导致数据采样错误。
2.11.3 不同速度模式的标准参数
| 模式 | 速率 | 最大上升时间 tr | 最小灌电流 IOL | 最大总线电容 Cb |
|---|---|---|---|---|
| 标准模式 (Standard-mode) | 100 kbps | ≤ 1000 ns | 3 mA | 400 pF |
| 快速模式 (Fast-mode) | 400 kbps | ≤ 300 ns | 3 mA | 400 pF |
| 快速模式加 (Fast-mode Plus) | 1 Mbps | ≤ 120 ns | 20 mA | 550 pF |
| 高速模式 (High-speed mode) | 3.4 Mbps | ≤ 120 ns | 30 mA | 100 pF |
2.11.4 总线电容 Cb 的估算方法
总线电容是最容易被忽略但对计算结果影响最大的参数,需要综合考虑以下三部分:
-
PCB 走线电容:约 0.5-1 pF/cm(FR-4 板材,线宽 0.2mm,间距 0.2mm)
-
连接器电容:每个连接器约 5-10 pF
-
器件引脚电容:每个 I2C 器件的输入电容约 5-15 pF(查芯片手册)
Cb = 走线长度(cm) × 0.8 pF/cm + 连接器数量 × 8 pF + 器件数量 × 10 pF
2.11.5 举个例子
案例:3.3V 系统,快速模式 (400kbps)
已知条件:
VDD = 3.3V
VOL(max) = 0.4V
IOL = 3mA
tr = 300ns
Cb = 100pF
计算过程:
最小值:Rp (min) = (3.3 - 0.4) / 0.003 = 2.9 / 0.003 ≈ 967Ω
最大值:Rp (max) = 300×10⁻⁹ / (0.8473×100×10⁻¹²) ≈ 300×10⁻⁹ / 84.73×10⁻¹² ≈ 3540Ω
可选范围:967Ω < Rp < 3540Ω
推荐值:2.2kΩ(在范围内,兼顾功耗和抗干扰能力)

