[攻克存儲] s3c2440存儲系統設計與思考

   前面幾篇文章分別講述了存儲系統的地址線連接方法、存儲芯片的寫屏蔽、存儲系統的擴展,以及SDRAM/DDR的結構和尋址,本文將以ARM芯片s3c2440爲例,從整體上描述一個包含有同時SDRAM、Nor Flash、Nand Flash的存儲系統的設計、工作原理和注意事項。

    下面這幅原理圖就是這樣一個完整的存儲系統,主控芯片是三星公司的ARM芯片s3c2440(未畫出,但相關引腳都在圖中的導線上的標號標出),該存儲系統包含了一個SDRAM(HY57V561620),一個Nor Flash(Am29LV160DB)一個Nand Flash(K9F1208)。

    由該存儲系統原理圖,我們提出以下幾個問題,並一一解答:

   (1)SDRAM芯片和 Nor Flash芯片都連接了ARM芯片的地址線,他們各自在存儲系統中的地址範圍是多少?由什麼決定當前訪問的是哪一個存儲器 ?

   (2)如果希望再擴展一個ROM存儲器,如何連線,地址範圍如何確定?

   (3)Nand Flash芯片並沒有連接到ARM芯片的地址線,如何尋址?怎樣選中它?

   (4)ARM芯片如何知道外接存儲器的位寬,即8位、16位還是32位?

   (5)程序代碼可能存儲在Nor Flash中,或者 Nand Flash中,系統啓動時如何知道從哪個存儲器中讀代碼? 


 

1. 首先回答第一個問題,存儲芯片地址範圍的確定。

    參考s3c2440的datasheet,我們可以找到該芯片的內存映射表(Memory Map),如下圖:

    根據OM[1]和OM[0]引腳的不同,內存映射的方式有細微差別(具體原理在本文後面講述)。但基本可以看出,決定外接存儲器的存儲地址範圍的因素主要是一組引腳 nGCS0[0]~nGCS[7] 。

    s3c2440芯片把存儲系統分爲了8個Bank,由nGCS0[0]~nGCS[7] 這8根引腳決定當前訪問的是哪一個Bank對應的存儲器。其中,前6個Bank用於連接ROM或者SRAM(或者類似SRAM接口的存儲器,如Nor Flash)(圖中由SROM標識),而第7和第8個Bank用於連接SDRAM,並且規定由第7個Bank地址作爲SDRAM的起始地址(即0x30000000)。

    原理圖中,我已經將決定存儲芯片起始地址的nGCS0x引腳用特殊的亮紅色標記出來了。我們可以看到,SDRAM芯片被連接到第7個Bank中,起始地址爲0x30000000,而Nor Flash被連接到了第0個Bank,起始地址爲0x0000000

2. 再回答第二個問題,如何添加新的存儲芯片?

    其實,由第一個問題的解釋,我們基本上就知道該怎麼回答這個問題了。如果添加的是SRAM或者ROM芯片,則自然是將ARM的地址線對應着芯片的地址線進行連接(連接方法在本系列第一篇文章中講過),然後由 nGCS0[0]~nGCS[5] 這6根引腳中,任選一個尚未使用到的Bank,連接到新添加的芯片上,以決定其地址起始。例如下圖,外接一個8位的ROM芯片,片選信號使用 nGCS1,查上面給出的內存映射得知,其起始地址爲 0x08000000:

3.  然後解決第三個問題,Nand Flash芯片是如何選中和訪問的?

    首先要了解Nand Flash的芯片原理,它不是直接通過地址線來尋址和訪問的,而是有一套自己的讀寫擦除機制。該原理的介紹網上文章很多,這裏不再贅述。這裏需要說明的是,Nand Flash芯片雖然不需要連接ARM的地址線來尋址,但是額外需要其他的一些引腳來控制對其的訪問,例如圖中的Nand Flash相關的控制引腳說明如下:

    對應的,ARM端(s3c2440)也爲Nand Flash的訪問單獨提供這些引腳,正好對應連接,例如Nand Flash片選信號nCE連接到了ARM端的Nand Flash片選引腳nFCE上。當ARM需要訪問Nand Flash時,就會使能這些相關的引腳,比如使能片選(nFCE),這樣就選中了對應的Nand Flash芯片,然後進行讀寫擦除等操作。

4.  下面回答第四個問題,如何配置外接存儲器的位寬?

    從s3c2440的datasheet可以找到,有一個寄存器是專門用於配置各個Bank外接存儲器的位寬的,並且配置了該外接存儲器是否使用寫屏蔽(即寫時序中是否分高字節和低字節)(在本系列第2篇文章中有描述),該寄存器說明如下:

    那麼,加問一句,爲什麼需要配置這個位寬呢?

    舉個例子來說明這個問題吧。

    假設 ARM 擴展了兩片16MB的SRAM芯片,每片SRAM芯片爲16位,擴展後,存儲系統爲32位,兩片SRAM片選引腳均連接的是ARM芯片的 nGCS1。

    由於每一片芯片都是16MB,兩片的地址增量應該是32MB。因爲2^20=1MB,即0x0100000,那麼32MB的話,應該是0x2000000,又起始地址連接到nGCS1,故地址範圍爲 0x8000000~0x10000000,即這個範圍內的尋址都應該讓nGCS1有效。

    由於 nGCS1決定起始地址0x8000000,而nGCS2決定起始地址0x10000000,那麼,如果ARM不知道當前Bank外接的存儲芯片的位寬,就無法計算出當前外接的這個存儲系統的地址範圍,當ARM需要訪問0x10000000地址時,就可能會讓nGCS2有效,從而無法訪問到正確的SRAM芯片了。

5.  下面回答最後一個問題,系統的啓動方式

    從s3c2440的datasheet可以知道,系統的啓動方式由 OM[0]和OM[1]引腳的電平決定,即硬件決定。如下圖:

    

    如果 OM[1:0]=00時,系統會選擇從 Nand Flash 中讀取代碼啓動(通過片內的BootSRAM中的啓動程序從Nand Flash中拷貝前4KB的代碼運行,從而啓動整個系統,具體過程網上也有許多文章論述,在此也不再贅述);如果 OM[1:0]=01或者10,則從0x00000000位置啓動,一般該位置連接的存儲器爲Nor Flash,從而直接從Nor Flash中讀取代碼啓動。

    注意回答第一個問題時給出的內存映射圖,不同的啓動方式,內存的映射是不同的,當從Nand Flash啓動時,片上的BootSRAM被映射到了高位地址(0x40000000),而非Nand Flash方式啓動時,則映射到了0x00000000.

    到此,整個s3c2440的存儲系統原理就基本說完了。因爲s3c2440非常常用,市面上也有許多基於s3c2440的開發板,故以該芯片作爲核心芯片來展開關於ARM存儲系統原理的討論,其他ARM芯片應該會有着類似的結構和原理,參考本文就應該不難理解了。文中有講得不清楚或者錯誤的地方,歡迎批評指正,留言或者來信[email protected]交流。

本文出自 “對影成三人” 博客,請務必保留此出處http://ticktick.blog.51cto.com/823160/687350

發佈了22 篇原創文章 · 獲贊 4 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章