STM32硬件基础--QaudSPI总线读写片外FLASH(一)

【海东青电子原创文章,转载请注明出处:https://www.jianshu.com/p/f22afca42c57

(文中代码下载地址:https://github.com/haidongqing/qspi-readid

STM32F746G-DISCO开发板上,通过QaudSPI接口连接了一片MICRON公司的NOR FLASH,型号为 N25Q128A13EF840E 。这里涉及了2个方面的技术问题:

1)Qaud SPI 总线接口;

2)ST MCU如何通过Qaud SPI 接口读写NOR FLASH。

先来看看什么是Qaud SPI,它是SPI的“升级版”,也有简写成QSPI的,称为四线SPI,可以理解为在传统的SPI总线上,扩充了4条“双向”数据线。这样,Qaud SPI就有6根线:片选信号CS、时钟CLK、数据线D0-D3(SPI是4根线:CS、CLK、MISO、MOSI)。功能的增强一定带来新的复杂性,QSPI也不例外 ---- 相比较SPI而言,QSPI不再是只按照CLK的时钟时序读或写数据那么简单了,而是需要先发送“命令”才能读写数据。所以,QSPI总线的驱动、编程要复杂一些。

为了简化QSPI的编程、使用,STM32系列MCU在内部增加了一个QSPI控制器,通过一些相关的寄存器控制对QSPI的操作。总体而言,QSPI有3种工作模式:单线(Single,或Extended)、双线(Daul)和四线(Qaud),其中四线SPI最常用(显然,这种模式下数据吞吐率最大、效率最高),这也是我们下面要讨论的重点。


图一

上图是STM32F746用户手册中QaudSPI功能框图(单BANK的情形,746也支持双BANK模式,此处不作讨论),可见MCU与FLASH之间就是6根信号线。

既然我们关心的是如果读写FLASH,就得先看看FLASH这个外部器件对读写数据有哪些要求(时序,读写命令等)。

首先,FLASH在进入“常规工作”状态之前,需要先进行“配置”,即参数初始化,比如QSPI总线模式、读数据延迟周期等。N25Q内部有2种类型的配置寄存器:Nonvolatile Configuration Register 和 Volatile Configuration Register,前者是非易失的,后者是易失的。读配置寄存器有相应的命令:


图二


图三

这是很简单的读取命令,MCU通过QSPI总线发送一个命令字 B5 ,FLASH接收到之后,在数据线上送出配置寄存器中的内容。写配置寄存器如下:


图四

发送2个字节:命令字 B1 + 一字节配置内容,总共16 bit。读写配置寄存器的时序图比较简单,但这个是基础,读懂了图二、图四的时序图,就能读懂下面稍复杂一些的时序图。

第二,读出数据的具体操作。最简单的,是先读出FLASH的ID。任何一个厂家的FLASH器件,内部都有一个device id,以及一些扩展信息,说明这个FLASH的生产商、芯片容量等基础参数。


图五

测试时,使用了READ ID(9E) 命令,它只能用于Extended模式。注意上图的 Notes 2 :


图六

表明此命令不需要地址,读延迟周期(Dummy clock cycles)为0,即不需要。请注意 Dummy clock cycles 这个参数,这是个非常重要的参数,在读取FLAHS数据时,从发出读命令,到FLASH将数据送上数据线,是需要一定时间的,这个时间就是 Dummy clock cycles,后面讲到对FLASH读数据时还会重点提到。正确读出ID的结果会是这样的:


图七

读ID ,得到的数据(前3个)是:20h,BAh,18h。

(注:JEDEC,Joint Electron Device Engineering Council,JEDEC固态技术协会,EIA的分支,FLASH厂家的ID应该是由这个标准化组织分配的)

好了,我们就只先做最简单的一步:如何读出FLAHS的ID。MCU这一端的工作,主要是使用CubeMX正确配置QaudSPI,并编写代码访问FLASH。先看看STM32F746G-DISCO 开发板的原理图、确定QSPI用到的pin:


