打印
[其他ST产品]

STM32的QSPI通信(学习笔记)

[复制链接]
1451|69
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
kqh11a|  楼主 | 2023-7-30 15:36 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
一、SPI Flash与QSPI FLASH
1、首先说说FLASH,不管是QSPI Flash还是SPI Flash说的实际上是一种闪存芯片,比如最常见的W25Q128(下图),真正不同的是SPI协议与QSPI协议罢了。可以看到下图的芯片,2、3、5、7这四个引脚是可以复用的,根据不同的通信协议变换功能。

W25Q128 是华邦公司推出的大容量 SPI FLASH 产品,W25Q128 的容量为 128Mb,该系列还有 W25Q80/16/32/64 等。

W25Q128 将 16M 的容量分为 256 个块(Block),每个块大小为 64K 字节,每个块又分为16 个扇区(Sector),每个扇区 4K 个字节。W25Q128 的最小擦除单位为一个扇区,也就是每次必须擦除 4K 个字节。这样我们需要给 W25Q128 开辟一个至少 4K 的缓存区,这样对 SRAM 要求比较高,要求芯片必须有 4K 以上 SRAM 才能很好的操作(SRAM:静态随机存取存储器(Static Random-Access Memory,SRAM)是随机存取存储器的一种。所谓的“静态”,是指这种存储器只要保持通电,里面储存的数据就可以恒常保持。)。

W25Q128 的擦写周期多达 10W 次,具有 20 年的数据保存期限,支持电压为2.7~ 3.6V,W25Q128 支持标准的 SPI,还支持双输出/四输出的 SPI,最大 SPI 时钟可以到 80Mhz(双输出时相当于 160Mhz,四输出时相当于 320M)。



使用特权

评论回复
沙发
kqh11a|  楼主 | 2023-7-30 15:38 | 只看该作者
SPI与FLASH的通信方式:

SPI 是英语Serial Peripheral interface的缩写,顾名思义就是串行外围设备接口。是Motorola(摩托罗拉)首先在其MC68HCXX系列处理器上定义的。

SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,主要应用在 EEPROM,FLASH,实时时钟,AD转换器,还有数字信号处理器和数字信号解码器之间。

如下图所示,标椎的SPI接口一般使用四条信号线通信:

SDI(数据输入),SDO(数据输出),SCK(时钟),CS(片选)

MISO: 主设备输入/从设备输出引脚。该引脚在从模式下发送数据,在主模式下接收数据。

MOSI: 主设备输出/从设备输入引脚。该引脚在主模式下发送数据,在从模式下接收数据。

SCLK:串行时钟信号,由主设备产生。

CS/SS:从设备片选信号,由主设备控制。它的功能是用来作为“片选引脚”,也就是选择指定的从设备,让主设备可以单独地与特定从设备通讯,避免数据线上的冲突。

使用特权

评论回复
板凳
kqh11a|  楼主 | 2023-7-30 15:39 | 只看该作者
QSPI与FLASH的通信方式:

所谓QSPI是Queued SPI的简写,是Motorola公司推出的SPI接口的扩展,比SPI应用更加广泛。在SPI协议的基础上,Motorola公司对其功能进行了增强,增加了队列传输机制,推出了队列串行外围接口协议(即QSPI协议)。QSPI 是一种专用的通信接口,连接单、双或四(条数据线)SPI Flash 存储介质。

该接口可以在以下三种模式下工作:

① 间接模式:使用 QSPI 寄存器执行全部操作

② 状态轮询模式:周期性读取外部 Flash 状态寄存器,而且标志位置 1 时会产生中断(如擦除或烧写完成,会产生中断)

③ 内存映射模式:外部 Flash 映射到微控制器地址空间,从而系统将其视作内部存储器

采用双闪存模式时,将同时访问两个 Quad-SPI Flash,吞吐量和容量均可提高二倍。

使用特权

评论回复
地板
kqh11a|  楼主 | 2023-7-30 15:39 | 只看该作者

使用特权

