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

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

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

% q4 p, S/ H' b: _前言
: z' O* K* K9 o' V3 g0 ]; mSTM32提供了灵活多样的外扩存储器访问实现。本文中,介绍如何利用QSPI (QuadSPI) 外扩串行NOR Flash存储器。首先对QSPI接口功能特性进行介绍,然后分别介绍硬件设计和软件开发。并基于STM32CubeMX,提供访问MICRON N25Q128A13EF840F的实现参考。
9 R+ K. z$ w: B# H! c! C
1 M' X9 }2 r+ y7 u一 实现环境
9 o1 q' Z8 q1 [8 `; [) j+ h    开发板:STM32F469G-DISCO
1 G% u0 t; `" @: V+ Q    开发库:STM32CubeF4 v1.16.0
' s2 M& f% J3 Q+ X! R: R) g    STM32CubeMX: v4.22.0  O9 M/ {) m  x. u$ }
    集成开发环境:IAR v7.70.1.11486
: i2 z) I  [  ]
, \, m) v- S5 }/ Q    实现过程在STM32F469I-DISCO板上展开,利用板上已有的串行NOR Flash存储器(MICRON N25Q128A13EF840F)。呈现整个开发涉及环节。在本文中,首先根据QSPI接口,介绍QSPI与外扩串行存储器硬件连接。另外,Cube软件包中包含QSPI实现例,在本文对库中实现的QSPI例不做讨论,读者也可参考这些QSPI例进行设计。本文围绕由STM32CubeMX生成的工程,介绍如何实现对外扩串行NOR Flash存储器的访问。' F% m  B5 F) j6 a
/ _9 d; W& y2 R& `3 Q# P
二 QSPI介绍
) r9 s2 E: b) h6 ~    在呈现QSPI访问外扩Flash的实现例前, 需要对QSPI有一定的了解,在此对QSPI进行简短的介绍。更多内容请参考AN4760。
! {5 H2 f/ S: s2 u& E6 Q    QSPI(Quad-SPI)支持四线串行访问形式。同时,QSPI支持传统SPI和Dual-SPI模式,Dual-SPI模式支持两线串行访问。与FMC/FSMC比较,QSPI支持更低成本、更小封装外部串行Flash存储器,更少的IO引脚占用,有效减少PCB面积,降低PCB设计复杂度。' a, z* V4 ~' ?- u6 x, t" m% A
    QSPI在不同系列STM32产品线的支持情况(仅部分罗列,未涵盖所有支持型号)。

, Q) G* i% g: p, O  ^ 11.jpg 7 R0 `! d$ ], \+ @7 g
        
' p1 `9 V* T+ A7 ?% L. G! A    QSPI接口提供了灵活可配置的5个阶段,如下图所示(仅用于理解阶段构成,时序图根据配置不同存在差异)。分别是命令阶段、地址阶段、复用字节阶段、Dummy阶段和数据阶段。可以根据外扩Flash中命令时序对不同阶段进行配置。后续会以实例进行呈现。更多内容请参考AN4760。
2 F7 i+ x* Y9 X: z5 F+ B
12.jpg   T8 A9 I& ~/ v
    QSPI支持三种模式,分别是:
