第24章 SPI—读写串行FLASH—零死角玩转STM32-F429系列

第五讲spi通过SPI接口模拟主机读写从机寄存 Vivado版本:2019.2 Modelsim版本:Modelsim SE-64 10.7 实验内容:通过SPI接口模拟主机读写从机寄存器,从机SPI时序图在下方给出。 SPI:是Serial Peripheral Interface的缩写,既串行外设接口,是一种4线高速全双工同步的通信总线。通常由一个主模块和一个从模块或多个从模块组成,主模块选择一个从模块进行同步通信,从而完成数据传输。单向传输时,3根线也可以。 其工作方式为主从方式,双向通信至少需要4根线,分别是 CS——Chip Select,片 阅读详情
第24章     SPI—读写串行FLASH

全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn

野火视频教程优酷观看网址:http://i.youku.com/firege

 

 

本章参考资料:《STM32F4xx 中文参考手册》、《STM32F4xx规格书》、库帮助文档《stm32f4xx_dsp_stdperiph_lib_um.chm》及《SPI总线协议介绍》。

若对SPI通讯协议不了解,可先阅读《SPI总线协议介绍》文档的内容学习。

关于FLASH存储器,请参考"常用存储器介绍"章节,实验中FLASH芯片的具体参数,请参考其规格书《W25Q128》来了解。

24.1 SPI协议简介

SPI协议是由摩托罗拉公司提出的通讯协议(Serial Peripheral Interface),即串行外围设备接口,是一种高速全双工的通信总线。它被广泛地使用在ADC、LCD等设备与MCU间,要求通讯速率较高的场合。

学习本章时,可与I2C章节对比阅读,体会两种通讯总线的差异以及EEPROM存储器与FLASH存储器的区别。下面我们分别对SPI协议的物理层及协议层进行讲解。

24.1.1 SPI物理层

SPI通讯设备之间的常用连接方式见图 241。

图 241 常见的SPI通讯系统

SPI通讯使用3条总线及片选线,3条总线分别为SCK、MOSI、MISO,片选线为,它们的作用介绍如下:

(1)     ( Slave Select):从设备选择信号线,常称为片选信号线,也称为NSS、CS,以下用NSS表示。当有多个SPI从设备与SPI主机相连时,设备的其它信号线SCK、MOSI及MISO同时并联到相同的SPI总线上,即无论有多少个从设备,都共同只使用这3条总线;而每个从设备都有独立的这一条NSS信号线,本信号线独占主机的一个引脚,即有多少个从设备,就有多少条片选信号线。I2C协议中通过设备地址来寻址、选中总线上的某个设备并与其进行通讯;而SPI协议中没有设备地址,它使用NSS信号线来寻址,当主机要选择从设备时,把该从设备的NSS信号线设置为低电平,该从设备即被选中,即片选有效,接着主机开始与被选中的从设备进行SPI通讯。所以SPI通讯以NSS线置低电平为开始信号,以NSS线被拉高作为结束信号。

(2)    SCK (Serial Clock):时钟信号线,用于通讯数据同步。它由通讯主机产生,决定了通讯的速率,不同的设备支持的最高时钟频率不一样,如STM32的SPI时钟频率最大为fpclk/2,两个设备之间通讯时,通讯速率受限于低速设备。

(3)    MOSI (Master Output, Slave Input):主设备输出/从设备输入引脚。主机的数据从这条信号线输出,从机由这条信号线读入主机发送的数据,即这条线上数据的方向为主机到从机。

(4)    MISO(Master Input,,Slave Output):主设备输入/从设备输出引脚。主机从这条信号线读入数据,从机的数据由这条信号线输出到主机,即在这条线上数据的方向为从机到主机。

24.1.2 协议层

与I2C的类似,SPI协议定义了通讯的起始和停止信号、数据有效性、时钟同步等环节。

1.    SPI基本通讯过程

先看看SPI通讯的通讯时序,见图 242。

图 242 SPI通讯时序

这是一个主机的通讯时序。NSS、SCK、MOSI信号都由主机控制产生,而MISO的信号由从机产生,主机通过该信号线读取从机的数据。MOSI与MISO的信号只在NSS为低电平的时候才有效,在SCK的每个时钟周期MOSI和MISO传输一位数据。

以上通讯流程中包含的各个信号分解如下:

2.    通讯的起始和停止信号

在图 242中的标号处,NSS信号线由高变低,是SPI通讯的起始信号。NSS是每个从机各自独占的信号线,当从机检在自己的NSS线检测到起始信号后,就知道自己被主机选中了,开始准备与主机通讯。在图中的标号†处,NSS信号由低变高,是SPI通讯的停止信号,表示本次通讯结束,从机的选中状态被取消。

