【嵌入式大厂面经】·IIC常见考点(持续更新中···)

目录

[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Ω(在范围内,兼顾功耗和抗干扰能力)

嵌入式面试八股文_时光の尘的博客-CSDN博客

相关推荐
三佛科技-187366133971 小时前
AIP7550GD893.TR是什么芯片?200mA/30V低压差线性稳压器芯片分析
单片机·嵌入式硬件
高翔·权衡之境1 小时前
主题3:天线与耦合——近场与远场
网络·嵌入式硬件·物联网·软件工程·信息与通信
踏着七彩祥云的小丑1 小时前
嵌入式测试学习第 7 天:PCB电路板基础、走线、焊盘、贴片/直插
单片机·嵌入式硬件
飞凌嵌入式2 小时前
飞凌嵌入式率先推出RK3572核心板 | 新一代八核AIoT平台,新品强势来袭!
科技·嵌入式硬件·嵌入式
MicroTech20252 小时前
微算法科技(NASDAQ: MLGO)区块链赋能物联网:量子安全互认证创新方案
科技·物联网·区块链
LCG元2 小时前
STM32实战:基于STM32F103的Modbus RTU通信(从机实现)
stm32·单片机·嵌入式硬件
武汉知识图谱科技2 小时前
从“事后记录”到“事前预警”:智能视觉+物联网如何让危险提前3秒发现
物联网
爱喝纯牛奶的柠檬2 小时前
【已验证】STM32 LoRa 环境监测与远程控制系统
arm开发·stm32·单片机·嵌入式硬件
东京老树根11 小时前
Arduino - 入门02 - Arduino编程基础 Arduino程序结构,实物与模拟器对照,Arduino常用函数
单片机·机器人