大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家介紹的是FlexSPI外設對AHB Burst Read特性的支持。
痞子衡之前寫過一篇關於FlexSPI LUT的文章 《從頭開始認識i.MXRT啟動頭FDCB里的lookupTable》,這個LUT機制是i.MXRT上能夠實現對串行NOR Flash進行AHB讀訪問的原因(也是程序能夠XiP原地執行的基礎)。那篇文章的最后留了一個小伏筆,即FlexSPI的Prefetch不使能,SEQ_CTL工作一次獲取的數據由AHB Burst Read策略決定,那么這個Burst Read策略到底是什么?今天痞子衡來跟大家好好聊一聊:
一、什么是Burst Read?
說起Burst Read概念,其實也沒啥玄機,中文直譯就叫突發讀取(其實有個更接地氣的翻譯:連續讀取),這個概念要跟Single Read(或者Random Read)對比來看。
對於一個NOR Flash器件而言,主設備(這里指i.MXRT)如果要讀取它的內容,必須按照手冊規定的讀時序,這個讀時序中肯定有我們要提供地址信息,這樣Flash器件才能知道該把哪個地方的數據送出來。在一次讀時序中(一個CS拉低期間,發送一次地址信息),Single Read就是讀取固定大小的數據(比如4bytes),而Burst Read可以靈活調整讀取數據的長度(一般來說用於一次讀取更長的數據)。
二、AMBA AHB支持哪些Burst Type?
前面講了,Burst Read可以靈活調整讀取數據的長度,即當前讀時序內,地址信息發送完后,主設備想讀多少byte數據相應輸出所需的SCK時鍾數即可(地址根據上次訪問按序自增),那么主設備是不是可以任意輸出SCK時鍾呢?一般情況下是的,這種就是典型的線性遞增類型(簡稱INCR)。
除了INCR類型外,還有另一種環繞類型(簡稱WRAP),這種類型下,主設備輸出SCK時鍾並不總是得到線性地址遞增的數據,而是在一個指定長度數據塊里不斷循環,這種類型應用場景更多在RAM型器件(比如用於棧)。
下表是ARM官方 AMBA Specification 第 3.6 Burst operation 小節里關於Burst Type全部定義與解釋。我們主要關注INCR類:INCR4/8/16一次訪問長度是4/8/16 * data block (具體data block大小由HSIZE[2:0]決定),INCR即不定長度。
在 AMBA Specification 里找到關於HSIZE[2:0]定義如下,這個HSIZE是由AHB master根據訪問自動設置的。
下圖是典型的INCR型不定長Burst訪問時序圖,圖中共有兩次INCR型Burst:第一次INCR Burst共讀取4bytes,Burst開始於HADDR = 0x20處,共發起了HSIZE = Halfword的兩次傳輸;第二次INCR Burst共讀取12bytes,Burst開始於HADDR = 0x5c處,共發起了HSIZE = Word的三次傳輸。
Note: HTRANS共有四種傳輸類型:IDLE、BUSY、NONSEQ、SEQ,前兩種顧名思義,NONSEQ代表一次Burst的首次傳輸,SEQ代表一次Burst的后續傳輸。
三、FlexSPI對AHB Burst Read的支持
現在我們回到FlexSPI的LUT機制,在它的指令集關於讀寫序列的解釋里,特別提到了當訪問類型是AHB的時候,一次訪問的數據長度取決於Burst Size和Burst Type。
Burst type一共有如下8種(其實對應了AMBA AHB Burst Type),Burst size也有8/16/32/64bits四種(即data block,未完全實現HSIZE[2:0]里定義的所有值),FlexSPI模塊會自動響應AHB master訪問請求來調度Burst type和Burst size去完成對應Flash的訪問。
下表具體解釋了FlexSPI模塊對於AHB讀訪問的響應,表中 hbeat_start_address 就是上一小節里Burst訪問時序里的HADDR[31:0]值,即AHB master當前節拍下(beat)要讀的地址;hburst_start_address 是當前Burst類型下訪問總長度區域的首地址,hburst_end_address 就是當前Burst類型下訪問總長度區域的末地址加1。表中特別強調了當Prefetch被關掉后,INCR型Burst下每個節拍訪問均會被當做SINGLE Burst來處理。
現在我們終於理解,FlexSPI的SEQ_CTL工作一次獲取的數據其實是受AHB master控制的。當Prefetch不使能的時候,FlexSPI就是個身不由己的數據傳送器,AHB master怎么要求,FlexSPI就怎么做。只有開了Prefetch功能,FlexSPI才會有靈魂,它會利用自己1KB大小的AHB RX Buffer干一些取巧的事。
至此,FlexSPI外設對AHB Burst Read特性的支持痞子衡便介紹完畢了,掌聲在哪里~~~
歡迎訂閱
文章會同時發布到我的 博客園主頁、CSDN主頁、知乎主頁、微信公眾號 平台上。
微信搜索"痞子衡嵌入式"或者掃描下面二維碼,就可以在手機上第一時間看了哦。