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

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

[复制链接]
zero99 发布时间:2017-9-28 15:51
利用 QuadSPI外扩 串行 NOR Flash的实现
! V3 r9 `" F8 L
前言
% h4 A1 t$ L  b( i5 v+ O& M6 YSTM32提供了灵活多样的外扩存储器访问实现。本文中,介绍如何利用QSPI (QuadSPI) 外扩串行NOR Flash存储器。首先对QSPI接口功能特性进行介绍,然后分别介绍硬件设计和软件开发。并基于STM32CubeMX,提供访问MICRON N25Q128A13EF840F的实现参考。
, |  T8 p/ ?. P' g6 U. t
7 N0 u5 m1 A; J一 实现环境
% `+ w9 }, l) f- S! D# N8 s# ^6 k    开发板:STM32F469G-DISCO4 Y/ S4 }+ D8 T) p. M
    开发库:STM32CubeF4 v1.16.0
7 R, d7 i: f( L& Z' X6 T; J* U* |2 L    STM32CubeMX: v4.22.0
5 I3 j2 W, \# n; P9 N    集成开发环境:IAR v7.70.1.114865 u7 N& S% x, _
/ p& W: ?& m  M/ D7 p
    实现过程在STM32F469I-DISCO板上展开,利用板上已有的串行NOR Flash存储器(MICRON N25Q128A13EF840F)。呈现整个开发涉及环节。在本文中,首先根据QSPI接口,介绍QSPI与外扩串行存储器硬件连接。另外,Cube软件包中包含QSPI实现例,在本文对库中实现的QSPI例不做讨论,读者也可参考这些QSPI例进行设计。本文围绕由STM32CubeMX生成的工程,介绍如何实现对外扩串行NOR Flash存储器的访问。  s4 k' G) n( F, e
: V8 {9 Q, N) a* o$ a; e( P
二 QSPI介绍1 U9 W+ g0 ^5 q# u/ K2 W- Y
    在呈现QSPI访问外扩Flash的实现例前, 需要对QSPI有一定的了解,在此对QSPI进行简短的介绍。更多内容请参考AN4760。4 l4 ?" v5 @6 `& I- d8 x6 W
    QSPI(Quad-SPI)支持四线串行访问形式。同时,QSPI支持传统SPI和Dual-SPI模式,Dual-SPI模式支持两线串行访问。与FMC/FSMC比较,QSPI支持更低成本、更小封装外部串行Flash存储器,更少的IO引脚占用,有效减少PCB面积,降低PCB设计复杂度。
+ y' V5 a1 m0 Q1 r+ ]% t; C    QSPI在不同系列STM32产品线的支持情况(仅部分罗列,未涵盖所有支持型号)。
: W# ]0 g, c- n
11.jpg
5 e/ u0 s1 e. H( T  v0 H+ y/ }4 ]        
9 ~, |6 m9 _; m+ k8 E* K    QSPI接口提供了灵活可配置的5个阶段,如下图所示(仅用于理解阶段构成,时序图根据配置不同存在差异)。分别是命令阶段、地址阶段、复用字节阶段、Dummy阶段和数据阶段。可以根据外扩Flash中命令时序对不同阶段进行配置。后续会以实例进行呈现。更多内容请参考AN4760。" z( C) R  [$ ~+ Y
12.jpg
0 h% L* z8 `( N& Q    QSPI支持三种模式,分别是:
& ^6 H7 S  ]0 ?! j2 A. z' F    间接模式---所有操作通过QSPI寄存器实现,类似于传统SPI,可以使用阻塞模式、中断模式或者DMA模式进行读写等访问。本文中提供的实现例为间接模式下的实现。
: q: {# \9 x' n& w7 P/ t& k! D6 e    状态轮询模式---接口自动轮询指定寄存器,直到回读寄存器内容与指定条件匹配。可应用于状态检测,从而实现忙等待等效果。本文不对此模式进行实现介绍,应用实现可参考Cube软件包中QSPI例程。- m; y6 f* Z9 m  [$ V- Z' v4 ~
    存储器映射模式---外扩Flash被视为内部存储器,支持AHB主器件直接访问,CPU能够直接运行位于QSPI存储器的执行代码。内部系统架构如下图所示(以STM32F469/F479为例)。本文不对此模式进行实现介绍,应用实现可参考Cube软件包中QSPI例程QSPI_ExecuteInPlace。
& K7 L, k; ]! a, g8 r9 X
13.jpg 5 u) B/ S' z1 k" O  P
; }5 r# h1 j4 i7 B4 t0 x! }( I
三 QSPI外扩串行Flash实现例
  R& u! X5 O: Z/ U: D. {; I, L, L4 H7 j: l+ o% P  b) B8 k) s% @

! f! n; b, ]/ n( H% u3.1 串行Flash介绍# D6 `3 @4 ^# T- k" h% S$ H
    以MICRON N25Q128A13EF840F为例,更多细节请参考存储器手册。N25Q128A13EF840F引脚图、时序图和电气参数来源于N25Q128A13 手册文档。
. S7 d& L$ U! }, ~% `$ E    支持协议: SPI, Dual I/O(对应Dual-SPI), Quad I/O(对应Quad-SPI)5 ~1 s  ~) ?' V. ^- ]9 e& O! ~
    支持访问模式: 单线访问、双线访问、四线访问,得益于 QSPI接口的灵活可配性,三种访问模式全部支持。2 Q& V. q; ^( I2 u! H/ L0 S
    供电电压范围: 2.7 ~ 3.6V
9 F# H) D8 ?% X" I    最大时钟频率: 108MHz
; F' e0 W0 b! A, @    存储空间: 128Mb (16MB)) D- X( h3 t3 w9 O/ l* X$ P
    器件引脚示意图如下所示。由两根电源引脚和六根QSPI信号线构成。
/ O. q; }5 C9 `& X  ^
14.jpg $ a% z8 D, k8 u5 ^9 Z% P8 z& C
    下表为存储器N25Q128A13xxx命令(未列出全部命令)。通过下表可知,存储器提供了灵活的访问实现形式,而结合同样灵活可配的QSPI接口,能够实现存储器命令全支持。而本文仅为提供设计思路,呈现了部分命令在QSPI上的实现。* H! x9 @5 I$ d, |+ v
