1. 摘要
本篇筆記主要介紹,如何開發(fā)穩(wěn)定可靠,功能齊全的QSPI驅(qū)動。
2. 準(zhǔn)備工作
1, IAR 8.32.1
2, STM32Cube_FW_H7_V1.6.0
3. QSPI簡介
4. QSPI驅(qū)動
在項(xiàng)目的開發(fā)中,我們經(jīng)常會使用外掛Flash在做一些應(yīng)用,而STM32H743帶QSPI接口,可以用來外掛QSPI Flash,在之前的推送中我們以winbond華邦的W25Q256為例給大家說明了下QSPI的操作,借助ST的HAL庫例程可以快速驗(yàn)證,不同型號的QSPI Flash會有一些參數(shù)和命令區(qū)別,大家應(yīng)用時(shí)候要注意,例如美光和華邦的有的命令碼就不同。ST的驅(qū)動里STM32H743的評估板是以美光的MT25T_QLKT_L_01G為例。如果你使用不同的型號,請注意區(qū)分,既然是評估板,那么就只是給大家參考,在正式的項(xiàng)目中,還需要考慮一些其他的問題。
5. 驅(qū)動架構(gòu)
驅(qū)動的架構(gòu)可以參考STM32Cube_FW_H7中對QSPI Flash驅(qū)動架構(gòu),也可以自己做架構(gòu),盡量簡單明了,易用且穩(wěn)定。對具體型號Flash的驅(qū)動可以放在一個(gè)文件下建立一個(gè).c和.h. 如我們以華邦的W25Q系列為例,
還可以建立一個(gè)文本文檔,用來記錄驅(qū)動的一些變更,發(fā)布筆記等。
BSP層可以在BSP文件夾下建立QSPI的驅(qū)動,名字可以參考ST庫,也可以按照自己的命名規(guī)則來定,或者企業(yè)的軟件文件命名規(guī)則來定。
建立好這些文件后,接下來可以動手開發(fā)了。開發(fā)的時(shí)候可以先畫一些圖,除過正常的初始化,去初始化,外,考慮都包含那些功能,那些模式,那些命令,那些安全管理。那些中斷,是否可以用DMA操作等。還要考慮數(shù)據(jù)結(jié)構(gòu)類型,配置信息,錯誤碼等。這些一定要結(jié)合數(shù)據(jù)手冊來考慮和分析。
5.1 初始化和去初始化
這部分相對比較簡單,可以參考例程,市面上的開發(fā)板,編碼風(fēng)格和良莠不齊,大家盡量參考官方的資料和文檔,要考慮檢查返回值,初始化有沒有成功。跟硬件相關(guān)的管腳,時(shí)鐘等大家根據(jù)自己的應(yīng)用去定,H743我一般跑400M. 官方的大部分例程也都是跑在400M.
5.2 驅(qū)動模式
從手冊可以知道分為間接模式,狀態(tài)輪詢模式,內(nèi)存映射模式,那么我們的驅(qū)動就要能夠分別支持這三種模式。在stm32h743i_eval_qspi.h里面定義這些模式和其他數(shù)據(jù)類型。這些可以參考官方的定義
在w25q256.h中定義跟flash相關(guān)的數(shù)據(jù)類型,結(jié)構(gòu)體,宏定義等。如QSPI的操作模式,這里要明白1-1-1,1-1-2,1-1-4,1-4-4等的含義,因?yàn)镼SPI包含這四種,指令單線,地址單線/4線,數(shù)據(jù)單線/兩線/四線,這些在flash的數(shù)據(jù)手冊指令表里都會標(biāo)出,支持那種操作,而我們在驅(qū)動中要綜合考慮這四種。
命令表的定義,這個(gè)要注意不同型號的FLASH,會稍有區(qū)別,即使同一家的不同型號的可能也有區(qū)別,如華邦256M和1G的指令就有一些個(gè)別的不同。恰好這兩款我都用過,在這里給大家提一下。由于指令比較多,這里就不一一列舉了,只截取其中一部分,具體指令表的定義可以參考flash手冊,
但是建議大家在做驅(qū)動的時(shí)候?qū)λ兄噶钭鲋С郑@樣在用的時(shí)候就很方便,而不是用的時(shí)候發(fā)現(xiàn)少,在去填補(bǔ)。可以分別做成子函數(shù),例如讀取ID,可以做一些校驗(yàn)
很多指令的內(nèi)容官網(wǎng)的驅(qū)動里都沒有,需要我們自己去做。
5.3 狀態(tài)寄存器讀寫
W25Q系列一般有三個(gè)狀態(tài)寄存器,用來表示一些狀態(tài),如狀態(tài)寄存器1就可以通過讀取來判斷flash的狀態(tài),有沒有忙,寫使能有沒有打開,以及保護(hù)位保護(hù)了那些地址,這些都要自己去實(shí)現(xiàn),市面上包括官方的例程驅(qū)動里都沒有,假如你不判斷的話,如果要寫的地址被保護(hù),是寫不進(jìn)去的,還有可能出現(xiàn)異常,這些都可以通過讀取狀態(tài)寄存器1和2來判斷和處理。以及結(jié)合WP腳。
這些功能在正式的產(chǎn)品中我們一定要考慮,否則你的驅(qū)動就不穩(wěn)定,不安全,因?yàn)楣I(yè)現(xiàn)場各種干擾,以及其他異常情況。可能你在實(shí)驗(yàn)室跑的好好的代碼,到現(xiàn)場就不行了
5.4 讀寫擦驅(qū)動
擦除操作比較耗時(shí),所以如果你是用查詢模式的話,要不斷去查詢狀態(tài),而不能死等,從手冊可以看除時(shí)間量級,擦除正片最大需要1000s,還是比較耗時(shí),即使最小的擦除單元4k擦除,最壞情況也需要400ms。用中斷或者DMA方式操作的話不涉及,但DMA的話中斷需要好幾個(gè),有命令,完成,狀態(tài)匹配,收發(fā)完成等。要熟悉這些大概時(shí)間量級。方便參考。基于不同模式的驅(qū)動我們在公眾號里都給大家介紹過。
讀寫驅(qū)動,可以參考官網(wǎng)的例程,但是要加一些改動,如考慮讀寫失敗怎么辦,超時(shí)退出,如果連續(xù)兩次還是失敗,怎么考慮,我們一般會考慮嘗試三次,如果第一次失敗就嘗試第二次讀取,第二次失敗,嘗試第三次,這樣可以大大加強(qiáng)安全性,可能99.99%的情況下一次就成功,但不排除失敗的可能性。此外還要考慮參數(shù)的保護(hù)。
5.4.1 擦除
可以按照擦除單位來綜合寫一個(gè)函數(shù)
這里要注意就是W25Q256 和W25Q01J 的一些區(qū)別。如有的指令前者支持指令地址四線,而后者不支持。
5.4.2 讀操作
讀操作要考慮是single還是dual模式,分別出兩個(gè)子函數(shù),讀的指令不同,時(shí)序也不同
建議大家一個(gè)指令做一個(gè)子函數(shù)。如0x6C和0xEC的時(shí)序和操作模式就不同,如0X6c
代碼實(shí)現(xiàn)
從時(shí)序圖可以看到指令單線,地址單線,數(shù)據(jù)4線即 1-1-4模式。0xEC留給大家去聯(lián)系實(shí)現(xiàn)。
5.4.3 寫操作
寫操縱也有幾條不同的命令
不同的時(shí)序和方式,可以寫成不同的子函數(shù),我們以34h為例子
通過時(shí)序圖可以看到是指令單線,地址單線,數(shù)據(jù)四線,這樣就可以實(shí)現(xiàn)寫操作了。
5.5 異常
通常我們還需要去管理和處理一些異常情況,例如下面的定義,你也可以按照自己的方式,總之要對異常和錯誤做一些管理。
官方的例子基本上每個(gè)都有返回值,大家可以去參考,這樣使你的驅(qū)動更安全可靠。
5.6 其他
其他一些應(yīng)考慮的問題,大家可以根據(jù)自己的需求和應(yīng)用在添加,這里就不在贅述。
6. 測試驗(yàn)證
開發(fā)完后,就可以寫一個(gè)簡答的測試程序,對自己的驅(qū)動進(jìn)行測試,因?yàn)槲沂窃?a href="http://m.xsypw.cn/v/tag/1019/" target="_blank">freeRTOS系統(tǒng)下用的,所以建立一個(gè)QSPI的測試任務(wù),去實(shí)現(xiàn)擦,寫,讀,比較的功能和驗(yàn)證。截取幾張測試圖
7. 參考文檔
序號 | 文獻(xiàn) |
1 | STM32H743RM |
2 | STM32Cube_FW_H7_V1.6.0 |
原文標(biāo)題:如何寫好QSPI驅(qū)動
文章出處:【微信公眾號:嵌入式程序猿】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
責(zé)任編輯:haq
-
驅(qū)動
+關(guān)注
關(guān)注
12文章
1906瀏覽量
86593 -
QSPI
+關(guān)注
關(guān)注
0文章
45瀏覽量
12601
原文標(biāo)題:如何寫好QSPI驅(qū)動
文章出處:【微信號:InterruptISR,微信公眾號:嵌入式程序員】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
串行通信接口SPI與QSPI的區(qū)別

MRCANHUBK344測試Qspi_Ip_Example_S32K344,遇到Qspi_Ip_Init返回STATUS_QSPI_IP_BUSY的問題求解
使用FRDM-MXCN947板,在MCUXpresso IDE中調(diào)試期間嘗試從下載寫入QSPI閃存出現(xiàn)報(bào)錯的原因?
北京迅為RK3568開發(fā)板OpenHarmony系統(tǒng)南向驅(qū)動開發(fā)內(nèi)核HDF驅(qū)動框架架構(gòu)

AN210 GD32G5x3系列QSPI高速模式時(shí)鐘調(diào)整方法

功能齊全的350W離線電源轉(zhuǎn)換器的設(shè)計(jì)回顧

在rtt studio使用qspi dma就是進(jìn)不了中斷,為什么?
STM32H743配置了QSPI驅(qū)動W25Q256JV,初始化成功,但后續(xù)都失敗了,為什么?
在mmWave SDK增加QSPI Flash驅(qū)動的示例

Linux 驅(qū)動開發(fā)與應(yīng)用開發(fā),你知道多少?

評論