APP下载

基于STM32 SPI接口的M25P80FLASH的驱动设计与实现

2013-07-07邓国荣

机电信息 2013年6期
关键词:控制指令管脚扇区

邓国荣

(暨南大学信息技术研究所,广东 广州 510075)

0 引言

M25P80FLASH可以按页、扇区和整片擦除,并提供按页写数据功能,能够方便地保存数据。STM32有独立的SPI控制器,该控制器可以直接控制SPI FLASH的读写操作,自动生成读写SPI FLASH控制时序。因此,本文采用STM32的SPI接口控制M25P80FLASH读写,分析了M25P80FLASH的读写时序和SPI接口的初始化,最终实现了M25P80FLASH的读写,仿真结果显示,该方案正确、可行。

1 STM32 SPI接口简介

STM32 SPI接口结构框图如图1所示。STM32 SPI接口内部有一个移位寄存器,当数据从MOSI管脚输入时,数据首先通过移位寄存器移位输入,然后保存在接收缓冲区中,由地址和数据总线读出,当数据写出时,写入数据首先被写入发送缓冲区,然后由移位寄存器从MISO管脚移出。SPI接口输入和输出控制时序由波特率发生器产生,然后从SCK管脚输出,在数据读写过程中同步产生。

图1 STM32 SPI接口结构图

2 STM32 SPI接口与M25P80之间的硬件连接

STM 32 SPI接口与M25P80SPI FLASH硬件连接如图2所示。MOSI对应连接M25P80的数据输出口Q,MOSO对应M25P80的数据输入口D,时钟管脚SCK提供M25P80的时钟控制管脚C,CS 对应 M25P80片选控制管脚 S[1]。

图2 STM32与M25P80之间的硬件连接

3 M25P80驱动的实现

3.1 STM32 SPI接口的初始化

STM32 SPI接口初始化流程图如图3所示。首先,在SPI开始配置之前,必须先配置SPI接口控制的RCC时钟,然后配置MOSI、MOSO和SCK管脚为复用管脚,并进一步配置管脚工作方式为推挽上拉方式,管脚最大输出工作时钟为50M,配置SPI管脚为双线双向数据传输方式,NSS管脚为软件控制模式,并配置SPI控制方式为主模式,数据宽度为8 bit,数据采样时钟极性通过CPOL和CPHA控制,设置时钟分频系数和CRC校验方式,最后,设置数据传输起始位,即先传输数据高位还是低位。

M25P80的片选控制管脚S,可以直接用STM32的普通IO控制,需要配置为输出模式,推免上拉,最大输出与SPI接口管脚一致,都为50M。

图3 SPI接口初始化配置流程

3.2 M25P80读数据实现

M25P80控制读写的第一步就是读取ID号,只有ID正常读取才能说明M25P80时序控制配置正常。读M25P80控制指令为0x30,读M25P80的ID控制指令为0x9F,紧跟控制指令READ之后的是24位读取数据地址,然后就可以直接读取数据了。STM32F2xx固件库中提供了向SPI FLASH发送和接收数据 API函数 SPI_I2S_SendData()和 SPI_I2S_ReceiveData(),在每次数据发送时,都要检测SPI控制接口的工作状态,可以通过API函数SPI_I2S_GetFlagStatus()检测SPI接口控制状态。在控制指令和读取数据地址发送之后完成,读取数据时,需向FLASH发送空指令0xA5才能启动数据读取时序。

在每次向FLAHS发送数据之前,必须先将片选管脚拉低,在每次数据读取完成之后,必须拉高。

3.3 M25P80擦除实现

M25P80FLASH在写数据之前,必须首先擦除。首先,发送擦除控制指令,有3种擦除FLASH方式,页擦除、扇区擦除和整片擦除,可以根据需要选择擦除方式,页擦除每次擦除一页空间大小,为256 Byte空间,扇区擦除空间大小为1个扇区为64K,整片擦除就是将整个空间数据都擦除。按页擦除需要的时间是最短的,适用于对于擦除时间要求比较短的情况下,扇区擦除和整片擦除都需要比较长的时间,而且擦除区域大,需要擦除的数据区域也大,不适宜实时擦除数据更新情况,适用于一次性写入大片数据情况。