3.    数据有效性

SPI使用MOSI及MISO信号线来传输数据,使用SCK信号线进行数据同步。MOSI及MISO数据线在SCK的每个时钟周期传输一位数据,且数据输入输出是同时进行的。数据传输时,MSB先行或LSB先行并没有作硬性规定,但要保证两个SPI通讯设备之间使用同样的协定,一般都会采用图 242中的MSB先行模式。

观察图中的‚ƒ„…标号处,MOSI及MISO的数据在SCK的上升沿期间变化输出,在SCK的下降沿时被采样。即在SCK的下降沿时刻,MOSI及MISO的数据有效,高电平时表示数据"1",为低电平时表示数据"0"。在其它时刻,数据无效,MOSI及MISO为下一次表示数据做准备。

SPI每次数据传输可以8位或16位为单位,每次传输的单位数不受限制。

4.    CPOL/CPHA及通讯模式

上面讲述的图 242中的时序只是SPI中的其中一种通讯模式,SPI一共有四种通讯模式,它们的主要区别是总线空闲时SCK的时钟状态以及数据采样时刻。为方便说明,在此引入"时钟极性CPOL"和"时钟相位CPHA"的概念。

时钟极性CPOL是指SPI通讯设备处于空闲状态时,SCK信号线的电平信号(即SPI通讯开始前、 NSS线为高电平时SCK的状态)。CPOL=0时, SCK在空闲状态时为低电平,CPOL=1时,则相反。

时钟相位CPHA是指数据的采样的时刻,当CPHA=0时,MOSI或MISO数据线上的信号将会在SCK时钟线的"奇数边沿"被采样。当CPHA=1时,数据线在SCK的"偶数边沿"采样。见图 243及图 244。

图 243 CPHA=0时的SPI通讯模式

我们来分析这个CPHA=0的时序图。首先,根据SCK在空闲状态时的电平,分为两种情况。SCK信号线在空闲状态为低电平时,CPOL=0;空闲状态为高电平时,CPOL=1。

无论CPOL=0还是=1,因为我们配置的时钟相位CPHA=0,在图中可以看到,采样时刻都是在SCK的奇数边沿。注意当CPOL=0的时候,时钟的奇数边沿是上升沿,而CPOL=1的时候,时钟的奇数边沿是下降沿。所以SPI的采样时刻不是由上升/下降沿决定的。MOSI和MISO数据线的有效信号在SCK的奇数边沿保持不变,数据信号将在SCK奇数边沿时被采样,在非采样时刻,MOSI和MISO的有效信号才发生切换。

类似地,当CPHA=1时,不受CPOL的影响,数据信号在SCK的偶数边沿被采样,见图 244。

图 244 CPHA=1时的SPI通讯模式

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

表 241 SPI的四种模式

SPI模式

CPOL

CPHA

空闲时SCK时钟

采样时刻

0

0

0

低电平

奇数边沿

1

0

1

低电平

偶数边沿

2

1

0

高电平

奇数边沿

3

1

1

高电平

偶数边沿

24.2 STM32的SPI特性及架构

与I2C外设一样,STM32芯片也集成了专门用于SPI协议通讯的外设。

24.2.1 STM32的SPI外设简介

STM32的SPI外设可用作通讯的主机及从机,支持最高的SCK时钟频率为fpclk/2 (STM32F429型号的芯片默认fpclk1为90MHz,fpclk2为45MHz),完全支持SPI协议的4种模式,数据帧长度可设置为8位或16位,可设置数据MSB先行或LSB先行。它还支持双线全双工(前面小节说明的都是这种模式)、双线单向以及单线模式。其中双线单向模式可以同时使用MOSI及MISO数据线向一个方向传输数据,可以加快一倍的传输速度。而单线模式则可以减少硬件接线,当然这样速率会受到影响。我们只讲解双线全双工模式。

STM32的SPI外设还支持I2S功能,I2S功能是一种音频串行通讯协议,在我们以后讲解MP3播放器的章节中会进行介绍。

24.2.2 STM32的SPI架构剖析

图 245 SPI架构图

1.    通讯引脚

SPI的所有硬件架构都从图 245中左侧MOSI、MISO、SCK及NSS线展开的。STM32芯片有多个SPI外设,它们的SPI通讯信号引出到不同的GPIO引脚上,使用时必须配置到这些指定的引脚,见表 242。关于GPIO引脚的复用功能,可查阅《STM32F4xx规格书》,以它为准。

表 242 STM32F4xx的SPI引脚(整理自《STM32F4xx规格书》)

引脚

SPI编号

SPI1

SPI2

SPI3

SPI4

SPI5

SPI6

MOSI

