嵌入式面试八股文之外设

1.1 GPIO

GPIO(General Purpose Input/Output)是芯片控制外部电路最基础的引脚接口。

1. 八种工作模式

分类 模式名称 核心特点与典型应用场景
输入模式 浮空输入 (Floating) 电平完全由外部决定,引脚悬空时电平不确定。常用于UART RX、外部按键(已有外部上下拉)。
上拉输入 (Pull-up) 内部连接上拉电阻,默认高电平。用于检测低电平有效的外部中断或按键。
下拉输入 (Pull-down) 内部连接下拉电阻,默认低电平。用于检测高电平有效的外部信号。
模拟输入 (Analog) 关闭施密特触发器,信号直通内部 ADC 模块。用于ADC 电压采集或低功耗模式下的省电配置。
输出模式 开漏输出 (Open-Drain) PMOS 不工作,NMOS 导通输出低电平,截止呈高阻态。必须外接上拉电阻才能输出高电平。
推挽输出 (Push-Pull) PMOS 和 NMOS 交替导通,可直接输出强高低电平,驱动能力强。用于驱动 LED、继电器、SPI/UART TX。
复用模式 复用开漏 / 复用推挽 引脚控制权交给片上外设硬件(如 I2C、SPI、PWM),而非 CPU 直接写 ODR 寄存器。

1.2 UART

UART 是一种异步、全双工、点对点(1对1)的串行通信协议。

1. 协议核心要素

  • 物理连线:TX(发送)、RX(接收)、GND(共地,必不可少)。硬件流控需额外增加 RTS(请求发送)和 CTS(允许发送)。
  • 数据帧格式:
    1. **空闲态 (Idle)**:持续高电平。
    2. **起始位 (Start Bit)**:1 bit 低电平(标志传输开始,触发接收端采样定时器)。
    3. 数据位 (Data Bits):5~8 bits(通常为 8 bits,低位 LSB 先发)。
    4. **校验位 (Parity Bit)**:可选(奇校验、偶校验、无校验),用于简单检错。
    5. **停止位 (Stop Bit)**:1 / 1.5 / 2 bits 高电平,拉开帧间间隔并校准时钟。

2. 高频面试考点

  • 既然没有时钟线(CLK),异步通信如何保证收发同步?

    • 收发双方预先约定相同的波特率(Baud Rate)。接收端检测到起始位下降沿后,以 16 倍波特率的内部时钟进行过采样,取每个 bit 中间位置(第 7、8、9 次采样值)进行表决,从而滤除边沿毛刺并容忍一定程度的时钟偏差(通常要求收发双方时钟误差小于 **2.5%~3%**)。
  • UART、RS232、RS485 的区别?

    特性 UART (TTL电平) RS232 RS485
    信号类型 单端信号(3.3V/5V) 单端信号(±3V~ ±15V 负逻辑) 差分信号(A/B 两线压差)
    通信方式 全双工(1对1) 全双工(1对1) 半双工(支持 1对多 总线组网,最多32~256节点)
    传输距离 板级(小于 1 米) 约 15 米 可达 1200 米(抗共模干扰极强)
  • 串口接收不定长数据怎么处理?

    • 最优解是 DMA + 串口空闲中断(IDLE Interrupt)。DMA 在后台自动搬运每个字节到内存缓冲区,当总线出现超过 1 个字节时间的空闲高电平时,触发 IDLE 中断,通知 CPU 一帧数据接收完毕。

1.3 I2C

I2C 是 Philips 开发的同步、半双工、支持多主多从的双线制串行总线。

1. 物理层与协议时序

  • 双线结构:SDA(串行数据线)、SCL(串行时钟线)。两条线均配置为开漏输出 + 外部上拉电阻(典型值 1.8kΩ ~ 10kΩ)。
  • 传输速率:标准模式(100 kbps)、快速模式(400 kbps)、高速模式(3.4 Mbps)。
  • 核心时序规则:
    • **起始信号 (START)**:SCL 为高电平时,SDA 由高变低。
    • **停止信号 (STOP)**:SCL 为高电平时,SDA 由低变高。
    • 数据有效性:SCL 为高电平时,SDA 必须保持稳定(供接收方采样);SCL 为低电平时,SDA 才允许改变状态。
    • 应答信号 (ACK/NACK):每传输完 8 bits(1字节,高位 MSB 先发),发送方释放 SDA,在第 9 个时钟周期由接收方拉低 SDA 表示 ACK,保持高电平表示 NACK。