评论回复
5
kqh11a|  楼主 | 2023-7-30 15:39 | 只看该作者
二、QSPI协议功能框图

QSPI 使用 6 个信号连接Flash,分别是四个数据线BK1_IO0~BK1_IO3,一个时钟输出CLK,一个片选输出(低电平有效)BK1_nCS,它们的作用介绍如下:

(1) BK1_nCS:片选输出(低电平有效),适用于 FLASH 1。如果 QSPI 始终在双闪存模式下工作,则其也可用于 FLASH 2从设备选择信号线。QSPI通讯以BK1_nCS线置低电平为开始信号,以BK1_nCS线被拉高作为结束信号。

(2) CLK:时钟输出,适用于两个存储器,用于通讯数据同步。它由通讯主机产生,决定了通讯的速率,不同的设备支持的最高时钟频率不一样,如STM32的QSPI时钟频率最大为fpclk/2,两个设备之间通讯时,通讯速率受限于低速设备。

(3) BK1_IO0:在双线 / 四线模式中为双向 IO,单线模式中为串行输出。

(4) BK1_IO1:在双线 / 四线模式中为双向 IO,单线模式中为串行输入。

(5) BK1_IO2:在四线模式中为双向 IO。

(6) BK1_IO3:在四线模式中为双向 IO。

使用特权

评论回复
6
kqh11a|  楼主 | 2023-7-30 15:39 | 只看该作者
二、QSPI初始化结构体详解
跟其它外设一样,STM32 HAL库提供了QSPI初始化结构体及初始化函数来配置SPI外设。初始化结构体及函数定义在库文件“stm32f7xx_hal_spi.h”及“stm32f7xx_hal _spi.c”中,编程时我们可以结合这两个文件内的注释使用或参考库帮助文档。了解初始化结构体后我们就能对SPI外设运用自如了,见代码清单 241。

使用特权

评论回复
7
kqh11a|  楼主 | 2023-7-30 15:40 | 只看该作者
a、 QSPI_InitTypeDef初始化结构体
1 typedef struct {
2     uint32_t ClockPrescaler;     //预分频因子
3     uint32_t FifoThreshold;      //FIFO中的阈值
4     uint32_t SampleShifting;     //采样移位
5     uint32_t FlashSize;          //Flash大小
6     uint32_t ChipSelectHighTime; //片选高电平时间
7     uint32_t ClockMode;          //时钟模式
8     uint32_t FlashID;            //Flash ID
9     uint32_t DualFlash;          //双闪存模式
10 } QSPI_InitTypeDef;

使用特权

评论回复
8
kqh11a|  楼主 | 2023-7-30 15:40 | 只看该作者
这些结构体成员说明如下,其中括号内的文字是对应参数在STM32 HAL库中定义的宏:

(1) ClockPrescaler

本成员设置预分频因子,对应寄存器QUADSPI_CR [31:24]即PRESCALER[7:0],取值范围是0—255,可以实现1—256级别的分频。仅可在 BUSY = 0 时修改该字段。

使用特权

评论回复
9
kqh11a|  楼主 | 2023-7-30 15:40 | 只看该作者
(2) FifoThreshold

本成员设置FIFO 阈值级别,对应寄存器QUADSPI_CR [12:8]即FTHRES[4:0],定义在间接模式下 FIFO 中将导致 FIFO 阈值标志(FTF,QUADSPI_SR[2])置 1 的字节数阈值。

使用特权

评论回复
10
kqh11a|  楼主 | 2023-7-30 15:40 | 只看该作者
(3) SampleShifting

本成员设置采样,对应寄存器QUADSPI_CR [4],默认情况下,QUADSPI 在 Flash 驱动数据后过半个 CLK 周期开始采集数据。使用该位,可考虑外部信号延迟,推迟数据采集。可以取值0:不发生移位;1:移位半个周期。在 DDR 模式下 (DDRM = 1),固件必须确保 SSHIFT = 0。

使用特权

评论回复
11
kqh11a|  楼主 | 2023-7-30 15:40 | 只看该作者
(4) FlashSize

