STM32F4_SPI协议详解

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

目录

1. 什么是SPI

2. SPI物理层

3. SPI协议层

3.1 SPI基本通讯过程

3.2 数据有效性

3.3 CPOL/CPHA及通讯模式

4. SPI框图及通讯过程

4.1 SPI框图

4.2 通讯过程

5. SPI初始化结构体

6. Flash芯片(W25Q128)简介

7. 库函数配置SPI1的主模式

8. 实验程序

8.1 实验程序讲解

8.1.1 main.c

8.1.2 SPI.c

8.1.3 SPI.h

8.1.4 W25Q128.c

8.1.5 W25Q128.h


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时钟频率最大为f_{pclk}/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]位控制f_{pclk}时钟的分频因子,对f_{pclk}的分频结果就是SCK引脚的输出时钟频率。

数据控制逻辑:SPI的MOSI及MISO都连接到数据移位寄存器上,数据移位寄存器的数据来源于接收缓冲区及发送缓冲区。

通过写SPI的数据寄存器DR把数据填充到发送缓冲区中。

通过读数据寄存器DR,可以获取接收缓冲区中的内容。

数据帧长度可以通过控制寄存器CR1DFF位配置成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
本文章已经生成可运行项目
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值