痞子衡嵌入式:不清i.MXRTxxx里FLEXSPI_MCR0寄存器保留位會造成IP CMD讀寫異常

来源:https://www.cnblogs.com/henjay724/p/18062627
-Advertisement-
Play Games

大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家介紹的是不清i.MXRTxxx里FLEXSPI_MCR0寄存器保留位會造成IP CMD讀寫異常。 痞子衡曾經寫過一篇文章 《改動i.MXRT1xxx里IOMUXC_GPR寄存器保留位可能會造成系統異常》,這篇文章提出了一個觀點,即對於 MCU ...



  大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家介紹的是不清i.MXRTxxx里FLEXSPI_MCR0寄存器保留位會造成IP CMD讀寫異常

  痞子衡曾經寫過一篇文章 《改動i.MXRT1xxx里IOMUXC_GPR寄存器保留位可能會造成系統異常》,這篇文章提出了一個觀點,即對於 MCU 外設寄存器應使用謹慎賦值法(應該先讀回初值再做位操作賦值,不要忽略初值直接整體賦值),如今三年過去了,這個經驗狠狠地反噬了痞子衡一把,一度把痞子衡調試到崩潰,且聽痞子衡辛酸道來:

一、引出NAND訪問問題

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

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

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

二、關於FLEXSPI_MCR0寄存器保留位

  在 RT500 參考手冊(Rev.2)以及 RT600 參考手冊(Rev1.5)里查看 FlexSPI 模塊的 MCR0 寄存器描述,會發現 MCR0[7:6] 是保留位,且複位預設值為 1。

1. RT500 手冊描述來看,這兩個保留位可讀不建議寫,且讀回值應該是 0
2. RT600 手冊對這兩個保留位描述是 both bits must be written with ones.

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

三、FLEXSPI_MCR0寄存器保留位測試

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

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

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

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

四、SDK驅動處理方法

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

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 位信息,無上述特性巨集定義

五、經驗與教訓

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

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

歡迎訂閱

文章會同時發佈到我的 博客園主頁CSDN主頁知乎主頁微信公眾號 平臺上。

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

  最後歡迎關註痞子衡個人微信公眾號【痞子衡嵌入式】,一個專註嵌入式技術的公眾號,跟著痞子衡一起玩轉嵌入式。

痞子衡嵌入式-微信二維碼 痞子衡嵌入式-微信收款二維碼 痞子衡嵌入式-支付寶收款二維碼

  衡傑(痞子衡),目前就職於某全球頂級半導體原廠MCU系統部門,擔任高級嵌入式系統應用工程師。

  專欄內所有文章的轉載請註明出處:http://www.cnblogs.com/henjay724/

  與痞子衡進一步交流或咨詢業務合作請發郵件至 [email protected]

  可以關註痞子衡的Github主頁 https://github.com/JayHeng,有很多好玩的嵌入式項目。

  關於專欄文章有任何疑問請直接在博客下麵留言,痞子衡會及時回覆免費(劃重點)答疑。

  痞子衡郵箱已被私信擠爆,技術問題不推薦私信,堅持私信請先掃碼付款(5元起步)再發。



您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 如題,在使用Pyinstaller庫打包過程中,如果遇到IndexError:tuple index out of range,不必驚慌,本質上是庫函數在傳參過程中出現異常 下麵是解決方案: 找到..\envs\steamlit\lib\dis.py這個文件。 如果你是用的虛擬環境,比如conda, ...
  • 1. 查看防火牆狀態:active (running) 即是開啟狀態 systemctl status firewalld 2. 如果不是顯示 active 狀態,需要打開防火牆 # 啟動 systemctl start firewalld # 查看狀態 systemctl status firew ...
  • 1、準備材料 正點原子stm32f407探索者開發板V2.4 STM32CubeMX軟體(Version 6.10.0) Keil µVision5 IDE(MDK-Arm) 野火DAP模擬器 2、學習目標 瞭解 FreeRTOS 相關知識,並熟悉使用 STM32CubeMX 軟體配置 FreeRT ...
  • 前幾天遇到一個使用情景,需要從一個包含各個讀取代碼文件路徑及名字的文件中把文件路徑提取出來,做一個filelist,這裡用到了文本的提取和替換,這裡做個小總結記錄一下。 從網上找了一個作者寫的代碼用來練習。 module asyn_fifo #( //parameter declaration pa ...
  • 痞子衡嵌入式半月刊: 第 94 期 這裡分享嵌入式領域有用有趣的項目/工具以及一些熱點新聞,農曆年分二十四節氣,希望在每個交節之日準時發佈一期。 本期刊是開源項目(GitHub: JayHeng/pzh-mcu-bi-weekly),歡迎提交 issue,投稿或推薦你知道的嵌入式那些事兒。 上期回顧 ...
  • 蓬萊enclave-spmp 編譯和運行說明 蓬萊是一個RISC-V TEE系統,其設計具有安全性,高性能和可擴展性。基於PMP的OpenSBI版本的蓬萊Enclave使用可以參考下文,具體倉庫地址為:https://github.com/Penglai-Enclave/Penglai-Enclav ...
  • 一.找回root密碼 找到以““Linux16”開頭內容所在的行數”,在行的最後面輸入:init=/bin/sh 輸完紅色命令後 Ctrl + X 命令 接下來在游標閃爍處,輸入指令:mount -o remount,rw /(註意:各個單詞間有空格) 游標閃爍的位置中,輸入passwd,輸入一次密 ...
  • iptables是Linux系統上用於配置網路包過濾規則的工具,它使用表(tables)和鏈(chains)來組織規則。以下是iptables中的五表五鏈及其對應的實例說明: 五表 filter表:預設表,用於過濾數據包,允許或拒絕數據包通過。它包含INPUT、OUTPUT和FORWARD三個鏈。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...