2. 高频面试考点

  • I2C 读寄存器的完整流程是什么?(为什么读操作包含写过程?)
    • 读操作本质是复合格式(Combined Format),需要先“写”告诉从机要读哪个寄存器地址:
      1. 主机发送 START + 从机地址(7bit) + 写标志(0) -> 等待从机 ACK。
      2. 主机发送 目标寄存器地址(8bit) -> 等待从机 ACK。
      3. 主机发送 Repeated START(重复起始信号,不发 STOP 以防总线被其他主机抢占) + 从机地址(7bit) + 读标志(1) -> 等待从机 ACK。
      4. 从机发送数据字节,主机回复 ACK(若读完最后一个字节,主机必须回复 NACK 通知从机停止发送)。
      5. 主机发送 STOP 释放总线。
  • I2C 总线死锁(SDA 被一直拉低)的原因及如何解除?
    • 原因:主机正在读从机数据时,从机正好输出 bit 0(拉低了 SDA),此时主机发生异常复位。复位后主机处于空闲态,而从机因为没有收到后续的 SCL 时钟,一直卡在拉低 SDA 的状态等待时钟,导致总线死锁。
    • 解决方法:主机初始化时检测 SDA,若为低电平,将 SCL 引脚临时配置为普通 GPIO,软件模拟连续输出 9 个 SCL 时钟脉冲,让从机走完剩余的 bit 状态机并释放 SDA,最后主机再发一个 STOP 信号恢复总线。

1.4 I2S

I2S(Inter-IC Sound)是专为数字音频设备之间传输 PCM 音频数据设计的同步串行接口。

1. 信号线定义

  • CK / BCLK(Bit Clock,位时钟):对应数字音频的每一位数据。
    • 计算公式:
  • WS / LRCK(Word Select / Left-Right Clock,帧时钟/声道选择):频率等于**采样率 ($f_s$)**。用于区分当前传输的是左声道(通常 0 表示左)还是右声道(1 表示右)。
  • SD / SDATA(Serial Data):实际的二进制补码音频数据线(MSB 先发)。
  • MCLK(Master Clock,主时钟,可选):通常为采样率的 256 倍或 384 倍(如 $256 \times f_s$),专供外部 Audio Codec 内部的锁相环(PLL)和 $\Delta-\Sigma$ 调制器使用,不属于标准 I2S 三线制强制要求,但实际硬件中极其常见。

2. 三种对齐格式对比

  • 标准 I2S 格式(Philips 标准):最高有效位(MSB)在 LRCK 发生翻转后的第 2 个 BCLK 上升沿才开始有效(即延迟 1 个 BCLK 周期)。
  • 左对齐格式(Left-Justified):LRCK 翻转的同时,紧接着的第 1 个 BCLK 周期就开始传输 MSB(无延迟)。
  • 右对齐格式(Right-Justified):LSB 对齐在 LRCK 下一次翻转前的最后一个 BCLK 周期。

3. 高频面试考点

  • 为什么音频传输不直接用 SPI 或 I2C,而要专门设计 I2S?
    • ① 时钟抖动(Jitter)隔离:音频将数据和时钟完全分离,配合硬件 PLL 降低采样时钟抖动,避免爆音或底噪;② 天然支持双声道同步:通过 LRCK 硬件切换左右声道;③ 容忍位宽不匹配:标准 I2S 因为 MSB 固定在 LRCK 翻转后第 2 个时钟,若发送端发 24-bit 而接收端只支持 16-bit,接收端直接截取高 16 位、忽略后 8 位即可,无需修改协议即可兼容。

1.5 MIPI

嵌入式面试中提到的 MIPI 通常指用于摄像头的 MIPI CSI-2(Camera Serial Interface)和用于显示屏的 MIPI DSI(Display Serial Interface)。

1. 物理层(D-PHY)核心机制

  • Lane(通道)结构:由 1 对差分时钟线(Clock Lane) + 1~4 对差分数据线(Data Lanes) 组成。

  • 两种工作状态自动切换(高频考点):

    状态模式 信号类型 电平范围 速率 作用
    LP 模式 (Low Power) 单端信号 0~ 1.2V 小于 10 Mbps 空闲省电、传输控制命令(如屏幕初始化寄存器配置)。
    HS 模式 (High Speed) 低摆幅差分信号 100mV~ 300mV (典型 200mV) 80 Mbps~ 2.5 Gbps/Lane 高速传输图像帧数据(像素流)。
  • 状态切换时序:发送图像帧前,总线从 LP11 -> LP01 -> LP00 序列进入 HS 高速差分模式;一帧或一行传完后(消隐期 Blanking),立刻退回 LP11 省电状态。

2. MIPI DSI 的两种工作模式

  • Video Mode(视频模式):类似传统 RGB 接口,主控必须持续不断地向屏幕刷新像素流和同步信号(VSYNC/HSYNC)。屏幕内部没有显存(GRAM),一旦主控停止发送数据,屏幕就会黑屏或花屏。
  • Command Mode(命令模式):屏幕内部自带显存(GRAM)。主控只在画面变化时通过 MIPI 发送更新的数据包,平时主控可以休眠,由屏幕自刷新,极大降低系统功耗(常用于智能手表、手机息屏显示)。

1.6 SDMMC 与 SDIO

SDMMC 是控制器或存储卡标准,而 SDIO 是基于 SD 总线扩展出来的外设接口协议。

