SPI(Serial Peripheral Interface) 接口根据时钟极性(CPOL)和时钟相位(CPHA)的不同组合,共有 4种工作模式。这些模式决定了数据采样和传输的时序关系,是SPI通信中必须正确配置的关键参数。以下是详细解析:
1. SPI的4种工作模式
SPI模式由两个参数定义:
- CPOL(Clock Polarity):时钟空闲时的电平状态。
CPOL=0
:空闲时为低电平。CPOL=1
:空闲时为高电平。
- CPHA(Clock Phase):数据采样的时钟边沿。
CPHA=0
:在时钟的第一个边沿(上升沿或下降沿)采样数据。CPHA=1
:在时钟的第二个边沿采样数据。
组合后形成4种模式:
模式 | CPOL | CPHA | 空闲时钟 | 数据采样边沿 | 数据切换边沿 |
---|---|---|---|---|---|
Mode 0 | 0 | 0 | 低电平 | 第一个上升沿(SCK从低→高) | 下降沿(SCK从高→低) |
Mode 1 | 0 | 1 | 低电平 | 第一个下降沿(SCK从高→低) | 上升沿(SCK从低→高) |
Mode 2 | 1 | 0 | 高电平 | 第一个下降沿(SCK从高→低) | 上升沿(SCK从低→高) |
Mode 3 | 1 | 1 | 高电平 | 第一个上升沿(SCK从低→高) | 下降沿(SCK从高→低) |
2. 模式对比与波形示例
Mode 0(最常用)
- 波形特点:
- 空闲时SCK为低电平。
- 数据在SCK上升沿被采样,下降沿切换。
- 典型应用:多数传感器(如BME280)、FLASH芯片(如W25Q64)。
Mode 1
- 波形特点:
- 空闲时SCK为低电平。
- 数据在SCK下降沿被采样,上升沿切换。
- 典型应用:部分ADC芯片(如MCP3008)。
Mode 2
- 波形特点:
- 空闲时SCK为高电平。
- 数据在SCK下降沿被采样,上升沿切换。
- 典型应用:较少见,某些特定射频模块。
Mode 3
- 波形特点:
- 空闲时SCK为高电平。
- 数据在SCK上升沿被采样,下降沿切换。
- 典型应用:部分EEPROM(如AT25系列)。
3. 如何选择SPI模式?
- 查阅器件手册:从设备的SPI模式是固定的,必须与主设备匹配。
- 例如:BMP280传感器默认Mode 0,而ADXL345支持Mode 0和Mode 3。
- 观察时序图:
- 确认数据采样边沿与时钟极性/相位的对应关系。
- 实验调试:
- 若通信失败,可尝试切换模式(常见错误:Mode 0与Mode 3混淆)。
4. SPI的其他关键配置
除了模式,还需配置以下参数:
- 时钟频率(SCK):从设备支持的最大频率(如10 MHz)。
- 数据位顺序(MSB/LSB First):通常MSB优先。
- 片选信号(CS):高电平有效或低电平有效。
5. 代码示例(STM32配置SPI Mode 0)
// STM32 HAL库配置SPI Mode 0
SPI_HandleTypeDef hspi;
hspi.Instance = SPI1;
hspi.Init.Mode = SPI_MODE_MASTER;
hspi.Init.Direction = SPI_DIRECTION_2LINES;
hspi.Init.DataSize = SPI_DATASIZE_8BIT;
hspi.Init.CLKPolarity = SPI_POLARITY_LOW; // CPOL=0
hspi.Init.CLKPhase = SPI_PHASE_1EDGE; // CPHA=0
hspi.Init.NSS = SPI_NSS_SOFT;
hspi.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_32;
HAL_SPI_Init(&hspi);
6. 常见问题
- 模式不匹配:主从设备模式不一致导致数据读取错误。
- 时钟频率过高:从设备无法响应,表现为数据丢失。
- 片选信号未控制:未拉低CS导致通信无响应。
总结
SPI的4种模式通过CPOL和CPHA组合定义,需严格匹配从设备要求。Mode 0和Mode 3最为常见,Mode 1和Mode 2多用于特定器件。配置时务必结合时序图和手册验证!