痞子衡嵌入式:恩智浦i.MX RT1xxx系列MCU啟動那些事(11.B)- FlexSPI NOR連接方式大全(RT1015/1020/1050)



  大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家介紹的是恩智浦i.MX RT1015/1020/1050三款MCU的FlexSPI NOR啟動的連接方式

  由於i.MXRT內部沒有非易失性存儲器,因此在系統設計時為i.MXRT搭配一塊存放應用程序代碼的存儲器是頭等大事。i.MXRT支持啟動的外部存儲器類型眾多,其中通過FlexSPI接口連接串行NOR Flash是首選。

  就i.MXRT芯片引腳本身來說,其FlexSPI模塊支持的Pinmux選擇較多,這在芯片參考手冊Chip IO一章可以找到具體信息。但是並不是所有FlexSPI Pinmux組合都能被用來連接串行NOR Flash去啟動。

  i.MXRT1050/1020/1015是i.MXRT系列MCU家族比較早亮相的型號,也是客戶當前使用較多的i.MXRT芯片。它們三兄弟內部均只有一個雙通道8bit的FlexSPI模塊,在FlexSPI NOR啟動連接方式支持上是相似的。今天痞子衡就來跟大家好好聊一聊到底哪些FlexSPI NOR連接方式是可以用作啟動的。

  • Note: 本文提及的芯片,在系統映射地址空間分配上,給 FlexSPI 分配的起始地址是 0x60000000,因此 XIP 應用程序需要從 0x60000000 之后的空間開始鏈接

一、FlexSPI連接模式

  在講啟動連接之前,首先跟大家簡單聊一下FlexSPI模塊的連接模式。從手冊里看,FlexSPI一共有三種連接模式:

Individual mode:如下圖左邊Flash A1+A2+B1+B2,它們分時復用FlexSPI,同一時刻僅有一個四線QSPI Flash被操作(僅一個PORT有數據收發)。
Parallel mode:如下圖左邊Flash A1+B1或Flash A2+B2,同一時刻兩個四線QSPI Flash可以一起被操作(兩個PORT都有數據收發),FlexSPI會自動合並/拆分數據(read/program)到兩個PORT。
Combination mode:如下圖右邊Flash A1或A2,這是FlexSPI接八線Octal/Hyper Flash的方法。

二、涉及FlexSPI引腳

  提及啟動,就不得不提i.MXRT芯片內部BootROM,BootROM是固化在芯片內部ROM空間的一段代碼,芯片上電永遠是BootROM先運行,由BootROM從外部存儲器去加載應用程序執行。因此FlexSPI NOR連接方式其實是由BootROM決定的,更直白點說,其實FlexSPI NOR連接方式是寫死在BootROM代碼里。

2.1 BootROM指定

  我們可以在芯片參考手冊System Boot這一章節找到BootROM指定的FlexSPI NOR引腳,痞子衡整理如下:

  下表適用於i.MXRT105x(適用全系列封裝):

  下表適用於i.MXRT102x和i.MXRT1015(對於LQFP144封裝,所有引腳均適用。對於LQFP100封裝,只有1st Option里ALT為1的12根線可用):

  上面的表格基本上已經給我們指明了方向,目前我們知道了哪些Pin可以用作FlexSPI NOR啟動連接,但是似乎還是有一些不清楚的地方:

疑問1:1st Option里一共有4根片選信號(SSx)和2根DQS信號,而Flash只需要一個片選和一個DQS,是不是所有片選+DQS組合都可以?
疑問2:1st Option里一共8根數據線,除了連接八線Octal/Hyper Flash之外,是否可以單連四線QSPI Flash?PortA和PortB是不是都可以連QSPI Flash?
疑問3:是否可以從1st和2nd Option里分別挑選信號線和數據線來連接Flash?比如1st Option里的PortA_DATA[1:0]和2nd Option里的PORTA_DATA[3:2]組成四線。
疑問4:那根FlexSPI Reset信號對於1st和2nd Option是不是都適用?
疑問5:是否可以掛兩片QSPI Flash啟動?具體怎么掛?兩片Flash能否實現在一片Flash中執行代碼去擦寫另一片Flash?
疑問6:2nd Option里只有PortA和一根片選,但RT1050 Pinmux表里其也支持PortB和其他片選,那些信號線后續是否可以利用?

  在后面的內容里,痞子衡會逐一為大家解析這些疑問。

2.2 BootROM未指定

  在此也列出不在BootROM指定的FlelxSPI NOR引腳,方便后續設計雙Flash時參考。

  下表適用於i.MXRT105x(適用全系列封裝):

  下表適用於i.MXRT102x和i.MXRT1015(適用全系列封裝):

