痞子衡嵌入式:恩智浦i.MX RT1xxx系列MCU啓動那些事(11.1)- 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鏈接方式是能夠用做啓動的。緩存

1、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的方法。函數

2、涉及FlexSPI引腳

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

2.1 BootROM指定

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

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

  下表適用於i.MXRT102x和i.MXRT1015(對於LQFP144封裝,全部引腳均適用。對於LQFP100封裝,只有1st Option裏ALT爲1的12根線可用):設計

  上面的表格基本上已經給咱們指明瞭方向,目前咱們知道了哪些Pin能夠用做FlexSPI NOR啓動鏈接,可是彷佛仍是有一些不清楚的地方:3d

疑問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和其餘片選,那些信號線後續是否能夠利用?blog

  在後面的內容裏,痞子衡會逐一爲你們解析這些疑問。

2.2 BootROM未指定

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

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

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

3、單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信號。

  第三種Flash鏈接方式就是利用FlexSPI 2nd Option裏的6根PORTA信號線鏈接四線QSPI Flash,具體接法跟第一種方式很像,可是此處沒有關於片選的疑慮,由於2nd 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。

4、雙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),即下面的第一、二、三、十、十一、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。

5、關於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主頁微信公衆號 平臺上。

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

相關文章
相關標籤/搜索