本成员设置FLASH大小,对应寄存器QUADSPI_CCR [20:16]的FSIZE[4:0]位。定义外部存储器的大小,简介模式Flash容量最高可达4GB(32位寻址),但是在内存映射模式下限制为256MB,如果是双闪存则可以达到512MB。

使用特权

评论回复
12
kqh11a|  楼主 | 2023-7-30 15:41 | 只看该作者
(5) ChipSelectHighTime

本成员设置片选高电平时间,对应寄存器QUADSPI_CR [10:8]的CSHT[2:0]位,定义片选 (nCS) 在发送至 Flash 的命令之间必须保持高电平的最少 CLK 周期数。可以取值1~8个周期。

使用特权

评论回复
13
kqh11a|  楼主 | 2023-7-30 15:41 | 只看该作者
(6) ClockMode

本成员设置时钟模式,对应寄存器QUADSPI_CR [0]位,指示CLK在命令之间的电平,可以选模式0,1: nCS 为高电平(片选释放)时,CLK 必须保持低电平;或者模式3 ,1:nCS 为高电平(片选释放)时,CLK 必须保持高电平。

使用特权

评论回复
14
kqh11a|  楼主 | 2023-7-30 15:41 | 只看该作者
(7) FlashID

本成员用于选择Flash1或者Flash2,单闪存模式下选择需要访问的flash。

使用特权

评论回复
15
kqh11a|  楼主 | 2023-7-30 15:41 | 只看该作者
(8) DualFlash

本成员用于激活双闪存模式,0:禁止双闪存模式;1:使能双闪存模式。双闪存模式可以使系统吞吐量和容量扩大一倍。

使用特权

评论回复
16
kqh11a|  楼主 | 2023-7-30 15:41 | 只看该作者
(8) DualFlash

本成员用于激活双闪存模式,0:禁止双闪存模式;1:使能双闪存模式。双闪存模式可以使系统吞吐量和容量扩大一倍。

使用特权

评论回复
17
kqh11a|  楼主 | 2023-7-30 15:41 | 只看该作者
b、QSPI_CommandTypeDe通信配置命令结构体

1 typedef struct {
2     uint32_t Instruction;        //指令
3     uint32_t Address;            //地址
4     uint32_t AlternateBytes;     //交替字节
5     uint32_t AddressSize;        //地址长度
6     uint32_t AlternateBytesSize; //交替字节长度
7     uint32_t DummyCycles;        //空指令周期
8     uint32_t InstructionMode;    //指令模式
9     uint32_t AddressMode;        //地址模式
10     uint32_t AlternateByteMode;  //交替字节模式
11     uint32_t DataMode;           //数据模式
12     uint32_t NbData;             //数据长度
13     uint32_t DdrMode;            //双倍数据速率模式
14     uint32_t DdrHoldHalfCycle;   //DDR保持周期
15     uint32_t SIOOMode;           //仅发送指令一次模式
16 } QSPI_CommandTypeDef;

使用特权

评论回复
18
kqh11a|  楼主 | 2023-7-30 15:41 | 只看该作者
这些结构体成员说明如下,其中括号内的文字是对应参数在STM32 HAL库中定义的宏:

(1) Instruction

本成员设置通信指令,指定要发送到外部 SPI 设备的指令。仅可在 BUSY = 0 时修改该字段。

使用特权

评论回复
19
kqh11a|  楼主 | 2023-7-30 15:42 | 只看该作者
(2) Address

本成员指定要发送到外部 Flash 的地址,BUSY = 0 或 FMODE = 11(内存映射模式)时,将忽略写入该字段。在双闪存模式下,由于地址始终为偶地址,ADDRESS[0] 自动保持为“0”。

使用特权

评论回复
20
kqh11a|  楼主 | 2023-7-30 15:42 | 只看该作者
(3) AlternateBytes

本成员指定要在地址后立即发送到外部 SPI 设备的可选数据,仅可在 BUSY = 0 时修改该字段。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

24

主题

499

帖子

0

粉丝