三、單Flash連接方式(3種)

  在系統設計時使用一片Flash是最常用的情況,這片Flash負責存放應用程序代碼(即所謂的Code Flash),i.MXRT既可以在Flash中原地執行,也可以將應用程序拷貝到內部RAM中執行。

  相信大家做板級設計一定會參考官方EVK,在RT1050-EVKB中,官方給出了如下兩種單Flash的連接方式,這也是最推薦的兩種方式:

  第一種Flash連接方式就是利用FlexSPI 1st Option里的6根PORTA信號線連接四線QSPI Flash,此處需要注意的是片選信號僅能選PORTA_SS0,你可能會疑問PORTA_SS1明明也在BootROM支持列表里,為何不能用?關於這一點痞子衡會在后面雙Flash連接里為大家解釋。

  第二種Flash連接方式就是利用FlexSPI 1st Option里的7根PORTA信號線和5根PORTB信號線連接八線Octal/Hyper Flash,此處仍需注意的是片選和DQS信號僅能選PORTA_SS0、PORTA_DQS。此種Flash接法還利用了FlexSPI Reset信號。

  • Note: 如果連接的是 HyperFlash,需要燒寫eFuse 0x450 或撥碼對應 BOOT_CFG 引腳, 將 FLASH_TYPE[2:0] 設為 010-HyperFlash 1V8 / 011-HyperFlash 3V3 才能啟動

  第三種Flash連接方式就是利用FlexSPI 2nd Option里的6根PORTA信號線連接四線QSPI Flash,具體接法跟第一種方式很像,但是此處沒有關於片選的疑慮,因為2nd Option只有一個片選。

  • Note: 需要燒寫eFuse 0x450 或撥碼對應 BOOT_CFG 引腳, 將 FLASH_TYPE[2:0] 設為 111 - QSPI device supports 3B read by default on secondary pinmux option 才能啟動

  介紹完三種單Flash連接方案,現在來解答一些前面列出的疑問。

解答1:1st Option里一共4根片選信號(SSx)和2根DQS信號並不是隨意組合都可以,無論是四線還是八線單Flash連接方案,均只有PORTA_SS0、PORTA_DQS這一種組合可用。其他組合主要用在雙Flash連接方案中。
解答2:1st Option中僅PORTA可以單獨接四線QSPI Flash,不支持PORTB單獨接四線QSPI Flash。
解答3:不支持從1st和2nd Option里分別挑選數據線來連接Flash(不過就FlexSPI模塊本身而言,理論上是支持的,但這么用的話需要解決數據線信號等長問題,因為這兩個Option的走線長度在芯片內部不一樣,總之不推薦這么用)。但是支持1st Option里取信號線,2nd Option里取數據線類似這種組合方式來連接Flash。
解答4:FlexSPI Reset信號是與1st、2nd Option無關的,所以兩個Option下均可以用,不過Reset信號常用於八線Flash。

四、雙Flash連接方式(18種)

  很多實際系統設計中,常常有既在Flash中存放用戶應用程序,也在Flash中存放用戶數據的場景,當然我們可以將一片Flash分成Code區和Data區來實現,但更好的方案是選用兩片Flash(一片Code Flash、一片Data Flash)同時掛在FlexSPI上,這樣可以避免數據誤操作,而且最重要的是在擦除或者編程Data Flash的等待期間(這個時間可不短),CPU可以繼續從Code Flash取代碼執行或響應中斷。此處我們暫不討論支持RWW特性的Flash。

  i.MXRT支持掛兩片Flash去啟動,此處僅以兩片四線QSPI Flash為例。下圖給出了多片Flash的連接方式,理論上一個FlexSPI最多可以掛四片Flash,因為最大有4個片選。但僅考慮接兩片Flash的話,1st Option以及2nd Option里所有片選按排列組合來說應該有近30多種組合方式,那么這30多種組合是不是都可行呢?當然不是!要在這些組合中剔除掉不包含1st A_SS0或者2nd A_SS0的組合。即下圖中標淺綠色的Flash A0在雙Flash組合中是一定要存在的,因為BootROM上電永遠是從Flash A0中獲取FDCB以及啟動代碼頭(IVT, BootData),所以Flash A0就是Code Flash

  分析到了這里,我們就知道如下符合條件的18種包含Flash A0的組合方式,其中標記Code的片選信號應該連接存放應用程序代碼的Code Flash,標記Data的片選信號則連接存放用戶數據的Data Flash:

Note1:如果兩個Flash掛在同一類型PORT上(都是PORTA或都是PORTB),即下面的第1、2、3、10、11、12種組合時,這兩片Flash最好是同一個型號,這樣電氣特性容易保持一致。
Note2:如果組合中所有引腳選擇全部在BootROM指定范圍里,那么BootROM直接支持Data Flash的配置。如果有引腳不在BootROM指定范圍,那么需要用戶在Code Flash用代碼去實現Data Flash配置。