图八


图九


图十

运行STM32Cube,选择STM32F746NG芯片,配置RCC、SYS和时钟:


图十一


图十二


图十三

最后是主角:QaudSPI:


图十四

上图中,

1、选择QSPI的四线模式。

2、FLASH的时钟频率,选择对HCLK 2分频,就是 216/(1+1) = 108 MHz,正好是N25Q芯片的最高可用频率(见;N25Q数据手册)。---- 之前这个参数设置成了2,是错误的,感谢网友 “海鸦” 的提醒!!

3、QSPI针对读写数据设计了FIFO缓冲区,这是缓冲区长度。

4、选择延迟半个时钟采样周期、利于适应FLASH的可能延迟,见图十五。

5、N25Q容量是128Mbit,即16MByte,那么按字节寻址的话有16M个地址,16M = 2的24次方,所以填写24。

6、连续2个命令之间需要的延迟间隔时间(时钟周期)。QSPI每次向FLASH发送命令,片选信号CS都有一个拉低、再拉高的过程,2个命令之间CS保持高电平(无效状态),这个高电平保持多久,称为 Chip Select High Time(见图十六)。N25Q要求这个时间最小是50ns(见图十七),FLASH时钟是108MHz,50ns/(1/108MHz) = 5.4,即最小需要5.4个时钟周期,所以这里选择了6。

7、Clock Mode,空闲时CLK的电平状态,似无大碍,这里选了low(模式0;如果high,是模式3)。

图十五


图十六


图十七

QaudSPI的配置还没完事,还需要检查GPIO的复用功能是否配置正确(这是有血的教训的,见这里)。CubeMX默认的QSPI管脚配置是:


图十八

需要按下图重新分配pin:


图十九

生成KEIL代码。main.c中,函数 MX_QUADSPI_Init() 是CubeMX生成的QSPI的初始化函数。

先定义一个常数数组,包含了N25Q的ID信息:

const uint8_t bN25Q_ID[BUFFERSIZE] = {0x20, 0xBA, 0x18};               //Manufacturer ID, Memory Type, Memory Capacity

然后读FLASH:


图二十

sCommand 是 QSPI_CommandTypeDef 类型的结构体,负责配置命令模式、命令字、数据格式、数据长度等关键信息,然后调用 HAL_QSPI_Command() 发送命令。在  HAL_QSPI_Command() 内部又调用了 QSPI_Config(),通过写QSPI相关的一些寄存器最终实现发送命令的操作。在调用 QSPI_Config() 时,使用了一个重要的参数:QSPI_FUNCTIONAL_MODE_INDIRECT_WRITE,它约定了QSPI在此次与FLASH的会话中,使用的是QSPI的“间接操作模式”(QSPI有三种操作模式,详情将在下一讲中介绍,预留链接)。

读出ID结果如下:


图二十一

读出的数值确实是 20h,BAh,18h;开发板背面的LED慢闪,表明读取ID正确(如果出错,LED将快闪)。

本例的代码下载地址:https://github.com/haidongqing/qspi-readid

下一节将介绍QSPI的三种操作模式、并实现读FLASH数据:《STM32硬件基础--QaudSPI总线读写片外FLASH(二)》


补充:关于QaudSPI的时钟频率


图二十二

分频系数数值+1,是真正的分频倍数。为了2分频,应该将 PRESCALER 参数设置为1;如果设置为2,就是3分频了,QaudSPI时钟频率更低了,程序仍能正常执行,只不过读写速率降低了、效率低了。经测试,如果将 PRESCALER 参数设置为0,QaudSPI时钟频率==HCLK 了,超出了最大频率范围,读出的ID是错误的。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,504评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,434评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,089评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,378评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,472评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,506评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,519评论 3 413
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,292评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,738评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,022评论 2 329
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,194评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,873评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,536评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,162评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,413评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,075评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,080评论 2 352