|
對(duì)于具體存儲(chǔ)器而言,它的位寬是一定的,所謂位寬,指的是“讀/寫(xiě)操作時(shí),最小的數(shù)據(jù)單元”──別說(shuō)最小單元是“位”,一般存儲(chǔ)器上沒(méi)有單獨(dú)的“位操作”,修改位時(shí)通過(guò)把整個(gè)字節(jié)、字或雙字讀出來(lái)、修改,再回寫(xiě)。對(duì)于處理器來(lái)說(shuō),一個(gè)地址對(duì)應(yīng)的是一個(gè)字節(jié)(8位),也就是說(shuō)處理器的地址線對(duì)應(yīng)的最小數(shù)據(jù)單元是字節(jié)。
這里需要注意的是,不要把“存儲(chǔ)器的位寬”和“處理器的位數(shù)”這兩個(gè)概念混淆了。存儲(chǔ)器的位寬是讀寫(xiě)存儲(chǔ)器的最小數(shù)據(jù)單元,處理器位數(shù)是處理器可以一次處理的字節(jié)數(shù),32位處理器可以一次處理4字節(jié)數(shù)據(jù)。
如果處理器最小數(shù)據(jù)單元是8位,存儲(chǔ)器位寬是16位,那在我們寫(xiě)程序時(shí)會(huì)特意進(jìn)行16位操作嗎?顯然不會(huì),我們寫(xiě)代碼時(shí),可不管外設(shè)到底是多少位。這是如何實(shí)現(xiàn)的呢?原因在于有存儲(chǔ)控制器(MemoryController)這個(gè)中間層。
存儲(chǔ)控制器根據(jù)存儲(chǔ)器的位寬,每次總是讀/寫(xiě)16位數(shù)據(jù)。
以讀操作為例:
處理器進(jìn)行8位操作時(shí),它選擇其中的8位返回給處理器;
處理器進(jìn)行16位操作時(shí),它直接把這16位數(shù)據(jù)返回給處理器;
處理器進(jìn)行32位操作時(shí),它發(fā)起2次讀/寫(xiě),把結(jié)果組合成32位返回給處理器。
假設(shè)現(xiàn)在的連線是:處理器的(ADDR1-ADDR20)接到16位的存儲(chǔ)器(A0-A19),即處理器的ADDR0不接──這說(shuō)明:不管ADDR0是0還是1,存儲(chǔ)器接收到的地址是一樣的。處理器發(fā)出地址0bxxxxxxxxx0、0bxxxxxxxxx1時(shí),存儲(chǔ)器看到的都是0bxxxxxxxxx,返回給存儲(chǔ)控制器的都是同一個(gè)16位數(shù)據(jù)。再由MemoryController選擇其中的低8位或高8位給處理器。
存儲(chǔ)控制器會(huì)做以下事情:
軟件要讀取地址0上的8位數(shù)據(jù)時(shí),硬件是這樣進(jìn)行的:
① MemoryController發(fā)出0b000000000000000000000的地址信號(hào),存儲(chǔ)器的A0-A19線上的信號(hào)是:0b00000000000000000000
②存儲(chǔ)器在數(shù)據(jù)總線D0~D15上提供一個(gè)16位的“最小數(shù)據(jù)單元”的數(shù)據(jù);
③存儲(chǔ)控制器讀入16位數(shù)據(jù);
④存儲(chǔ)控制器把16位數(shù)據(jù)的低8位返回給處理器,就得到了一個(gè)8位數(shù)據(jù)。
軟件要讀取地址1上的8位數(shù)據(jù)時(shí),硬件是這樣進(jìn)行的:
①存儲(chǔ)控制器發(fā)出0b000000000000000000001的地址信號(hào),存儲(chǔ)器的A0-A19線上的信號(hào)是:0b00000000000000000000
②存儲(chǔ)器在數(shù)據(jù)總線D0~D15上提供一個(gè)16位的數(shù)據(jù),這是存儲(chǔ)器中的第1個(gè)“最小數(shù)據(jù)單元”
③存儲(chǔ)控制器讀入這個(gè)16位數(shù)據(jù)
④存儲(chǔ)控制器把這個(gè)16位數(shù)據(jù)的高8位(注意,前面的低8位)返回給處理器,這就是一個(gè)8位數(shù)據(jù)。
所以:
外設(shè)位寬是8時(shí),處理器的A0~AXX與外設(shè)的A0~AXX直接相連
外設(shè)位寬是16時(shí),處理器的A1~AXX與外設(shè)的A0~AYY直接相連,表示不管處理器的A0是0還是1,外設(shè)看到的都是同一個(gè)地址,對(duì)應(yīng)16位的數(shù)據(jù),存儲(chǔ)控制器對(duì)數(shù)據(jù)進(jìn)行選擇或組合,再提供給處理器。
外設(shè)位寬是32時(shí),處理器的A2~AXX與外設(shè)的A0~AZZ直接相連,表示不管處理器的A0A1是00,01,10還是11,外設(shè)看到的都是同一個(gè)地址,對(duì)應(yīng)32位的數(shù)據(jù),“MemoryController”對(duì)數(shù)據(jù)進(jìn)行選擇或組合,再提供給處理器
ARM與不同位寬存儲(chǔ)器的地址線錯(cuò)位接口 , 外部總線接口深入
ARM是32位,地址空間是2的32次冪,4G地址空間。所有的外設(shè)(FLASH,RAM,SD卡等等)都映射到這4G的空間上。比如大部分ARM7都把RAM映射到0x40000000,所以對(duì)RAM的操作就在0X40000000開(kāi)始的地址上。FLASH從0X0開(kāi)始。使用FLASH還要考慮地址重映射,就是選擇片內(nèi)FLASH或片外FLASH。
FLASH一般是8位或16位,當(dāng)它接到32位的ARM上時(shí),地址位就會(huì)錯(cuò)位。對(duì)于16位FLASH,F(xiàn)LASH的A0要接ARM的A1。對(duì)于8位FLASH,F(xiàn)LASH的A0要接ARM的A0。ARM的A0對(duì)應(yīng)8位,ARM的A1對(duì)應(yīng)16位,ARM的A2對(duì)應(yīng)32位,如果FLASH是32位,那么FLASH的A0接ARM的A2
32位的FLASH,F(xiàn)LASH的A0要接ARM的A2,因?yàn)?2位地址表示4個(gè)字節(jié),每次要跳4個(gè)字節(jié)的話(huà),那么就是從A2開(kāi)始才變化,A1 A0不變化
16位的FLASH,F(xiàn)LASH的A0要接ARM的A1,因?yàn)?6位地址表示2個(gè)字節(jié),每次要跳2個(gè)字節(jié)的話(huà),那么就是從A1開(kāi)始才變化,A0不變化
8位的FLASH,F(xiàn)LASH的A0要接ARM的A0,因?yàn)?位地址表示1個(gè)字節(jié),每次要跳1個(gè)字節(jié)的話(huà),那么就是從A0開(kāi)始才變化。
對(duì)于 16位的FLASH ,我們可以這樣認(rèn)為:16位存儲(chǔ)器的設(shè)計(jì)者將低位A[0]省掉了,我們只要讀取一次就可以得到兩個(gè)字節(jié),讀取的
這個(gè)地址對(duì)應(yīng)于ARM發(fā)出的地址的A[21..1],即實(shí)際上是存儲(chǔ)器需要的偶地址(偶地址是針對(duì)ARM發(fā)出的地址而言的)。
LPC2200,S3C2410A,S3C2440等都是上述這樣的,當(dāng)然也有不同的。
IMX27和BF537這兩款CPU都是不管存儲(chǔ)器是多少位的的,都是直接A0-B0,沒(méi)有任何考慮錯(cuò)位的情況,是因?yàn)樗麄兊拇鎯?chǔ)控制器已經(jīng)內(nèi)部作了處理
了,三星的如S3C2443S3C2450S3C6410等后續(xù)的也都是這樣子了
再來(lái)看看外部總線配置EMC和外部總線功能引腳的關(guān)系:
OE:輸出使能OUT EABLE
WE:WRITEEABLE 寫(xiě)入使能
CE:chipEABLE 片選
ALE:地址鎖存使能(ADRESS LOCK EABLE)
BLS:字節(jié)選擇信號(hào)
重點(diǎn)看 WE BLS 的關(guān)系
在LPC2200系列ARM中,為了適應(yīng)外部存儲(chǔ)器組的寬度和類(lèi)型,EMC提供了一組字節(jié)選擇信號(hào),要實(shí)現(xiàn)這些功能,需要對(duì)相應(yīng)存儲(chǔ)器配置寄存器中的RBLE位進(jìn)行設(shè)定。
對(duì)外部存儲(chǔ)器組進(jìn)行寫(xiě)訪問(wèn)時(shí),RBLE位決定WE信號(hào)是否有效;
對(duì)外部存儲(chǔ)器組進(jìn)行讀訪問(wèn)時(shí),RBLE位決定BLSn信號(hào)是否有效。
外部存儲(chǔ)器的接口取決于存儲(chǔ)器組的寬度(32位、16位、8位,由BCFG的MW位決定)。而且,存儲(chǔ)器芯片的選擇也需要對(duì)BCFG寄存器的RBLE位進(jìn)行適當(dāng)?shù)脑O(shè)置。選擇8位或者不按字節(jié)區(qū)分的的存儲(chǔ)器的時(shí)候,RBLE位應(yīng)該為0,在讀訪問(wèn)期間EMC將BLS[3:0]拉高。當(dāng)存儲(chǔ)器組為含有字節(jié)選擇選擇輸入的16位或32位存儲(chǔ)器組成的時(shí)候,RBLE位應(yīng)該為1,在讀訪問(wèn)期間EMC將BLS[3:0]拉低。注意這里沒(méi)有對(duì)RBLE為0或1的時(shí)候,寫(xiě)訪問(wèn)期間BLS[3:0]引腳的電平作出交代。
以16位寬的存儲(chǔ)器組連接16位的存儲(chǔ)器芯片為例(這種情況比較常見(jiàn),周立功的easyarm2200就是這樣的)。很顯然這里RBLE位應(yīng)該為1。
BLS[1]、BLS[0]分別接到了存儲(chǔ)器芯片的UB、LB腳。作為16位的存儲(chǔ)器芯片,要取得16位寬度的字,無(wú)論是讀訪問(wèn)還是寫(xiě)訪問(wèn),UB和LB位都必須為低電平0。作為16位的ram,程序中不可避免的存在對(duì)它的寫(xiě)操作。程序能正常運(yùn)行就說(shuō)明對(duì)它的寫(xiě)操作是成功的?梢赃M(jìn)一步推斷在寫(xiě)訪問(wèn)期間,BLS[1]、BLS[0]是低電平的。當(dāng)存儲(chǔ)器組為含有字節(jié)選擇選擇輸入的16位或32位存儲(chǔ)器組成的時(shí)候,RBLE位應(yīng)該為1,在讀訪問(wèn)期間EMC將BLS[3:0]拉低。在寫(xiě)訪問(wèn)周期EMC同樣是將BLS[3:0]拉低。
這種操作也符合使用8位單片機(jī)時(shí)候的習(xí)慣,WR扮演了“寫(xiě)”的角色。

