基于STM32F7通过cube软件配置:读写QSPI接口64M flash和64M PSRAM参考教程
核心板:NUCLEO-F767ZI
Flash:NM25Q64EB(64M)
PSRAM:IPS6404L(64M)
配置文件请使用stm32cubemx打开
程序请使用keil5MDK打开
NUCLEO-F767ZI上引出的QSPI引脚如下,NM25Q64EB和IPS6404L都是分别接到同样引脚:
PB2————CLK
PB6————NCS
PD11———–IO0
PD12———–IO1
PE2————-IO2
PD13———–IO3
1、 NM25Q64EB及IPS6404L的简介
(1) NM25Q64EB是一款容量64Mbit(8Mbyte)的flash。
内部存储单元的数量关系如下:1个块(block)容量为65535byte,包含16扇区(sector)。1个扇区容量为4096byte,包含16页(page)。每页的容量为256byte。
NM25Q64EB默认为SPI1线通讯,当开启QSPI模式时,为4线通讯,大大增加了通讯的速度。芯片支持的时钟频率最高可到达104MHz。
(2) IPS6404L时一款容量64Mbit(8Mbyte)的PSRAM,同样采用QSPI接口。在2.7V~3.6V供电下,最高时钟频率为104MHz。
2、 STM32CUBEMX的配置。
(1) 芯片的选择:选择和板上同款的芯片型 (STM32F767ZI)
(2) 引脚的配置:在图形化配置界面直接左键对应引脚,在本次实验中我们引出一个QSPI引脚和串口3的引脚(PD8,PD9),QSPI和USART3的引脚和核心板一致。
图形化界面配置完成后,在引脚模式处进行选择,QSPI选择Bank1 with Quad SPI lines,USART3选择Asynchronous。
(3) 时钟的配置:点开clock configuration,核心板没有外接晶振,所以我们使用内部时钟HSI,按照下图配置,最高的系统时钟为216MHZ。
(4) 外设的配置
频率配置:对于NM25Q64EB来说,最高频率可达104MHz,分频系数选择3,则QSPI的频率为216/(3+1)=54MHZ,经测试,这个频率是比较合适的;
FIFO的阈值设置:4字节;
Flash size配置:NM25Q64EB为8Mbyte,2^23=8M,所以取权值23-1=22;
Chip select high time:即片选的高电平时间,按照芯片的数据手册,tSHSL要求大于20ns,对于我们的时钟54MHZ来说,1/54MHZ=18.5ns,所以我们要配置2个cycle,就能满足要求,此处配置为4 cycles。即18.5ns*4=74ns>20ns;
Dual flash 配置:是否采用双闪存模式,我们只使用BANK1的接口,此处配置为DISABLE.
整体的配置如下图的QUSDSPI CONFIGURATION.
串口的配置:波特率设置为115200,8字节数据长度,没有校验位,1个停止位。如下图配置。
到此处配置全部完成,点击工具栏的黄色小齿轮,配置工程信息,包括工程的命名和IDE的选择,再点击OK,即可生成工程。
3、 NM25Q64EB读写的移植
在完成了QSPI基础配置后,我们还需要加入QSPI的3个函数, NM25Q64EB的读取的一系列函数。
(1)对于发送指令,我们要关注的是它的指令码(instruction),发送地址(address),指令的模式(instructionmode),空指令周期数(dummycycles),地址的长度(addresssize),数据模式(datamode)等。
以下是QSPI的3个函数,对指令配置的函数,QSPI发送,QSPI接收。函数的参数和以上提到的一致。
指令配置模式
QSPI发送
QSPI接收
(2)接下来我们利用以上3个函数,对NM25Q64EB进行操作。
对flash的操作过程,就是利用QSPI接口,往NM25Q64EB发送不同的指令码,来实现不同的功能。基础的功能包括:进入QPI,退出QPI,读取ID,擦除,读,写等。
接下来,我们举几个有特征的指令进行说明。
0x90指令:在数据手册中,我们可以看到0x90是读取Device ID(REMS)的指令,从electronic identification中可知发送0x90后,会返还2byte的ID,包括1byte manufacturer ID和1byte device ID。从Table9中来看,第一列说明了指令的功能,第三四列说明了该指令对应的模式(QPI or SPI),从5-7行可以看到0x90的地址长度(addresssize)为3byte,即24bit。Dummycycle为0 。这些信息都会在配置函数中使用到。
了解了上面的信息后,我们开始来配置读取ID的函数。上一个标题我们介绍了QSPI的3个函数,包括配置函数,接收函数,发送函数。这里我们就用到了前两个,先配置,再接收传回的2字节地址。
函数中的if…else…可选择在QPI模式下(4线)发送,或者SPI模式下(单线)发送。以QPI模式为例,往QSPI_Send_CMD(…,…,…,…,…,…,…)中填入参数,下图的函数共有7个参数.
第一个参数是指令码0x90;(看Table9)
第二个参数是指令发送的地址0;
第三个参数是dummycycles:0;(看Table9)
第四个参数是指令模式:选择4线;
第五个参数是地址模式:选择4线;
第六个参数是地址长度:选择24bits;(看Table9)
第七个参数是数据模式:选择4线。
temp的操作是将temp[0]和temp[1]这2字节数据通过移位操作,赋值给deviceid,方便一次性打印出来。打印出来的数据为0x5216即为读取成功。可进行下一步读写操作。
0x38指令:
从Table8可知,该指令的功能是使能QPI,该指令对比0x90,他只能在SPI模式下使用,且无返还的数据。同样0xFF,是失能QPI的指令,只能在QPI模式下使用,所以我们配置如下:
在Qspi_Enable的函数中,涉及到了NM25Q64EB的状态寄存器。NM25Q64共有3个状态寄存器,决定QPI是否使能(QE)的寄存器是第二个(status register2),位从下表中查得是第3位,我们先将状态寄存器3得到值(stareg2)读出来,再和00000100(0x04)做一个与运算,如果该位不为1,则往该位写入1,即1<<2左移运算得到00000100,再和状态寄存器原始状态stareg2做一个或运算。
其他指令跟以上两个指令的配置方式类似,查询指令表,将不同功能的指令码和模式作为参数写进QSPI_Send_CMD即可。
其他事项:
Ⅰ、dummycycles一般情况下都是0,只有在各种Read操作的时候需要用到,可以理解为,在接收到指令后延时一小段时间,再读取返回值。从如下时序图就可以直观看出。
Ⅱ、在状态寄存器1的第一位是busy的标志位,可以通过检测该位,知道各种操作是否完成,检测完成再进行下一个指令的操作。
Ⅲ、在配置SET_PARAM时,通过配置第4,5位来选择不同的cycles和frequent。此处配置为00011000,即3<<4。
(3) 到此为止,我们完成了QSPI和NM25Q64EB的全部配置,整理以下该工程的函数所属。核心文件有:
qspi.c(存放QSPI的引脚配置和QSPI时钟等配置,是由stm32cubemx生成的,另外包括3个自己写的函数:QSPI_Send_CMD、QSPI_Receive、QSPI_Transmit);
w25qxx.c(存放NM25Q64EB的一系列函数,包括读ID,读,写,擦除,QPI使能等)
实验过程中,我们在main函数中调用NM25Q64EB的一系列函数进行测试读写功能:
Ⅰ、先读取ID是否等于0x5216;
Ⅱ、flash的大小,在读写的时候,读写的起始地址+数据大小不能超过8*1024*1024
Ⅲ、擦除
Ⅳ、写数据
Ⅴ、读出数据并打印出来
经测试得到以下结果,说明通讯正常。
4、 IPS6404L读写的移植。
对IPS6404L和NM25Q64EB的读写,可以对比进行学习。两者的引脚,QSPI系数配置是一致的,工作过程照样是发送指令,让IPS6404L做出不同的操作,但有一些差异。
在这个函数里包含要用到的函数和读写校验,一旦return OK,则可以在main函数内正常读写。
(1) 退出QPI模式
这是IPS6404L和NM25Q64EB的第一个区别,IPS6404L要读取ID只允许在SPI的模式下,所以在读取ID之前我们要先退出QPI的模式,利用指令码0Xf5,该指令只能在QPI模式下使用,使用我们指令模式要选择4线。此处的Waitcycles和NM25Q64EB的dummycycles是同样的作用,查表该值为0.
(2) 读ID
读取ID和NM25Q64EB也有差异,读取ID的指令是0x9F,只能在SPI模式下读取,根据时序图的注释,我们可以看出,读出的地址有两个字节(16bits),我们同样经过移位操作(在QSPI_PARAM_Test中,将读取到的第一个字节左移8位,再与第二个字节做或运算)将其通过串口打印出来,读到ID=0Xd5d说明正确。
在配置指令时,指令码为0X9F,指令模式、数据模式、地址模式全部为1线,地址大小和NM25Q65EB一致,为3bytes(24bites)。
(3) 进入QPI模式
读取完ID后进入QPI模式,指令码是0X35,只能再SPI模式下操作。除了指令码,其他配置和退出QPI模式的配置函数一致。
(4) 写PSRAM数据
指令码是0x38,指令模式、数据模式、地址模式全部为4线,地址大小为24bits,赋值好后调用HAL_QSPI_Command完成配置并调用HAL_QSPI_Transmit发送
(5) 读PSRAM数据
指令码是0xEB,此处特别注意要配置dummy cycles为6,一般涉及到Read的函数都要查表确认。
(6) 读写数据校验
最后将写入PSRAM的数据和读取到的数据进行逐一比较,按位比较成功,说明测试成功。可以正式在main函数中正常读写,测试得到以下结果,说明通讯正常。
(7) 其他事项:
Ⅰ、IPS6404L如果在进入QPI模式后没有退出QPI模式,尽管在函数中将进入QPI模式的函数屏蔽,照样会保持QPI模式,无法读取ID,必须在读ID前退出QPI模式。
Ⅱ、配置指令所用的宏定义放在stm32f7xx_hal_msp.h中,请对照移植。
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!