硬件(十四)SPI通信协议
一、SPI 基本概念与四线制信号线作用
SPI(Serial Peripheral Interface,串行外设接口)是一种高速、全双工、同步的串行通信总线,广泛应用于 EEPROM、FLASH、实时时钟、AD 转换器、数字信号处理器与解码器等设备间的通信,仅需占用芯片四根管脚(四线制)。
四线制 SPI 的四根信号线及作用如下:
- SCLK(Serial Clock):时钟信号线,由主机提供,用于同步所有设备的数据传输。
- MOSI(Master Out Slave In):主出从入线,是主机向从机发送数据的通道。
- MISO(Master In Slave Out):主入从出线,是从机向主机返回数据的通道。
- CS(Chip Select):片选信号线,用于选择总线上的目标从机(低电平有效)。与 I2C 不同,SPI 无从机地址概念,同一时刻总线仅能通过 CS 选中一个外设;若仅保留 MOSI 或 MISO,还可实现单工通信。
二、时钟极性(CPOL)与时钟相位(CPHA)
1. 时钟极性(Clock Polarity 简称CPOL)
规定时钟信号线(SCLK)在空闲状态(无数据传输时)的电平:
- CPOL = 0:空闲时 SCLK 为低电平;
- CPOL = 1:空闲时 SCLK 为高电平。
2. 时钟相位(Clock Phase简称CPHA)
决定数据在 SCLK 的哪个边沿(上升沿 / 下降沿)被采样:
- CPHA = 0:在 SCLK 信号变化的第一个边沿(空闲态 → 活跃态的跳变沿)采样;
- CPHA = 1:在 SCLK 信号变化的第二个边沿(活跃态 → 空闲态的跳变沿)采样。
三、SPI 的四种时序模式
由于 CPOL(2 种取值)和 CPHA(2 种取值)的组合方式共有 2×2=4 种,因此 SPI 时序分为四种模式,具体如下:
模式(Mode) | CPOL(时钟极性) | CPHA(时钟相位) | 空闲时 SCLK 电平 | 数据采样边沿 |
---|---|---|---|---|
0 | 0 | 0 | 低电平 | 上升沿(低→高) |
1 | 0 | 1 | 低电平 | 下降沿(高→低) |
2 | 1 | 0 | 高电平 | 下降沿(高→低) |
3 | 1 | 1 | 高电平 | 上升沿(低→高) |
注意:SPI 通信时,主机与从机必须工作在相同的时序模式,否则会因采样时机不匹配导致数据错误。
四、I.MX6ULL 的 ECSPI 外设
I.MX6ULL 自带的 SPI 外设称为 ECSPI(Enhanced Configurable Serial Peripheral Interface),本质仍是 SPI,具备以下特性:
1. 基本能力
- 支持主模式 / 从模式,通常使用主模式;
- 有 4 个 ECSPI 外设,每个 ECSPI 支持4 个硬件片选信号,可连接 4 个外设;
- 配备 64×32 位的接收 FIFO(RXFIFO)和发送 FIFO(TXFIFO),提升数据吞吐效率。
2. 重要寄存器
(1)ECSPIx_CONREG(控制寄存器)
- BURST LENGTH(bit31:20):设置 SPI 突发传输数据长度,范围 1∼212 bit,通常设为 8 bit(即
BURST_LENGTH = 7
)。 - CHANNEL SELECT(bit19:18):选择 SPI 通道(如连接 ADXL345 时选通道 0)。
- PRE_DIVIDER(bit15:12)、POST_DIVIDER(bit11:8):两步分频设置,用于调整 SPI 时钟频率(时钟源为
pll3_sw_clk = 480MHz
,经静态 8 分频后为 60MHz)。 - CHANNEL MODE(bit7:4):设置通道为主 / 从模式(
0
为从模式,1
为主模式)。 - EN(bit0):SPI 使能位(
0
关闭,1
使能)。
(2)ECSPIx_CONFIGREG(配置寄存器)
- SCLK_CTL(bit23:20):设置 SCLK 空闲电平(
0
为低电平,1
为高电平)。 - SCLK_POL(bit7:4):设置时钟极性(即 CPOL,对应通道 3~0)。
- SCLK_PHA(bit3:0):设置时钟相位(即 CPHA,对应通道 3~0)。
- SS_POL(bit15:12):设置片选信号极性(
0
低电平有效,1
高电平有效)。
(3)ECSPIx_PERIODREG(周期寄存器)
- CSD_CTL(bit21:16):设置片选信号与第一个 SCLK 信号的延时(范围 0~63)。
- CSRC(bit15):选择时钟源(
0
选 SPI CLK,1
选 32.768KHz 晶振,通常选 SPI CLK)。
(4)ECSPIx_STATREG(状态寄存器)
- TC(bit7):传输完成标志(
0
传输中,1
传输完成)。 - RF(bit5):RXFIFO 空标志(
0
不为空,1
为空)。 - TF(bit2):TXFIFO 满标志(
0
不为满,1
为满)。
(5)数据寄存器
- ECSPIx_TXDATA:32 位发送数据寄存器,向其写入数据可发起 SPI 传输。
- ECSPIx_RXDATA:32 位接收数据寄存器,读取其值可获取 SPI 接收的数据。
五、ADXL345 三轴加速度传感器与 SPI 通信
ADXL345 是一款支持 SPI(3 线 / 4 线模式)与 I2C 接口的三轴加速度传感器,特性如下:
1. 核心参数
- 测量范围:±2g、±4g、±8g、±16g 可选;
- 分辨率:最高 13 位(3.9mg/LSB);
- 工作电压:2.0V ~ 3.6V;
- 低功耗:测量模式仅 0.23mA,待机模式 40μA。
2. 核心功能
- 三轴加速度(X、Y、Z 轴)测量;
- 静态重力加速度、动态加速度(震动、运动)测量;
- 自由落体、单击 / 双击、活动 / 非活动监测。
3. SPI 通信细节(四线制模式)
ADXL345 采用 SPI 模式 3(CPOL=1,CPHA=1),且寄存器读写有特殊规则:
- 写寄存器:寄存器地址最高位为
0
,例如写0x20
寄存器时,先发送0x20
,再发送写入数据。 - 读寄存器:寄存器地址最高位为
1
,例如读0x20
寄存器时,先发送0xA0
(0x20 | 0x80
),再进入读取时序获取数据。