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

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

[复制链接]
zero99 发布时间:2017-9-28 15:51
利用 QuadSPI外扩 串行 NOR Flash的实现
$ d' \7 y, A% G# Y. y" L+ K
前言" |, k" X% k: i5 q& W2 M, `6 k7 A8 n
STM32提供了灵活多样的外扩存储器访问实现。本文中,介绍如何利用QSPI (QuadSPI) 外扩串行NOR Flash存储器。首先对QSPI接口功能特性进行介绍,然后分别介绍硬件设计和软件开发。并基于STM32CubeMX,提供访问MICRON N25Q128A13EF840F的实现参考。
5 C) a7 g9 l* ^# `8 H  g# h1 n* L% [) ~; l
一 实现环境* O  u: j% U# `9 Y
    开发板:STM32F469G-DISCO
/ o; |# a& w5 @6 y+ x    开发库:STM32CubeF4 v1.16.0' p+ p+ o+ a$ k/ ~' M* Q
    STM32CubeMX: v4.22.0
3 g9 c5 v* R  G- c( ?! ^9 X/ ]2 d    集成开发环境:IAR v7.70.1.114866 j. E% @) r+ p# O5 h) x
7 W* Q8 E5 g  V
    实现过程在STM32F469I-DISCO板上展开,利用板上已有的串行NOR Flash存储器(MICRON N25Q128A13EF840F)。呈现整个开发涉及环节。在本文中,首先根据QSPI接口,介绍QSPI与外扩串行存储器硬件连接。另外,Cube软件包中包含QSPI实现例,在本文对库中实现的QSPI例不做讨论,读者也可参考这些QSPI例进行设计。本文围绕由STM32CubeMX生成的工程,介绍如何实现对外扩串行NOR Flash存储器的访问。; ?2 Z3 y5 V2 z" E$ @1 z& B3 B- A

( @9 S" T7 E3 Q4 M' G二 QSPI介绍- s, W" \, u/ u2 P9 }
    在呈现QSPI访问外扩Flash的实现例前, 需要对QSPI有一定的了解,在此对QSPI进行简短的介绍。更多内容请参考AN4760。
! H8 P6 j* e0 j2 ~8 Q    QSPI(Quad-SPI)支持四线串行访问形式。同时,QSPI支持传统SPI和Dual-SPI模式,Dual-SPI模式支持两线串行访问。与FMC/FSMC比较,QSPI支持更低成本、更小封装外部串行Flash存储器,更少的IO引脚占用,有效减少PCB面积,降低PCB设计复杂度。* ~7 u8 p8 X( W; p& F
    QSPI在不同系列STM32产品线的支持情况(仅部分罗列,未涵盖所有支持型号)。

0 e. J; u* S* }& t 11.jpg
; A8 w/ Q( _$ |* k6 m) s& ~7 z        + j& G$ ^4 P, {2 m! f
    QSPI接口提供了灵活可配置的5个阶段,如下图所示(仅用于理解阶段构成,时序图根据配置不同存在差异)。分别是命令阶段、地址阶段、复用字节阶段、Dummy阶段和数据阶段。可以根据外扩Flash中命令时序对不同阶段进行配置。后续会以实例进行呈现。更多内容请参考AN4760。
1 A: V$ X* u3 i* N5 b% y3 V
12.jpg 7 A+ s# U- N! x* `; C
    QSPI支持三种模式,分别是:' m  u& P% y+ l( i% ~1 p) B! S
    间接模式---所有操作通过QSPI寄存器实现,类似于传统SPI,可以使用阻塞模式、中断模式或者DMA模式进行读写等访问。本文中提供的实现例为间接模式下的实现。
5 J! y% R6 o9 U) g  t2 d    状态轮询模式---接口自动轮询指定寄存器,直到回读寄存器内容与指定条件匹配。可应用于状态检测,从而实现忙等待等效果。本文不对此模式进行实现介绍,应用实现可参考Cube软件包中QSPI例程。/ o2 [5 p! }; B' o5 g5 C) f6 B
    存储器映射模式---外扩Flash被视为内部存储器,支持AHB主器件直接访问,CPU能够直接运行位于QSPI存储器的执行代码。内部系统架构如下图所示(以STM32F469/F479为例)。本文不对此模式进行实现介绍,应用实现可参考Cube软件包中QSPI例程QSPI_ExecuteInPlace。