下面是32位寬的存儲(chǔ)器組連接8位的存儲(chǔ)器芯片,很顯然這里RBLE位應(yīng)該為0。
網(wǎng)友wag提出這樣的問(wèn)題,能否用ARM的WE引腳直接連接到存儲(chǔ)器芯片的WE引腳。有這樣的問(wèn)題可能是源于以前的習(xí)慣,也可能是不清楚RBLE位為0時(shí),寫(xiě)訪問(wèn)期間BLS[3:0]引腳的狀態(tài)。
LPC2210/2220 User Manual上面介紹了RBLE=0的時(shí)候的讀寫(xiě)情況。EMC的WE信號(hào)沒(méi)有被使用。在寫(xiě)周期,BLS[3:0]拉低,將數(shù)據(jù)送到要寫(xiě)入的地址。對(duì)于讀周期,BLS[3:0]拉高。
網(wǎng)友sky421提到“我用的是2214,接一片8位的RAM,寫(xiě)的時(shí)候WE腳不會(huì)有變化,BLS0在變化”
我個(gè)人理解,如果RBLE=0,BLS引腳就取代了WR的功能,WR腳就不可以使用了。
有心的朋友可以用邏輯分析儀測(cè)一下,實(shí)際情況如何,驗(yàn)證一把。