15.jpg   i' U3 d8 s5 e
    其中,默认读写默认3字节地址,四线快速读命令默认Dummy 周期数为8。- [9 }3 M" M/ p
3 p+ r) o: S5 u, X/ d, z
3.2 硬件设计
0 c  t: w% l/ f' {7 {- q    涉及到的信号线少,硬件设计简单,只需直接将QSPI的六根信号线与存储器连接即可。考虑到可测性,可以增加串行电阻或者测试点。硬件电路图如下所示。
: H/ D) U% n/ o! m
16.jpg 5 z, k( f/ w7 `# r* }( h) r
        
# t8 P: z0 l4 E    QSPI接口PCB设计遵循如下几点,更多硬件设计内容请参考AN4488。' W) ^5 @, e9 O' C
    a. 线阻 50Ω ± 10%+ _" F* V* @, `8 N/ F- J6 ?
    b. 最大线长 < 120mm" j+ D6 W1 H! f5 j( ~$ W
    c. 避免在不同信号层走信号线! ~* ~% X* G" r9 f" ^! V& T4 E8 a/ P4 u. y
    d. 时钟线至少离其他信号线3倍线宽距离
* |4 c# B- P* y0 `* U4 J    e. 数据信号线长差 ≤ 10mm
1 V6 G- S+ B: g, B    f. 避免时钟线采用蛇形走线,同时尽量减少数据线上过孔。8 H( K$ k4 M. u. ^$ q; j

  B5 G8 N3 @3 P, Z# m) F: V8 v" u3.3 软件开发流程: `# }& W; \, G9 `* F
17.jpg % W1 f4 y' r( W8 S2 B# _" }" s# f

& B9 R+ J0 K% Q% x3.4 软件实现例0 |, S' h8 K# p& n
    在环境搭建完成后,就可以利用STM32CubeMX根据硬件连接情况,进行QSPI配置,获取IAR工程。具体软件实现流程如下。3 w( c/ O5 P5 C1 z: t  \
18.jpg
1 s# U$ g6 F; p0 b( t3 }& n; X# B+ }) n' i, u
    a. 利用STM32CubeMX生成IAR工程
4 P5 P2 s6 K( }    打开STM32CubeMX---点击”New project”---在”Part Number Search’中输入STM32F469NI---点击”MCUs Liast”中出现的STM32F469NIHx---点击“Start Project”  此时,基于STM32F469NIHx的STM32CubeMX工程被打开。" A  R5 [+ W  y8 Y/ G1 g
    如下,根据STM32F469I-DISCO板硬件连接情况(QSPI NCS, CLK, Q0, Q1, Q2, Q3对应PB6, PF10, PF8, PF9, PF7, PF6;外部高速晶振为8MHz无源晶振;调试接口采用SWD接口,其中SWCLK, SWDIO对应PA14, PA13):
  K! h. F+ G* K6 I! I! G& t$ l/ @$ G选择” QuadSPI”为”Bank1 with Quad SPI Lines”(注:也可在开发过程中,先用STM32CubeMX查看QSPI接口对应的IO引脚,进行硬件开发) 。& r+ U: X7 l2 P; x0 M5 F
    注: 在如上选择后,右侧引脚图中QSPI对应的引脚会呈现绿色显示。需要根据电路图中所连接的QSPI引脚,进行复用引脚确认。例如,在默认情况下,QSPI IO0对应到PC9引脚,而STM32F469I-DISCO板上的QSPI IO0与PF8连接,并非PC9。所以,需要在右侧引脚图中,按住Ctrl键,左键在PC9引脚按下,拖动至PF8处,松开左键和Ctrl键,实现IO0引脚的关联。
$ _' C8 x4 Y* u/ ?; {0 D7 r    选择“High Speed Clock(HSE)”为“Crystal/Ceramic Resonator”。  P; s- s( Z$ s, S+ g
    选择”Debug”为”Serial Wire”( y9 w$ g5 @7 b+ `- U; j6 O
19.jpg 7 L2 R( x/ N% K7 Q9 I3 M' F4 R

0 }6 ]1 d* a3 |) A. P  P: n8 d    时钟配置如下图所示。设置输入时钟频率为8MHz  选择”HSE”做为PLL倍频时钟源  选择”PLLCLK”做为主频时钟源  设置 “HCLK”为180MHz (FAHB 为180MHz) 点击 Enter键,自动生成对应主频的时钟参数(仅提供时钟配置参考,并不限制一定要设置180MHz主频)。
( G5 _' t# |4 Q- [/ i% O
21.jpg 6 I# u" p  O3 i. C2 d' O. F* ^
    QSPI配置如下图。参数的配置需要与存储器参数匹配。; k$ I3 }2 l% n5 q! ]) t
    • FIFO Threshold(FIFO阈值) 配置为4,并不严格要求。3 H, j  C- O  F& B$ m0 b* c- @' v: Q
    • Smaple shift 选择“Sample shifting half cycle”。延后半个时钟,获取数据线上数据。可以使用在由于线路设计,数据信号存在较大延迟的场景。
. e3 v0 b8 X# P, _! @7 V! g0 J
22.jpg ' B5 L: Z2 V, u+ G  Y5 |, |3 |
    使能QSPI中断。0 a2 ]; g' @, @, e- i# l4 Y/ q
23.png 3 n* @% p& j  P! J
    点击菜单栏”Project”---“Settings”---设置”Project Name” , “Project Location” 和 “Toolchain / IDE” 。其中“Toolchain / IDE”设置为EWARM以便生成对应IDE的工程。其他选项保持默认。
3 C# Q+ N; t' T" M" s    点击菜单栏”Project”---“Generate Code”---等待IAR工程生成,出现”Code Generation”界面---点击”Open Project”打开工程。( m* e3 f6 u9 m) [
    b. 完善工程。
" X7 E) W5 z7 s4 }) `% K     由上述步骤获得的IAR工程中,包含了时钟配置及QSPI接口的初始化。对于外扩Flash的操作,还需要 添加外扩Flash支持的命令进行操作。N25Q128A13EF840F支持的部分命令可参见本文3.1小结。
( B2 ~# o& x4 m% ?    在这里出于简化考虑,仅提供了阻塞式读取ID,擦除Flash,块写和快读操作的实现。更多实现模式,可以参考Cube软件包中提供的QSPI例程。; Z4 I  V$ h6 q- q' n, ?) T
    在N25Q128A13EF840F手册中提供了读ID命令时序,如下图所示。
  R1 ^( y2 `! e# n& }3 W, H 25.png - o3 _0 e) n, X2 C" e% R. Y; Q. q
    由时序图可知,读ID时序构成: 命令阶段 + 数据阶段。命令阶段和数据阶段线宽都为1,读ID命令码为0x9E或者0x9F,ID数据长度为17字节。
3 N, S7 L5 t1 Q- d1 ]    在N25Q128A13EF840F手册中提供了写使能命令时序,如下图所示。! i+ O/ d* }& r
24.jpg ) [9 ]) C& i2 l. V8 `" E! {( M
    由时序图可知,块擦除时序仅有命令阶段。命令阶段线宽为1,写使能命令码为0x06。(注:这里仅呈现了单线命令模式的实现。除此之外,STM32 QSPI接口和外扩存储器支持双线、四线模式)。& U! q& W6 N9 F. n7 H3 l
    在N25Q128A13EF840F手册中提供了扇区擦除命令时序,如下图所示。, ^! w  Y- a& y3 k
26.jpg # h0 S( t" H9 k$ i/ L( L' M
    由时序图可知,扇区擦除时序构成:命令阶段+地址阶段。命令阶段和地址阶段线宽为1,扇区擦除命令码为0xD8。其中地址为24-bit,任一位于需要进行擦除操作的扇区范围内地址都有效。在此简单选择扇区0进行擦除,选择地址为0。(注:这里仅呈现了单线命令模式的实现。除此之外,STM32 QSPI接口和外扩存储器支持双线、四线模式)。4 V6 }. v. |0 q# \) u9 F; K6 F
    在N25Q128A13EF840F手册中提供了四线快速写命令时序,如下图所示。9 I5 o! ]% C% x# B4 i
27.jpg
% |2 U% ]+ p/ D! ?7 B. B    由时序图可知,四线快速写命令时序构成:命令阶段+地址阶段+数据阶段。命令阶段和地址阶段线宽为1,数据阶段线宽为4,四线快速写命令码为0x32。其中地址为24-bit,对应写入起始地址。(注:这里仅呈现了单线命令模式的实现。除此之外,STM32 QSPI接口和外扩存储器支持双线、四线模式)。
! ^5 `7 s- I  x: V% ]. J8 _    在N25Q128A13EF840F手册中提供了四线快速读命令时序,如下图所示。
' Q" x2 x+ K& C& A 28.jpg
* f, e: Q2 v5 \4 C    由时序图可知,四线快速读命令时序构成:命令阶段+地址阶段+数据阶段。命令阶段和地址阶段线宽为1,数据阶段线宽为4,四线快速读命令码为0x6B。其中地址为24-bit,对应写入起始地址。四线快速读命令默认Dummy cycles为8。(注:这里仅呈现了单线命令模式的实现。除此之外,STM32 QSPI接口和外扩存储器支持双线、四线模式)。
# D* b0 n* }, q    在main.c \ main函数中,增加代码如下。
! ~0 k0 y% K3 B( G, Y  C 29.jpg % _4 A! j% w8 z) G; z" E4 W$ d
31.jpg
/ j, R/ }6 s3 \4 Y  W1 v 32.jpg
( |. e; p6 n! j9 Y2 L' T: D 33.jpg
) I, O: F. M9 }+ K5 e
, i$ e; c  l& O5 J8 }- e* z1 V9 T( O0 E* P
四 小结
% s/ q  Y- g% O, y% N5 Z! U1 H$ p    STM32的QuadSPI接口灵活可配,对于命令阶段、地址阶段、复用字节阶段、Dummy阶段和数据阶段都可以进行配置。基于这种灵活性,能够实现市面上SPI、Dual IO、Quad IO的串行Flash支持。但出于简化考虑,QSPI支持的中断访问及DMA访问等更多功能没有在本文进行介绍,更多实现可以参考ST提供的Cube软件包中的QSPI例程。另外,不同厂家的串行Flash命令及操作实现略有差异,具体以采用的Flash文档描述为准。

9 x$ _2 R! B9 u
8 N9 u$ J* J8 E$ a* Q: Z) H# |4 W2 ?/ {  S  G% C; B
文档下载1>>         文档下载2>>       更多实战经验>>* i1 b; m5 ?! ^9 U& O0 O/ O
! V) Z2 c6 |) W& m) Z9 ?
! @$ s+ P  h& q9 V
收藏 2 评论5 发布时间:2017-9-28 15:51

举报

5个回答
斜阳 回答时间:2017-9-28 16:38:42
mark一下
heweijian55 回答时间:2017-10-26 14:30:09
6 K: D4 C# j# T5 A! B0 p
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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版