加入星計(jì)劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴(kuò)散
  • 作品版權(quán)保護(hù)
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長(zhǎng)期合作伙伴
立即加入
  • 正文
    • 一、引出NAND訪問(wèn)問(wèn)題
    • 二、關(guān)于LEXSPI_MCR0寄存器保留位
    • 三、FLEXSPI_MCR0寄存器保留位測(cè)試
    • 四、SDK驅(qū)動(dòng)處理方法
    • 五、經(jīng)驗(yàn)與教訓(xùn)
  • 推薦器件
  • 相關(guān)推薦
申請(qǐng)入駐 產(chǎn)業(yè)圖譜

是誰(shuí)說(shuō)MCU寄存器一定要謹(jǐn)慎賦值來(lái)著?

2024/03/11
2247
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

大家好,我是痞子衡,是正經(jīng)搞技術(shù)的痞子。今天痞子衡給大家介紹的是不清i.MXRTxxx里FLEXSPI_MCR0寄存器保留位會(huì)造成IP CMD讀寫(xiě)異常

痞子衡曾經(jīng)寫(xiě)過(guò)一篇文章 《改動(dòng)i.MXRT1xxx里IOMUXC_GPR寄存器保留位可能會(huì)造成系統(tǒng)異?!?,這篇文章提出了一個(gè)觀點(diǎn),即對(duì)于 MCU 外設(shè)寄存器應(yīng)使用謹(jǐn)慎賦值法(應(yīng)該先讀回初值再做位操作賦值,不要忽略初值直接整體賦值),如今三年過(guò)去了,這個(gè)經(jīng)驗(yàn)狠狠地反噬了痞子衡一把,一度把痞子衡調(diào)試到崩潰,且聽(tīng)痞子衡辛酸道來(lái):

一、引出NAND訪問(wèn)問(wèn)題

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

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

    i.MX RT上串行NAND驅(qū)動(dòng):https://github.com/JayHeng/RT-SNAND

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

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

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

1. RT500 手冊(cè)描述來(lái)看,這兩個(gè)保留位可讀不建議寫(xiě),且讀回值應(yīng)該是 0
2. RT600 手冊(cè)對(duì)這兩個(gè)保留位描述是 both bits must be written with ones.

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

三、FLEXSPI_MCR0寄存器保留位測(cè)試

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

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

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

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

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

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

1. 在 RTxxx 頭文件 FlexSPI 模塊寄存器定義里沒(méi)有 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 位信息,無(wú)上述特性宏定義

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

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

至此,不清i.MXRTxxx里FLEXSPI_MCR0寄存器保留位會(huì)造成IP CMD讀寫(xiě)異常痞子衡便介紹完畢了,掌聲在哪里~~~

推薦器件

更多器件
器件型號(hào) 數(shù)量 器件廠商 器件描述 數(shù)據(jù)手冊(cè) ECAD模型 風(fēng)險(xiǎn)等級(jí) 參考價(jià)格 更多信息
MOCD207R2M 1 Fairchild Semiconductor Corporation Transistor Output Optocoupler, 2-Element, 2500V Isolation, LEAD FREE, PLASTIC, SOIC-8
$1.16 查看
NX3225SA-25.000M-STD-CRS-2 1 Nihon Dempa Kogyo Co Ltd Quartz Crystal,
$9.24 查看
HCPL2631SDM 1 Fairchild Semiconductor Corporation Logic IC Output Optocoupler, 2-Element, 5000V Isolation, 10MBps, LEAD FREE, SURFACE MOUNT, DIP-8
$2.67 查看

相關(guān)推薦

登錄即可解鎖
  • 海量技術(shù)文章
  • 設(shè)計(jì)資源下載
  • 產(chǎn)業(yè)鏈客戶資源
  • 寫(xiě)文章/發(fā)需求
立即登錄

碩士畢業(yè)于蘇州大學(xué)電子信息學(xué)院,目前就職于恩智浦(NXP)半導(dǎo)體MCU系統(tǒng)部門,擔(dān)任嵌入式系統(tǒng)應(yīng)用工程師。痞子衡會(huì)定期分享嵌入式相關(guān)文章