前言
AUTOSAR架構圖下的Fls模塊對上(Fee)模塊提供統一的標準接口,但是具體的實現因不同的芯片而不一樣,Infineon公司的Fls模塊通過操作TC3xx芯片的DMU模塊實現Fls的功能。在具體介紹Fls模塊的功能之前,有必要先介紹下TC3xx芯片的DMU模塊。本文就來詳細介紹下TC37x芯片的DMU功能,希望能搞清楚以下問題:
問題1:站在軟件實現的角度來看,如何通過DMU實現讀,寫,擦除DFlash?
問題2:站在軟件實現的角度來看,如何通過DMU監控讀,寫,擦除DFlash等任務完成的?
問題3:站在軟件實現的角度來看,如何通過DMU監控讀,寫,擦除DFlash等任務出現Error的?
問題4:站在軟件實現的角度來看,在監控到讀,寫,擦除DFlash等任務出現Error后如何恢復重來?
Note: 作者對芯片的各種模塊的硬件接口或者功能實現也不是很理解(非電子信息專業出身,屬于半路出家的半吊子……),但是站在軟件開發者的角度來看,個人理解,操作芯片模塊基本就是操作芯片模塊的控制寄存器來達到想要的功能,輪詢芯片的狀態寄存器判斷控制命令是否完成,監控Error寄存器看是否發生錯誤(發送錯誤后一般通知上層后嘗試重置芯片模塊功能)。對于軟件開發者,搞清楚上述四個問題其實就是搞清楚在上述問題的上下文中如何控制和監控寄存器。
縮略詞
簡寫 | 全稱 |
DMU | Data Memory Unit |
DPI | Direct Processor Interface (to Local Flash Bank) |
FSI | Flash Standard Interface |
SRI | Shared Resource Interconnect |
SIF | Slave Interface |
正文
1.DMU硬件架構
CPU通過SRI總線能夠訪問/控制DMU,DMU通過FSI接口能夠控制DFLASH。CPU訪問/控制DMU可以通過軟件(我們寫代碼)實現,DMU通過FSI訪問/控制DFLASH是硬件實現(軟件不不參與,軟件發錯命令序列后只能輪詢DMU的狀態寄存器來獲取DMU訪問/操作DFLASH的結果)。
圖1:Non Volatile Memory (NVM) Subsystem
圖2:Block diagram of DMU module
圖3:Block Diagram of the NVM module
2.DMU寄存器
DMU模塊相關的寄存器很多,這里我們只要了解DMU相關的控制,狀態,錯誤狀態三個寄存器就能理解絕大部分的功能。
2.1 DMU狀態寄存器
HF_STATUS狀體寄存器,標識當前Flash的狀態。比如,標識當前Flash是否在Page Mode(擦寫Flash時必須在這個模式下),Flash當前是否Busy(Flash是否正在處理上一次的擦寫任務)。
D0BUSY: 標識DFlash0是否處于Busy狀態。
D1BUSY:標識DFlash1是否處于Busy狀態。
Fls在進行硬件操作前,會檢查DFlash是否Busy,如果Busy的話就不進行任何操作。
DFPAGE: 標識DFlash是否處于Page Mode
DFPAGE: 標識PFlash是否處于Page Mode
Fls在執行Writesequence前都要先進入到Page Mode
Note: 進入Page Mode后,Flash模塊才能夠接收寫入的數據
2.2 DMU控制寄存器
DMU控制寄存器HF_CONTROL并不是用來直接操作數據的寫入和擦除(數據的寫入和擦除由Command Sequence實現,后面章節介紹),而是用來控制/使能一些Flash的全局功能(后面遇到了再展開介紹)。
2.3 錯誤狀態寄存器
HF_ERRSR錯誤狀態寄存器標識當前Flash有沒有發生錯誤。對每個錯誤類型的具體解釋和檢測到錯誤后建議的軟件操作請參考后面的錯誤處理章節。
Fls模塊在執行Flash寫操作前也會先檢查Flash有沒有Error產生,如果有Error產生,則不進行任何操作。
3.DMU命令序列
3.1 讀Flash
對Flash的讀訪問是Memory mapped read,什么意思了?比如我們要讀0xAF001234這個起始地址處的一個uint32的數據,我們可以直接操作內存進行讀:
uint32 Value = *((uint32 *)0xAF001234);
3.2 寫Flash
但是對于Flash的寫(Programming)和擦除(Erase)操作不能直接操作內存,需要通過特定的命令序列(Command Sequence),比如以下的操作就是無效的。
*((uint32 *)0xAF001234) = 0xFFFF;
實際對DFlash的寫操作需要一組命令序列(Command Sequences)來實現。DMU會把者一組命令序列翻譯過來去完成對DFlash的寫操作。寫的過程中的狀態和錯誤通過HF_STATUS和HF_ERRSR寄存器標識。DMU提供了一些Command Sequence供開發者使用。
我們來分析一個Write Page的Command Sequence:
第一步:把PA(緩存要寫入數據的變量的地址)加載到DFlash Base Address + 0xAA50處
第二步:把xx00H(xx標識的部分被忽略)這個值加載到DFlash Base Address + 0xAA58處
第三步:把xxA0H(xx標識的部分被忽略)這個值加載到DFlash Base Address + 0xAA58處
第四步:把xxAAH(xx標識的部分被忽略)這個值加載到DFlash Base Address + 0xAA58處
執行Write Page需要注意:
1.Write Page命令序列需要在Load Page命令序列之后執行
2.執行完Write Page命令序列后,PageMode的標志就會在HF_STATUS狀態寄存器中被設置
3.如果Flash不在PageMode下執行Write Page操作,那么HF_ERRSR錯誤狀態寄存器的Sequence Error(SQER)標志就會被置位,如果PA地址值不在合肥的地址范圍內,SQER標志也會被置位。
4.如果進入Page Mode后數據太少,則沒有數據或太多數據通過“LoadPage”傳輸到程序集緩沖區,“WrtePage”會對頁面進行編程,但會設置序列錯誤 (SQER)。 缺少的數據是使用程序集緩沖區的先前內容進行編程的
5.當頁面“ PA ”位于具有有效寫入保護的Sector中,或者Flash模塊具有有效的全局讀取保護時,Write Page就會執行失敗并設置保錯誤 Protection Error(PROER)。
6.當寫入(Programming)過程中出現錯誤,PVER錯誤標志就會被設置
7.如果DMU處于Cranking Mode或者Error Mode,執行Write Page命令序列就會產生Sequence Error(SQER).
Write Page在代碼中的體現:
Note:
1.不要問為什么是這樣來實現對DFlash的操作,這是人家芯片廠商規定的,我們照著做就行。
2.命令序列很多,遇到了想了解的話,就按照Write Page這個分析過程去分析就行
4.DMU錯誤處理
Infineon的芯片手冊中對每一種Error產生原因和出現Error后建議的操作都寫的非常詳細,我們能找到地方并理解就好,這里僅介紹Sequence Error(SQER),其他自己去查手冊就好。
Sequence Error(SQER)產生的原因:
1.Comman的地址或者數據不正確,也就是沒有按照規定的CommandSequence來操作Flash
2.DMU處于Page Mode時又嘗試進入Page Mode
3.Load Page命令序列不在Page Mode下執行
4.Load Page命令序列混合32/64操作
……太多了,參考<< AURIXTC3XX_um_part1_v2.0.pdf>>以下章節
出現問題后怎么處理:
SQER錯誤通常就是軟件Bug導致的,所有我們把軟件寫好,這些問題就不會出現。如果出現了這些Error,應該把Error信息通知到應用代碼。但是,可以使用“Clear Status”或“Resetto Read”命令序列清除此標志,然后可以再次發出更正后的命令序列。
5.DMU中斷和Trap
5.1中斷
DMU在以下截圖的事件觸發時可以觸發中斷,中斷使能和中斷處理函數需要我們去配置和實現,然后可以通過中斷來判斷事件完成或錯誤發生。但是,對Flash操作的狀態獲取和錯誤獲取一般采用輪詢的方式實現。
5.2Trap
同樣,DMU外設報告以下的Fatal Errors會觸發CPU進入Trap。
Note: 這些了解就好,好像在實際工程中沒有使用DMU中斷,也沒去管DMUTrap,回頭再仔細研究下。
6.總結
這篇文章的所有內容都可以在Infineon的數據手冊中找到,但是對于初學者或者對硬件手冊不熟悉的朋友不容易抓到重點(動不動一個章節就是幾十上百頁的英文,確實看著就頭疼…),所以作者結合代碼梳理出個人認為對于軟件開發者最為重要的內容,希望各位對各位看官有所幫助,也希望對各位新人苦于看數據手冊有所啟發。
最后,咱們來來回答開頭提出的問題結束本文。
問題1:站在軟件實現的角度來看,如何通過DMU實現讀,寫,擦除DFlash?
答:通過Load Page和Write Page命令序列實現寫操作;通過Erase Logical Sector Range命令序列實現擦除操作;通過Memory mapped read直接讀Flash。
問題2:站在軟件實現的角度來看,如何通過DMU監控讀,寫,擦除DFlash等任務完成的?
答:通過監控HF_STATUS的D0BUSY/D1BUS標志來監控擦寫操作,讀不用監控,直接讀取就行。
問題3:站在軟件實現的角度來看,如何通過DMU監控讀,寫,擦除DFlash等任務出現Error
的?
答:通過監控HF_ERRSR錯誤狀態寄存器的錯誤標志來監控讀,寫,擦除DFlash等任務出現Error
類型。
問題4:站在軟件實現的角度來看,在監控到讀,寫,擦除DFlash等任務出現Error后如何恢復重來?
答:太多,這里就不在細講,具體參考數據手冊的Error Handing章節。
審核編輯:湯梓紅
-
芯片
+關注
關注
454文章
50460瀏覽量
421965 -
寄存器
+關注
關注
31文章
5325瀏覽量
120052 -
接口
+關注
關注
33文章
8526瀏覽量
150861 -
AUTOSAR
+關注
關注
10文章
350瀏覽量
21481
原文標題:TC3xx芯片DMU介紹
文章出處:【微信號:汽車電子嵌入式,微信公眾號:汽車電子嵌入式】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論