1.CFI简介
CFI(Common Flash Interface)的作用是把 NOR Flash 的信息通过统一的方法读出来。
不同公司产的NOR Flash在 erase,program,lock,unlock等操作上有差别,即command set不一样。
本来产品中用这种NOR Flash,后来升级又换了其他牌子的了,command set不一样,就要改代码。
NOR Flash要是支持CFI就好办多了,就不用改代码。通过CFI可以读出片子的manufacturer id,vendorid等等,在程序中就可以通过以上信息来选择正确的erase,program等操作方式。
NOR Flash的数据线和地址线都可能为32/16/8条。
为了统一起见,通过CFI接口查询时,
CFI接口描述的地址均为Flash芯片的地址,
CFI接口查询到的数据,以低字节D7-D0上为准,高字节数据线无视就好了。
2. Query mode
NOR Flash支持很多命令,包括erase,program,lock什么的。若NOR Flash支持CFI的话,它一定要支持CFI Query Command。
为了进入让芯片进入Query mode,需要向0x55(Flash地址)上写数据0x98
Flash的地址线上放 55h (高字节全是0)
Flash的数据线上放 98h (高字节全是0)
在query mode下,再读Flash地址的话,得到的就不是存储的用户数据了,而是片子自己的属性信息:厂商id,容量大小等(即所谓的Query Struct)
3. Query Struct
在Query mode时,一定要无视Flash的芯片的高字节数据线,只关心最低字节数据线D7-D0,比如:
解释一下,上图是在query mode时,读0x10(flash地址)时得到的结果
第一列:x16 device / x8 mode的意思是说,芯片有16根地址线,配置后,我们只用其中的8根
第二列:Flash的地址 0x10
第四列:为了访问Flash地址0x10, CPU需要发出的地址,注意这里地址线错接。
第五列:CPU数据线得到的数据。
x8 device/ x8 mode 没啥讲的,地球人都知道
x16 device/x16 mode
1.为访问Flash的地址0x10,CPU需在地址线上发出的地址为0x20,见 NOR Flash的帖子。
2.Flash把0x10(Flash地址)上的16-bit数据放到数据线上,这个数据是 0x0051(即 'null' 'Q')
3.CPU 得到16-bit数据,但只有低字节是有用的(即'Q') 记住CFI接口只使用地址线的最低字节
为了方便起见,我们只考虑 x8 mode 这种情况,则Query Struct是这样的:
0x10段的 'QRY'总是被用来判别NOR Flash是否支持CFI
0x1B段主要描述当前NOR Flash的Program 和 Erase操作所使用的电压
0x27段主要描述的就是Flash的容量等信息
4. 判断是否支持CFI的流程
CFI(Common Flash Interface)的作用是把 NOR Flash 的信息通过统一的方法读出来。
不同公司产的NOR Flash在 erase,program,lock,unlock等操作上有差别,即command set不一样。
本来产品中用这种NOR Flash,后来升级又换了其他牌子的了,command set不一样,就要改代码。
NOR Flash要是支持CFI就好办多了,就不用改代码。通过CFI可以读出片子的manufacturer id,vendorid等等,在程序中就可以通过以上信息来选择正确的erase,program等操作方式。
NOR Flash的数据线和地址线都可能为32/16/8条。
为了统一起见,通过CFI接口查询时,
CFI接口描述的地址均为Flash芯片的地址,
CFI接口查询到的数据,以低字节D7-D0上为准,高字节数据线无视就好了。
2. Query mode
NOR Flash支持很多命令,包括erase,program,lock什么的。若NOR Flash支持CFI的话,它一定要支持CFI Query Command。
为了进入让芯片进入Query mode,需要向0x55(Flash地址)上写数据0x98
Flash的地址线上放 55h (高字节全是0)
Flash的数据线上放 98h (高字节全是0)
![](https://i-blog.csdnimg.cn/blog_migrate/66e008b0ab0fdf843b63dcebccb71f6d.jpeg)
在query mode下,再读Flash地址的话,得到的就不是存储的用户数据了,而是片子自己的属性信息:厂商id,容量大小等(即所谓的Query Struct)
3. Query Struct
在Query mode时,一定要无视Flash的芯片的高字节数据线,只关心最低字节数据线D7-D0,比如:
![](https://i-blog.csdnimg.cn/blog_migrate/621447ffde9075d33bffef616928be81.jpeg)
解释一下,上图是在query mode时,读0x10(flash地址)时得到的结果
第一列:x16 device / x8 mode的意思是说,芯片有16根地址线,配置后,我们只用其中的8根
第二列:Flash的地址 0x10
第四列:为了访问Flash地址0x10, CPU需要发出的地址,注意这里地址线错接。
第五列:CPU数据线得到的数据。
x8 device/ x8 mode 没啥讲的,地球人都知道
x16 device/x16 mode
1.为访问Flash的地址0x10,CPU需在地址线上发出的地址为0x20,见 NOR Flash的帖子。
2.Flash把0x10(Flash地址)上的16-bit数据放到数据线上,这个数据是 0x0051(即 'null' 'Q')
3.CPU 得到16-bit数据,但只有低字节是有用的(即'Q') 记住CFI接口只使用地址线的最低字节
为了方便起见,我们只考虑 x8 mode 这种情况,则Query Struct是这样的:
![](https://i-blog.csdnimg.cn/blog_migrate/f22d295a674309ac0fb7c25e1705bd0d.jpeg)
0x10段的 'QRY'总是被用来判别NOR Flash是否支持CFI
![](https://i-blog.csdnimg.cn/blog_migrate/f756c6e69ce4317627795d11ae989f11.jpeg)
0x1B段主要描述当前NOR Flash的Program 和 Erase操作所使用的电压
![](https://i-blog.csdnimg.cn/blog_migrate/1510e9ce27ddfe62ec15d89e49616309.jpeg)
0x27段主要描述的就是Flash的容量等信息
![](https://i-blog.csdnimg.cn/blog_migrate/1fa60f2a2a5f56d35a432a2f308010ed.jpeg)
4. 判断是否支持CFI的流程
![](https://i-blog.csdnimg.cn/blog_migrate/15c8d359e6a5edf2aae3e364437bea7b.jpeg)