2 W6 Y: F/ g! [& @% s
13.jpg : W0 g$ v. {4 M! A6 [. e
* b2 H4 u5 k% ]9 @+ x5 a. N$ }% X9 B
三 QSPI外扩串行Flash实现例
# i) w. w8 G! M9 p1 z$ W
& E+ X' H+ r. ~% i9 {$ h
* t9 I  T# A: y! b: p3.1 串行Flash介绍
' p) m, G4 G! }; N6 [5 N    以MICRON N25Q128A13EF840F为例,更多细节请参考存储器手册。N25Q128A13EF840F引脚图、时序图和电气参数来源于N25Q128A13 手册文档。/ J4 h7 D' a/ A8 G9 I0 e/ N, ]/ y8 G
    支持协议: SPI, Dual I/O(对应Dual-SPI), Quad I/O(对应Quad-SPI)+ g0 J% |9 j1 r" F* F8 _# W$ i
    支持访问模式: 单线访问、双线访问、四线访问,得益于 QSPI接口的灵活可配性,三种访问模式全部支持。
# K- _  @: O8 b0 |- R    供电电压范围: 2.7 ~ 3.6V+ W) h! L: ?3 R5 y  E
    最大时钟频率: 108MHz
. ~( T6 @6 y3 T  t4 A6 u    存储空间: 128Mb (16MB)
. D* H7 x* L$ F8 B    器件引脚示意图如下所示。由两根电源引脚和六根QSPI信号线构成。( l# @6 O& u1 y$ b
14.jpg
6 s. v5 Q7 X. ?9 U    下表为存储器N25Q128A13xxx命令(未列出全部命令)。通过下表可知,存储器提供了灵活的访问实现形式,而结合同样灵活可配的QSPI接口,能够实现存储器命令全支持。而本文仅为提供设计思路,呈现了部分命令在QSPI上的实现。& U/ r. c) T# h& T& W2 Q
15.jpg 8 e6 t' P, a& G: n4 J
    其中,默认读写默认3字节地址,四线快速读命令默认Dummy 周期数为8。; a2 a8 W. z& a3 O0 x' g, i
( q# c9 N5 s5 d  w3 a$ T
3.2 硬件设计5 Q- \+ k) _5 [! Q* Y
    涉及到的信号线少,硬件设计简单,只需直接将QSPI的六根信号线与存储器连接即可。考虑到可测性,可以增加串行电阻或者测试点。硬件电路图如下所示。
1 m1 _/ B1 P2 ~- z  i
16.jpg $ ?0 P; @) ^. g' r) _
        
2 ]! W9 }3 z( }% L    QSPI接口PCB设计遵循如下几点,更多硬件设计内容请参考AN4488。
. N0 E$ j  j8 {& c    a. 线阻 50Ω ± 10%  s/ p+ [+ A; j) [" o
    b. 最大线长 < 120mm/ Q. A1 \# g& L5 C
    c. 避免在不同信号层走信号线1 f- }: h: t% V2 _" L9 _: S/ y
    d. 时钟线至少离其他信号线3倍线宽距离0 ?$ _9 f! w$ O' _2 r0 E; q" k
    e. 数据信号线长差 ≤ 10mm
! a( ?8 r/ e  l! a6 s5 q3 f1 A- G    f. 避免时钟线采用蛇形走线,同时尽量减少数据线上过孔。
4 c. i  b7 _3 O
, v' a' H8 |  t5 o  f; }3.3 软件开发流程
1 M4 o1 X) v; j; u( k+ k  a
17.jpg 3 n; i% o4 A! R0 l9 `

% f* L% }0 r) x( L: K4 S, G4 @: Z! M3.4 软件实现例
0 t0 ^$ [% I2 s6 M  H. V/ N    在环境搭建完成后,就可以利用STM32CubeMX根据硬件连接情况,进行QSPI配置,获取IAR工程。具体软件实现流程如下。
* `" H3 h$ n, c( \3 O
18.jpg
) F9 g2 W$ O' V/ k6 i
) H( H1 d5 |" q- @7 ^' I    a. 利用STM32CubeMX生成IAR工程7 }7 }$ t( d5 c1 J% ~+ ^- p
    打开STM32CubeMX---点击”New project”---在”Part Number Search’中输入STM32F469NI---点击”MCUs Liast”中出现的STM32F469NIHx---点击“Start Project”  此时,基于STM32F469NIHx的STM32CubeMX工程被打开。9 B/ h: `4 \, q; C6 g) D6 G1 o
    如下,根据STM32F469I-DISCO板硬件连接情况(QSPI NCS, CLK, Q0, Q1, Q2, Q3对应PB6, PF10, PF8, PF9, PF7, PF6;外部高速晶振为8MHz无源晶振;调试接口采用SWD接口,其中SWCLK, SWDIO对应PA14, PA13):
! q0 ?5 l. N/ W! f9 O4 z% C/ W选择” QuadSPI”为”Bank1 with Quad SPI Lines”(注:也可在开发过程中,先用STM32CubeMX查看QSPI接口对应的IO引脚,进行硬件开发) 。& }+ Q  q) [$ r2 U! z" M% {7 E( f
    注: 在如上选择后,右侧引脚图中QSPI对应的引脚会呈现绿色显示。需要根据电路图中所连接的QSPI引脚,进行复用引脚确认。例如,在默认情况下,QSPI IO0对应到PC9引脚,而STM32F469I-DISCO板上的QSPI IO0与PF8连接,并非PC9。所以,需要在右侧引脚图中,按住Ctrl键,左键在PC9引脚按下,拖动至PF8处,松开左键和Ctrl键,实现IO0引脚的关联。. X9 j: K8 T1 F5 J1 r: @
    选择“High Speed Clock(HSE)”为“Crystal/Ceramic Resonator”。
7 H6 }0 s( o) L- M) [7 F! i    选择”Debug”为”Serial Wire”+ r1 w% I) e; w8 H( C  R
19.jpg 7 x+ i# a- d, H+ w
. Y5 W8 C  X$ K
    时钟配置如下图所示。设置输入时钟频率为8MHz  选择”HSE”做为PLL倍频时钟源  选择”PLLCLK”做为主频时钟源  设置 “HCLK”为180MHz (FAHB 为180MHz) 点击 Enter键,自动生成对应主频的时钟参数(仅提供时钟配置参考,并不限制一定要设置180MHz主频)。4 I2 N# f% m" k, J
21.jpg
! k. P' G5 F6 T- z6 Y0 `0 w$ e    QSPI配置如下图。参数的配置需要与存储器参数匹配。; r+ C- X0 }& g7 b/ u
    • FIFO Threshold(FIFO阈值) 配置为4,并不严格要求。! I7 @: e$ K, [, _0 B
    • Smaple shift 选择“Sample shifting half cycle”。延后半个时钟,获取数据线上数据。可以使用在由于线路设计,数据信号存在较大延迟的场景。
+ V" p4 R6 A& Z4 M1 z' A$ O
22.jpg : u4 ^; w) f( `8 j
    使能QSPI中断。3 o# [, m% j% u
23.png
" Q4 H  {2 |. h- G    点击菜单栏”Project”---“Settings”---设置”Project Name” , “Project Location” 和 “Toolchain / IDE” 。其中“Toolchain / IDE”设置为EWARM以便生成对应IDE的工程。其他选项保持默认。
0 a1 t; W7 b  s) B. b; U& F    点击菜单栏”Project”---“Generate Code”---等待IAR工程生成,出现”Code Generation”界面---点击”Open Project”打开工程。
1 c" h7 _$ Z% D+ Y* N1 |8 c    b. 完善工程。
- o6 O  B+ G3 ?     由上述步骤获得的IAR工程中,包含了时钟配置及QSPI接口的初始化。对于外扩Flash的操作,还需要 添加外扩Flash支持的命令进行操作。N25Q128A13EF840F支持的部分命令可参见本文3.1小结。
+ t7 [/ O: P; s3 M: B8 q+ ?    在这里出于简化考虑,仅提供了阻塞式读取ID,擦除Flash,块写和快读操作的实现。更多实现模式,可以参考Cube软件包中提供的QSPI例程。6 K% O( A9 B1 h/ ^9 J; D" C$ r
    在N25Q128A13EF840F手册中提供了读ID命令时序,如下图所示。7 r5 v& M6 K9 v+ d* T
25.png * _+ v5 K. p: L. B* Q
    由时序图可知,读ID时序构成: 命令阶段 + 数据阶段。命令阶段和数据阶段线宽都为1,读ID命令码为0x9E或者0x9F,ID数据长度为17字节。
( k" S# ~" y+ z% q# y( t    在N25Q128A13EF840F手册中提供了写使能命令时序,如下图所示。0 ~5 x1 T3 f& V  m9 q3 w
24.jpg " j8 Y( u4 ~+ R2 E
    由时序图可知,块擦除时序仅有命令阶段。命令阶段线宽为1,写使能命令码为0x06。(注:这里仅呈现了单线命令模式的实现。除此之外,STM32 QSPI接口和外扩存储器支持双线、四线模式)。
* \3 o2 j- J7 r; O3 U4 Q    在N25Q128A13EF840F手册中提供了扇区擦除命令时序,如下图所示。
! _* B) V# Z; u, _3 o) j 26.jpg
7 q0 f+ m: A1 G  t; B+ l3 k. E    由时序图可知,扇区擦除时序构成:命令阶段+地址阶段。命令阶段和地址阶段线宽为1,扇区擦除命令码为0xD8。其中地址为24-bit,任一位于需要进行擦除操作的扇区范围内地址都有效。在此简单选择扇区0进行擦除,选择地址为0。(注:这里仅呈现了单线命令模式的实现。除此之外,STM32 QSPI接口和外扩存储器支持双线、四线模式)。- B1 \6 A" J. Z3 S( O0 b+ ]
    在N25Q128A13EF840F手册中提供了四线快速写命令时序,如下图所示。: N5 f/ j8 S3 H/ A: t# Z: g$ l
27.jpg ( {; U) d& ~* c- x+ S7 q& Y* G; v
    由时序图可知,四线快速写命令时序构成:命令阶段+地址阶段+数据阶段。命令阶段和地址阶段线宽为1,数据阶段线宽为4,四线快速写命令码为0x32。其中地址为24-bit,对应写入起始地址。(注:这里仅呈现了单线命令模式的实现。除此之外,STM32 QSPI接口和外扩存储器支持双线、四线模式)。' S4 V( m# `4 g' R" M4 X2 q9 f
    在N25Q128A13EF840F手册中提供了四线快速读命令时序,如下图所示。- A3 E! Y+ E/ N* u5 Q6 M
28.jpg
7 m4 w0 _1 o( W; G& B    由时序图可知,四线快速读命令时序构成:命令阶段+地址阶段+数据阶段。命令阶段和地址阶段线宽为1,数据阶段线宽为4,四线快速读命令码为0x6B。其中地址为24-bit,对应写入起始地址。四线快速读命令默认Dummy cycles为8。(注:这里仅呈现了单线命令模式的实现。除此之外,STM32 QSPI接口和外扩存储器支持双线、四线模式)。
  ]& L. q$ d2 n+ q# N    在main.c \ main函数中,增加代码如下。" Z" U- o! W; ^+ \
29.jpg 2 r# _* M: {7 x' Y
31.jpg
7 P7 Z8 Q" o. H" [5 a: ?: q 32.jpg 0 C* p4 I+ H5 d8 O. K0 @8 }
33.jpg 1 a0 \& Y, W. ]- c# c5 S4 Q6 S

