0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

i.MXRTxxx里FLEXSPI_MCR0寄存器保留位會造成IP CMD讀寫異常?

痞子衡嵌入式 ? 來源:痞子衡嵌入式 ? 2024-03-11 10:28 ? 次閱讀

一、引出NAND訪問問題

痞子衡最近需要在恩智浦無線系列 SoC(RW612)上調(diào)試串行 NAND Flash 驅(qū)動,簡單理解這顆芯片其實就是 RT600 + 多模無線 SIP 到一起,但是其 MCU 部分對 RT600 做了精簡以及魔改。因為痞子衡對 i.MX RT 特別熟,所以自然想到先在 RT500/600 上調(diào)通串行 NAND Flash,然后再做簡單移植就大功告成了,沒想到被這么個想法坑慘了。

痞子衡手里早就有成熟的 RT1050 系列串行 NAND Flash 驅(qū)動(并不是基于官方 SDK 底層驅(qū)動),單從 FlexSPI 外設(shè)角度來看,RT1xxx 和 RTxxx 差異不太大,基本是兼容的,所以痞子衡很快就將代碼從 RT1050 移植到了 RT500 上,工程編譯幾乎是一把過,然而在 RT500 上實測時卻連 NAND 的 JEDEC ID 都無法正常讀取,IP CMD 獲取到的值永遠是 0x0。

由于串行 NAND Flash 驅(qū)動代碼在 RT1050 上得到過驗證,所以其本身不存在邏輯問題,大概率問題還是出在 FlexSPI 外設(shè)配置上,于是痞子衡經(jīng)過 RT1050 vs RT500 各種單元對比測試(此處耗費時間較長),最終發(fā)現(xiàn)是由 FLEXSPI_MCR0[7:6] 的配置值不同引起的。

二、關(guān)于LEXSPI_MCR0寄存器保留位

在 RT500 參考手冊(Rev.2)以及 RT600 參考手冊(Rev1.5)里查看 FlexSPI 模塊的 MCR0 寄存器描述,會發(fā)現(xiàn) MCR0[7:6] 是保留位,且復(fù)位默認值為 1。

1. RT500 手冊描述來看,這兩個保留位可讀不建議寫,且讀回值應(yīng)該是 0
2. RT600 手冊對這兩個保留位描述是 both bits must be written with ones.
d9558714-dddf-11ee-a297-92fbcf53809c.png

作為對比我們再查看一下 RT 四位數(shù)系列(如 RT1050)上相關(guān)描述,這兩個位并不是保留位,其具體功能是決定訪問 IP TX/RX FIFO 數(shù)據(jù)的方式是 AHB bus 還是 IP bus。默認值 1 表明只能從 AHB bus 訪問 IP TX/RX FIFO,這個初始值設(shè)置其實稍微有點不合理,畢竟 AHB bus 已經(jīng)有專用的 AHB TX/RX Buffer 傳輸數(shù)據(jù)了。

d95e827e-dddf-11ee-a297-92fbcf53809c.png

三、FLEXSPI_MCR0寄存器保留位測試

在 RT500/600 上 FLEXSPI_MCR0[7:6] 是保留位,那這個保留位到底是什么意思?到底是沒有這個 ATDFEN/ARDFEN 相應(yīng)功能,還是單純不對用戶開放而已,這里就需要做一個實驗來驗證。

痞子衡在 RT500-EVK 上用連在 FlexSPI PortA 上的那顆四線 NOR 做測試,我們嘗試用 IP CMD 發(fā) Read JEDEC ID 命令讀取 2byte 數(shù)據(jù),在 FLEXSPI_MCR0[7:6] 為默認 2'b11 的情況下,可以看到 FLEXSPI_RFDRx 寄存器全是 0,這意味著 IP bus 根本就沒有觸發(fā) IP RX FIFO 工作。

d96eb090-dddf-11ee-a297-92fbcf53809c.png

將 FLEXSPI_MCR0[7:6] 設(shè)為 2'b00 再測一次,這時可以看到 FLEXSPI_RFDRx 寄存器里開始有數(shù)據(jù)了,IP bus 觸發(fā) IP RX FIFO 干活了。

d9735dd4-dddf-11ee-a297-92fbcf53809c.png

現(xiàn)在我們知道了,RT500/600 上 FLEXSPI_MCR0[7:6] 雖然是保留位,但是其 ATDFEN/ARDFEN 功能仍然是存在的。

