打印
[应用相关]

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

[复制链接]
1202|36
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
【海东青电子原创**,转载请注明出处: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。



作者:海东青电子
链接:https://www.jianshu.com/p/f22afca42c57
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

使用特权

评论回复
沙发
phosphate|  楼主 | 2020-6-26 13:22 | 只看该作者
先来看看什么是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总线的驱动、编程要复杂一些。

使用特权

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

使用特权

评论回复
地板
phosphate|  楼主 | 2020-6-26 13:24 | 只看该作者


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

使用特权

评论回复
5
phosphate|  楼主 | 2020-6-26 13:25 | 只看该作者
既然我们关心的是如果读写FLASH,就得先看看FLASH这个外部器件对读写数据有哪些要求(时序,读写命令等)。

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


使用特权

评论回复
6
phosphate|  楼主 | 2020-6-26 13:25 | 只看该作者
这是很简单的读取命令,MCU通过QSPI总线发送一个命令字 B5 ,FLASH接收到之后,在数据线上送出配置寄存器中的内容。写配置寄存器如下:

使用特权

评论回复
7
phosphate|  楼主 | 2020-6-26 13:26 | 只看该作者
发送2个字节:命令字 B1 + 一字节配置内容,总共16 bit。读写配置寄存器的时序图比较简单,但这个是基础,读懂了图二、图四的时序图,就能读懂下面稍复杂一些的时序图。

使用特权

评论回复
8
phosphate|  楼主 | 2020-6-26 13:27 | 只看该作者
第二,读出数据的具体操作。最简单的,是先读出FLASH的ID。任何一个厂家的FLASH器件,内部都有一个device id,以及一些扩展信息,说明这个FLASH的生产商、芯片容量等基础参数。

使用特权

评论回复
9
phosphate|  楼主 | 2020-6-26 13:27 | 只看该作者
测试时,使用了READ ID(9E) 命令,它只能用于Extended模式。注意上图的 Notes 2 :

使用特权

评论回复
10
phosphate|  楼主 | 2020-6-26 13:31 | 只看该作者
表明此命令不需要地址,读延迟周期(Dummy clock cycles)为0,即不需要。请注意 Dummy clock cycles 这个参数,这是个非常重要的参数,在读取FLAHS数据时,从发出读命令,到FLASH将数据送上数据线,是需要一定时间的,这个时间就是 Dummy clock cycles,后面讲到对FLASH读数据时还会重点提到。

使用特权

评论回复
11
phosphate|  楼主 | 2020-6-26 13:32 | 只看该作者
正确读出ID的结果会是这样的:

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

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

使用特权

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



使用特权

评论回复
13
phosphate|  楼主 | 2020-6-26 13:34 | 只看该作者
运行STM32Cube,选择STM32F746NG芯片,配置RCC、SYS和时钟:


使用特权

评论回复
14
phosphate|  楼主 | 2020-6-26 13:34 | 只看该作者
最后是主角:QaudSPI:

使用特权

评论回复
15
phosphate|  楼主 | 2020-6-26 13:35 | 只看该作者
上图中,

1、选择QSPI的四线模式。

使用特权

评论回复
16
phosphate|  楼主 | 2020-6-26 13:36 | 只看该作者
2、FLASH的时钟频率,选择对HCLK 2分频,就是 216/(1+1) = 108 MHz,正好是N25Q芯片的最高可用频率(见;N25Q数据手册)。---- 之前这个参数设置成了2,是错误的,感谢网友 “海鸦” 的提醒!!

使用特权

评论回复
17
phosphate|  楼主 | 2020-6-26 13:37 | 只看该作者
3、QSPI针对读写数据设计了FIFO缓冲区,这是缓冲区长度。

使用特权

评论回复
18
phosphate|  楼主 | 2020-6-26 13:37 | 只看该作者
4、选择延迟半个时钟采样周期、利于适应FLASH的可能延迟,见图十五。

使用特权

评论回复
19
phosphate|  楼主 | 2020-6-26 13:38 | 只看该作者
5、N25Q容量是128Mbit,即16MByte,那么按字节寻址的话有16M个地址,16M = 2的24次方,所以填写24。

使用特权

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

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

32

主题

393

帖子

1

粉丝