QSPI協(xié)議介紹
QSPI全稱為“Queued SPI”,本質(zhì)上是屬于SPI協(xié)議的一種,一般來說,SPI協(xié)議可以分為Standard SPI,Dual SPI,以及本文要講解的Queued SPI。只不過Dual SPI,Queued SPI常用于作為SPI Flash的通信接口。
功能應(yīng)用
QSPI作為一種隊列串行外圍接口協(xié)議,就是對SPI協(xié)議的擴展,可以通過單線,雙線或四線模式與外部Flash存儲器進行高速通信。其功能應(yīng)用場景如下:
數(shù)據(jù)存儲:可以用來實現(xiàn)大量數(shù)據(jù)的存儲,如代碼,圖像,視頻等,從而提高數(shù)據(jù)的讀寫速度與容量;
代碼執(zhí)行:QSPI用于執(zhí)行外部Flash存儲器的代碼,這樣可以節(jié)約內(nèi)部Flash的空間,如通過QSPI XIP模式從而實現(xiàn)在Memmap下執(zhí)行代碼;
與其他外圍設(shè)備進行通信:QSPI也可支持與其他QSPI協(xié)議的外圍設(shè)備進行通信,如傳感器,顯示器等,可以提高通信的效率與靈活性;
協(xié)議特點
QSPI協(xié)議作為一種SPI協(xié)議的擴展,一般而言,可以分為兩種工作模式,即設(shè)置模式與Memmap模式,雖然也有些芯片存在三種,如STM32,不同芯片存在些許差異可以理解,本質(zhì)上可以歸納為上述兩者;
QSPI協(xié)議的命令序列包括指令、地址、交替字節(jié)、空指令和數(shù)據(jù)這五個階段,任一階段均可跳過,但至少要包含指令、地址、交替字節(jié)或數(shù)據(jù)階段之一;
一般而言,QSPI僅支持dual read 與quad read模式,不支持dual write與quad write兩種模式,同時也不會存在QSPI 輸入與輸出的loop back模式;
QSPI Flash驅(qū)動說明
雖然市面上存在許多的Flash驅(qū)動供應(yīng)商,但是基本都大同小異,本文已TI系列的QSPI Flash驅(qū)動介紹舉例給大家介紹下其QSPI的硬件實現(xiàn)原理,讀寫操作模式以及EDMA搬運等操作。
QSPI硬件實現(xiàn)原理
作為QSPI通信的雙方,本質(zhì)上來講都是主芯片端作為主設(shè)備,可以通過控制CS引腳來決定與外圍不同的Flash芯片進行通信,同時通過輸出Clock時鐘來完成針對從設(shè)備的通信傳輸控制,如下圖所示:
圖1 QSPI硬件連接原理(圖片來源于TI官方文檔)
左圖為主芯片的內(nèi)部QSPI的控制器,右圖則為外部的支持QSPI協(xié)議的外部Flash,兩者之間通過QSPI協(xié)議接口連接,包含1個CLK引腳,1個CS引腳與4個用于傳輸數(shù)據(jù)的IO引腳。
針對上圖中的內(nèi)容,小T將針對每個引腳做個較為詳細的介紹,如下表所示:
圖2 QSPI接口引腳功能定義
QSPI讀寫操作模式
通過上述文章我們了解到QSPI存在3線Single Write/Read模式,4線Single Write/ Read,Dual Read模式,6線Quad Read模式的6種QSPI讀寫方式,在具體的項目實際應(yīng)用過程中,我們一般推薦正常的寫入操作通過4線Single Write來寫入,讀取操作推薦采用6線Quad Read模式,這樣才能最大效率的利用Flash硬件自身特性,從而提高通信效率。
如下圖所示為QSPI 控制器的內(nèi)部組成關(guān)系,從中我們可以得出如下幾個關(guān)鍵結(jié)論:
圖3 QSPI控制器接口內(nèi)部結(jié)構(gòu)(來源于TI官方文檔)
整個QSPI控制器可以分為SFI_MM_IF與SPI_CORE兩個模塊,其中SFI_MM_IF模塊主要負責讀寫指令,地址以及dummy cycle的個數(shù)等,而SPI_CORE主要負責芯片的時鐘極性與時鐘相位以及傳輸?shù)拈L度等;
SFI_MM_IF接口由以下兩個部分組成:
SFI register control:用來實現(xiàn)上述讀寫指令的初始化設(shè)置;
SFI translator:將對應(yīng)的SFI register control中的讀寫指令發(fā)送至SPI_CORE模塊來外部Flash;
SPI_CORE模塊則是由如下四個部分組成:
SPI_CNTIF:SPI Control Interface,用于設(shè)置對應(yīng)的讀寫指令,時鐘極性或相位等,在配置模式下會使用到;
SPI_CLKGEN:SPI Clock Generator,用于設(shè)置通信相關(guān)的時鐘頻率;
SPI_MACHINE:SPI State Machine,將SPI_CNTIF中的相關(guān)讀寫指令作為輸入,然后控制數(shù)據(jù)的移位發(fā)送等;
SPI_SHIFTER:SPI Data Shifter,用來實現(xiàn)接口信號的捕捉與生成。
QSPI控制器支持兩種配置方式,一種是Config模式,另外一種則是Memmap方式;對于寫入操作不支持Memmap方式僅支持Config模式,對于讀取操作推薦使用Memmap方式,這樣便可以直接在芯片MCU的Memory Layout中看到相應(yīng)的外部Flash空間的代碼或者數(shù)據(jù)。
對于QSPI接口的通信雙方而言,需要確保兩者通信的時鐘極性與時鐘相位是一致的,時鐘極性與時鐘相位的組合有如下4種方式:
圖4 QSPI時鐘極性與時鐘相位關(guān)系圖
QSPI EDMA搬運
當通過QSPI去讀取大量數(shù)據(jù)時,我們推薦使用Memmap方式讀取+EDMA的方式來完成,因為通過該兩種技術(shù)手段的結(jié)合,我們便可以減小CPU負擔,直接讓EDMA去執(zhí)行對應(yīng)的數(shù)據(jù)讀取操作;
有關(guān)EDMA的具體實現(xiàn)機理就不再本文進行展開,后續(xù)將進行單獨講解,歡迎多多關(guān)注小T。
AUTOSASR架構(gòu)下Flash驅(qū)動標準接口
小T將AUTOSAR架構(gòu)下針對Flash驅(qū)動的標準接口以及相關(guān)需求列舉如下,這樣在我們使用Flash驅(qū)動過程我們能夠快速的了解到Flash驅(qū)動的關(guān)鍵API的具體功能與作用。
圖5 Flash驅(qū)動標準接口表
在使用上述標準的AUTOSAR Flash驅(qū)動API也有很多需要注意的地方,小T將自己覺得需要特別注意的點列舉如下,這也是大家容易忽視的一些點:
在使用Flash驅(qū)動其他讀,寫等接口之前,務(wù)必需調(diào)用Fls_Init完成初始化,否則后續(xù)的Flash操作請求將會無效;
如果你使用的是外部Flash并采用QSPI驅(qū)動,請務(wù)必在Fls_Init之前執(zhí)行QSPI驅(qū)動的初始化,保證一個有效的初始化過程;
在執(zhí)行Flash寫入操作時其寫入地址與長度均需要與Flash的Page單位進行對齊,如一般為256字節(jié),具體還是取決于Flash芯片型號;
在執(zhí)行Flash擦除操作時,需確保其擦除地址與長度與Flash的sector單位進行對齊,如一般為4K,具體還是取決于Flash芯片型號;
Fls_Read, Fls_Write等關(guān)鍵API操作均屬于異步操作且不可重入,因此需確保Flash驅(qū)動的被操作對象的唯一性,不要應(yīng)用層與Fee模塊沖突,統(tǒng)一通過NVM發(fā)送請求來完成Flash的操作;
QSPI Flash驅(qū)動使用注意事項
小T在具體的軟件開發(fā)過程中,也遇到過很多跟Flash驅(qū)動操作有關(guān)的問題,這些問題往往解決起來非常棘手,因為非常偶發(fā)且極難復現(xiàn)。
這類問題更多時候還是我們?nèi)狈Ψ烙?a target="_blank">編程思維,沒有針對Flash可能失效的場景進行全面的考慮,以下小T將我個人針對Flash驅(qū)動的幾個常見的經(jīng)驗總結(jié)列舉如下,希望能給大家后續(xù)的Flash驅(qū)動開發(fā)帶來一些幫助與思考。
在每次系統(tǒng)啟動或者復位的過程中,最為推薦的做法針對外部Flash同步進行reset操作,該操作可以一般存在如下三種方式:
每次啟動或者復位的過程中可通過硬件來操作Flash的上下電操作來完成Flash自身的重置;
通過軟件的方式來拉低Reset引腳來實現(xiàn)外部Flash復位,這種方式需要考慮到引腳復用功能是否可用的可能性;
通過軟件的方式在初始化的過程中通過QSPI通信發(fā)送軟復位指令讓Flash芯片進行重置;
如果需要針對外部的SPI Flash通過QSPI進行通信,需要特別注意該SPI Flash芯片的QE位是否默認使能,如果沒有使能,將無法采用QUAD SPI進行通信,因此建議工廠端刷寫軟件過程中均需要主動設(shè)置該QE位或者在軟件初始化過程中設(shè)置該QE位,該QE位一旦寫入掉電也會丟失,僅需寫入一次即可;
在執(zhí)行Flash初始化過程中需要針對Flash外部型號,如Manufacture ID等設(shè)備號進行校驗,確保不會出現(xiàn)生產(chǎn)過程中出現(xiàn)芯片型號貼錯的場景;
在軟件運行過程中有時會偶發(fā)導致系統(tǒng)跑飛意外執(zhí)行操作Flash驅(qū)動寫或者擦除操作導致用戶程序遭到破壞,從而軟件無法正常啟動,因此有必要針對關(guān)鍵應(yīng)用程序代碼空間進行Flash寫保護,這樣即使程序死機復位后整個系統(tǒng)也能夠再次正常啟動。
編輯:黃飛
?
評論
查看更多