flash操作不同於sram,sram類似於在使用ram ip核(quartus/vivado)時生成的模塊直接對存儲操作,flash操作都是基於控制器的指令來的。flash在編程(寫數據)之前是需要對芯片擦除(也就是寫1),因爲編程操作只能把1變成0,而不能把原本是0的位變成1。
基本的命令:擦除命令/編程命令/讀取命令(讀取命令分爲讀取數據和讀取寄存器)
基本操作格式:命令+[地址]+[數據] //地址和數據是可選的
flash芯片擦除時按扇區來劃分的;讀取時一般芯片內部有一個buffer(大概幾十個字節的大小),也就是說一般每次讀取就是這個buffer的大小;program也是一樣有一個buffer(具體的大小取決於各個芯片)。
flash芯片還有一些寫保護功能(本測試不做驗證,測試主要這對操作接口)。
-------------------------------------------------------------
flash分類:
並口flash
串行flash
norflash:容量小但速度快(這裏的速度指讀取的速度,尤其並口flash的讀取和ram讀取幾乎沒有區別)/一般用於存儲系統,啓動代碼,bios之類
nandflash:容量大但速度低於nor/一般用於應用存儲數據
-----------------------------------------------------------------
測試使用的cypress的flash芯片:以S25FS128S/S25FS256S爲例
扇區劃分模式,選擇最簡單的一種,便於操作:
注意: 該芯片讀取時可以一個字節一個字節自累加讀取模式(可以一直讀完整個芯片再回到地址0繼續循環下去):
另一種QuadIO Read一定要burst模式,也就是隻能一組一組讀取,地址在組內累加循環。
cypress的芯片一般都有模型可以下載:https://www.cypress.com/verilog/s25fs256s-verilog
這個芯片有多種讀寫接口模式:命令+地址+數據
1-1-1(默認模式/基本的spi模式)/1-4-4(QuadIO模式)/4-4-4(QPI模式)
【芯片讀取數據時還可支持ddr操作,取決於具體的讀取命令】
【QPI模式和QuadIO模式的區別:兩者都需要開啓四線操作(CR1V[1]),但QPI模式還要開啓(CR2V[6]);
需要說明,CR2V[6]一旦assert會同時assert CR1V[1],CR1V[1] assert之後除非復位否則不會變爲0】
芯片的工作狀態由4個8bits配置寄存器控制:CR1V/CR2V/CR3V/CR4V
所有操作要通過SR1V狀態寄存的查詢結果作爲判斷成功結束的依據:
-------------------------------------------------------------
注意:spi模式io用了兩個,qpi/quadio是4個。
注意:片選信號csn需要提前且滯後時鐘信號clk至少一個時鐘週期。
-------------------------------------------------------------
以對一個扇區的操作來驗證flash芯片的基本功能,操作流程:
1、上電延時(等待芯片復位)->
2、設置工作模式(使能4字節模式)-> 1-1-1(SPI)
3、讀取配置寄存器的默認值(驗證基本的讀取功能及芯片的工作狀態)-> 1-1-1(SPI)
4、寫入配置寄存器(需要注意此步驟之前需要先執行寫使能操作/否則操作不成功)-> 1-1-1(SPI)
5、在新配置的模式下讀取芯片id(驗證當前設置是否成功)-> 4-4-4(QPI)
6、芯片指定扇區擦除-> 4-4-4(QPI)
7、第一次讀取驗證-> 4-4-4(QPI/SDR)
8、指定扇區編程-> 4-4-4(QPI)
9、指定扇區讀取及驗證-> 1-4-4(QaudIO/DDR)
10、進入芯片低功耗模式(測試完成)(1-1-1/SPI)
整個測試代碼分爲兩部分:
底層的接口驅動(完成讀寫時序)+測試狀態機(完成測試流程)