目錄
1.FlsLoader Driver和FlsDmu Driver
2. FlsLoader小細節
3.小結
大家好,我是快樂的肌肉,今天聊聊TC3xx NvM相關硬件細節以及MCAL針對NvM的驅動。
1.FlsLoader Driver和FlsDmu Driver
在最開始做標定的時候,認為標定數據既然是數據,那么想當然就應該放置到DFlash;
但是做診斷的同事就納悶了:那DTC、DID這些數據咋和標定數據區分呢?還得預留一段空間給標定數據,沒這么搞過呀。
后來老板數你要么就用FlsLoader的接口,把數據存到PFlash,不要和診斷內容攪到一起了。
所以當時問題就出來了:FlsLoader接口是啥?為啥在一個包里既有Fls_Dmu Driver,還有FlsLoader Driver。
今天在整理筆記的時候翻到了,又細讀了相關代碼,覺得很有意思,分享給大家。
英飛凌針對TC3xx發布了多個MCAL包,包括Basic和CD(Complex Driver) package;
- Basic Package里提供了Fee Driver和Fls_Dmu Driver;
- CD Package里提供了FlsLoader Driver。
Fls_Dmu Driver
該驅動用于支持AUTOSAR中定義的標準功能,主要針對DFlash0的初始化和讀寫擦,因此它這個scope僅限于DFlash。
這是符合CP AUTOSAR FlashDrvie的Scope定義(僅用于Flash EEPROM):
In application mode of the ECU, the flash driver is only to be used by the Flash EEPROM emulation module for writing data. It is not intended to write program code toflash memory in application mode. This shall be done in boot mode which is out ofscope of AUTOSAR.
那如果想要刷寫PFlash上的內容,就得在復雜驅動里找找答案了,例如FlsLoader Driver
FlsLoader Driver
用于操作所有PFlash 和DFlash0,包括初始化、PFlash的讀寫擦,以及針對Flash的上鎖和解鎖。
有了這個理解之后,我們再來看看代碼里的小細節。
2. FlsLoader小細節
?FlsLoader_Erase接口很有意思,他的入參包括TargetAddress和Length;我們很容易想當然這里給的參數就應該是目標擦除地址和長度(0x10000),但實際上再往下看代碼邏輯時會發現這個Length對應的是即將要擦除的Sector個數,這樣就對應的是DMU 命令序列 Erase sector nn。
因此調用該接口時應該簡單計算下需要擦幾個Sector,也不是以前的目標地址+實際長度。
我們接著手冊看看關于該命令序列出現SQER(Sequence Error),最讓我困惑的是關于PFlash Size的判斷,如下:
以TC37x為例,明明有2個PFlash Bank,每個Bank容量為3MB,但為什么每次只能擦除512K/16K = 32?,難道說這里面有什么物理限制嗎?
我們來看看PFlash的結構組成,它是有3個1 MB物理Sector組合為一個3MB的Bank,每個物理Sector劃分為64個邏輯Sector(64*16),如下:
手冊里特別強調的是每個物理Sector之間是獨立的,并且最大Erase Size為512KB,因此我們在代碼邏輯里首先會看到判斷是否超最大擦除大小了,這點我最開始想了很久,如下:
?其次,如果是跨物理Sector的擦寫,在代碼實現里還特別多出了一步:判斷是否超出了1MB的范圍,如超出了,需要使用兩次erase cmd命令序列,如下圖:
這里確實很神奇,不知道這個是否和本身它的這個Flash IP特性相關,不支持跨PS擦除。
3.小結
分析它的代碼,主要還是要完善自己的驅動知識庫,感覺每家的Flash操作大不相同,所以多看多學,才能見怪不怪,哈哈。?