總結(jié),當(dāng)RBLE=1,WR有效,BLS充當(dāng)字節(jié)選擇,其隨WR,OE的變化而變化,讀、寫(xiě)操作時(shí)BLS都是低電平,此時(shí)用于有字節(jié)選擇的外部設(shè)備。
當(dāng)RBLE=0,WR無(wú)效,此時(shí)用于無(wú)字節(jié)選擇的外部設(shè)備,BLS可以充當(dāng)WR信號(hào),而WR 無(wú)效。
不是ARM9S3C2440的,但是有相似之處!
存儲(chǔ)器映射:
0-1G(0x0000,0000 -0x3fff,ffff): 片內(nèi)Flash.
1-2G(0x4000,0000 - 0x7fff,ffff): 片內(nèi)RAM.
2-3.5G(0x8000,0000 - 0xbfff,ffff - 0xdfff,ffff):片外存儲(chǔ)器。
3.5G - 3.75G(0xe000,0000 -0xefff,ffff): VPB外設(shè)。
3.75G - 4G(0xf000,0000 -0xffff,ffff): AHB外設(shè)。
雖然ARM7的尋址空間為4G,但是LPC2200系列只提供A0~A23總共16M的地址。片選信號(hào)CS0 - CS3是A24和A25的譯碼輸出,將片外存儲(chǔ)區(qū)0x8000,0000 -0x83ff,ffff劃分為bank0 -bank3,共16M*4=64M. 這4個(gè)bank可以被分別配置為8/16/32位總線寬度。復(fù)位時(shí),bank0的總線寬度由Boot1:0引腳決定, bank1為32位,bank2為16位,bank3為8位。
字節(jié)定位信號(hào)(BLS0 - BLS3)協(xié)調(diào)總線寬度和外存芯片數(shù)據(jù)線寬度。
當(dāng)Memory由“字節(jié)寬度器件”(如62256)或者“未按照字節(jié)區(qū)分的多字節(jié)器件”組成時(shí),應(yīng)將RBLE設(shè)置為"0"。此時(shí),讀訪問(wèn)時(shí)EMC將BLS0~BLS3拉高。
當(dāng)Memory由“含有字節(jié)選擇輸入的16位或32位器件”組成時(shí),應(yīng)將RBLE設(shè)置為"1"。此時(shí),讀訪問(wèn)時(shí)EMC將BLS0~BLS3拉低。
所以,當(dāng)Memory由62256組成時(shí),由于不需要“片內(nèi)字節(jié)選擇輸入”,故令RBLE ='0',則BLS0~BLS3只會(huì)與nWR同步,可以代替nWR使用。
但是,當(dāng)Memory由IS61LV25616AL組成時(shí),由于該芯片有"nLB"和"nUB"控制低/高8位的輸入,故令RBLE ='1',則BLS0~BLS3與nRD和nWR都會(huì)同步,此時(shí),不可以使用BLS0~BLS3代替nWR信號(hào)。
地址數(shù)據(jù)總線:D0 - D31, A0 - A23, OE, WE, CS0 - CS3, BLS0 -BLS3
啟動(dòng)后由P2.7/P2.6控制引導(dǎo)方式,然后由程序設(shè)置MEMMAP決定中斷向量的映射。
BCFG0 - BCFG3控制讀寫(xiě)延時(shí)和總線寬度。注意復(fù)位后的默認(rèn)值。
PINSEL2控制引腳功能。
Boot Block
LPC2114/2214的BootBlock被固化在最高的Flash塊中,運(yùn)行時(shí)被映射到0x7FFF,E000 -0x7FFFF,FFFF的區(qū)域。而LPC2210沒(méi)有片內(nèi)Flash,但它有8K片內(nèi)ROM存儲(chǔ)了BootBlock,也被映射到0x7FFF,E000處。
|
|