最近需要驱动一个SPI FLASH做内存芯片,公司用的是SPANSION的S25FL256L型号SPI FLASH ,我也是一个新手,写这个芯片驱动对现在的我来说也是困难重重,花了差不多快2周的时间,完成的芯片的驱动,现在分享下我的经历,希望对新手有些帮助。 先介绍下平台,我主板上用的是STM32F767,所以开始写这个芯片驱动的时候,我直接参考了原子哥STM32F767实验QSPI那章,STM32F767上有一个 Quad SPI专用通信接口,可以直接驱动这个接口与SPI FLASH 芯片进行通信,这个 Quad SPI具体信息大家可以看看原子哥的开发指南和STM32中文中文参考手册,讲解很清楚,这个接口的驱动我直接用的原子哥实验里写的qspi.c的驱动函数,主要是4个驱动函数的编写,
u8 QSPI_Init(void);
void SPI_Send_CMD(u8 cmd,u32 addr,u8 mode,u8 dmcycle);
void QSPI_Send_CMD(u8 cmd,u32 addr,u8 mode,u8 dmcycle);
u8 QSPI_Receive(u8* buf,u32 datalen);
这里我比较建议用原子哥寄存器版本的驱动函数,在看了STM32这个接口的参考手册后,可以比较清楚了解 Quad SPI专用通信接口是如何与SPI FLAH 芯片通信,在后面调试阶段也比较荣排除问题。这块我不多说,原子哥实验也说得比较好,我用的是Quad SPI专用通信接口的间接模式,所有通信都是通过发送命令完成的,我主要说说S25FL256驱动如何进行移植编写。
原子哥QSPI通信实验里用的SPI FLAH 是W25Q256,这个与S25FL256是同一种类芯片,在芯片内部寄存器和命令上虽然大致相同,但是区别也是很多,在S25L256芯片中每个寄存器都分别有易失性和非易失两种,易失性寄存器我们可以进行发命令进行配置,非易失寄存器是给易失寄存器提供默认状态,芯片在上电时,会自动把非易失寄存器的值写到对应易失性寄存器中,
如状态寄存器1会有:Status Register-1 Non-Volatile (SR1NV) 与 Status Register-1 Volatile (SR1V)两个。我们主要是对易失性寄存器编程,在配置芯片内寄存器过程中,我们主要是参考Data sheet中写的时序图,依照上面的时序图正确发送命令时序,比如说在写void S25FL256L_Init(void),这个初始化函数时,需要发送Enter QPI Mode (QPIEN 38h),这个命令,设置芯片的模式为QPI 模式,我就依照时序图,发送一个命令,发送命令最关键是要设置好指令各个阶段,发送这个命令只需要发一个8位命令就拉高片选,于是SPI_Send_CMD()函数就设置参数为单线指令,其他都设置为0,注意发送这个命令之前芯片是在spi模式,发送后芯片进入QPI 模式,之后发送没拿过来就是需要设置为4线传输啦,这个命令不会改变配置寄存器中地址长度,如果用4字节地址发送,我们还是需要单独进行配置,这类命令的发送就只要严格按照命令后的时序进行发送,就没有什么问题了,其中两个最重要函数移植就是页编程函数和读数据函数:S25FL256L_Write_Page(),发送页编程命令需要注意就是写入的内存地址的值一定要是0XFF,不然会写入数据失败,因为内存写入数据只能是把1编程0,不能把0变成1,发送擦除命令才可以把内存中的值由0编写成1,在一个是S25FL256L_Read(),只要按着时序图,发送命令就可以了,其他一些命令函数按着原子哥实验里的驱动函数修改,其中最终的就是一定要看每个命令的时序图,按着时序图进行发送命令。不然可能会导致命令发送失败。参考Datasheet,去移植驱动,基本就没有什么问题。
题主是个新手,第一次写分享贴,也是第一次移植这种芯片驱动,走了很多弯路,大家有什么疑问 ,可以交流哈,希望这个帮到大家喽
一周热门 更多>