辨析NOR FLASH地址左右移的問題

norflash芯片手冊command如下:

在這裏插入圖片描述

下面是2240對norflash的 一些操作:

擦除:
在這裏插入圖片描述
燒錄:
在這裏插入圖片描述

讀取:
在這裏插入圖片描述

問1:同樣是操作norflash,爲什麼cpu發出norflash芯片手冊中解鎖等命令時,傳參時addr不需要右移,cpu燒錄起始地址或發送要擦除扇區地時就得右移呢

注意:nor_cmd函數裏已經左移一位了
在這裏插入圖片描述

答1:

我們通過NOR FLASH的芯片手冊得知,要實現解鎖功能:要往地址0X555寫入0XAA等等幾個操作,因爲我們是通過NOR的手冊查看到的,那麼這裏肯定是從NOR角度看到的地址,也就是說我們要往第0X555個16位的地址裏寫入0XAA,因爲地址線是錯開的緣故,我們CPU必須把地址左移一位後再發生給NOR,這樣才能真正地把0XAA寫到NOR的第0X555地址裏去。

而發送扇區地址的時候,因爲我們人操縱的是CPU,所以我們的角度和CPU是一樣的,我們也認爲NOR是2M * 8bit,而不是1M * 16bit,比如我們要清除地址爲0X001F0000時,0X001F0000代表的是第0X001F0000個8bit的地址,因爲地址線是錯開的原因,我們直接發送CPU角度的地址出去就好,但又因爲nor_cmd函數裏已經左移一位了,所以我們要提前右移一位以抵消左移的操作。(爲什麼把NOR看成是2M * 8bit的時候就直接把地址發送出去而不用左移一位呢,這就和cpu內存控制器有關了)

總結就是角度不同,發送扇區地址的時候,我們是站在cpu內存控制器位篩選後的角度,即此時我們將norflash看做2M * 8bit,而NOR FLASH的芯片手冊中的解鎖功能是站在norflash自己的角度來要求CPU地址總線發出地址的,它自認爲自己是1M * 16bit

問2:(addr >> 1) << 1 可能會丟位

提前右移一位以抵消左移的操作,即(addr >> 1) << 1 ,舉個例子:
假如我們想把0x11作爲起始燒錄地址
addr = 0x11 , 則 ((addr >> 1) << 1) = 0x10
細心點會發現,哎?右移一位導致丟位了啊!!
再看
addr = 0x10 , 則 ((addr >> 1) << 1) = 0x10
也就是說,輸入addr=2或3(CPU角度的 norflash 爲 2M * 8bit),起始燒錄地址都對應 1M * 16bit 的 norflash的1(本來是 1 0 ,但 norflash 的 A0 接了CPU的 A1)
爲什麼要限制?

答2:(注意:爲方便說明,我們將起始內存單元稱之爲第零個內存單元)

之所以這樣,是因爲我們操作的norflash 是16bit 寬度的,連接如下,可以發現是錯位連接的

在這裏插入圖片描述
這是一種好的燒錄習慣,作此限制可以保證我們的起始燒錄地址或起始擦除地址是16bit 對齊的
在這裏插入圖片描述
在這裏插入圖片描述

問3:爲什麼把NOR看成是2M * 8bit進行讀取訪問的時候就直接把地址發送出去而不用左移一位呢

答3:

針對問題3,**內存控制器**絕對是勞苦功高: 示意圖如下:
在這裏插入圖片描述

addr = 0x11 由於norflash的A1接CPU的A0,所以norflash看到的實際上是它1M *16bit的第1個16bit單元,在數據經內存控制器返回CPU時,內存控制器用A0=1,去挑出nor第一個16bit的低8位(注意:這裏的示意圖爲低位在前,僅爲了方便觀察;實際也有可能是高位在前,如果是高位在前,則內存控制器用A0=1,去挑出nor第一個16bit的高8位)
我們將16bit位寬的norflash看做2M * 8bit, addr = 0x11 ,我們也的確訪問到了norflash第3個8bit單元
同理,假如addr = 0x10,我們也的確訪問到了2M * 8bit的norflash的第2個8bit單元
所以,這種錯位連接實際上保留了內存控制器選擇內存單元的權利,即:內存控制器利用被錯開的A0去選擇內存單元的高低位。

本文參考了韋東山老師的講解已及關於NOR FLASH地址左右移的問題,特此感謝
如有問題,歡迎評論區指出批評。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章