PA7/PB5

PB15/PC3/PI3

PB5/PC12/PD6

PE6/PE14

PF9/PF11

PG14

MISO

PA6/PB4

PB14/PC2/PI2

PB4/PC11

PE5/PE13

PF8/PH7

PG12

SCK

PA5/PB3

PB10/PB13/PD3

PB3/PC10

PE2/PE12

PF7/PH6

PG13

NSS

PA4/PA15

PB9/PB12/PI0

PA4/PA15

PE4/PE11

PF6/PH5

PG8

其中SPI1、SPI4、SPI5、SPI6是APB2上的设备,最高通信速率达45Mbtis/s,SPI2、SPI3是APB1上的设备,最高通信速率为22.5Mbits/s。除了通讯速率,在其它功能上没有差异。

2.    时钟控制逻辑

SCK线的时钟信号,由波特率发生器根据"控制寄存器CR1"中的BR[0:2]位控制,该位是对fpclk时钟的分频因子,对fpclk的分频结果就是SCK引脚的输出时钟频率,计算方法见表 243。

表 243 BR位对fpclk的分频

BR[0:2]

分频结果(SCK频率)

 

BR[0:2]

分频结果(SCK频率)

000

fpclk/2

 

100

fpclk/32

001

fpclk/4

 

101

fpclk/64

010

fpclk/8

 

110

fpclk/128

011

fpclk/16

 

111

fpclk/256

其中的fpclk频率是指SPI所在的APB总线频率,APB1为fpclk1,APB2为fpckl2。

通过配置"控制寄存器CR"的"CPOL位"及"CPHA"位可以把SPI设置成前面分析的4种SPI模式。

3.    数据控制逻辑

SPI的MOSI及MISO都连接到数据移位寄存器上,数据移位寄存器的内容来源于接收缓冲区及发送缓冲区以及MISO、MOSI线。当向外发送数据的时候,数据移位寄存器以"发送缓冲区"为数据源,把数据一位一位地通过数据线发送出去;当从外部接收数据的时候,数据移位寄存器把数据线采样到的数据一位一位地存储到"接收缓冲区"中。通过写SPI的"数据寄存器DR"把数据填充到发送缓冲区中,通过"数据寄存器DR",可以获取接收缓冲区中的内容。其中数据帧长度可以通过"控制寄存器CR1"的"DFF位"配置成8位及16位模式;配置"LSBFIRST位"可选择MSB先行还是LSB先行。

4.    整体控制逻辑

整体控制逻辑负责协调整个SPI外设,控制逻辑的工作模式根据我们配置的"控制寄存器(CR1/CR2)"的参数而改变,基本的控制参数包括前面提到的SPI模式、波特率、LSB先行、主从模式、单双向模式等等。在外设工作时,控制逻辑会根据外设的工作状态修改"状态寄存器(SR)",我们只要读取状态寄存器相关的寄存器位,就可以了解SPI的工作状态了。除此之外,控制逻辑还根据要求,负责控制产生SPI中断信号、DMA请求及控制NSS信号线。

实际应用中,我们一般不使用STM32 SPI外设的标准NSS信号线,而是更简单地使用普通的GPIO,软件控制它的电平输出,从而产生通讯起始和停止信号。

24.2.3 通讯过程

STM32使用SPI外设通讯时,在通讯的不同阶段它会对"状态寄存器SR"的不同数据位写入参数,我们通过读取这些寄存器标志来了解通讯状态。

图 246中的是"主模式"流程,即STM32作为SPI通讯的主机端时的数据收发过程。

图 246 主发送器通讯过程

主模式收发流程及事件说明如下:

(1)    控制NSS信号线,产生起始信号(图中没有画出);

(2)    把要发送的数据写入到"数据寄存器DR"中,该数据会被存储到发送缓冲区;

(3)    通讯开始,SCK时钟开始运行。MOSI把发送缓冲区中的数据一位一位地传输出去;MISO则把数据一位一位地存储进接收缓冲区中;

(4)    当发送完一帧数据的时候,"状态寄存器SR"中的"TXE标志位"会被置1,表示传输完一帧,发送缓冲区已空;类似地,当接收完一帧数据的时候,"RXNE标志位"会被置1,表示传输完一帧,接收缓冲区非空;

(5)    等待到"TXE标志位"为1时,若还要继续发送数据,则再次往"数据寄存器DR"写入数据即可;等待到"RXNE标志位"为1时,通过读取"数据寄存器DR"可以获取接收缓冲区中的内容。

假如我们使能了TXE或RXNE中断,TXE或RXNE置1时会产生SPI中断信号,进入同一个中断服务函数,到SPI中断服务程序后,可通过检查寄存器位来了解是哪一个事件,再分别进行处理。也可以使用DMA方式来收发"数据寄存器DR"中的数据。

