
点击上方蓝色字体,关注我们
在嵌入式开发的面试中,I2C总线是一个常见的考察内容。面试官通常会问一些关于I2C总线的基础知识、通信原理、常见问题以及调试方法等方面的问题。
以下是我整理的一些常见的I2C总线面试问题及回答。
拓展学习:一文搞懂I2C总线通信、如何检测和解决I2C通信死锁

1
I2C总线的基本原理是什么?
I2C是一种串行通信协议,通常用于在MCU与外部设备(如传感器、显示器等)之间进行通信。
I2C总线有两根信号线:
I2C协议支持多主机模式和多从机模式,通过唯一的设备地址进行通信。
通信是基于主设备发起的,通过“起始位”与“停止位”来标识数据传输的开始与结束。

2
I2C的多主机模式和多从机模式如何工作?
多主机模式:I2C总线允许多个主设备共享同一总线。在多主模式下,任何一个主设备都可以发起通信。
然而,必须确保多个主设备不会同时争用总线,因此需要总线仲裁机制。

多从机模式:多个从设备可以通过唯一的地址进行区分,主设备根据地址选择需要通信的从设备。多个从设备不可以同时发送数据。

3
I2C协议中如何进行设备寻址?
I2C设备通过一个唯一的7位或10位设备地址进行寻址。最常见的是7位地址,地址范围从0x00到0x7F。设备地址通常由制造商定义,并且有些地址是保留的,不能使用。
例如:
设备寻址是通过SDA线发送设备地址来完成的,主设备发送设备地址后,从设备会响应一个ACK(确认)信号。

4
I2C通信中的起始位和停止位是什么?
起始位(Start Condition):通信开始时,主设备会在SCL为高电平时,将SDA从高电平拉到低电平。此时标志着一个数据帧的开始。
停止位(Stop Condition):通信结束时,主设备会在SCL为高电平时,将SDA从低电平拉到高电平。此时标志着数据帧的结束。

5
什么是重复START?
在不发送STOP的情况下,重新发送START,用于连续读写(如先写寄存器地址,再读数据),避免总线被其他主抢占。

6
什么是ACK和NACK?从设备如何响应?
每传输一个字节,后面跟随一个应答位。通过将 SDA 线拉低,来允许接收端回应发送端。ACK 为 一个低电平信号,当时钟信号为高时, SDA 保持低电平则表明接收端已成功接收到发送端的数据。
当主机作为发送器件时,如果从机上产生无响应信号(NACK) ,主机可以产生停止信号来退出数据传输,或者产生重复起始信号开始新一轮的数据传输。当主机作为接收器件时,发生无响应信号(NACK) ,从机释放 SDA 线,使主机产生停止信号或重复起始信号。

7
什么是时钟拉伸?它如何工作?
时钟拉伸是I2C的从设备功能:当从设备未准备好(如缓冲满)时,拉低SCL,暂停主设备的时钟,主检测SCL低后等待从设备释放。仅从设备可拉伸,主不能。
8
如果两个从设备地址相同,会发生什么?如何解决?
冲突导致总线混乱(两个设备同时响应,SDA不确定)。
解决:
9
I2C总线的最大传输距离是多少?影响因素是什么?
标准<1m(取决于速度和电容);高速模式<10cm。
影响:总线电容(C=εA/d,过多设备增加C)、噪声、EMI。
优化:短线、低速、低电容电缆、差分屏蔽。
10
I2C总线的速度(SCL频率)是多少?
I2C协议支持多种数据传输速度:
不同的设备和应用场景可能会选择不同的速率。
一般来说,高速模式需要确保总线电容较小,并且信号质量较好,否则会导致通信不稳定。
11
I2C总线通信中常见的错误是什么?
常见的I2C通信错误包括:
12
如何处理I2C总线上的多个设备冲突?
I2C总线允许多个从设备共享同一条SDA和SCL线,因此避免冲突是设计的关键。几个常见的解决方法:
13
如何调试I2C总线问题?
调试I2C总线时,可以采取以下步骤:
14
I2C与SPI的区别是什么?何时选择I2C?

I2C适合多设备、低速场景(如传感器网络),节省引脚;SPI适合高速、点对点(如闪存)。
15
如何实现I2C总线的错误检测与恢复?
常见的错误检测方法包括:
通过这些方法,可以有效地提高I2C总线通信的可靠性和稳定性。
16
I2C总线上最多能连接多少设备?
理论上,7位寻址支持128地址(0x00-0x7F),但0x00保留广播,实际112个唯一从设备;10位寻址支持1024个(0x80-0xFF扩展)。
实际数量受总线电容限制(<400pF for SM),过多设备增加寄生电容,导致信号衰减。
17
I2C通信中,为什么需要上拉电阻?其阻值如何选择?
I2C 总线内部使用漏极开路输出驱动器,因此 SDA和 SCL 可以被拉低为低电平,但是不能被驱动为高电平,所以每条线上都要使用一个上拉电阻,默认情况下将其保持在高电平。

I2C 总线上拉电阻阻值取决于系统应用,TI 官方手册推荐使用以下公式来计算上拉电阻值:


根据上表,这里不难发现需要在做电阻选择需要满足几个条件:
所以根据上述公式可以计算,对于5V的电源,每个上拉电阻阻值至少1.53kΩ,而对于3.3V的电源,每个电阻阻值至少967Ω。
如果觉得计算电阻值比较麻烦,也可以使用典型值 4.7kΩ。若各位想了解更多可直接参见手册说明。
18
I2C如何实现多主仲裁?如果两个主机同时开始传输,一个发送地址0x50,一个发送0x52,最终哪个主机赢得仲裁?
以地址0x50 (0b1010000) 和 0x52 (0b1010010) 为例:
最终,发送地址0x50的主机赢得仲裁,因为它发送的地址在二进制上更小(有更早的‘0’),通信继续,而0x52的主机会等待总线空闲后重试。
面试官通过这些问题,不仅是在考察你是否“知道”I2C,更是在评估你是否“理解”其背后的物理原理和协议,以及是否具备将理论知识应用于复杂实际场景、解决棘手问题的能力。