目录
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操作大不相同,所以多看多学,才能见怪不怪,哈哈。