目录
1. 什么是SPI
SPI 是由摩托罗拉公司提出的通讯协议,即串行外设接口(Serial Peripheral Interface),SPI是一种高速、全双工(可以同时接收和发送)、同步通信的通信总线,被广泛的应用于ADC、MCU的通信过程中,其相对于IIC最显著的特点就是通讯的速度快,要求通讯速率较高的场合。所以对于通讯速率要求不高的场合,通常使用IIC;通讯速率要求较高的场合,通常使用SPI。
同样的,和IIC协议一样,学习SPI协议,首先也是从其物理层和协议层开始。
2. SPI物理层
这里通过和IIC协议进行比较,来进一步学习SPI协议。

①:IIC协议是通过寻址的方式来找到通讯的从机,那么SPI是通过什么方式呢?
SPI不同于IIC,不是通过寻址的方式来和从机进行通信的,每个从机都挂载着一条独立的SS信号线,该信号线也称为从设备选择信号线,常常称作片选信号线,也称为NSS,CS(其中STM32F4的芯片引脚就是CS)。每个从机的SS信号线独占主机的一个引脚,也可以说是,有多少个从设备,主机上就有多少条片选信号线。将该片选信号线置低电平0,则意味着选择该从机进行SPI通信;将该片选信号线置高电平1,则意味着停止通讯。
事实上,每个从设备都有独立的这一条SS信号线,该信号线独占主机的一个引脚。IIC协议中通过设备地址来寻址,选中总线上某个设备并与其进行通讯;而SPI协议中没有设备地址,它是用SS信号线来寻址,当主机选中从设备时,就将所选的从设备的信号线置为低电平0,即意味着该设备被选中,即片选有效,接着主机开始与被选中的从设备进行SPI通讯。所以SPI通讯以SS线置低电平为开始信号,以SS线被拉高作为结束信号。
②:IIC通讯只需要2根串行总线即可,SPI通讯的主机需要哪些特殊的引脚呢?
SCK(Serial Clock):时钟信号线,用于通讯数据同步。它由通讯的主机产生,决定了通讯的速率,不同的设备支持的最高时钟频率不同,STM32的SPI时钟频率最大为/2,两个设备之间通讯时,通讯速率受限于低速设备。
MOSI(Master Output,Slave Input):主设备输出/从设备输入引脚。主机的设备从这条信号线输出,从机由这条信号线读入主机发送的数据,即这条信号线上数据的方向为主机到从机。
MISO(Master Input,Slave Output):主设备输入/从设备输出引脚。主机从这条信号线读入数据,从机的数据由这条信号线输出到主机,即在这条线上数据的方向为从机到主机。
注意:也正是因为这两条MOSI和MISO信号的存在,SPI通讯才能实现全双工,也就是发送和接收可以同步进行,大大增强了通讯的效率。因为IIC通讯只有一条串行数据总线SDA,一根线是不可能单方向的发送,同时也能反方向的接收数据的。而SPI通讯的两根数据线,一根可以用来发送数据,另外一根可以用来接受数据。
3. SPI协议层
SPI协议定义了通讯的起始和停止信号、数据有效性、时钟同步等环节。
3.1 SPI基本通讯过程

①:NSS信号,也就是上面提及的SS信号、CS信号,这三个信号表示的意义是相同的,都表示从机片选信号。NSS信号线由高到低,是SPI通讯的起始信号。NSS是每个从机各自独占的信号线,当从机在自己的NSS线检测到起始信号后,就知道自己被主机选中了,开始准备与主机进行通讯。
⑥:NSS信号由低变高,是SPI通讯的停止信号,表示本次通讯结束,从机的选中状态被取消。
②③④⑤:分别表示触发、采样、触发、采样。SCL高电平期间,不管是MOSI还是MISO输入或者输出,此时信号正在传动,处于不稳定状态,不进行采样。当SCL低电平期间,主从传输的数据进入稳定状态,这个时间段进行采样。
3.2 数据有效性
SPI使用MOSI及MISO信号线来传输数据,使用SCK信号线进行数据同步。
MOSI及MISO数据线在SCK的每个时钟周期传输一位数据,如果需要传输8次,则需要循环传输,且数据输入输出是同时进行的。
3.3 CPOL/CPHA及通讯模式

由CPOL及CPHA的不同状态,SPI分成了四种模式,主机与从机需要工作在相同模式下才可以正常通讯,实际中采用较多的是模式0和模式3;

4. SPI框图及通讯过程
4.1 SPI框图
通讯引脚:STM32F4板载了SPI1,SPI2,SPI3。通常情况下使用SPI1,传输速度较快。SPI2和SPI3可以作为I2S音频协议使用。
时钟控制逻辑:通过控制SPI的BR寄存器来控制SPI协议的波特率。产生SPI时钟。BR[0:2]位控制时钟的分频因子,对
的分频结果就是SCK引脚的输出时钟频率。
数据控制逻辑:SPI的MOSI及MISO都连接到数据移位寄存器上,数据移位寄存器的数据来源于接收缓冲区及发送缓冲区。
通过写SPI的数据寄存器DR把数据填充到发送缓冲区中。
通过读数据寄存器DR,可以获取接收缓冲区中的内容。
数据帧长度可以通过控制寄存器CR1的DFF位配置成8位及16位。
模式:配置LSBFIRST可选择MSB先行还是LSB先行。
4.2 通讯过程

5. SPI初始化结构体
跟其他外设一样,STM32标准库提供了SPI初始化结构体及初始化函数来配置SPI外设。
typedef struct
{
uint16_t SPI_Direction; //设置SPI单双向模式
uint16_t SPI_Mode; //设置SPI主/从机模式
uint16_t SPI_DataSize; //设置SPI的数据帧长度,可选8/16位
uint16_t SPI_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_InitTypeD

文章详细介绍了STM32F4微控制器如何使用SPI接口与W25Q128Flash芯片进行通信,包括SPI协议的基础知识、物理层和协议层的原理、STM32F4的SPI初始化设置,以及如何配置SPI1为主模式进行数据传输。此外,还展示了针对W25Q128的读写操作和Flash芯片的存储特性。
最低0.47元/天 解锁文章
7046

被折叠的 条评论
为什么被折叠?



