I2C 和 SPI 总线在通信速率和引脚数量上有何区别?

解读

面试官问的是两条“板级低速总线”的硬指标差异,却放在 Android 岗位里考,目的有三:

  1. 验证候选人是否真正调过 Sensor、TP、NFC、Camera 等外设,而不只是写 Java/Kotlin;
  2. 看候选人能否把“速率/引脚”差异与驱动选型、功耗、布线成本、射频干扰等 Android 量产痛点联系起来;
  3. 筛掉只会背“SPI 快、I2C 省线”口诀的“PPT 工程师”。
    回答时要给出典型数值区间,并立刻回扣到 Android 场景:比如 400 kHz I2C 在 1.8 V 长线下拉不到 1 m 就会掉眼图,而 24 MHz SPI 在折叠屏转接软排上要做等长差分,否则 EMI 测试会爆。

知识点

  1. 通信速率
    I2C:标准模式 100 kbit/s,快速模式 400 kbit/s,高速模式 3.4 Mbit/s,超高速模式 5 Mbit/s(UM10204 修订版)。
    SPI 无协议级上限,主控端 8 MHz、16 MHz、26 MHz、50 MHz 常见,车载 TDDI 可到 80 MHz;速率只受布线、驱动能力、匹配电阻限制。

  2. 引脚数量
    I2C:双向开漏总线,仅需 SDA、SCL 两条信号线,外加上拉电阻;地址线通过 7/10 bit 编码复用,无需片选。
    SPI:全双工推挽,每颗从设备独占一条片选 CS,再加上 SCLK、MOSI、MISO 三条公用线;即 n 颗从设备需要 3+n 条信号线。

  3. Android HAL 关联
    Sensor HAL 2.0 默认 I2C 地址 0x68/0x76 的 BMI160、BMM150;
    屏下指纹安全 MCU 走 SPI 48 MHz,DMA 双缓冲,避免 SELinux ioctl 阻塞;
    折叠屏角度霍尔传感器因 FPC 走线受限,改用 1 MHz I2C + 低速模式,牺牲 2 ms 延迟换 6 根线节省。

  4. 量产测试指标
    I2C 眼图模板:VH ≥ 0.7 VDD,VL ≤ 0.3 VDD,Tr/Tf ≤ 300 ns(400 kHz);
    SPI 在 26 MHz 时,CLK 上升沿 2 ns 内必须稳定,MOSI/MISO 建立时间 ≥ 3 ns,否则 EMI 辐射 Class B 失败。

答案

通信速率:I2C 协议规定上限 3.4 Mbit/s(高速),国内 Android 主板常见 400 kbit/s;SPI 无协议上限,主流主控可跑到 24–50 Mbit/s,车载甚至 80 Mbit/s,比 I2C 高 1–2 个数量级。
引脚数量:I2C 最少只需 SDA、SCL 两根线,靠地址寻址;SPI 每增加一颗从芯片就要多一根独立 CS,最少 4 根(3 公线 + 1 CS),扩展 n 颗从设备需要 3+n 根线。
因此,在 Android 外设选型里,低速、少线、多颗从设备(如 Sensor Hub、PMIC、EEPROM)优先 I2C;高吞吐、单颗高速外设(屏下指纹、高速 FIFO IMU、QSPI Nor Flash)用 SPI,哪怕多占 GPIO 也要换速度。

拓展思考

  1. 速率再往上走,I3C 12.5 Mbit/s 可原位替换 I2C,但需 Android Linux 5.10 以上才支持 CCC 命令,老平台回退兼容性如何验证?
  2. 多 SPI 从设备 GPIO 不够时,可用菊花链(Daisy Chain)或外扩 74HC138 译码器,但 Android 用户空间如何原子化操作 CS 序列,避免 SensorService 与厂商 HAL 竞态?
  3. 折叠屏转轴软排 80 mm 长、0.12 mm 线宽时,24 MHz SPI 的反射系数 > -10 dB,要不要在驱动里降频到 12 MHz?还是改板层叠、加 22 Ω 串阻?给出决策流程。