9 |$ r/ g' i' v3 l8 V% f    间接模式---所有操作通过QSPI寄存器实现,类似于传统SPI,可以使用阻塞模式、中断模式或者DMA模式进行读写等访问。本文中提供的实现例为间接模式下的实现。1 k( n6 I+ [5 l# I
    状态轮询模式---接口自动轮询指定寄存器,直到回读寄存器内容与指定条件匹配。可应用于状态检测,从而实现忙等待等效果。本文不对此模式进行实现介绍,应用实现可参考Cube软件包中QSPI例程。
, Z. G/ B& d! F    存储器映射模式---外扩Flash被视为内部存储器,支持AHB主器件直接访问,CPU能够直接运行位于QSPI存储器的执行代码。内部系统架构如下图所示(以STM32F469/F479为例)。本文不对此模式进行实现介绍,应用实现可参考Cube软件包中QSPI例程QSPI_ExecuteInPlace。
2 z: C# [) s4 }3 V( `
13.jpg 2 R. ^& a! [4 `2 z5 r, p( u# V! s
$ H7 X1 Y; ?. P; M: t+ \& ~5 S
三 QSPI外扩串行Flash实现例
6 }8 _+ b2 L: e* G. b
$ B  @1 z. a1 B. T( N1 ?6 B7 Y9 X- c0 M( y& ^) Q
3.1 串行Flash介绍
: Z) \& F- R* }3 O: t    以MICRON N25Q128A13EF840F为例,更多细节请参考存储器手册。N25Q128A13EF840F引脚图、时序图和电气参数来源于N25Q128A13 手册文档。
* \- z. g3 {; x; j6 |6 s    支持协议: SPI, Dual I/O(对应Dual-SPI), Quad I/O(对应Quad-SPI)
, m; U# e* U6 e5 G    支持访问模式: 单线访问、双线访问、四线访问,得益于 QSPI接口的灵活可配性,三种访问模式全部支持。/ W; u" b1 M6 ?# h9 ?/ f& z1 O- K' i
    供电电压范围: 2.7 ~ 3.6V, V: T! \) P% x, {( O% [
    最大时钟频率: 108MHz
. j/ J( m1 z! r7 ?6 {    存储空间: 128Mb (16MB)" H/ f  l5 U. s8 c/ V6 |3 y
    器件引脚示意图如下所示。由两根电源引脚和六根QSPI信号线构成。
- {. _" S$ l& o+ F# e5 G
14.jpg + t9 F7 R" \1 M- j
    下表为存储器N25Q128A13xxx命令(未列出全部命令)。通过下表可知,存储器提供了灵活的访问实现形式,而结合同样灵活可配的QSPI接口,能够实现存储器命令全支持。而本文仅为提供设计思路,呈现了部分命令在QSPI上的实现。  W5 Y7 W4 s) Z& o$ v
15.jpg
  p* y$ Y0 q% X# P& e    其中,默认读写默认3字节地址,四线快速读命令默认Dummy 周期数为8。, s) V( z5 F  d2 x0 F2 _  h

1 B) y4 a9 J( f0 Z1 @3.2 硬件设计
) W- B3 @' A8 ~    涉及到的信号线少,硬件设计简单,只需直接将QSPI的六根信号线与存储器连接即可。考虑到可测性,可以增加串行电阻或者测试点。硬件电路图如下所示。
9 H4 E. C" b" p0 Q, J
16.jpg
9 N  N, E0 Y' H  T% |! y        % K9 n$ D& [+ l7 }- C5 F7 e
    QSPI接口PCB设计遵循如下几点,更多硬件设计内容请参考AN4488。1 a. w+ j" [7 V2 B* L7 X
    a. 线阻 50Ω ± 10%5 p; {- L' |9 _/ b
    b. 最大线长 < 120mm
( r. C! m5 }2 ?8 k5 n, y. B    c. 避免在不同信号层走信号线
' g; y( R0 ^( |/ U( y4 V. d; |    d. 时钟线至少离其他信号线3倍线宽距离7 f: {2 X# Z& J4 D/ H
    e. 数据信号线长差 ≤ 10mm
: B6 Q9 u/ T2 e1 y- Y$ V    f. 避免时钟线采用蛇形走线,同时尽量减少数据线上过孔。- I9 R' {9 l% Y' P. z/ z- D
- b  i2 T' z0 j" _# X& M7 N
3.3 软件开发流程( m& d4 d. X4 t9 K; N) b
17.jpg 7 j- v# K: ^. w6 e7 a; x

( V5 @0 R# P8 N5 z% P" l( X$ X3.4 软件实现例
: i8 ~8 Z, u9 F2 `( M( \; W. Q3 a2 A    在环境搭建完成后,就可以利用STM32CubeMX根据硬件连接情况,进行QSPI配置,获取IAR工程。具体软件实现流程如下。7 V0 G  [* S  k2 H
18.jpg / u% A- K9 ?/ z- P
: j5 ^* k% }8 n* Y9 [+ V
    a. 利用STM32CubeMX生成IAR工程
* h+ R8 L8 l" n3 L) R+ |2 d    打开STM32CubeMX---点击”New project”---在”Part Number Search’中输入STM32F469NI---点击”MCUs Liast”中出现的STM32F469NIHx---点击“Start Project”  此时,基于STM32F469NIHx的STM32CubeMX工程被打开。
. f2 [( u- w% [0 [    如下,根据STM32F469I-DISCO板硬件连接情况(QSPI NCS, CLK, Q0, Q1, Q2, Q3对应PB6, PF10, PF8, PF9, PF7, PF6;外部高速晶振为8MHz无源晶振;调试接口采用SWD接口,其中SWCLK, SWDIO对应PA14, PA13):  j- d0 b5 \/ M3 q4 {0 V
选择” QuadSPI”为”Bank1 with Quad SPI Lines”(注:也可在开发过程中,先用STM32CubeMX查看QSPI接口对应的IO引脚,进行硬件开发) 。
0 ], |5 H7 q$ a! A2 f8 H% A    注: 在如上选择后,右侧引脚图中QSPI对应的引脚会呈现绿色显示。需要根据电路图中所连接的QSPI引脚,进行复用引脚确认。例如,在默认情况下,QSPI IO0对应到PC9引脚,而STM32F469I-DISCO板上的QSPI IO0与PF8连接,并非PC9。所以,需要在右侧引脚图中,按住Ctrl键,左键在PC9引脚按下,拖动至PF8处,松开左键和Ctrl键,实现IO0引脚的关联。& R) b: Y" w" u9 c
    选择“High Speed Clock(HSE)”为“Crystal/Ceramic Resonator”。
5 W$ B5 S: g0 v4 l, a    选择”Debug”为”Serial Wire”  c" R6 A2 H! p) D9 o  C7 F& r
19.jpg
+ q9 W4 c9 z% }" J
$ H8 W7 S! D# x    时钟配置如下图所示。设置输入时钟频率为8MHz  选择”HSE”做为PLL倍频时钟源  选择”PLLCLK”做为主频时钟源  设置 “HCLK”为180MHz (FAHB 为180MHz) 点击 Enter键,自动生成对应主频的时钟参数(仅提供时钟配置参考,并不限制一定要设置180MHz主频)。
' K. T- A5 j% @3 e
21.jpg 6 K, m5 D, s3 l. V
    QSPI配置如下图。参数的配置需要与存储器参数匹配。% n4 o1 t' q6 A6 ~! K2 u7 V  m, W4 a$ H
    • FIFO Threshold(FIFO阈值) 配置为4,并不严格要求。8 y- F* ~# r* Z* _+ _6 T: T& J
    • Smaple shift 选择“Sample shifting half cycle”。延后半个时钟,获取数据线上数据。可以使用在由于线路设计,数据信号存在较大延迟的场景。
5 z0 t9 }4 J: f4 U
22.jpg 0 f1 x# T$ i. V
    使能QSPI中断。2 d" L; G  O3 ~
23.png
. ]! Q/ K2 z7 Z, Q$ \$ T2 A) C, Z1 }    点击菜单栏”Project”---“Settings”---设置”Project Name” , “Project Location” 和 “Toolchain / IDE” 。其中“Toolchain / IDE”设置为EWARM以便生成对应IDE的工程。其他选项保持默认。
8 v" q: q: W5 j2 G  y' r2 d" r! Z  P) [    点击菜单栏”Project”---“Generate Code”---等待IAR工程生成,出现”Code Generation”界面---点击”Open Project”打开工程。7 f3 E' e( }5 B4 x; ~
    b. 完善工程。
- C% \( A- u/ l- _% Q/ z     由上述步骤获得的IAR工程中,包含了时钟配置及QSPI接口的初始化。对于外扩Flash的操作,还需要 添加外扩Flash支持的命令进行操作。N25Q128A13EF840F支持的部分命令可参见本文3.1小结。! ]5 }" C7 ~5 M0 [' \
    在这里出于简化考虑,仅提供了阻塞式读取ID,擦除Flash,块写和快读操作的实现。更多实现模式,可以参考Cube软件包中提供的QSPI例程。: O2 v% z& M% L; S3 u
    在N25Q128A13EF840F手册中提供了读ID命令时序,如下图所示。
  n+ F( u. y/ {4 C* K  S 25.png * E) K* v  t  r( u, J- c3 M/ N
    由时序图可知,读ID时序构成: 命令阶段 + 数据阶段。命令阶段和数据阶段线宽都为1,读ID命令码为0x9E或者0x9F,ID数据长度为17字节。3 V- k: e' Z- T4 R8 F1 H" M" M+ }  M
    在N25Q128A13EF840F手册中提供了写使能命令时序,如下图所示。
; t, l& I3 f! N5 D! y% Y0 p 24.jpg
: @' r7 O3 P0 s# f" I. F, g    由时序图可知,块擦除时序仅有命令阶段。命令阶段线宽为1,写使能命令码为0x06。(注:这里仅呈现了单线命令模式的实现。除此之外,STM32 QSPI接口和外扩存储器支持双线、四线模式)。
$ Z' v) k; _1 q5 L% ?+ t    在N25Q128A13EF840F手册中提供了扇区擦除命令时序,如下图所示。) u/ u- a! T) F0 N+ Y& V8 n
26.jpg $ V/ N, d5 G. e2 j$ z' \4 }( n
    由时序图可知,扇区擦除时序构成:命令阶段+地址阶段。命令阶段和地址阶段线宽为1,扇区擦除命令码为0xD8。其中地址为24-bit,任一位于需要进行擦除操作的扇区范围内地址都有效。在此简单选择扇区0进行擦除,选择地址为0。(注:这里仅呈现了单线命令模式的实现。除此之外,STM32 QSPI接口和外扩存储器支持双线、四线模式)。
* c* {4 P* z' r! t" p( d    在N25Q128A13EF840F手册中提供了四线快速写命令时序,如下图所示。
2 ~" g7 E5 C, t$ \$ W. F7 d: R 27.jpg - m3 Z0 }- O& L, I9 @8 v8 A
    由时序图可知,四线快速写命令时序构成:命令阶段+地址阶段+数据阶段。命令阶段和地址阶段线宽为1,数据阶段线宽为4,四线快速写命令码为0x32。其中地址为24-bit,对应写入起始地址。(注:这里仅呈现了单线命令模式的实现。除此之外,STM32 QSPI接口和外扩存储器支持双线、四线模式)。
1 z+ v7 E+ y: z& ]0 u; c% f% t    在N25Q128A13EF840F手册中提供了四线快速读命令时序,如下图所示。
2 v$ |- V: ~# v' A  \. v- _1 b9 J3 A 28.jpg $ L" ^. q# _# Y1 \
    由时序图可知,四线快速读命令时序构成:命令阶段+地址阶段+数据阶段。命令阶段和地址阶段线宽为1,数据阶段线宽为4,四线快速读命令码为0x6B。其中地址为24-bit,对应写入起始地址。四线快速读命令默认Dummy cycles为8。(注:这里仅呈现了单线命令模式的实现。除此之外,STM32 QSPI接口和外扩存储器支持双线、四线模式)。
7 n# f9 L; S; r    在main.c \ main函数中,增加代码如下。
& x% c2 k( u' H  B: {6 O! ^ 29.jpg
/ Q; G) x6 v3 }2 L 31.jpg
7 R: F% o( j6 g: ` 32.jpg
3 U3 ?7 W4 d: S, C0 t 33.jpg ; S# J- @! @: _; i# c
7 Q8 @) V' e2 z* ?8 ?& X8 L

* X! s/ R' a2 J/ U/ a' l四 小结
: C+ z1 A, L, E% a, ]! I2 j    STM32的QuadSPI接口灵活可配,对于命令阶段、地址阶段、复用字节阶段、Dummy阶段和数据阶段都可以进行配置。基于这种灵活性,能够实现市面上SPI、Dual IO、Quad IO的串行Flash支持。但出于简化考虑,QSPI支持的中断访问及DMA访问等更多功能没有在本文进行介绍,更多实现可以参考ST提供的Cube软件包中的QSPI例程。另外,不同厂家的串行Flash命令及操作实现略有差异,具体以采用的Flash文档描述为准。

' m- ~( e2 t9 \9 W5 j9 F( H$ }% j7 i! A& z7 _2 [: [; H( k# s: J

4 w2 ]- |# t, O& }, K' {文档下载1>>         文档下载2>>       更多实战经验>>
/ }& M; X6 Q$ @7 Y! J9 h6 Q
' ^$ r3 f' I: D- L' w3 n2 k1 w  S+ g& a4 f+ y. ?
收藏 2 评论5 发布时间:2017-9-28 15:51

举报

5个回答
斜阳 回答时间:2017-9-28 16:38:42
mark一下
heweijian55 回答时间:2017-10-26 14:30:09
1 l# ~$ c# p. l% V; h
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 手机版