你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【实战经验】利用QuadSPI外扩串行NOR Flash的实现

[复制链接]
zero99 发布时间:2017-9-28 15:51
利用 QuadSPI外扩 串行 NOR Flash的实现

$ T( @; b8 q# T前言
* }6 M9 Z0 p4 J! T# E+ cSTM32提供了灵活多样的外扩存储器访问实现。本文中,介绍如何利用QSPI (QuadSPI) 外扩串行NOR Flash存储器。首先对QSPI接口功能特性进行介绍,然后分别介绍硬件设计和软件开发。并基于STM32CubeMX,提供访问MICRON N25Q128A13EF840F的实现参考。1 Z' [) l& M1 [9 _/ ]5 M# J# ^0 X3 e

8 m( z& F+ W) J一 实现环境' N/ }" x7 k9 Q( _6 [
    开发板:STM32F469G-DISCO/ w$ P5 p6 H' E- K
    开发库:STM32CubeF4 v1.16.0
, W, w. T% b6 N7 X- b& U! j    STM32CubeMX: v4.22.0
! ?; J+ a) x/ ^: f    集成开发环境:IAR v7.70.1.11486
4 ]0 O! @2 A, a0 x6 h8 I$ u6 e* J  g' M) f) v+ T9 H+ Z1 g, n
    实现过程在STM32F469I-DISCO板上展开,利用板上已有的串行NOR Flash存储器(MICRON N25Q128A13EF840F)。呈现整个开发涉及环节。在本文中,首先根据QSPI接口,介绍QSPI与外扩串行存储器硬件连接。另外,Cube软件包中包含QSPI实现例,在本文对库中实现的QSPI例不做讨论,读者也可参考这些QSPI例进行设计。本文围绕由STM32CubeMX生成的工程,介绍如何实现对外扩串行NOR Flash存储器的访问。
