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 引脚置为高阻态,避免总线冲突。
驱动开发陷阱:在 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。