常见外设驱动:I2C / SPI / I2S / UART / SDMMC
这篇对应简历里的哪句话
Section titled “这篇对应简历里的哪句话”熟悉常见外设驱动开发,包括 I2C、SPI、I2S、UART、GPIO、SDMMC,具备显示、音频、传感器、SD 卡等模块调试经验。完成显示屏、按键、RTC、传感器、电池检测、SD 卡、音频 Codec、Wi-Fi 等外设模块开发与调试。面试官为什么会问
Section titled “面试官为什么会问”外设驱动是嵌入式基本功。面试官会通过 I2C、SPI、I2S、UART、SDMMC 判断你是否真的做过硬件联调,而不是只写上层业务。
Q1:I2C 和 SPI 有什么区别?
Section titled “Q1:I2C 和 SPI 有什么区别?”短答:
I2C 是两线、半双工、地址寻址,适合低速多设备;SPI 是多线、全双工、片选寻址,速度更高,适合屏幕、Flash 等高速设备。
展开回答:
I2C 主要信号是 SCL 和 SDA,多个设备挂在同一总线上,通过地址区分。SPI 常见信号是 SCLK、MOSI、MISO、CS,每个设备通常有独立片选。
结合我的项目:
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。
结合我的项目:
串口常用于日志、调试和外部模块通信。调试设备时,串口日志是定位启动、崩溃、网络状态和音频状态的第一手证据。
继续追问:
串口日志过多会影响实时性,尤其是高频音频路径,不应该逐帧打印。
Q5:I2S 为什么适合音频?
Section titled “Q5:I2S 为什么适合音频?”短答:
I2S 是面向数字音频的串行总线,包含位时钟、左右声道时钟和数据线,适合连续传输 PCM 音频数据。
展开回答:
常见信号:
BCLK: bit clockWS/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 策略。
最后 30 秒总结
Section titled “最后 30 秒总结”我理解外设调试不能只看软件 API,还要结合电源、电平、时序、总线速率和数据流。I2C 适合低速控制,SPI 适合高速外设,I2S 适合连续音频,SDMMC 适合 SD 卡吞吐。项目中我会把外设封装到 BSP/Service 层,让上层通过清晰接口使用。