四、SDK驅(qū)動處理方法

在官方 SDK 2.14 的 fsl_flexspi 驅(qū)動 FLEXSPI_Init() 函數(shù)里對于 MCR0 寄存器采取得是忽略初值直接整體賦值的初始化方式,其關(guān)于 ATDFEN/ARDFEN 位操作根據(jù)特性宏來做條件編譯。這樣的處理導(dǎo)致 RT500/600 上 FLEXSPI_MCR0[7:6] 永遠被重置為 2'b00。例程測試結(jié)果上來看似乎沒有問題,但是這里存在一定不合理的地方。

1. 在 RTxxx 頭文件 FlexSPI 模塊寄存器定義里沒有 ATDFEN/ARDFEN 位信息,但有如下特性宏定義
  #define FSL_FEATURE_FLEXSPI_HAS_NO_MCR0_ARDFEN (1)
  #define FSL_FEATURE_FLEXSPI_HAS_NO_MCR0_ATDFEN (1)
2. 在 RT1xxx 頭文件 FlexSPI 模塊寄存器定義里有 ATDFEN/ARDFEN 位信息,無上述特性宏定義
d9801236-dddf-11ee-a297-92fbcf53809c.png

五、經(jīng)驗與教訓(xùn)

回到文章開頭,痞子衡推薦的 MCU 外設(shè)寄存器謹慎賦值法在這個案例里就完全失效了。我們知道 MCU 外設(shè)寄存器有保留位是業(yè)界常規(guī)做法,但是保留位到底是無功能還是功能不開放,這個要看具體情況。如果應(yīng)用代碼是基于官方 SDK 底層驅(qū)動,那么可能不會遇到問題。如果你需要重寫底層驅(qū)動,想手撕寄存器,那就要特別小心了,關(guān)于寄存器保留位的處理是值得深思的。




審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • mcu
    mcu
    +關(guān)注

    關(guān)注

    146

    文章

    17475

    瀏覽量

    354615
  • 驅(qū)動器
    +關(guān)注

    關(guān)注

    54

    文章

    8378

    瀏覽量

    147717
  • 寄存器
    +關(guān)注

    關(guān)注

    31

    文章

    5392

    瀏覽量

    121930
  • SoC芯片
    +關(guān)注

    關(guān)注

    1

    文章

    620

    瀏覽量

    35215
  • Nand flash
    +關(guān)注

    關(guān)注

    7

    文章

    241

    瀏覽量

    40209

原文標(biāo)題:是誰說MCU寄存器一定要謹慎賦值來著?

