痞子衡嵌入式:i.MXRT中FlexSPI外設對AHB Burst Read特性的支援

痞子衡發表於2021-04-23

  大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家介紹的是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 Specification3.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主頁知乎主頁微信公眾號 平臺上。

微信搜尋"痞子衡嵌入式"或者掃描下面二維碼,就可以在手機上第一時間看了哦。

相關文章