24.3 SPI初始化结构体详解

跟其它外设一样,STM32标准库提供了SPI初始化结构体及初始化函数来配置SPI外设。初始化结构体及函数定义在库文件"stm32f4xx_spi.h"及"stm32f4xx_spi.c"中,编程时我们可以结合

【STM32学习】——SPI通信协议&SPI时序&W25Q64存储芯片&软件SPI读写 声明:学习笔记来自江科大自化协B站教程,仅供学习交流!!对于SPI通信的学习和I2C一样,分为软件模拟实现和硬件配置实现读写W25Q64 Flash存储器!SPI传输数据的速度更快,协议没有严格规定最大传输速度,取决于芯片厂商需求;SPI的设计比较简单粗暴,实现的功能没有I2C多,比较简单;SPI硬件开销比较大,通信线的个数较多,且通信过程经常有资源浪费的现象——“富家子弟,有钱任性”,只在乎任务快速完成! 阅读详情

相关推荐

2021秋-北邮计算机导论期末考试(BUPT)

2021秋-北邮计算机导论期末考试(BUPT) 难度较低适合新手练习

weixin_73985779的博客 1498

构建自己的哨兵数据集(以sentinel-1为例,使用SNAP软件)

通过欧洲航天官网获取哨兵数据的产品,通过SNAP软件进一步得到SAR图像(以导出图片为例)

xiaoxTai的博客 6182

Materials studio中的简单聚合物的建立及盒子的弛豫

涉及模块 Amorphous Cell-construction Forcite-caculation Build Polymers-Homopolymer

快乐学术猿 3万+

铭飞MCMS源码部署

文章目录前言一、下载铭飞源码二、部署源码1.使用IDEA打开源码2.配置tomcat环境2.1下载tomcat并测试是否可以成功启动(此处不赘述)2.2在IDEA中安装tomcat环境并配置3.添加数据库,并配置3.1新建数据库3.2 导入sql配置三、启动测试 前言 铭飞MCMS基于IDEA、tomcat和mysql的环境搭建。 提示:以下是本篇文章正文内容,下面案例可供参考 一、下载铭飞源码 gitee:https://gitee.com/mingSoft/MCMS/releases(各种版本按需下

MARS_ZORO的博客 4064

华为手机连接Win11失败?内核隔离与驱动签名冲突的终极解决指南

在Windows操作系统中,驱动程序是硬件与系统通信的桥梁,其数字签名机制是保障系统内核安全的核心防线。基于虚拟化的安全技术通过强制验证驱动签名,能有效隔离恶意代码,提升系统抵御高级威胁的能力。然而,严格的签名策略有时会与部分硬件驱动产生兼容性问题,导致设备无法识别,直接影响文件传输、应用调试等核心工作流。本文聚焦于华为手机在开启Windows 11内核隔离功能时出现的连接故障,深入剖析驱动签名验证与Hypervisor保护的代码完整性原理,并提供从驱动更新、策略调整到无线替代方案的完整解决路径,帮助用户在

weixin_31309419的博客 352

RV1126B芯片实战:如何用这款视觉处理器SoC打造你的第一个AI摄像头项目

本文详细介绍了如何利用瑞芯微RV1126B视觉处理器SoC从零构建AI摄像头项目。涵盖硬件选型、开发环境搭建、ISP配置、AI模型部署及系统集成等关键步骤,帮助开发者高效实现边缘计算方案,特别适合智能安防和工业检测应用。

dropout6artist的博客 931

【深度学习】最强算法之:残差网络(ResNet)

一篇掌握深度学习算法之:残差网络

商务合作 | 面试培训 | 职场规划 ==>主页扫码 7837

GEE:随机森林分类教程(样本制作、特征添加、训练、精度、参数优化、贡献度、统计面积)

本文将介绍在Google Earth Engine (GEE)平台上进行随机森林分类的方法和代码,其中包括制作样本点教程(本地、在线和本地在线混合制作样本点,合并样本点等),加入特征变量,运行随机森林分类器教程,计算随机森林分类结果的精度,优化随机森林分类算法的参数,打印各个变量特征的贡献度等步骤的方法和代码。本教程可以应用于多种分类场景,包括土地利用分类、种植区提取(大蒜、小麦、玉米等)、局部气候区分类、植被分类等多种场景。

养乐多的博客 1万+

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

上一篇: 第23章 I2C—读写EEPROM—零死角玩转STM32-F429系列
下一篇: 第25章 串行FLASH文件系统FatFs—零死角玩转STM32-F429系列
0木木0
博客等级 码龄17年 458粉丝 58原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值