目录
1. CFI概述
2. CFI的使用小结
3. CFI在车规MCU里有用吗
在看关于ifx的标准flash驱动配置时,无意中瞄到一个注灰的选项:
Try to use CFI information to detect Flash Type
之前讲过CFI这个标准,但为何在IFX memtool工具里注灰?什么是CFI information?带着这个疑问,我特地到官网去仔细搜索,确实发现了以前没有注意到的知识点。
1. CFI概述
CFI,全称Common Flash Interface,它是由JEDEC(Joint Electron Device Engineering Council)在2003年提出的一个标准。
该标准定义了对符合CFI的Flash的查询接口,允许对Flash读写擦等接口的参数化和平台化,允许programmer可以读到Flash相关设备等电气特性,包括memory大小、擦写速度、特殊功能feature等等,换句话说,相当于把Flash的数据手册装载到Flash这个物理设备里,在有需要的时候可供相关人员读取使用。
这就很神奇了,之前接触过的MCU,例如NXP S32K1\3、MPC5744,瑞萨RH850-P\F等系列,英飞凌TC3xx等等,搜遍所有手册也没发现CFI这个词汇相关描述。
所以,还是得首先从标准上看看CFI具体讲了些什么。
CFI实际上定义了以数组的形式把Flash的电气特性等存到硬件中,具体包含了5个部分:
- CFI查询标识符(CFI Query Identification),包括指令集ID、算法等;
- 系统接口(System Interface),包括Flash时间、电压等参数的信息
- 设备layout信息
- Vendor指定的主要扩展信息
- Vendor指定的可选扩展信息
在上述表格里,我们看到了针对地址描述出现了x16,相应的还有x8、x32,我们在车控类ECU的Flash开发时根据没有关注这些,确实很有意思。
首先明确一点,目前接触的MCU都是以字节编址,我们在写软件的时候也是一个地址一个Byte;对于Flash这种设备来说,它是有位宽约束的,例如x8表示byte位宽,x16表示word位宽(哟个地址对应2个Byte数据),x32表示Dword位宽(1个地址对应4bytes数据),但是我们写代码不会去操心这个事情啊。
所以在设计时,不同位宽的Flash与CPU连接时就会有相应的设计来进行转换,暂且叫做“Flash控制器”,
例如当CPU发出访问,要到0x0000_0001地址获取1byte数据,但是对于x16来说Flash来说,0x0000_0001表示是其实是一个word,并且不是CPU想要访问的那个byte数据,所以设计里CPU和Flash地址接线上首先要错位,保证CPU发出0x0000_0000和0x0000_0001两个地址对应的都是x16 Flash的0x0000_0000地址;那么x16 Flash返回2个byte的数据后,需要有这个Flash控制器来选择返回第一个字节还是第二个字节。典型连接如下:
地址总线错开一位,保证了CPU的0x0000_0001和0,对于Flash来说都是地址0x0000_0000。
有了这个基础后,我们来看,CFI针对不同位宽的Flash是如何定义的,具体如下:
可以看到不管是什么位宽的Flash,有效数据都是最低位8位(D7-D0),因此针对不同位宽的Flash,我们在软件设计上需要按照规范要求进行地址偏移。
2. CFI的使用小结
由于在车规MCU的eFlash里没有发现任何CFI的描述,我特地去找了一些满足CFI的Flash产品,其中包括Cypress的Parellel Nor Flash、Micron的Parallel Nor Flash,简单总结使用方法。
根据标准,要读取CFI相关数组信息,必须在偏移地址55H上发送98H的指令,假设在x16Flash设备上必须发送0098H,x32 设备上发送00000098H的指令,相应地址也要做偏移,如下:
假设现在基地址为0x1000_0000,要想让Flash进入到CFI模式,不同位宽设备的伪代码如下:
- x8 Flash ,Write8 0x1000_0055 0x98
- x16 Flash,Write16 0x1000_00AA 0x0098,从Flash视角,一个地址对应2个Byte,因此软件实现往55h写98h,就需要做一个地址偏移,0x55 * 2 = AA;
- x32 Flash , Write32 0x1000_0154 0x0000_0098,软件0x55* 4
读取CFI相关信息同样如此, 以美光MT28EW为例,它支持x8和x16的总线模式,因此在设计时必须以x16来设计读取CFI相关信息,具体如下:
x16模式下,0x10代表CFI 查询ID,如果转为x8模式,那么软件就必须要0x20地址去进行查询,获取相关指令集ID等,因为对于Flash设备来说,一个地址包含2个Byte。不仅软件要做偏移,硬件地址总线和数据总线的连接也要进行切换。
3. CFI在车规MCU里有用吗
这个答案不确定,CFI的思想是就是针对同一系列的产品,系统设计者即使升级了memory容量,也可以使用相同的Flash驱动来适配产品升级,开发者只需要读取CFI相关信息就可以知道使用什么要的Flash驱动。
其实这个思路和目前接触到的MCU的Flash是很相似的,例如TC3xx所有系列都是使用Command sequence的方式对PFlash、DFlash进行编程,瑞萨RH850的FACI命令也在不同系列发挥了作用,也见过哪家说可以在BaseAddr+0x55写0x98可以查询指令集、Flash相关特性。
毕竟我们拿到的是带eFlash的MCU产品,按道理这些大厂也不会把这些eFlash IP拆出来作为产品单独售卖,因此只要是相同系列的MCU,针对Flash的操作基本都会保持一致,自然也就没有CFI信息的相关需求,要看特性的话看数据手册吧。