此系列文章是小白学习STM32的一些学习笔记。小白第一次写笔记文章,有不足或是错误之处,请多体谅和交流!
1.SPI协议介绍
(一)SPI物理层
相比于IIC通讯,数据传输线由一条变成两条(MOSI、MISO)。
SCK:时钟总线,同步通信。
MOSI:主机输出数据,从机接收数据。
MISO:主机接受数据,从机输出数据。
SS:片选信号,低电平有效。
(二)SPI协议层
SPI通信时序如图:NSS(片选信号)发送起始信号、停止信号。时钟上升沿触发,下降沿数据有效(这是某一种通讯模式)。
通信模式(CPOL/CPHA):
CPOL(时钟极性):CPOL=0时,SCK空闲时为低电平;CPOL=1时,SCK空闲时为高电平。(空闲指的SPI未开始使用时)
CPHA(时钟相位):CPHA=0时,奇数边沿数据有效;CPHA=1时,偶数边沿数据有效。
如下图:
2.STM32f103的SPI介绍
(一)SPI通讯过程
两个标志信号TXE、RXNE:
一帧数据准备了之后,硬件将TXE置1,然后送到SPI_DR(发送缓冲区),然后软件清零TXE,这是发送过程;
一帧数据接受了时,硬件将RXNE自动置1,然后SPI_DR(接收缓冲区)接受数据,软件清零RXNE,这就是接受过程。
Tips:该过程是将发送(接受)缓冲区的数据一位一位(按时钟信号)通过MOSI(MISO)传输。
(二)SPI结构体介绍
// SPI_InitTypeDefSPI_InitTypeDef结构体
1 typedef struct
2 {
3 uint16_t SPI_Direction; /*设置 SPI 的单双向模式 */
4 uint16_t SPI_Mode; /*设置 SPI 的主/从机端模式 */
5 uint16_t SPI_DataSize; /*设置 SPI 的数据帧长度,可选 8/16 位 */
6 uint16_t SPI_CPOL; /*设置时钟极性 CPOL,可选高/低电平*/
7 uint16_t SPI_CPHA; /*设置时钟相位,可选奇/偶数边沿采样 */
8 uint16_t SPI_NSS; /*设置 NSS 引脚由 SPI 硬件控制还是软件控制*/
9 uint16_t SPI_BaudRatePrescaler; /*设置时钟分频因子,fpclk/分频数=fSCK */
10 uint16_t SPI_FirstBit; /*设置 MSB/LSB 先行 */
11 uint16_t SPI_CRCPolynomial; /*设置 CRC 校验的表达式 */
12 } SPI_InitTypeDef;
具体结构体各种配置参数可以去看stm32f103_spi.h头文件。
本系列笔记内容和图片基于《【野火®】零死角玩转STM32—F103-MINI》