1
摘要
本篇应用笔记主要介绍 HC32F460 系列的四线式串行外设接口(QSPI)模块,并简要说明通过QSPI 四线式输入输出快速读模式如何与外部 Flash 通信。
2
QSPI 简介
HC32F460 系列的四线式串行外设接口(QSPI)是一个存储器控制模块,主要用于和带 SPI 兼容接口的串行 ROM 进行通信,其对象主要包括有串行闪存、串行 EEPROM 以及串行FeRAM。
2.1
主要特性
支持扩展 SPI,二线式 SPI 和四线式 SPI 等多种协议
地址线宽度可选择 8 位/16 位/24 位/32 位
可通过时序调整以支持各种串行闪存
支持多种读取方式
-
标准读/快速读
-
二线式输出快速读取/二线式输入输出快速读取
-
四线式输出快速读取/四线式输入输出快速读取
数量可调的虚拟周期
16 字节的预读取功能
总线周期延长功能
XIP 控制功能
灵活而广泛的支持大量串行闪存软件控制指令,包括擦、写、ID读取及掉电控制等。
2.2 内存映射
串行闪存及相关的控制寄存器在 AHB 总线空间的位置由总体的地址范围配置来决定,QSPI 空间被区分为 2 段空间,包括 QSPI I/O 寄存器空间 64MB 和外部 QSPI 设备空间 64MB。每当对 QSPI 的 ROM 空间进行读访问时,QSPI 总线自动开始工作,将从串行闪存内读到的数据传送过来,QSPI 可以通过自动将 MCU 的外部 ROM 读取总线周期转换为 QSPI 总线周期来对串行闪存进行读取。
3
HC32F460 系列的 QSPI
3.1
帧格式
HC32F460 系列的四线式串行外设接口(QSPI)支持扩展式 SPI,二线式 SPI 和四线式 SPI 三种协议。初始的默认协议是扩展式 SPI 协议,可通过设置 QSCR 寄存器中的 IPRSL[1:0]/ APRSL[1:0]/DPRSL[1:0]位来分别配置指令发送阶段、地址发送阶段、数据接收阶段的协议。通过 QSCR 寄存器中的 MDSEL 可以配置 QSPI 的读取模式,一般配置为推荐的模式即可正常通信,如配置为自定义的模式,则 QSCR 寄存器中的 IPRSL[1:0]/ APRSL[1:0]/DPRSL[1:0]位必须配置为同一种协议才能保证 QSPI 正常工作。且直接通信模式不支持多线式动作。
3.1.1 指令
当一个串行总线周期开始的时候,串行闪存选择信号被置为有效状态,QSPI 开始输出指令代码,指令代码为一个 8-bits 的数据,可以发送任何有效的指令值,指令代码需要在串行总线周期开始之前配置好,通过 QSCCMD 寄存器进行配置。
3.1.2 地址
在这个阶段,一个地址被发送到闪存。QSPI 拥有 32 位地址总线宽度来配合串行闪存,可以通过设置 QSFCR 寄存器内的 AWSL[1:0]来选择使用 8 位/16 位/24 位/32 为地址总线宽度。如果选择 8 位/16 位/24 位的地址总线宽度,那么只有地址与之匹配的低位空间可以被正常访问,访问QSPI 中高位的串行闪存镜像空间将会反复出现低位空间的内容。
3.1.3 虚拟周期
在快速读指令的情况下,需要在发送地址之后加入一定数量的虚拟周期,其具体数量由QSFCR 寄存器中的 DMCYCN[3:0]决定。虚拟周期最初的两个周期用于决定是否选择 XIP 模式。
3.1.4 数据
在这个阶段,数据发送到 QSPI 闪存或者从 QSPI 闪存接收数据,直接通信模式下一个完整的QSPI 总线周期从对寄存器 QSDCOM 的 DCOM[7:0]首次操作开始直到对 QSCR 寄存器的进行一次写操作后结束。对 DCOM[7:0]的写会转换为一次 QSPI 总线的单字节的数据传送,而对DCOM[7:0]的读则会转换成一次 QSPI 总线的单字节的数据接收。
3.2 通信协议
HC32F460 系列的四线式串行外设接口(QSPI)支持灵活的配置目标地址及虚拟周期数,其中目标地址的宽度通过 QSFCR 寄存器中的 AWSL[1:0]位来设置,虚拟周期通过 QSFCR 寄存器中的 DMCYCN[3:0]位来设置。
3.2.1 扩展式 SPI 协议
扩展式 SPI 协议只用 QSIO0 管脚单线进行指令输出,之后的地址及数据则根据具体的读取模式指令使用单线式/二线式/四线式输出。若配置为单线式及二线式输出则 QSIO2 为输出状态,输出电平由 QSFCR 寄存器的 WPOL 位 决定,初始输出为低电平,QSIO3 也为输出状态,输出高电平。QSIO2 管脚也可用作串行闪存的 WP 功能,QSIO3 管脚也可用作串行闪存 HOLD 或 RESET 功能。
3.2.2 二线式 SPI 协议
二线式 SPI 协议使用 QSIO0,QSIO1 两个管脚实行相应的操作,包括发出指令,地址,接收数据等。此时 QSIO2 为输出状态,输出电平由 QSFCR 寄存器的 WPOL 位决定,初始输出为低电平,QSIO3 也为输出状态,输出高电平。QSIO2 管脚也可用作串行闪存的 WP 功能, QSIO3 管脚也可用作串行闪存 HOLD 或 RESET 功能。
3.2.3 四线式 SPI 协议
四线式 SPI 协议使用 QSIO0,QSIO1,QSIO2,QSIO3 四个管脚实行发出指令,地址,接收数据等所有相关操作。
3.3 总线模式
3.3.1 ROM 访问模式
串行闪存及相关的控制寄存器在 AHB 总线空间的位置由总体的地址范围配置来决定,QSPI 可以通过自动将 MCU 的外部 ROM 读取总线周期转换为 QSPI 总线周期来对串行闪存进行读取。此模式下配置好相关参数,读取闪存和读取内置 Flash 一样,不需要操作寄存器,对 QSPI连接的闪存的映射地址进行直接访问即可。
对于 ROM 的单一读取指令会独立的从芯片内部总线周期一对一的转换为 QSPI 总线周期。当一个 ROM 的读取总线周期被检测到时,QSSN 信号会置为有效状态,从而启动一个 QSPI 总线周期。当接收完串行闪存的数据后,QSSN 信号变成无效状态,该 QSPI 总线周期宣告完成。
3.3.2 直接通信模式
串行闪存还有很多不同的追加功能,诸如 ID 信息读取,擦除,写入及状态信息读取等。针对这种情况,QSPI 提供了直接通信模式,用户可通过软件直接对串行闪存进行控制,由此模式软件可以产生任意所需的 QSPI 总线周期。将 QSCR 寄存器的DCOME 位设成 1 可以进入直接通信模式,一旦进入直接通信模式,将无法进行通常的闪存读取操作,如果要进行常规的闪存读取,需要将 DCOME 位清零退出直接通信模式。直接通信模式下一个完整的 QSPI 总线周期从对寄存器 QSDCOM 的 DCOM[7:0]首次操作开始直到对 QSCR 寄存器的进行一次写操作后结束,这期间 QSSN 信号始终保持低电平的有效状态。
在直接通信模式下是无法对 QSCR 和 QSDCOM 以外的寄存器进行写操作的,对其他寄存器的写操作将会退出直接通信模式。
3.4 特殊功能
3.4.1 闪存预读取功能
对于诸如 CPU 指令或是数据块的传输,系统通常是以一个顺次递增的闪存地址顺序进行数据的读取,串行闪存具有连续数据传输能力而不需要再次发送指令代码和地址。QSPI 提供了预读取功能来进行连续的数据接收,通过设置 QSCR 寄存器中的 PFE 位为 1 激活预读取功能,当该功能有效后,数据会被连续接收并储存到缓冲区而不需要等待另一个闪存读取要求,预读取的缓冲区可存储 16 个字节的数据,除此以外,还有 2 个字节的数据接收缓冲区也可以存储预读取的数据,当所有的缓冲区数据取满后,QSPI 总线周期结束。
在预读取状态寄存器 QSSR 中,PFAN 位显示了当前的预读取工作状态,PFFUL 位表示预读取数据缓冲区已经放满,而 PFNUM[4:0]则显示了目前已经读取到缓冲区的数据的字节数。
3.4.2 XIP 模式
一些串行闪存器件可以通过省略接收读取指令来降低延迟时间,该机能可通过虚拟周期期间发送的模式代在快速度指令时的虚拟周期期间,QSPI 在最初的两个周期通过发送 XIP 模式代码来控制串行闪存的 XIP 模式,可通过寄存器 QSXCMD 的XIPMC[7:0]位进行针对性设置。启动串行闪存的 XIP 模式需要在 QSXCMD[7:0]中设置相应的模式代码,控制部分的 XIP 模式只需要将 XIPE 位置成 1 就可以,而与 QSXCMD[7:0]的值无关。退出串行闪存的 XIP 模式需要在 QSXCMD[7:0]中设置相应的退出模式代码,控制部分的 XIP 模式只需要将 XIPE 位清零就可以,而与 QSXCMD[7:0]的值无关。
3.5
注意事项
3.5.1 寄存器的设置顺序
在使用中可以动态的对 QSPI 控制寄存器进行设置或更改,但是不注意寄存器的设置顺序可能 会导致 QSPI 总线周期在寄存器还没有完全设置完成时就开始,因此请仔细配置寄存器的设置顺序以避免这类情况的发生。
3.5.2 模块停止信号的设置
QSPI 在系统复位后处于模块停止状态,只有在将模块停止控制寄存器中的 QSPI 模块停止信号清零号才可以对寄存器进行设置。
4
样例代码
4.1
代码介绍
用户可以根据上述的工作流程编写自己的代码来学习验证该模块,也可以直接通过华大半导体的网站下载到 HC32F460 系列 MCU 的设备驱动库(Device Driver Library,DDL)来体验 QSPI 与外部 Flash 通信的优势。
4.2 工作流程
样例代码中 QSPI 操作流程如下图所示:
4.3 代码运行
用户可以通过华大半导体的网站下载到 DDL 的样例代码(qspi_four_wire_io_fast_read、qspi_two_wire_io_fast_read、qspi_standard_read、qspi_fast_read),并配合评估用板(比如‘EVHC32F460-LQFP100-050-V1.1’)运行相关代码学习使用 QSPI 模块。
5
总结
以上章节简要介绍 HC32F460 系列的 QSPI 寄存器、功能模式、注意事项。演示了如何操作QSPI 读写 Flash 样例代码,在开发中用户可以根据自己的实际需要使用 QSPI 模块。