一、SPI协议
![](https://i-blog.csdnimg.cn/blog_migrate/101429292f0d4670ce881d8d3dd4f092.png)
- SCK
- 时钟线,用于通讯数据同步,决定通讯速率(受限于低速设备),信号由master产生
- MOSI
- 主设备输出 / 从设备输入,数据方向:master --> slave,信号由master产生
- MISO
- 主设备输入 / 从设备输出,数据方向:slave --> master,信号由slave产生
- CS / NSS
- 片选信号线,拉低表示设备被选中,即低电平为开始信号,拉高作为结束信号,信号由master产生
- spi支持双线全双工、双线单向、单线模式
![](https://i-blog.csdnimg.cn/blog_migrate/72edb375bc00270122ed684675393f04.png)
- 起始、停止信号
- ①处,NSS由高到低,是SPI起始信号。
- ⑧处,NSS由低到高,是SPI停止信号。
- 数据有效性
- MOSI、MISO数据线在SCK每个时钟周期传输一位数据,输入输出同时进行。数据传输MSB先行、LSB先行master、slave保持一直就行,一般为MSB先行。
- ②③④⑤处,SCK上升沿时MOSI、MISO可以准备数据,SCK下降沿时数据有效,可以被采样。且高电平为数据1,低电平为数据0。
- 每次传输的数据单位数8 / 16bit
- CPOL / CPHA及通讯模式
- CPOL时钟极性,SPI未通讯时,SCK的电平信号。(设备空闲:SPI开始前、NSS高电平时)
- CPOL=0,SCK空闲为低电平
- CPOL=1,SCK空闲为高电平
- CPHA时钟相位,MOSI、MISO数据线被采样时刻
- CPHA=0,在SCK“奇数边沿”被采样
- CPHA=1,在SCK“偶数边沿”被采样
- 四种通讯模式
- 由CPOL、CPHA的不同状态,SPI分成四种模式,master、slave需要在相同的模式下才能正常通信。
![](https://i-blog.csdnimg.cn/blog_migrate/9bbab853c8b39e688747bdcb6dc00ec2.png)
![](https://i-blog.csdnimg.cn/blog_migrate/d3be05bb76699c47be0a5cf54b9fb0fd.png)
- CPHA=0时的SPI通讯模式
- 奇数边沿采样,不受CPOL影响
![](https://i-blog.csdnimg.cn/blog_migrate/f84b48197079fe87ed71892ceda505ca.png)
- CPHA=1时的SPI通讯模式
- 偶数边沿采样,不受CPOL影响
二、SPI通信
typedef struct
{
uint16_t SPI_Direction; /*设置 SPI 的单双向模式 */
uint16_t SPI_Mode; /*设置 SPI 的主/从机端模式 */
uint16_t SPI_DataSize; /*设置 SPI 的数据帧长度,可选 8/16 位 */
uint16_t SPI_CPOL; /*设置时钟极性 CPOL,可选高/低电平*/
uint16_t SPI_CPHA; /*设置时钟相位,可选奇/偶数边沿采样 */
uint16_t SPI_NSS; /*设置 NSS 引脚由 SPI 硬件控制还是软件控制*/
uint16_t SPI_BaudRatePrescaler; /*设置时钟分频因子, fpclk/分频数=fSCK */
uint16_t SPI_FirstBit; /*设置 MSB/LSB 先行 */
uint16_t SPI_CRCPolynomial; /*设置 CRC 校验的表达式 */
} SPI_InitTypeDef;
双线全双工 SPI_Direction_2Lines_FullDuplex
双线只接收 SPI_Direction_2Lines_RxOnly
单线只接收 SPI_Direction_1Line_Rx
单线只发送 SPI_Direction_1Line_Tx
主机模式 SPI_Mode_Master
从机模式 SPI_Mode_Slave
数据帧8位 SPI_DataSize_16b
数据帧16位 SPI_DataSize_8b
SPI_CPOL_Low
SPI_CPOL_High
SPI_CPHA_1Edge
SPI_CPHA_2Edge
SPI_NSS_Soft
SPI_NSS_Hard
SPI_BaudRatePrescaler_2
SPI_BaudRatePrescaler_4
SPI_BaudRatePrescaler_8
SPI_BaudRatePrescaler_16
SPI_BaudRatePrescaler_32
SPI_BaudRatePrescaler_64
SPI_BaudRatePrescaler_128
SPI_BaudRatePrescaler_256
SPI_FirstBit_MSB
SPI_FirstBit_LSB