介绍
一般这种功能主要用于程序在线更新,无需使用下载器。或者为安全考虑,满足某种条件执行其他程序。
flash读写
主要基于w25q128fv,本文档不会详细介绍各个芯片内容,只提供大概思路及逻辑,需要详细了解请自行查阅相关文。
- w25q128fv读写等功能。
flash使用spi接口,在里面分为4种模式,spi×1.spi×2,spi×4及Quad spi。
区别为:spi模式下命令是串行,数据可以根据模式不同分为1.2.4口并行输出
Quad spi模式下,命令及数据都可以并行输出。
唯一麻烦可能只在模式切换需要配置相关寄存器,先以单口串行发送如下命令:
第一步:50h(打开易失性状态寄存器使能)
第二步:31h(写配置寄存器2)
第三部:02h(修改寄存器中第二位QE为’1’)
第四步:38h(切换至Quad spi模式)
至此就已经进入Quad spi模式.只需要发送读写等命令即可,在读写命令发送后查看寄存器1,查看busy位,当busy为0时,即可其他操作,相关时序及数据格式自行查阅文档;当flash写入完成后,自启动前必须退出Quad spi模式,才能进行多启动,命令如下:
第一步:66h(复位使能)
第二步:99h(设备复位)
其中读写一次好像不能超过256(可以少但不能多),擦除只能4k,32k,64k及全部擦除并不能针对某一字节,所以在使用时,还是多注意下,反正多看文档多调试,一遍不行就两遍。
安全起见,写命令执行完之后最好再读出来计算crc,以保证数据的正确性。
多启动
多启动只需要发送相关序列即可,相关序列如下:
Multiboot Start Address是需要启动的地址,Fallback Start Address是当启动程序有误时,执行一段安全的程序所在地址,所以Fallback所在程序一般是安全且固定不变的;按顺序输入命令后,程序就会重启。其中Opcode是spi模式,有spi×1.spi×2,spi×4可以选择,分别为 0x0B, 0x3B, and 0x6B 。
唯一需要注意的是序列在发送时字节需要交换,低字节与高字节交换,文档中有详细说明。
需要知道fpga是如何进行程序加载,可生成mcs文件,查看其中具体内容,0x000044之前就是进行程序启动部分,其中包含多启动地址及返回地址。
如果需要上电就执行下载后的程序,在生成bit文件时,修改这两地址就行,但这样要么你程序永远放置在一个位置,要么你每次下载新程序都需要更改相关位置,如果需要可以看看mcs文件内容,大概就知道需要改什么了。