1. 概念区分

  • MMC / eMMC:MMC 是最早的多媒体卡标准;eMMC(Embedded MMC) 是将 NAND Flash 芯片和主控(负责磨损均衡、坏块管理 ECC)封装成 BGA 焊死在主板上的存储芯片,通常支持 1-bit、4-bit、8-bit 数据位宽。
  • SD 卡(Secure Digital):在 MMC 基础上发展而来的可插拔存储卡,支持 1-bit 和 4-bit 模式(以及兼容 SPI 模式)。
  • SDIO(Secure Digital Input/Output):复用 SD 卡的物理引脚和命令协议,但连接的不是存储卡,而是外设芯片(最典型的是 SDIO Wi-Fi / 蓝牙模组,如 AP6212、ESP8266/ESP32 作为从机网卡)。

2. 硬件信号线(以 4-bit SD/SDIO 为例)

  • **CLK**:主机提供给从机的同步时钟。
  • **CMD**:双向命令/响应线(用于发送控制指令,如 CMD0 复位、CMD5 SDIO 初始化、CMD52/CMD53 SDIO 读写寄存器与数据块)。
  • DAT0 ~ DAT3:4 根双向数据线。

3. 高频面试考点

  • SDIO 和 SD 卡在中断机制上有什么重要区别?
    • 普通 SD 存储卡是纯被动的,没有硬件中断概念;而 SDIO 外设(如 Wi-Fi 收到网络数据包)需要主动通知主机。在 4-bit SDIO 模式下,复用 DAT1 引脚在数据传输间隙作为硬件中断线,通知主控读取数据。
  • 为什么板载大容量存储普遍用 eMMC 而不是 Raw NAND Flash?
    • Raw NAND 需要主控软件自行处理坏块管理(BBM)、磨损均衡(Wear Leveling)和复杂的 ECC 纠错;而 eMMC 内部自带 FTL(Flash Translation Layer)控制器,对外呈现为标准的块设备,极大地简化了 Linux/RTOS 的驱动开发。

1.7 SPI/QSPI

  1. 标准 SPI(串行外设接口)

SPI 是 Motorola 提出的同步、全双工、一主多从的高速串行接口(常见速率 10MHz ~ 50MHz+)。

  • 四根信号线:

    • SCLK(Serial Clock):同步时钟,由主机产生。
    • MOSI(Master Out Slave In):主机输出,从机输入。
    • MISO(Master In Slave Out):主机输入,从机输出。
    • CS / NSS(Chip Select):片选信号(通常低电平有效),每个从机独占一根 CS 线。
  • 四种工作模式(必考核心):由 CPOL(时钟极性) 和 CPHA(时钟相位) 组合决定:

    SPI 模式 CPOL(空闲时 SCLK 电平) CPHA(数据采样边沿) 采样时刻与数据切换时刻
    Mode 0 (最常用) 0(空闲为低电平) 0(第 1 个跳变沿采样) 上升沿采样,下降沿切换数据
    Mode 1 0(空闲为低电平) 1(第 2 个跳变沿采样) 下降沿采样,上升沿切换数据
    Mode 2 1(空闲为高电平) 0(第 1 个跳变沿采样) 下降沿采样,上升沿切换数据
    Mode 3 (最常用) 1(空闲为高电平) 1(第 2 个跳变沿采样) 上升沿采样,下降沿切换数据

    记忆技巧:不管 Mode 0 还是 Mode 3,都是上升沿采样数据,这也是绝大多数 SPI Flash 和传感器默认同时兼容 Mode 0 和 Mode 3 的原因!

2. QSPI(Queued / Quad SPI)

嵌入式语境下的 QSPI 绝大多指 Quad SPI(四线数据 SPI),专用于连接外部 NOR Flash。

  • 与标准 SPI 的核心区别:
    1. 半双工 4 线并行传输:将原本的 MOSI 和 MISO 升级为双向的 IO0、IO1,并把原本 Flash 的写保护引脚 (WP) 和保持引脚 (HOLD) 复用为 IO2、IO3。一个时钟周期可以同时传输 4 bits 数据,吞吐率直接提升 4 倍(若配合 DTR/DDR 双边沿采样,1 个时钟可传 8 bits)。
    2. 帧阶段划分:QSPI 协议将一次通信拆分为 **指令阶段 (Instruction) -> 地址阶段 (Address) -> 交替字节 (Alternate Bytes) -> 空周期 (Dummy Cycles) -> 数据阶段 (Data)**,每个阶段都可独立配置为单线(1-line)、双线(2-line)或四线(4-line)传输。
    3. XIP(eXecute In Place,片内执行)与内存映射模式(Memory-Mapped Mode):
      • 标准 SPI 需要 CPU 先发读命令把数据搬到 RAM 才能运行;
      • QSPI 控制器支持内存映射,将外部 Flash 直接映射到 MCU 的系统寻址空间(如 STM32 的 0x90000000)。CPU 可以直接通过指针读取外部 Flash,或者直接把代码放在外部 QSPI Flash 中运行(XIP),极大节省片内 Flash 成本。