5 s) B2 {6 a! A& k$ F& z. T: |1 _( Z: {  ^; Q6 g6 L2 l5 L
二 QSPI介绍0 `9 W: L' ^9 W; v( @
    在呈现QSPI访问外扩Flash的实现例前, 需要对QSPI有一定的了解,在此对QSPI进行简短的介绍。更多内容请参考AN4760。
" W( l  P; S8 u4 N    QSPI(Quad-SPI)支持四线串行访问形式。同时,QSPI支持传统SPI和Dual-SPI模式,Dual-SPI模式支持两线串行访问。与FMC/FSMC比较,QSPI支持更低成本、更小封装外部串行Flash存储器,更少的IO引脚占用,有效减少PCB面积,降低PCB设计复杂度。1 R/ f5 g6 z; V0 L" y
    QSPI在不同系列STM32产品线的支持情况(仅部分罗列,未涵盖所有支持型号)。

( I+ p; M, B' w$ q9 C 11.jpg # Z# Y" ^" M2 H& [* s
        
$ |( n# s! Y  {! X: N; \    QSPI接口提供了灵活可配置的5个阶段,如下图所示(仅用于理解阶段构成,时序图根据配置不同存在差异)。分别是命令阶段、地址阶段、复用字节阶段、Dummy阶段和数据阶段。可以根据外扩Flash中命令时序对不同阶段进行配置。后续会以实例进行呈现。更多内容请参考AN4760。) V" O# C' ?4 ?7 Z# w& x
12.jpg 5 f% Z  L7 g" u- P
    QSPI支持三种模式,分别是:3 {  v( h" z& H
    间接模式---所有操作通过QSPI寄存器实现,类似于传统SPI,可以使用阻塞模式、中断模式或者DMA模式进行读写等访问。本文中提供的实现例为间接模式下的实现。6 k$ j5 W3 a' Q
    状态轮询模式---接口自动轮询指定寄存器,直到回读寄存器内容与指定条件匹配。可应用于状态检测,从而实现忙等待等效果。本文不对此模式进行实现介绍,应用实现可参考Cube软件包中QSPI例程。
4 x7 l+ T- [( Q    存储器映射模式---外扩Flash被视为内部存储器,支持AHB主器件直接访问,CPU能够直接运行位于QSPI存储器的执行代码。内部系统架构如下图所示(以STM32F469/F479为例)。本文不对此模式进行实现介绍,应用实现可参考Cube软件包中QSPI例程QSPI_ExecuteInPlace。
: G1 _0 U8 m& J5 t; |
13.jpg : B2 Y3 _1 h" B' h7 O# E' H
1 i: k% T5 |; F9 r' c7 u! \) j
三 QSPI外扩串行Flash实现例0 k7 A7 G1 i- A2 e; y$ ~

. b! v5 f6 s) H" t. Y1 r2 l: C( j* p2 t# S: e. g% J: H/ [
3.1 串行Flash介绍
0 ~: n3 Q4 D) i& b4 l3 @    以MICRON N25Q128A13EF840F为例,更多细节请参考存储器手册。N25Q128A13EF840F引脚图、时序图和电气参数来源于N25Q128A13 手册文档。1 U+ t0 P# o) c3 o3 V& {; N6 n
    支持协议: SPI, Dual I/O(对应Dual-SPI), Quad I/O(对应Quad-SPI)
7 j+ r2 S! v2 Z& _% Z# ~' V1 U    支持访问模式: 单线访问、双线访问、四线访问,得益于 QSPI接口的灵活可配性,三种访问模式全部支持。" @, |& I7 t3 b; b& G3 `4 L
    供电电压范围: 2.7 ~ 3.6V) H; R, O% F0 i/ E
    最大时钟频率: 108MHz
4 q! }7 d. h6 p8 y4 g    存储空间: 128Mb (16MB)6 [8 k1 c: s/ Z: I: }6 M1 k
    器件引脚示意图如下所示。由两根电源引脚和六根QSPI信号线构成。
$ p  ]+ M7 C) j0 x1 j3 U! _
14.jpg
: Z0 H, Z) j% x# H    下表为存储器N25Q128A13xxx命令(未列出全部命令)。通过下表可知,存储器提供了灵活的访问实现形式,而结合同样灵活可配的QSPI接口,能够实现存储器命令全支持。而本文仅为提供设计思路,呈现了部分命令在QSPI上的实现。" J' i' @+ L3 O  C% L- y
15.jpg
! b8 ~% E. x; p: P+ _    其中,默认读写默认3字节地址,四线快速读命令默认Dummy 周期数为8。
5 v6 q; U: B, u9 \" e7 H& s$ D+ P, R. ~- C# Z1 m1 ^
3.2 硬件设计
2 v: N/ |  Q8 m    涉及到的信号线少,硬件设计简单,只需直接将QSPI的六根信号线与存储器连接即可。考虑到可测性,可以增加串行电阻或者测试点。硬件电路图如下所示。$ V* L5 z& d$ J2 E( _
16.jpg
! C; y2 f, E, I4 s; C8 B! r) |; i        
' ]  |! \9 T* f2 u8 m* f4 h  K( c' b! x    QSPI接口PCB设计遵循如下几点,更多硬件设计内容请参考AN4488。6 p2 @; @' t; F/ r  Z! I& S
    a. 线阻 50Ω ± 10%
' T9 ?& F. k) D6 c2 `$ V    b. 最大线长 < 120mm  J8 N9 M9 Y- e5 R9 f. p
    c. 避免在不同信号层走信号线
