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

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

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

    由該存儲系統原理圖,咱們提出如下幾個問題,並一一解答:.net

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

   (2)若是但願再擴展一個ROM存儲器,如何連線,地址範圍如何肯定?3d

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

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

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

 

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

    參考s3c2440的datasheet,咱們能夠找到該芯片的內存映射表(Memory Map),以下圖:get

    根據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芯片應該會有着相似的結構和原理,參考本文就應該不難理解了。

 

免費學習更多精品課程,登陸樂搏學院官網http://www.learnbo.com/

或關注咱們的官方微博微信,還有更多驚喜哦~

 

本文出自 「Jhuster的專欄」 博客,請務必保留此出處http://ticktick.blog.51cto.com/823160/687350

相關文章
相關標籤/搜索