: B1 @" y# |4 l; s$ F9 b( {8 Y! y
% X+ ^- k+ E) O2 J# K四 小结3 S1 ?( k$ R  O, |7 c
    STM32的QuadSPI接口灵活可配,对于命令阶段、地址阶段、复用字节阶段、Dummy阶段和数据阶段都可以进行配置。基于这种灵活性,能够实现市面上SPI、Dual IO、Quad IO的串行Flash支持。但出于简化考虑,QSPI支持的中断访问及DMA访问等更多功能没有在本文进行介绍,更多实现可以参考ST提供的Cube软件包中的QSPI例程。另外,不同厂家的串行Flash命令及操作实现略有差异,具体以采用的Flash文档描述为准。
! f1 ~, U2 K; n* j0 q5 W

$ E5 w) z, S( y: W- `5 t/ G0 [9 O) E
. ~( t# ]( C! }: H7 V4 Z% P" g7 @文档下载1>>         文档下载2>>       更多实战经验>>3 Q: z: Z" s+ f8 U$ ?- p2 n1 h

/ Y1 x+ y+ K1 H! o+ m: v; M; X# {3 d8 G. C- }% U$ l
赞 收藏 2 评论5 发布时间:2017-9-28 15:51

举报

5个回答
斜阳 回答时间:2017-9-28 16:38:42
mark一下
heweijian55 回答时间:2017-10-26 14:30:09
6 e& \- B! G  B/ R) h4 s. 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管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版