Skip to content

常见外设驱动:I2C / SPI / I2S / UART / SDMMC

熟悉常见外设驱动开发,包括 I2C、SPI、I2S、UART、GPIO、SDMMC,具备显示、音频、传感器、SD 卡等模块调试经验。
完成显示屏、按键、RTC、传感器、电池检测、SD 卡、音频 Codec、Wi-Fi 等外设模块开发与调试。

外设驱动是嵌入式基本功。面试官会通过 I2C、SPI、I2S、UART、SDMMC 判断你是否真的做过硬件联调,而不是只写上层业务。

短答:

I2C 是两线、半双工、地址寻址,适合低速多设备;SPI 是多线、全双工、片选寻址,速度更高,适合屏幕、Flash 等高速设备。

展开回答:

I2C 主要信号是 SCLSDA,多个设备挂在同一总线上,通过地址区分。SPI 常见信号是 SCLKMOSIMISOCS,每个设备通常有独立片选。

结合我的项目:

RTC、温湿度传感器这类低速配置型设备适合 I2C;显示屏、Flash 或高速数据设备更适合 SPI;音频数据流则通常走 I2S。

继续追问:

I2C 设备多时要注意地址冲突和上拉;SPI 设备多时要注意 CS 管理和总线配置一致性。

Q2:I2C 上拉、电平、地址、ACK/NACK 怎么理解?

Section titled “Q2:I2C 上拉、电平、地址、ACK/NACK 怎么理解?”

短答:

I2C 是开漏/开集电极总线,需要上拉电阻。主机发送地址和数据,从机用 ACK/NACK 表示是否响应。

展开回答:

SCL/SDA 不能主动输出高电平,只能拉低或释放,所以需要上拉。地址通常是 7-bit,读写位另算。ACK 表示接收方拉低 SDA 确认收到,NACK 表示未确认。

结合我的项目:

调 I2C 传感器或 RTC 时,如果一直 NACK,要先查电源、电平、上拉、地址是否正确,再看寄存器读写时序。

继续追问:

I2C 扫描到地址不代表驱动完全正确,只说明设备在总线上响应了。

Q3:SPI 的 CPOL/CPHA、片选、全双工怎么回答?

Section titled “Q3:SPI 的 CPOL/CPHA、片选、全双工怎么回答?”

短答:

CPOL 决定时钟空闲电平,CPHA 决定采样边沿;片选用于选择设备;SPI 可以同时发送和接收。

展开回答:

SPI mode 由 CPOL/CPHA 组合决定。主从两边模式不一致,会出现读写错位。CS 拉低后设备进入一次事务,事务结束后拉高。

结合我的项目:

如果显示屏花屏或读写异常,不只看代码,也要确认 SPI mode、时钟频率、CS/DC/RST 引脚、DMA buffer 和屏幕初始化序列。

继续追问:

SPI 速度不是越高越好,线长、PCB、设备能力和 DMA buffer 都会影响稳定性。

Q4:UART 波特率、校验位、流控是什么?

Section titled “Q4:UART 波特率、校验位、流控是什么?”

短答:

UART 是异步串口通信,波特率决定符号速率,校验位用于简单错误检测,流控用于避免接收方处理不过来。

展开回答:

常见配置是 115200 8N1:115200 波特率、8 位数据、无校验、1 位停止位。硬件流控通常使用 RTS/CTS。

结合我的项目:

串口常用于日志、调试和外部模块通信。调试设备时,串口日志是定位启动、崩溃、网络状态和音频状态的第一手证据。

继续追问:

串口日志过多会影响实时性,尤其是高频音频路径,不应该逐帧打印。

短答:

I2S 是面向数字音频的串行总线,包含位时钟、左右声道时钟和数据线,适合连续传输 PCM 音频数据。

展开回答:

常见信号:

BCLK: bit clock
WS/LRCK: 声道选择/采样同步
DIN/DOUT: 数据输入输出

I2S 可以配合 DMA 连续搬运音频,减少 CPU 逐样本处理压力。

结合我的项目:

麦克风采集和音频播放都需要连续数据流。I2S + DMA 更适合实时音频,播放器再通过 ringbuf 保证数据持续供给。

继续追问:

如果 I2S 播放断续,要看 PCM 数据是否连续、DMA buffer 是否足够、I2S write 是否 short_write、上游 ringbuf 是否 underrun。

Q6:SDMMC 和 SPI 模式 SD 卡有什么区别?

Section titled “Q6:SDMMC 和 SPI 模式 SD 卡有什么区别?”

短答:

SDMMC 是 SD 卡原生接口,吞吐更高;SPI 模式接线简单、兼容性好,但速度较低。

展开回答:

SDMMC 可以使用 1-bit 或 4-bit 数据线,适合较高吞吐。SPI 模式只需要标准 SPI 总线,适合资源受限或简单场景。

结合我的项目:

我用 SD 卡外置 UI 图片资源,目的是减少固件 .rodata 占用。图片读取不是超高实时性场景,关键是挂载可靠、路径管理和 fallback。

继续追问:

SD 卡不是内部 Flash,可能缺卡、文件缺失、读取失败,所以 UI 资源要考虑 fallback 或错误显示。

Q7:按键和 GPIO 输入要注意什么?

Section titled “Q7:按键和 GPIO 输入要注意什么?”

短答:

要注意上下拉、电平有效性、消抖、长按短按和中断处理。

展开回答:

机械按键会抖动,不能把一次电平变化直接当成一次按键。可以用定时扫描或中断触发后延迟确认。ISR 中不要做复杂逻辑,只投递事件。

结合我的项目:

设备按键可以用于打断播放、切换状态或进入配置。按键事件应上报给 App 层,而不是在 GPIO driver 里直接修改业务状态。

继续追问:

如果按键要打断音频播放,要通过事件通知 Session/Player,而不是在 ISR 中清 ringbuf。

Q8:项目里显示屏、RTC、传感器、SD 卡、音频 Codec 分别走什么接口?

Section titled “Q8:项目里显示屏、RTC、传感器、SD 卡、音频 Codec 分别走什么接口?”

短答:

显示屏常见 SPI/RGB/MIPI,RTC 和低速传感器常见 I2C,SD 卡常见 SDMMC/SPI,音频 Codec 常见 I2C 配置 + I2S 数据。

展开回答:

音频 Codec 通常有两个层面:

控制面: I2C 配置寄存器
数据面: I2S 传输 PCM

这也是很多外设的共同特点:低速控制 + 高速数据分离。

结合我的项目:

我的简历里可以这样说:显示、按键、传感器、SD 卡、音频 Codec 都做过调试,其中音频 Codec 不只是初始化寄存器,还要和 I2S、PCM buffer、播放器状态配合。

继续追问:

如果面试官问某个具体芯片型号,不知道寄存器细节可以诚实说明,但要讲清通用调试方法。

  • 只背 I2C/SPI 定义,不讲实际调试问题。
  • 认为 I2C 不需要上拉。
  • 不知道 I2S 的 BCLK、WS、DIN/DOUT。
  • 把音频 Codec 当成普通 I2C 传感器。
  • SD 卡缺失时没有 fallback 策略。
我理解外设调试不能只看软件 API,还要结合电源、电平、时序、总线速率和数据流。I2C 适合低速控制,SPI 适合高速外设,I2S 适合连续音频,SDMMC 适合 SD 卡吞吐。项目中我会把外设封装到 BSP/Service 层,让上层通过清晰接口使用。