Android SPI DMA驱动开发与HAL联调 - 第2节

SPI 四线制信号与物理连接

SPI(Serial Peripheral Interface)是一种同步、全双工、主从架构的串行通信协议。物理层由 4 根信号线构成,所有通信由主设备(Master)发起并控制时钟。

信号线 全称 方向 功能描述
SCLK Serial Clock Master → Slave 由主设备产生的同步时钟,决定数据传输速率
MOSI Master Out Slave In Master → Slave 主设备输出数据线,从设备接收数据
MISO Master In Slave Out Slave → Master 从设备输出数据线,主设备接收数据
CS Chip Select Master → Slave 片选信号,低电平有效,选中特定从设备
关键理解:SPI 是全双工协议——在每个时钟周期,主设备通过 MOSI 发送一位数据,同时从设备通过 MISO 返回一位数据。这意味着一次传输同时完成发送和接收。

多从设备连接拓扑

SPI 支持一主多从架构。每个从设备独占一根 CS 线,主设备通过拉低对应 CS 线来选中目标从设备。未选中的从设备必须将 MISO 引脚置为高阻态,避免总线冲突。

SPI 一主多从连接拓扑 主设备 (Master) 从设备 1 (Slave) 从设备 2 (Slave) 从设备 3 (Slave) SCLK MOSI MISO CS1 CS2 CS3 SCLK / MOSI / MISO 共享总线 CS 线独立,低电平选中对应从设备
驱动开发陷阱:在 Android BSP 中,如果从设备 MISO 引脚未配置为高阻态,多个从设备同时驱动 MISO 会导致总线短路,严重时可能损坏硬件。务必在设备树中正确配置各从设备的 SPI 模式。

SPI 工作模式:CPOL 与 CPHA

SPI 协议通过 CPOL(Clock Polarity,时钟极性)和 CPHA(Clock Phase,时钟相位)两个参数定义 4 种工作模式。这两个参数决定了数据采样和切换的时序关系。

CPOL:时钟极性

  • CPOL = 0:空闲状态时 SCLK 为低电平(0)。
  • CPOL = 1:空闲状态时 SCLK 为高电平(1)。

CPHA:时钟相位

  • CPHA = 0:数据在 SCLK 的第一个边沿(上升沿或下降沿)被采样。
  • CPHA = 1:数据在 SCLK 的第二个边沿被采样。
模式 CPOL CPHA 空闲时钟电平 数据采样边沿 数据切换边沿
模式 0 0 0 低电平 上升沿 下降沿
模式 1 0 1 低电平 下降沿 上升沿
模式 2 1 0 高电平 下降沿 上升沿
模式 3 1 1 高电平 上升沿 下降沿
Android 驱动经验:绝大多数 SPI 从设备(如传感器、ADC、显示屏)默认使用 模式 0(CPOL=0, CPHA=0)。在设备树中通过 spi-cpol 和 spi-cpha 属性指定模式。如果主从模式不匹配,数据将全部错位,表现为通信完全失败。

时钟极性与相位时序详解

理解 CPOL 和 CPHA 组合的关键在于:数据采样边沿和数据切换边沿总是交替出现。主设备在切换边沿更新 MOSI 数据,从设备在采样边沿读取 MOSI;同时从设备在切换边沿更新 MISO 数据,主设备在采样边沿读取 MISO。

模式 0(CPOL=0, CPHA=0)时序

SPI 模式 0 时序(CPOL=0, CPHA=0) SCLK MOSI CS ↑ 采样边沿(上升沿) 模式 0:空闲低电平,上升沿采样数据,下降沿切换数据。CS 拉低后第一个时钟上升沿即采样第 1 位。

模式 3(CPOL=1, CPHA=1)时序

SPI 模式 3 时序(CPOL=1, CPHA=1) SCLK MOSI ← 上一章 📖 返回目录 下一章 →