摘要:SPI NOR Flash是一种片外扩展存储器,可用来存储图片、字库等大量数据,其种类繁多,应用广泛,用户每次使用时都需耗费大量时间阅读相关的手册。如何快速实现类似的相关功能呢?下文做详细介绍。
由于SPI NOR Flash种类繁多,我们每次使用SPI NOR Flash时,都耗费许多时间在阅读相关的手册上。AMetal助你快速实现Flash功能!即使不阅读Flash芯片手册,也能顺利使用,可以把专注力投入到应用优化和算法中,提升产品质量。
AMetal平台提供了IS25xx、MX25xx等系列SPI NOR Flash的组件,提供初始化函数及丰富的功能接口。
本次介绍所使用的SPI NOR Flash为:IS25LP064A。IS25LP064A是ISSI的其中一款存储芯片,采用SOIC封装,50MHz正常读取,DTR高达66MHz,超过100000次擦除,具有高灵活性和高性能。该器件可通过4线SPI接口访问,支持SPI模式0和模式3。该芯片可编程页大小为256Bytes,可选择的擦除方式为:扇区擦除、块擦除、整片擦除。
使用之前,必须先完成该芯片的初始化,初始化IS25xx的函数如图1所示,完成初始化后为设备的驱动函数提供实例化句柄。
图1 IS25xx初始化接口函数
am_is25xx_dev_t为IS25xx的设备实例,为整个外设驱动提供必要的内存空间,用户只需要使用设备结构体类型定义一个变量即可;
am_is25xx_devinfo_t为IS25xx的设备信息,包括使用的SPI模式、SPI片选引脚、使用的SPI速率以及器件型号,用户按实际使用进行配置即可正常工作;
IS25初始化函数中am_spi_handle_t为主机MCU的SPI初始化,AMetal平台支持的MCU提供了标准化的SPI接口函数及初始化函数,实际使用时,通常只需根据实际情况配置SPI使用的引脚,提供SPI标准服务句柄。
IS25实例初始化函数为:
在硬件连接一致的情况下,可直接调用IS25xx实例初始化函数完成SPI Flash的初始化:
am_is25xx_handle_t is25xx_handle = am_microport_flash_is25xx_inst_init(void);
SPI Flash比较特殊,在写入数据之前必须确保相应的地址单元已经被擦除,因此除了读、写函数外,还有一个擦除函数。IS25功能接口函数如图2所示。
图2 IS25xx功能接口函数
擦除
擦除就是将数据全部重置为0xFF,即所有存储单元的位设置为1。擦除操作不能直接擦除某个单一地址单元,擦除的最小单元是扇区,IS25一个扇区大小为4KB,即每次只能擦除单个或多个扇区。擦除函数原型为:
int am_is25xx_erase(am_is25xx_handle_t handle, uint32_t addr, uint32_t len);
其中,handle为IS25xx的实例句柄,addr为待擦除区域的首地址,由于擦除的最小单元为扇区,因此该地址必须为某个扇区的起始地址,len为擦除长度,必须为扇区大小的整数倍。返回AM_OK,说明擦除成功;
写入数据
在写入数据前,必须确保写入地址已被擦除。即需要变为0的位清0,写入操作无法将0变为1。从指定的起始地址开始写入一段数据的函数原型为:
int am_is25xx_write(am_is25xx_handle_t handle, uint32_t addr, uint8_t *p_buf, uint32_t len);
其中,addr为待写入区域的首地址,只要确保addr之后的区域已经经过擦除,则可以从该芯片中任一存储地址开始写入,len为写入数据长度。返回AM_OK,说明写入数据成功;
读取数据
从指定的起始地址开始读取一段数据的函数原型为:
int am_is25xx_read(am_is25xx_handle_t handle, uint32_t addr, uint8_t *p_buf, uint32_t len);
其中,addr为待读取区域的首地址,可以指定该芯片中任一存储地址开始读取,len为读取数据长度。返回AM_OK,说明读取数据成功。
由于读、写数据需要的缓存空间较大,最好从全局数据区域中分配缓存。如果直接从函数的运行栈中分配较大字节空间,则完全有可能导致栈溢出,进而系统崩溃。
AMetal平台提供了较全面的功能接口函数,所有接口函数均脱离底层,不与具体硬件绑定,切换MCU可快速移植。AMetal助你快速实现SPI Flash功能,将专注力投入到核心应用部分,让具有竞争力的产品更快走向市场!