spi通信协议概念:
SPI是一种有线通信协议,用于两个设备之间的全双工数据传输(所谓的全双工,就是该协议可以同时进行收发数据)
SPI 规定了两个 SPI 设备之间通信必须由主设备 (Master) 来控制次设备 (Slave). 一个 Master 设备可以通过提供 Clock 以及对 Slave 设备进行片选 (Slave Select) 来控制多个 Slave 设备, SPI 协议还规定 Slave 设备的 Clock 由 Master 设备通过 SCK 管脚提供给 Slave 设备, Slave 设备本身不能产生或控制 Clock, 没有 Clock 则 Slave 设备不能正常工作。
目录
(一)spi引脚详解:
(二)spi的四种模式详解
1:CPOL/CPOA
(三)STM32标准外设库SPI_InitTypeDef的定义
(四)SPI 发送/接收
(一)spi引脚详解:
NSS<-->RES:从机复位引脚
MOSI:主机发送,从机接收数据引脚
MISO:主机接收,从机发送数据引脚
SCK: 时钟引脚
对于spi通信协议来说,他的接收数据的时刻(数据采样时刻)就在时钟的跳变沿。上升沿和下降沿均可(这要看具体的spi参数配置)。
当然它也需要设置通信的波特率。波特率的概念,可以先简单的理解为每秒钟发送几个字节的数据,一般来说波特率越高,每秒发送的字节数越多。
(二)spi的四种模式详解
1:CPOL/CPOA
首先了解一下什么是SCK空闲状态,其就是当SCLK在数发送8个bit比特数据之前和之后的状态,于此对应的,SCK在发送数据的时候,就是正常的工作的时候,有效active的时刻了。
CPOL = 0 : 当无数据发送(空闲状态下)SCK默认保持高电平
CPOL = 1:当无数据发送(空闲状态下)SCK默认保持高电平
CPHA = 0: 有数据接收时,在第一个跳变沿进行数据的接收(在奇数的跳变沿接收数据)
CPHA = 1: 有数据接收时,在第二个跳变沿进行数据的接收(在偶数的跳变沿接收数据)
所以根据这两个变量的两两组合,就形成了四种模式,分别为 模式0 ~ 模式3。我们在使用spi和外设模块进行通信的时候,一定要注意到该外置模块兼容哪种spi通信模式,然后在mcu进行代码编写时进行相应的调整。(SPI通信模式,是从设备决定主设备的,我们在观察时序图时,只需要看sck空闲时刻的电平与下一时刻的取样电平是上升沿还是下降沿即可判定)
(三)STM32标准外设库SPI_InitTypeDef的定义
typedef struct
{
uint16_t SPI_Direction; // 设置SPI 的通信方式,可以选择为半双工,全双工,以及串行发和串行收方式
uint16_t SPI_Mode; // 设置SPI 的主从模式
uint16_t SPI_DataSize; // 为8 位还是16 位帧格式选择项
uint16_t SPI_CPOL; // 设置时钟极性
uint16_t SPI_CPHA; // 设置时钟相位
uint16_t SPI_NSS; //设置NSS 信号由硬件(NSS管脚)还是软件控制
uint16_t SPI_BaudRatePrescaler; //设置SPI 波特率预分频值
uint16_t SPI_FirstBit; //设置数据传输顺序是MSB 位在前还是LSB 位在前
uint16_t SPI_CRCPolynomial; //设置CRC 校验多项式,提高通信可靠性,大于1 即可
}SPI_InitTypeDef;
第一个参数SPI_Direction 是用来设置SPI的通信方式,可以选择为半双工,全双工,以及串行发和串行收方式,这里我们选择全双工模式SPI_Direction_2Lines_FullDuplex。
第二个参数SPI_Mode用来设置SPI的主从模式,这里我们设置为主机模式 SPI_Mode_Master,当然有需要你也可以选择为从机模式 SPI_Mode_Slave。
第三个参数SPI_DataSiz为8位还是16位帧格式选择项,这里我们是8位传输,选择SPI_DataSize_8b。
第四个参数SPI_CPOL用来设置时钟极性,我们设置串行同步时钟的空闲状态为高电平所以我们选择SPI_CPOL_High。
第五个参数SPI_CPHA 用来设置时钟相位,也就是选择在串行同步时钟的第几个跳变沿(上升或下降)数据被采样,可以为第一个或者第二个条边沿采集,这里我们选择第二个跳变沿,所以选择 SPI_CPHA_2Edge
第六个参数SPI_NSS设置NSS信号由硬件(NSS管脚)还是软件控制,这里我们通过软件控制NSS关键,而不是硬件自动控制,所以选择 SPI_NSS_Soft。
第七个参数 SPI_BaudRatePrescaler很关键,就是设置 SPI 波特率预分频值也就是决定 SPI 的时钟的参数,从不分频到256分频8个可选值,初始化的时候我们选择8分频值SPI_BaudRatePrescaler_8,传输速度为72M/8=9MHz。
第八个参数 SPI_FirstBit设置数据传输顺序是 MSB 位在前还是LSB位在前,这里我们选择SPI_FirstBit_MSB高位在前。
第九个参数 SPI_CRCPolynomial是用来设置CRC校验多项式,提高通信可靠性,大于1即可。
(四)SPI 发送/接收
通过官方提供的库函数可以看到,不管是通过SPI读数据还是写数据,它最终操作的都是SPI对应的数据寄存器的内存缓冲区。我们来看下面这张图
通过官方手册可以了解到,一个数据寄存器区对应着两个数据缓存区,一个用于缓存发送数据,一个用于缓存接收数据。我们可以总结为如下图所示:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)