3.4 M25P80写数据实现

M25P80写数据之前,首先需要擦除需要写入空间数据,然后才能写入数据,每次写数据之前还需要写使能,即设置状态寄存器的WEL位为高电平同时,需要检查状态寄存器的SRWD写保护位,高电平为写保护失效,低电平为写保护使能,在每次数据写入时,必须SRWD为高电平,即写保护失效才能写入数据。M25P80按页写入数据时序图如图4所示,按页写数据一次可以写入256 Byte,M25P80只提供按页写数据命令,只能一次写入一页数据。

图4 M25P80按页写入数据时序图

由于M25P80只能一次写入一页数据,只能一次写入256 Byte数据,而且M25P80的地址空间是按页分配的,每次不能跨页写数据,一次只能在一页中写数据,所以,当写入数据超出一页时,就需要多次写入数据。M25P80多页写数据处理流程图如图5所示。首先,写入数据之前,需要先擦写写入地址空间数据,然后判断写入起始地址是否是页初始地址,如果是页初始地址,再判断写入数据长度是否超出一页大小,如果是,数据计算需要写入的页数N,把数据写入N页地址空间中,并将最后剩余字节写入第N页的下一页中,如果写入数据长度小于一页,只需要直接将数据写入指定页中即可。如果写入地址不是页初始地址,首先需要判断数据是否超出一页,如果没有超出一页大小,还需要判断写入数据长度是否大于写入数据起始地址到页尾的剩余字节数,如果是,则写满写入页地址空间,并将剩余字节写入下一页中,如果写入数据小于写入数据起始地址到页尾的剩余字节数,则直接将数据写入指定页中即可;如果写入数据超出一页大小,首先填满起始页地址空间,然后计算剩余数据需要写入页数N,将剩余数据写入N页地址空间中,最后,将剩余字节写入第N页的下一页中即可[2-3]。

4 仿真结果与分析

图5 SPI FLASH多页写数据处理流程图

STM32的SPI接口控制M25P80仿真结果图如图6所示。首先,STM32控制页擦除M25P80的地址空间0x00对应的页,然后向FLASH中写入SPI_SendData[]中的数据,写完之后,再读取FLASH对应地址中的数据,将结果存放到SPI_RecData[]中,仿真结果显示,写入数据和读出数据一致,说明FLASH已经正常读写了。

图6 SPI FLASH数据读写仿真图

5 结语

本文分析了M25P80FLASH的读写控制时序,并针对M25P80的多页写数据功能进行了详细的分析和介绍,并使用STM32的SPI控制接口实现了对M25P80FLASH的读写控制。仿真结果显示,STM32的 SPI控制接口可以实现对M25P80FLASH的读写控制。

[1]关珊珊,周洁敏.基于Xilinx FPGA的SPI Flash控制器设计与验证[J].电子器件,2012,2(35):216~220

[2]张立为,钟慧敏.实现基于FPGA的SPI Flash控制器设计[J].微计算机信息,2010,6(26):124~126

[3]唐琳,方方,张保静,等.基于ARM的多通道SPI Flash控制器设计[J].核电子学与探测技术,2012,5(32):583~586

猜你喜欢

控制指令管脚扇区
分阶段调整增加扇区通行能力策略
城轨车辆控制指令试验装置研制
宏指令控制的多轴系统研究及实现
U盘故障排除经验谈
基于图像处理的异型电子元器件管脚偏移误差检测方法研究
基于贝叶斯估计的短时空域扇区交通流量预测
高速公路隧道通风、照明联动控制方案探讨
CMOS数字IC管脚电容的估算与测量
重建分区表与FAT32_DBR研究与实现
HC08芯片JVT测试方法的探究