文章出處:【微信號:pzh_mcu,微信公眾號:痞子衡嵌入式】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    芯片I2C通信異常無法讀寫寄存器破解

    時鐘芯片PCF2129在批量生產(chǎn)過程中,有客戶反饋出現(xiàn)PCF2129有0.2%左右芯片I2C通信異常,無法讀寫寄存器
    的頭像 發(fā)表于 09-20 16:14 ?1.4w次閱讀

    MCU外設(shè)寄存器謹慎賦值法

    今天給大家介紹的是改動i.MXRT1xxxIOMUXC_GPR寄存器保留可能
    的頭像 發(fā)表于 12-12 09:14 ?861次閱讀
    MCU外設(shè)<b class='flag-5'>寄存器</b>謹慎賦值法

    為什么改動i.MXRT1xxxIOMUXC_GPR寄存器保留造成系統(tǒng)異常

    為什么改動i.MXRT1xxxIOMUXC_GPR寄存器保留
    發(fā)表于 11-29 06:34

    i.MXRTxxx系列ROM中靈活的串行NOR Flash啟動硬復(fù)位引腳選擇

    今天痞子衡給大家介紹的是i.MXRTxxx系列ROM中靈活的串行NOR Flash啟動硬復(fù)位引腳選擇?! £P(guān)于 i.MXRT 系列 BootROM 中串行 NOR Flash 啟動流程,痞子衡寫過一
    發(fā)表于 12-21 06:34

    32寄存器,32寄存器是什么意思

    32寄存器,32寄存器是什么意思  從X8086開始學(xué)了一年,第一個ASM的程序就是變32換16進制的程序,不過現(xiàn)在叫我從新開始寫ASM程
    發(fā)表于 03-08 17:26 ?1.8w次閱讀

    MIPS寄存器詳解

    保留,由于I型指令的立即數(shù)字段只有16,在加載大常數(shù)時,編譯或匯編程序需要把大常數(shù)拆開,然后重新組合到寄存器
    發(fā)表于 04-27 10:34 ?6296次閱讀
    MIPS<b class='flag-5'>寄存器</b>詳解

    51單片機的寄存器組應(yīng)該如何設(shè)置

    大家都知道51單片機有的寄存器R0-R7共有四組。最近1年來,我在與新手朋友交流時發(fā)現(xiàn),很多朋友對寄存器組的使用時經(jīng)常出現(xiàn)問題。雖然這并不是多難的問題,但如果出現(xiàn)錯誤,也
    發(fā)表于 09-11 17:24 ?0次下載
    51單片機的<b class='flag-5'>寄存器</b>組應(yīng)該如何設(shè)置

    【學(xué)習(xí)筆記】51單片機常用寄存器

    為98H,地址為98H~9FH。SCON控制寄存器結(jié)構(gòu)SCON寄存器各位定義(1)方式0( SM0 SM1 :
    發(fā)表于 11-14 16:21 ?9次下載
    【學(xué)習(xí)筆記】51單片機常用<b class='flag-5'>寄存器</b>

    C語言操作在(單片機)寄存器中的應(yīng)用

    C語言操作在寄存器中的應(yīng)用本文參考另一篇博客寫成附鏈接,個人感覺內(nèi)容過多不便于吸收,就寫了這篇博客。整體思想:設(shè)置一個就是設(shè)置該位為1,清除就是設(shè)置該位為0
    發(fā)表于 11-29 10:06 ?8次下載
    C語言<b class='flag-5'>位</b>操作在(單片機)<b class='flag-5'>寄存器</b>中的應(yīng)用

    痞子衡嵌入式:改動i.MXRT1xxxIOMUXC_GPR寄存器保留可能造成系統(tǒng)異常

      大家好,我是痞子衡,是正經(jīng)搞技術(shù)的痞子。今天痞子衡給大家介紹的是改動i.MXRT1xxxIOMUXC_GPR寄存器保留可能
    發(fā)表于 12-04 17:36 ?8次下載
    痞子衡嵌入式:改動<b class='flag-5'>i</b>.MXRT1xxx<b class='flag-5'>里</b>IOMUXC_GPR<b class='flag-5'>寄存器</b><b class='flag-5'>保留</b><b class='flag-5'>位</b>可能<b class='flag-5'>會</b><b class='flag-5'>造成</b>系統(tǒng)<b class='flag-5'>異常</b>

    GPIO寄存器

    ,一般高16保留BSRR寄存器32分為低16BSRRL和高16BSRRH,BSRRL配置
    發(fā)表于 12-08 17:06 ?5次下載
    GPIO<b class='flag-5'>寄存器</b>

    CS,IP和PC寄存器

    CS寄存器IP寄存器:首先強調(diào)一下,這兩個寄存器非常非常重要,CS的全拼為“Code segment”,即代碼段寄存器,對應(yīng)于內(nèi)存中的存放
    發(fā)表于 12-17 18:31 ?2次下載
    CS,<b class='flag-5'>IP</b>和PC<b class='flag-5'>寄存器</b>

    16和32寄存器的區(qū)別 16寄存器有哪些

    16寄存器可以存儲2個字節(jié)(16)的數(shù)據(jù),數(shù)據(jù)范圍為0~65535。在單片機中,16寄存器
    發(fā)表于 03-31 18:14 ?1.7w次閱讀

    一文了解i.MXRTxxx系列片內(nèi)SRAM分區(qū)電源控制

    大家好,我是痞子衡,是正經(jīng)搞技術(shù)的痞子。今天痞子衡給大家介紹的是從功耗測試角度了解i.MXRTxxx系列片內(nèi)SRAM分區(qū)電源控制。
    的頭像 發(fā)表于 07-07 09:58 ?1250次閱讀
    一文了解<b class='flag-5'>i.MXRTxxx</b>系列片內(nèi)SRAM分區(qū)電源控制

    IP2368寄存器說明文檔

    轉(zhuǎn)換芯片,轉(zhuǎn)到 3.3V;? IP2368 INT 應(yīng)用說明:IP2368 休眠時檢測到 INT 為高就會喚醒,喚醒之后,IP2368 主動拉高 INT,100ms之后,MCU 可進行 I
    發(fā)表于 12-04 14:30 ?17次下載