1. 程式人生 > >淺析AM335x GPMC模組地址區域的劃分--TI--Sitara AM335x系列

淺析AM335x GPMC模組地址區域的劃分--TI--Sitara AM335x系列

轉自:http://blog.csdn.net/swallow71701/article/details/22793191

我們知道AM335x的GPMC模組作為一組並行的外部匯流排介面,使用的頻率還是挺高的,在這上面可以掛NAND FLASH,NOR FLASH,FPGA,DM9000等等裝置。

        使用的方式,從硬體方面來說,GPMC總線上掛的裝置共享了資料線、地址線和一些控制線,然後由片選訊號控制、使能對應的裝置。這裡需要提到一點,不同片選的地址空間配置、時序配置,都是分開的,參考TRM中關於GPMC_CONFIG1_i~GPMC_CONFIG7_i的配置說明,i的取值決定了寫入的地址區間不同,對應的就是不同的片選。

軟體配置上面,時序配置就不贅述了,主要有個問題容易引起大家疑惑,那個地址空間的配置是怎樣的?下面就這個問題,簡要解析一下:
        首先,GPMC是可以對每個片選上的裝置進行地址區間的分配,配置起來也非常靈活。舉個例子:對於片選0,我們把地址空間配置為0x0000_0000~0x0400_0000;對於片選1,地址空間配置成0x0600_0000~0x0A00_0000;這樣完成配置了後,如果往0x0000_0004這個地址裡寫資料,由於它屬於片選0的地址區間,所以這個時候CPU就會去使能片選0(拉低GPMC_CS0n),從而對片選0上的裝置進行操作;如果寫的是0x0600_0010地址空間,屬於片選1的,就會去使能片選1(拉低GPMC_CS1n),操作片選1上的裝置。通過這種方式,就實現對不同的裝置操作。PS: 如果是對未分配的地址空間操作,則沒有片選訊號會拉低,操作無效;對於已經分配了的片選地址空間,一定要注意,不要交疊,以免發生衝突。

開啟AM335x的TRM,第二章2.1 ARM Cortex-A8 Memory Map中可以看到,對GPMC的外部記憶體地址分配的空間為512MB,從0x0000_0000~0x1FFF_FFFF。這個意思就是說,GPMC給所有片選分配的地址空間都必須要在這個區域之內。每個片選的地址分佈,是在GPMC_CONFIG7_i中定義的,可以參考TRM中詳細的示例講解,在這裡時間有限,我就挑重點的說了。
        1. 首先要確定你是GPMC的device是NAND型別的,還是NOR型別的,在GPMC_CONFIG1中有定義,對於位寬的定義、同步、非同步操作模式的定義也是在GPMIC_CONFIG1中定義的,不贅述。

        2. 時序,這一點根據你實際的NAND/NOR或者相關手冊定義就好,配置到相應片選訊號的GPMC_CONFIG中。
        3.地址,重點!GPMC_CONFIG7中:
        bit[6]明顯是確定當前所在的片選訊號是否可用,即為,當前的片選上是否掛有device需要使用。有就置為1即可。
        bit[11-8]這個mask address,其實是規劃了當前片選地址空間的大小,注意最小為16MB。16MB的地址空間的跨度即為0~0x00FF_FFFF(低24位),所以在規劃基地址的時候,只需要定義最高位即可,因為低位的地址,低24位都是可以由寫入的地址區間來決定,只有基地址需要我們定義和片選相關聯。
        bit[5-0]是base address,即為基地址的規劃。上面提到過地址空間的最小規劃為16MB地址空間跨度最小為為0~0x00FF_FFFF,對應的,這個基地址定義了高位上面的地址值(高8位),同時把這個地址與當前的片選相關聯。舉個例子,當前暫存器為GPMC_CONFIG7_0,當我的基地址規劃為0x08,大小劃歸成16MB時,也就是說,我規劃的片選0的地址空間為0x0800_0000 ~ 0x08FF_FFF;類似的,當我在暫存器中GPMC_CONFIG7_2的基地址定為0x0A,大小規劃為128MB時,地址空間即為:起始地址:0x0A00_0000,結束地址為0x0A00_0000+0x08FF_FFFF=0x12FF_FFFF。
        最後強調兩點:1.地址空間的分步,不要重疊;2.地址空間的區域要在0x0000_0000~0x1FFF_FFFF範圍之內。