Num FlexSPI 1st Option FlexSPI 2nd Option
BootROM指定 BootROM未指定 BootROM指定 BootROM未指定
不適用LQFP100 不適用LQFP100 不適用LQFP144/100
A_SS0 A_DATA[3:0]
A_SCLK
B_SCLK B_DATA[3:0] A_SS1 B_SS0 B_SS1 A_SS1 B_SS0 A_SS0 A_DATA[3:0]
A_SCLK
A_SS1 B_DATA[3:0]
1
Code

Data
2
Code

Data
3
Code

Data
4
Code

Data
5
Code

Data
6
Code

Data
7
Code

Data
8
Code

Data
9
Code

Data
10
Data

Code
11
Data

Code
12
Code

Data
13
Data

Code
14
Data

Code
15
Data

Code
16
Data

Code
17
Data

Code
18
Data

Code

  介紹完18種雙Flash連接方案,現在來解答一些前面列出的疑問。

解答5:可以掛兩片QSPI Flash啟動,一共有18種連接方式。兩片Flash的方案還是不可以實現在Code Flash里原地執行代碼去擦寫Data Flash這種用法,但可以實現RWW的核心意義,下一節會單獨展開講這個。
解答6:不在BootROM指定的2nd Option PortB信號可以用於連接Data Flash,但是Data Flash的配置需要由Code Flash里的用戶應用程序代碼來完成,BootROM無法直接配置Data Flash。

五、關於RWW的注意事項

  現在市面上大部分Flash(尤其是普通四線QSPI)是不支持RWW(Read-While-Write)特性的,就是在單片Flash上無法實現同時讀寫。但如果我們在i.MXRT1015/1020/1050系統設計中采用一片支持RWW特性的Flash或者直接使用兩片Flash,是否可以實現在Code Flash(或RWW Flash中的Code分區)中原地執行代碼去擦寫Data Flash(或RWW Flash中的Data分區)這種需求。答案其實還是不可以,這是由FlexSPI模塊本身特性限制的,這個特性就是同一個FlexSPI模塊下的AHB command和IP command是互斥的

5.1 FlexSPI異類命令互斥特性

  下圖是FlexSPI模塊框圖,可以這么簡單理解,CPU去Code Flash取程序代碼指令走的是64bit AHB Bus(即AHB command),Code Flash里的程序代碼里調用FlexSPI驅動去擦除或編程Data Flash走的是32bit IPS Bus(即IP command),這兩種不同類型的command會經過ARB_CTL模塊去仲裁,同一時間只有一種command勝出成為ARB command去實際操作Flash。

  那FlexSPI模塊這個限制到底怎么破?有以下四種方式可以來幫忙:

方法1:在MPU里設置Code Flash對應的映射地址區域,使能Cache,並且保證應用程序代碼里調用FlexSPI驅動去擦寫Data Flash的關鍵部分(觸發IP CMD執行)始終緩存在Cache里。
方法2:將應用程序代碼里調用FlexSPI驅動去擦寫Data Flash的關鍵部分搬運到RAM空間去運行,可以直接借助IDE特性去完成(比如IAR,可以用__ramfunc去修飾關鍵函數)。
方法3:在寫Data Flash的時候借助DMA來搬運數據,不讓CPU干預,具體可以參考官方《AN12564 Implement RWW on i.MX RT Series》
方法4:應用程序代碼里的FlexSPI驅動直接使用BootROM API(代碼是在ROM空間運行的)。

  這四種方法里首推方法4,既能實現需求,又能省Code Flash空間(FlexSPI驅動代碼說小不小)。方法1其實是不推薦的,畢竟Cache是種玄學,豈是你想控制就控制的。

5.2 RWW的核心意義

  最后再說一下,掛兩片Flash(或一片RWW Flash)到底相比掛一片非RWW Flash有什么好處?這就涉及到RWW的核心意義了,其實痞子衡前面已經講過了,雖然不能實現在Code Flash中原地執行擦寫操作相關代碼,但是在Data Flash擦寫等待期間,CPU可以繼續從Code Flash取代碼執行,這意味着此時不需要刻意關閉系統全局中斷,因此不影響系統響應的實時性。

  至此,恩智浦i.MX RT1015/1020/1050三款MCU的FlexSPI NOR啟動的連接方式痞子衡便介紹完畢了,掌聲在哪里~~~

歡迎訂閱

文章會同時發布到我的 博客園主頁CSDN主頁微信公眾號 平台上。

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM