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的流程