6 Q- K. m) x, D* R    d. 时钟线至少离其他信号线3倍线宽距离+ }7 Y  L( j" h8 A' t6 i' B0 \
    e. 数据信号线长差 ≤ 10mm0 K) B  w$ C" _* {
    f. 避免时钟线采用蛇形走线,同时尽量减少数据线上过孔。
/ W# H/ J9 p" w8 n/ H. n2 ]- a% o% X& ]: M
3.3 软件开发流程
3 o5 t% a6 x7 U: A
17.jpg 4 O1 A5 \7 f9 v  l; P/ r# V

+ K+ A2 c# I+ M3.4 软件实现例+ z* @9 d: {* J& w* X
    在环境搭建完成后,就可以利用STM32CubeMX根据硬件连接情况,进行QSPI配置,获取IAR工程。具体软件实现流程如下。
9 g: c! J1 a# C2 a) X/ S8 e; n' l
18.jpg & s7 w. z# K4 T6 P) t5 T/ F+ s9 c

% g7 O1 R  n& P6 X# P    a. 利用STM32CubeMX生成IAR工程3 p) Y5 H  t/ G  y5 ?6 b2 I! P) k
    打开STM32CubeMX---点击”New project”---在”Part Number Search’中输入STM32F469NI---点击”MCUs Liast”中出现的STM32F469NIHx---点击“Start Project”  此时,基于STM32F469NIHx的STM32CubeMX工程被打开。  j' K' m; r0 O
    如下,根据STM32F469I-DISCO板硬件连接情况(QSPI NCS, CLK, Q0, Q1, Q2, Q3对应PB6, PF10, PF8, PF9, PF7, PF6;外部高速晶振为8MHz无源晶振;调试接口采用SWD接口,其中SWCLK, SWDIO对应PA14, PA13):8 z$ P6 m4 U2 Z& J+ U
选择” QuadSPI”为”Bank1 with Quad SPI Lines”(注:也可在开发过程中,先用STM32CubeMX查看QSPI接口对应的IO引脚,进行硬件开发) 。
- p  M( N5 O+ @* |0 d  J    注: 在如上选择后,右侧引脚图中QSPI对应的引脚会呈现绿色显示。需要根据电路图中所连接的QSPI引脚,进行复用引脚确认。例如,在默认情况下,QSPI IO0对应到PC9引脚,而STM32F469I-DISCO板上的QSPI IO0与PF8连接,并非PC9。所以,需要在右侧引脚图中,按住Ctrl键,左键在PC9引脚按下,拖动至PF8处,松开左键和Ctrl键,实现IO0引脚的关联。) l- ^5 @. n0 x3 _) X& o" V
    选择“High Speed Clock(HSE)”为“Crystal/Ceramic Resonator”。0 e9 I. @  E  M+ J
    选择”Debug”为”Serial Wire”
* D: o( X9 n" ~: x  y: [
19.jpg & V/ ?' ^" x, F

9 O* r8 P8 e3 _* I$ N! ^) \, b    时钟配置如下图所示。设置输入时钟频率为8MHz  选择”HSE”做为PLL倍频时钟源  选择”PLLCLK”做为主频时钟源  设置 “HCLK”为180MHz (FAHB 为180MHz) 点击 Enter键,自动生成对应主频的时钟参数(仅提供时钟配置参考,并不限制一定要设置180MHz主频)。
6 ?, ~! T% d  [$ p
21.jpg % _0 l! O% ?  ~% b# d
    QSPI配置如下图。参数的配置需要与存储器参数匹配。" c5 G  [7 T1 ~* v  B: v  I9 y
    • FIFO Threshold(FIFO阈值) 配置为4,并不严格要求。  X* c2 Y. ?( ]$ W1 n9 d
    • Smaple shift 选择“Sample shifting half cycle”。延后半个时钟,获取数据线上数据。可以使用在由于线路设计,数据信号存在较大延迟的场景。* k( O5 p& J# H1 h* H8 ~
22.jpg
: e$ i& u/ m' G! J* r2 C4 ]5 R    使能QSPI中断。. ^3 _  C/ w/ m8 e8 a
23.png 7 w# K1 }( _5 O' t2 |) E/ L- U4 E
    点击菜单栏”Project”---“Settings”---设置”Project Name” , “Project Location” 和 “Toolchain / IDE” 。其中“Toolchain / IDE”设置为EWARM以便生成对应IDE的工程。其他选项保持默认。7 h  z  T4 |) g' r, O4 ~6 n
    点击菜单栏”Project”---“Generate Code”---等待IAR工程生成,出现”Code Generation”界面---点击”Open Project”打开工程。% |" y* J0 S+ H5 R8 \, ]5 c2 S
    b. 完善工程。
/ u  t7 f" [5 f+ |# `' d* E7 O     由上述步骤获得的IAR工程中,包含了时钟配置及QSPI接口的初始化。对于外扩Flash的操作,还需要 添加外扩Flash支持的命令进行操作。N25Q128A13EF840F支持的部分命令可参见本文3.1小结。" J4 {# _) J$ x- m5 Y; W
    在这里出于简化考虑,仅提供了阻塞式读取ID,擦除Flash,块写和快读操作的实现。更多实现模式,可以参考Cube软件包中提供的QSPI例程。( I9 Z  p! i8 O& }- \4 N4 B
    在N25Q128A13EF840F手册中提供了读ID命令时序,如下图所示。0 `& a# \) t4 C
25.png ( u/ d0 p, E0 H; m
    由时序图可知,读ID时序构成: 命令阶段 + 数据阶段。命令阶段和数据阶段线宽都为1,读ID命令码为0x9E或者0x9F,ID数据长度为17字节。) }& A) z1 F3 @# S. z9 e5 @! W+ w
    在N25Q128A13EF840F手册中提供了写使能命令时序,如下图所示。5 W: q2 z/ |% o( h8 p- J0 G
24.jpg
/ W$ X7 r0 k6 M1 ]4 P) W    由时序图可知,块擦除时序仅有命令阶段。命令阶段线宽为1,写使能命令码为0x06。(注:这里仅呈现了单线命令模式的实现。除此之外,STM32 QSPI接口和外扩存储器支持双线、四线模式)。( R$ j5 [# H: t/ Q
    在N25Q128A13EF840F手册中提供了扇区擦除命令时序,如下图所示。
5 P2 |" Z- l+ p0 G$ _* Y 26.jpg
. c+ D1 |, X" Z+ k3 f; d6 X: N    由时序图可知,扇区擦除时序构成:命令阶段+地址阶段。命令阶段和地址阶段线宽为1,扇区擦除命令码为0xD8。其中地址为24-bit,任一位于需要进行擦除操作的扇区范围内地址都有效。在此简单选择扇区0进行擦除,选择地址为0。(注:这里仅呈现了单线命令模式的实现。除此之外,STM32 QSPI接口和外扩存储器支持双线、四线模式)。
. p* o9 Z2 `. R: B, k* n* D    在N25Q128A13EF840F手册中提供了四线快速写命令时序,如下图所示。
" W: Q2 K; N# k  d. o) ?7 u 27.jpg
: p) |1 `! V4 D& q    由时序图可知,四线快速写命令时序构成:命令阶段+地址阶段+数据阶段。命令阶段和地址阶段线宽为1,数据阶段线宽为4,四线快速写命令码为0x32。其中地址为24-bit,对应写入起始地址。(注:这里仅呈现了单线命令模式的实现。除此之外,STM32 QSPI接口和外扩存储器支持双线、四线模式)。
, T, t# a  P1 m& o, w6 ?    在N25Q128A13EF840F手册中提供了四线快速读命令时序,如下图所示。
8 b* i# O6 a# _- i( E 28.jpg
' i2 N/ n! J# ]    由时序图可知,四线快速读命令时序构成:命令阶段+地址阶段+数据阶段。命令阶段和地址阶段线宽为1,数据阶段线宽为4,四线快速读命令码为0x6B。其中地址为24-bit,对应写入起始地址。四线快速读命令默认Dummy cycles为8。(注:这里仅呈现了单线命令模式的实现。除此之外,STM32 QSPI接口和外扩存储器支持双线、四线模式)。
5 C, [8 ]* ~  \- b4 M5 H+ }- Y( N    在main.c \ main函数中,增加代码如下。
. e3 C3 ]) U* B$ x2 o3 x+ D7 g4 m 29.jpg / S6 G8 _3 B# h
31.jpg
' q- V$ ~+ |6 u8 f9 Q( J 32.jpg
7 m, ~! `2 k7 v& P& l. M( ? 33.jpg
" q; V3 V# [8 d; t& Q( }* e& y 7 Y# n' x8 @5 `

- }4 h) ]& G) O) \* B  m- R四 小结
0 X- A# H- C+ f( o5 R2 R2 k    STM32的QuadSPI接口灵活可配,对于命令阶段、地址阶段、复用字节阶段、Dummy阶段和数据阶段都可以进行配置。基于这种灵活性,能够实现市面上SPI、Dual IO、Quad IO的串行Flash支持。但出于简化考虑,QSPI支持的中断访问及DMA访问等更多功能没有在本文进行介绍,更多实现可以参考ST提供的Cube软件包中的QSPI例程。另外,不同厂家的串行Flash命令及操作实现略有差异,具体以采用的Flash文档描述为准。
2 ?7 |) Y0 T# e% A9 t

) O: q/ S3 ?; K6 X% L) c5 V; }2 w
4 o- E5 n* b0 ~文档下载1>>         文档下载2>>       更多实战经验>>4 |/ H* S, j, e' x9 x9 A

7 E, H5 o- g2 M# `# W4 w$ b* S
收藏 2 评论5 发布时间:2017-9-28 15:51

举报

5个回答
斜阳 回答时间:2017-9-28 16:38:42
mark一下
heweijian55 回答时间:2017-10-26 14:30:09
. s' F- \6 }0 Q6 _  G& U
mark一下
joneing 回答时间:2018-6-4 15:41:44
感谢分享
蓝夜 回答时间:2018-6-8 20:51:15
QSPI 4线通信, 为什么说会减少pcb面积呢?
Onesdfa 回答时间:2019-1-25 18:00:35
用W25Q128进行内存映射操作总是读失败,楼主能否分享一下经验

所属标签

相似分享

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版