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

2019-09-19来源: eefocus关键字:SPI  读写串行FLASH  STM32-F429系列

本章参考资料:《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的四种模式

image.png

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规格书》)

image.png

其中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的分频

image.png

其中的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)",我们只要读取状态寄存

[1] [2] [3] [4] [5]
关键字:SPI  读写串行FLASH  STM32-F429系列 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic474965.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:第7章 使用寄存器点亮LED灯—零死角玩转STM32-F429系列
下一篇:第22章 常用存储器介绍—零死角玩转STM32-F429系列

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

​Marvell车载以太网交换机软件已获得SPICE 2级车载认证
Marvell(NASDAQ:MRVL)近日宣布,其车载以太网交换机软件已获得SPICE 2级车载认证。该认证表明了Marvell对提供世界级车载软件开发能力及流程的承诺。具体来说,ASPICE 2级认证可为汽车制造商提供足够信心,使其能够在重要应用领域使用Marvell软件,包括高级驾驶辅助系统(ADAS)、L3/L4自动驾驶系统(AD)以及安全中央网关。 车载SPICE(软件流程改进与能力认定)由汽车特别兴趣小组(SIG)内的多个特别兴趣小组联合开发。该小组包括汽车OEM厂商、采购论坛和SPICE用户群等,旨在解决汽车行业的软件开发需求。为获得此认证,Marvell在过去的三年中经过了严格的认证流程,并提高了软件开发
发表于 2019-09-30
提供高质量车载软件 Marvell获得战略性ASPICE 2级车载认证
通过安全可靠的下一代以太网解决方案,为任务关键应用提供高质量车载软件 Marvell近日宣布,其车载以太网交换机软件已获得SPICEÒ 2级车载认证。该认证表明了Marvell对提供世界级车载软件开发能力及流程的承诺。具体来说,ASPICE 2级认证可为汽车制造商提供足够信心,使其能够在重要应用领域使用Marvell软件,包括高级驾驶辅助系统(ADAS)、L3/L4自动驾驶系统(AD)以及安全中央网关。 车载SPICE(软件流程改进与能力认定)由汽车特别兴趣小组(SIG)内的多个特别兴趣小组联合开发。该小组包括汽车OEM厂商、采购论坛和SPICE用户群等,旨在解决汽车行业的软件开发需求。为获得此认证
发表于 2019-09-29
STM32学习之旅⑤ SPI控制TFT,从底层到顶层的设计
一、认识其本质(一)认识SPISPI是串行外设接口(Serial Peripheral Interface)的缩写,SPI 总线是Motorola公司推出的同步串行接口技术,(关于同步还是异步,主要看通信双方的时钟线是否连在一起)。SPI由四根线完成数据传输,分别是SCK(时钟)、MOSI(主出从入)、MISO(主入从出)和SSEL(片选)。通讯时序图如下(当然很多SPI器件的数据手册都会给出响应的时序图):SPI主要特点有:可以同时发出和接收串行数据,是一种全双工的通信;可以当作主机或从机工作提供频率可编程时钟发送结束中断标志写冲突保护总线竞争保护等结构简单传输速度快,通常可以达到几兆到几十兆每秒,常用于数据量比较大的传输。主要
发表于 2019-09-27
STM32学习之旅⑤ SPI控制TFT,从底层到顶层的设计
RT-Thread 当中spi和SFUD的移植问题解决方案
系统的方便性,让我开始了rtt的学习。但是在添加spi来读取外部FLASH的时候,遇到了一些情况。例如,找不到设备,或者说无法读取FLASH的ID。下面通过介绍一套完整的流程来帮助大家熟悉。首先。cube mx。配置spi 2为打开然后在menuconfig当中实现对驱动的定义和添加。最后在里面添加,关于spi的驱动和sfud。然后生成工程。最后添加代码测试:https://www.rt-thread.org/document/site/programming-manual/device/spi/spi/可以得到结果。 
发表于 2019-09-27
RT-Thread 当中spi和SFUD的移植问题解决方案
技术文章—通过SPICE仿真进行简单RLC电路的时域分析
如果您不是那种喜欢解微分方程的人,或者您只是喜欢写代码,那么,当您使用SPICE模拟器时,便会对时域中RLC网络的行为有所了解。您也可以通过多频率迭代,或者直接在频域中分析这种行为。我们先了解下基本的RLC网络,以及如何在SPICE软件包软件包中重现这些电路的行为。简单RLC电路的时域分析RLC电路是一种电阻、电容和电感组成的电路结构,通常称为RLC电路。由于电容和电阻具有一些频率相关的电抗,当用交流信号驱动时,该系统的行为将产生一些有趣的效果。当涉及谐波信号、脉冲或啁啾信号时,电压源对于电压调节至关重要。在频域中,我们可以清楚地了解到电压/电流源频率对RLC电路输出和RLC网络中不同部分电流的影响。频域的结果可以通过傅里叶逆变换
发表于 2019-09-20
技术文章—通过SPICE仿真进行简单RLC电路的时域分析
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved