徽州骆驼 · 7月10日

什么是Common Flash Interface

目录

  1. CFI概述
  2. CFI的使用小结
  3. CFI在车规MCU里有用吗

大家好,我是快乐的肌肉,今天聊一聊CFI-compliant Flash的内容。

在看关于ifx的标准flash驱动配置时,无意中瞄到一个注灰的选项:

Try to use CFI information to detect Flash Type

image.png

之前讲过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、算法等;

image.png

  • 系统接口(System Interface),包括Flash时间、电压等参数的信息

image.png

  • 设备layout信息

image.png

  • Vendor指定的主要扩展信息

image.png

  • 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控制器来选择返回第一个字节还是第二个字节。典型连接如下:

image.png

地址总线错开一位,CPU A[9:1]与Flash A[8:0]连接,CPU A[0]不接,保证了CPU的0x0000_0001和0,对于Flash来说都是地址0x0000_0000。 

有了这个基础后,我们来看,CFI针对不同位宽的Flash是如何定义数据的,具体如下:

image.png

可以看到不管是什么位宽的Flash,有效数据都是最低位8位(D7-D0),因此针对不同位宽的Flash,我们在软件设计上需要按照规范要求进行使用不同的地址即可。

2. CFI的使用小结

由于在车规MCU的eFlash里没有发现任何CFI的描述,我特地去找了一些满足CFI的Flash产品,发现基本都是外挂的Nor 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相关信息,具体如下:

image.png

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信息的相关需求,要看特性的话看数据手册吧。

image.png

CFI对于MCU来说,到底有没有用?各位看官怎么看?

作者:快乐的肌肉
来源:汽车MCU软件设计

推荐阅读:

更多汽车电子干货请关注汽车电子与软件专栏。欢迎添加极术小姐姐微信(id:aijishu20)加入技术交流群,请备注研究方向。
推荐阅读
关注数
5713
内容数
453
汽车电子与软件行业的相关技术报道及解读。
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息