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

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

[复制链接]
zero99 发布时间:2017-9-28 15:51
利用 QuadSPI外扩 串行 NOR Flash的实现
  z9 o  b7 q8 |; c: k( U$ m
前言
, W. G) c9 n2 I1 p4 X% I3 P9 [STM32提供了灵活多样的外扩存储器访问实现。本文中,介绍如何利用QSPI (QuadSPI) 外扩串行NOR Flash存储器。首先对QSPI接口功能特性进行介绍,然后分别介绍硬件设计和软件开发。并基于STM32CubeMX,提供访问MICRON N25Q128A13EF840F的实现参考。" @9 L6 p+ F* f2 x9 d

$ }$ r) ]" v& \/ O7 r6 r) s6 L5 y一 实现环境
  P" r/ P- g& m8 Q    开发板:STM32F469G-DISCO
( Z/ m. h$ ?2 G1 X    开发库:STM32CubeF4 v1.16.0
* d2 E" t' n# e# |1 y* K( F; n    STM32CubeMX: v4.22.0
7 z" F2 P3 Z/ e, i    集成开发环境:IAR v7.70.1.114862 Z& U8 g$ S2 H% e

! P& N7 {3 \( k  {: A( C    实现过程在STM32F469I-DISCO板上展开,利用板上已有的串行NOR Flash存储器(MICRON N25Q128A13EF840F)。呈现整个开发涉及环节。在本文中,首先根据QSPI接口,介绍QSPI与外扩串行存储器硬件连接。另外,Cube软件包中包含QSPI实现例,在本文对库中实现的QSPI例不做讨论,读者也可参考这些QSPI例进行设计。本文围绕由STM32CubeMX生成的工程,介绍如何实现对外扩串行NOR Flash存储器的访问。
+ D* Y' o4 p+ G) K
( C& n/ j. D2 i. _/ d' a6 L二 QSPI介绍
$ H/ K: C! Y- n( S4 O% m0 ]    在呈现QSPI访问外扩Flash的实现例前, 需要对QSPI有一定的了解,在此对QSPI进行简短的介绍。更多内容请参考AN4760。# v9 t4 }/ d, q* r) w' y
    QSPI(Quad-SPI)支持四线串行访问形式。同时,QSPI支持传统SPI和Dual-SPI模式,Dual-SPI模式支持两线串行访问。与FMC/FSMC比较,QSPI支持更低成本、更小封装外部串行Flash存储器,更少的IO引脚占用,有效减少PCB面积,降低PCB设计复杂度。- l4 P' O7 u1 j( Q- c+ }
    QSPI在不同系列STM32产品线的支持情况(仅部分罗列,未涵盖所有支持型号)。
; J2 K: p" i  N
11.jpg $ E9 Y+ J" R" X1 B
        
( C8 }) C2 z& K3 @    QSPI接口提供了灵活可配置的5个阶段,如下图所示(仅用于理解阶段构成,时序图根据配置不同存在差异)。分别是命令阶段、地址阶段、复用字节阶段、Dummy阶段和数据阶段。可以根据外扩Flash中命令时序对不同阶段进行配置。后续会以实例进行呈现。更多内容请参考AN4760。
/ G& z! w" J! I! v6 W
12.jpg / F8 L0 S9 {$ ~) Q* X, y# j' q0 f
    QSPI支持三种模式,分别是:
& I( }- a; }9 M    间接模式---所有操作通过QSPI寄存器实现,类似于传统SPI,可以使用阻塞模式、中断模式或者DMA模式进行读写等访问。本文中提供的实现例为间接模式下的实现。/ B) J8 P; E- C% P
    状态轮询模式---接口自动轮询指定寄存器,直到回读寄存器内容与指定条件匹配。可应用于状态检测,从而实现忙等待等效果。本文不对此模式进行实现介绍,应用实现可参考Cube软件包中QSPI例程。
1 [# B! b: q; a$ A' ?4 T; i6 C    存储器映射模式---外扩Flash被视为内部存储器,支持AHB主器件直接访问,CPU能够直接运行位于QSPI存储器的执行代码。内部系统架构如下图所示(以STM32F469/F479为例)。本文不对此模式进行实现介绍,应用实现可参考Cube软件包中QSPI例程QSPI_ExecuteInPlace。/ y, r# ~) q3 y+ `% B1 P
13.jpg + K: T) T8 r0 I4 m, ~4 Q
: x. o, d5 O+ ?
三 QSPI外扩串行Flash实现例
- i( V( {7 e: [) A2 }; U8 [6 s3 x3 f' H

* S( B( E3 U8 K7 x) N3.1 串行Flash介绍
2 J8 g2 U  S* b; h* B7 E; F    以MICRON N25Q128A13EF840F为例,更多细节请参考存储器手册。N25Q128A13EF840F引脚图、时序图和电气参数来源于N25Q128A13 手册文档。
" z% D3 k( S3 y* s& `: {7 f    支持协议: SPI, Dual I/O(对应Dual-SPI), Quad I/O(对应Quad-SPI)! ?# i+ ~5 c, a7 e& L! b# q0 i' W0 U
    支持访问模式: 单线访问、双线访问、四线访问,得益于 QSPI接口的灵活可配性,三种访问模式全部支持。
! K% i4 w, l# m6 T    供电电压范围: 2.7 ~ 3.6V
; B5 K$ Q( g' J# L    最大时钟频率: 108MHz( p" h, P( ^" S1 m" Z# q5 A
    存储空间: 128Mb (16MB)
; l7 P7 Q! T1 I  T7 q; ]  I+ b    器件引脚示意图如下所示。由两根电源引脚和六根QSPI信号线构成。' m7 ~3 _5 B* m$ E
14.jpg
: _& `  S" `2 u" K    下表为存储器N25Q128A13xxx命令(未列出全部命令)。通过下表可知,存储器提供了灵活的访问实现形式,而结合同样灵活可配的QSPI接口,能够实现存储器命令全支持。而本文仅为提供设计思路,呈现了部分命令在QSPI上的实现。/ D, |- m* O# k& D. e4 J
15.jpg
# C% }6 m, @) f+ s    其中,默认读写默认3字节地址,四线快速读命令默认Dummy 周期数为8。- `' R6 w8 M) G- v; r

4 P! D$ E6 r( d3.2 硬件设计
% {% m7 n) U) R9 s& [$ }$ N    涉及到的信号线少,硬件设计简单,只需直接将QSPI的六根信号线与存储器连接即可。考虑到可测性,可以增加串行电阻或者测试点。硬件电路图如下所示。8 n0 K" R& W2 j: ^+ H
16.jpg ' q" o2 W, T6 e& R- J0 z
        
: C7 ]$ b  ~6 z    QSPI接口PCB设计遵循如下几点,更多硬件设计内容请参考AN4488。1 M! i7 i& p7 _4 \0 W2 n
    a. 线阻 50Ω ± 10%
$ g0 u5 `0 ?4 U1 Y    b. 最大线长 < 120mm
# b: u# m% j- w9 x2 d, g; k) G    c. 避免在不同信号层走信号线6 n3 G' Q! K0 _) I3 I
    d. 时钟线至少离其他信号线3倍线宽距离; }* c: N% W. T/ d
    e. 数据信号线长差 ≤ 10mm
; M% U- N4 \/ j, M  _7 G( f    f. 避免时钟线采用蛇形走线,同时尽量减少数据线上过孔。
( T8 C& M3 \4 x5 z& n9 ]0 c9 A1 i% J- \% P3 {
3.3 软件开发流程' e& H1 q( B( q: U  R
17.jpg
6 p5 T6 z+ j2 Q$ `! |4 j3 J" D, c/ G- \3 z% u, K( `
3.4 软件实现例( R/ h7 f( l1 W. s" u( J
    在环境搭建完成后,就可以利用STM32CubeMX根据硬件连接情况,进行QSPI配置,获取IAR工程。具体软件实现流程如下。- Y0 ~8 ^  R7 q3 [: \3 P
18.jpg * D+ d: |2 P2 t6 o% @
) g6 W5 r8 Q6 k% p% v
    a. 利用STM32CubeMX生成IAR工程
( p& W$ ]6 f: {7 \    打开STM32CubeMX---点击”New project”---在”Part Number Search’中输入STM32F469NI---点击”MCUs Liast”中出现的STM32F469NIHx---点击“Start Project”  此时,基于STM32F469NIHx的STM32CubeMX工程被打开。: n8 H# D% R0 D0 D# H- [7 l9 G
    如下,根据STM32F469I-DISCO板硬件连接情况(QSPI NCS, CLK, Q0, Q1, Q2, Q3对应PB6, PF10, PF8, PF9, PF7, PF6;外部高速晶振为8MHz无源晶振;调试接口采用SWD接口,其中SWCLK, SWDIO对应PA14, PA13):
$ E* @6 g1 I. S5 }+ w" L7 U选择” QuadSPI”为”Bank1 with Quad SPI Lines”(注:也可在开发过程中,先用STM32CubeMX查看QSPI接口对应的IO引脚,进行硬件开发) 。" Z2 @9 F0 V  i* v
    注: 在如上选择后,右侧引脚图中QSPI对应的引脚会呈现绿色显示。需要根据电路图中所连接的QSPI引脚,进行复用引脚确认。例如,在默认情况下,QSPI IO0对应到PC9引脚,而STM32F469I-DISCO板上的QSPI IO0与PF8连接,并非PC9。所以,需要在右侧引脚图中,按住Ctrl键,左键在PC9引脚按下,拖动至PF8处,松开左键和Ctrl键,实现IO0引脚的关联。
! o: i: D8 s$ N3 ?+ b1 ?8 ]    选择“High Speed Clock(HSE)”为“Crystal/Ceramic Resonator”。1 g& x# W7 o2 |# n- M, C8 h2 V1 i
    选择”Debug”为”Serial Wire”" C5 d3 V% G4 u0 \5 w1 b+ K
19.jpg 2 d( m: Z$ S( q& K
8 N) C$ o: R' w- O; z
    时钟配置如下图所示。设置输入时钟频率为8MHz  选择”HSE”做为PLL倍频时钟源  选择”PLLCLK”做为主频时钟源  设置 “HCLK”为180MHz (FAHB 为180MHz) 点击 Enter键,自动生成对应主频的时钟参数(仅提供时钟配置参考,并不限制一定要设置180MHz主频)。
3 p9 h$ W. j+ u! }
21.jpg ; B- o6 [- f/ w( ^& T3 w; `
    QSPI配置如下图。参数的配置需要与存储器参数匹配。2 h' Z. a8 [' z+ P. z3 m  L
    • FIFO Threshold(FIFO阈值) 配置为4,并不严格要求。8 a& b) n: w8 N; j, E) W
    • Smaple shift 选择“Sample shifting half cycle”。延后半个时钟,获取数据线上数据。可以使用在由于线路设计,数据信号存在较大延迟的场景。
/ w/ \' r7 h% A
22.jpg
/ S+ O! Z& f" u9 Q    使能QSPI中断。8 k, q; T2 y, a' y( K
23.png
5 ]  z/ l( l8 _    点击菜单栏”Project”---“Settings”---设置”Project Name” , “Project Location” 和 “Toolchain / IDE” 。其中“Toolchain / IDE”设置为EWARM以便生成对应IDE的工程。其他选项保持默认。9 {$ S: y0 n" q  o' T8 x
    点击菜单栏”Project”---“Generate Code”---等待IAR工程生成,出现”Code Generation”界面---点击”Open Project”打开工程。
% s# K3 o; L$ H4 i+ X; p! U    b. 完善工程。1 L2 G% l. N* [( i
     由上述步骤获得的IAR工程中,包含了时钟配置及QSPI接口的初始化。对于外扩Flash的操作,还需要 添加外扩Flash支持的命令进行操作。N25Q128A13EF840F支持的部分命令可参见本文3.1小结。5 c5 L" M% p$ @( \
    在这里出于简化考虑,仅提供了阻塞式读取ID,擦除Flash,块写和快读操作的实现。更多实现模式,可以参考Cube软件包中提供的QSPI例程。6 n+ b, z/ t2 \; f1 U; {0 A4 f
    在N25Q128A13EF840F手册中提供了读ID命令时序,如下图所示。" h/ X0 y1 U6 K0 y4 R$ T
25.png
0 k; J2 S) e: n' s    由时序图可知,读ID时序构成: 命令阶段 + 数据阶段。命令阶段和数据阶段线宽都为1,读ID命令码为0x9E或者0x9F,ID数据长度为17字节。
2 a9 u/ ]: N" H8 O  J& l/ M    在N25Q128A13EF840F手册中提供了写使能命令时序,如下图所示。
; p1 P+ |2 L$ t4 Z% _0 T 24.jpg
% x- q, _* w# h8 R  O1 q5 f    由时序图可知,块擦除时序仅有命令阶段。命令阶段线宽为1,写使能命令码为0x06。(注:这里仅呈现了单线命令模式的实现。除此之外,STM32 QSPI接口和外扩存储器支持双线、四线模式)。
. K, u& w) ~  ]6 n    在N25Q128A13EF840F手册中提供了扇区擦除命令时序,如下图所示。
& j2 G) j- H' N 26.jpg
5 ^/ Q% S& r& ~$ W; q% A5 y    由时序图可知,扇区擦除时序构成:命令阶段+地址阶段。命令阶段和地址阶段线宽为1,扇区擦除命令码为0xD8。其中地址为24-bit,任一位于需要进行擦除操作的扇区范围内地址都有效。在此简单选择扇区0进行擦除,选择地址为0。(注:这里仅呈现了单线命令模式的实现。除此之外,STM32 QSPI接口和外扩存储器支持双线、四线模式)。, f; V: }" g3 b8 E
    在N25Q128A13EF840F手册中提供了四线快速写命令时序,如下图所示。
+ w8 y6 o# o( i! X* Z 27.jpg
9 M% n" m( |% [8 C( C- a3 d+ f  s+ k    由时序图可知,四线快速写命令时序构成:命令阶段+地址阶段+数据阶段。命令阶段和地址阶段线宽为1,数据阶段线宽为4,四线快速写命令码为0x32。其中地址为24-bit,对应写入起始地址。(注:这里仅呈现了单线命令模式的实现。除此之外,STM32 QSPI接口和外扩存储器支持双线、四线模式)。
5 `! M& e4 K! J& ?* m+ q6 e+ U& K    在N25Q128A13EF840F手册中提供了四线快速读命令时序,如下图所示。, e8 \8 l: I+ ]+ ~
28.jpg 9 d0 P2 Y3 c9 E8 _" T9 M! C. m
    由时序图可知,四线快速读命令时序构成:命令阶段+地址阶段+数据阶段。命令阶段和地址阶段线宽为1,数据阶段线宽为4,四线快速读命令码为0x6B。其中地址为24-bit,对应写入起始地址。四线快速读命令默认Dummy cycles为8。(注:这里仅呈现了单线命令模式的实现。除此之外,STM32 QSPI接口和外扩存储器支持双线、四线模式)。
: F7 g% F. C7 n0 h8 H  ]/ @: E! S& @    在main.c \ main函数中,增加代码如下。
8 ]1 i9 ^$ a0 `6 o# G3 M% u+ d" ?. B 29.jpg
; O! T5 g: |/ z: H; t) H 31.jpg
8 p+ {( O  D5 j 32.jpg
# k4 B( @. z9 u+ R- X4 O+ r' r 33.jpg
( @) B2 ]4 H/ S, X" e( e 2 v# j' D# v$ ^: }! b) H

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

  Y1 p6 D& ?$ P2 x' Y
, T$ Y2 q! i: y# ]8 [; e( ]# _6 D' x
文档下载1>>         文档下载2>>       更多实战经验>>8 G- ^& P8 P" B+ C' ]
" M/ ~8 F& p; ?! C* k8 @
5 R; L( r6 F8 V
收藏 2 评论5 发布时间:2017-9-28 15:51

举报

5个回答
斜阳 回答时间:2017-9-28 16:38:42
mark一下
heweijian55 回答时间:2017-10-26 14:30:09

$ M" G( _$ `2 Q6 S7 U! i# `+ vmark一下
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 手机版