存儲(chǔ)控制器與外設(shè)之間的關(guān)系
我們知道,S3C2440對(duì)外引出有27根地址線(ADDR0~ADDR26),對(duì)應(yīng)的訪問范圍為128M,另外,CPU還引出了8根片選信號(hào)(nGCS0~nGCS7)——低電平有效,對(duì)應(yīng)8個(gè)BANK,這樣就達(dá)到了1G的地址訪問空間。
理論上我們知道可以使用的地址訪問范圍為4G(32位的CPU),那么其他的地址空間用來(lái)做什么了呢?一部分是用來(lái)作為CPU的內(nèi)部寄存器地址,一部分保留。
注意:S3C2440的寄存器范圍處于:0x48000000~0x5fffffff;存儲(chǔ)控制器的地址在:0x48000000~0x48000030(13個(gè));
BANK1~BANK5的連接都差不多,所以對(duì)應(yīng)的寄存器設(shè)置也一樣;參考
setmem 0x48000008,0x00002e50,32
setmem 0x4800000c,0x00002e50,32
setmem 0x48000010,0x00002e50,32
setmem 0x48000014,0x00002e50,32
setmem 0x48000018,0x00002e50,32 主要用來(lái)設(shè)置訪問時(shí)序
BANK0稍微有點(diǎn)不同,setmem 0x48000004,0x00000f40,32 (不知道時(shí)序方面的設(shè)置 是不是和boot rom有關(guān))
下面重點(diǎn)分析SDRAM的連接與尋址的方式
幾個(gè)用于SDRAM的信號(hào):
SDRAM的時(shí)鐘有效信號(hào)SCKE;
SDRAM的時(shí)鐘信號(hào)SCLK0/SCLK1;
數(shù)據(jù)掩碼信號(hào)DQM0~DQM3,對(duì)應(yīng)nWBE;
SDRAM的片選信號(hào)nSCS0,與nGCS6是同一管腳兩個(gè)功能;
nSRAS 行地址選通脈沖信號(hào);
nSCAS 列地址選通脈沖信號(hào);
首先,SDRAM內(nèi)部是由幾個(gè)存儲(chǔ)陣列組成,每個(gè)存儲(chǔ)陣列為一個(gè)logical BANK
每個(gè)logical BANK 即存儲(chǔ)陣列 又由行地址和列地址來(lái)尋址,就像EXCEL文檔表格一樣;一般有4個(gè)logical BANK。
對(duì)SDRAM的訪問分為以下幾個(gè)步驟;
使片選信號(hào) nSCS0有效 BANK6 起始地址為0x30000000;
用兩根地址線作為選擇信號(hào)選擇相應(yīng)的logical BANK (addr25 addr24);addr26?(思考中)
對(duì)被選芯片進(jìn)行統(tǒng)一的行列尋址;(行地址數(shù):13 ,列地址數(shù):9)當(dāng)nSRAS有效時(shí),addr2~addr14上發(fā)出的是行地址信號(hào)bit[23:11];當(dāng)nSCAS有效時(shí),發(fā)出的是列地址信號(hào)bit[10:2]。
為什么addr0和addr1沒有連接,我們知道BANK6是32位寬的,那么這兩根地址線就不用用到了(恒為0);
BANK6的起始地址是0x30000000,所以SDRAM的訪問地址是0x30000000~0x33ffffff。
找到了存儲(chǔ)單元,就開始傳輸數(shù)據(jù)了,那么怎么組織這32位寬的數(shù)據(jù)呢?
內(nèi)存的這種接法,使它可以以8位訪問,也可以16位訪問,也可以32位訪問
那4個(gè)信號(hào)nWBE3~0,正是字節(jié)選通控制。
按8位訪問,也就是代碼中若有:
*(unsigned char *) 0x30000000 = 0x78;
就是一個(gè)字節(jié)寫,這時(shí)只有nBWE0信號(hào)有效
如果是0x30000001,則只有nBWE1有效(低),其它無(wú)效(高)。
再舉個(gè)例,如果是按16位訪問呢?
如果是16位訪問,代碼一般就是:
*(unsigned short *)0x30000000 = 0x1978;
這是一個(gè)16位寫。但此時(shí)要注意,最低位必須是0,而不能是1,比如地址0x30000001就會(huì)使CPU異常,因?yàn)楸仨?6位對(duì)齊!
dat16 = *(unsigned short *)0x30000002;
這是一個(gè)16位讀
在16位訪問時(shí),0x30000000地址寫操作中,nWBE1, 0 = 低,nWBE3, 2 = 高。當(dāng)0x30000002時(shí),則是nWBE3,2為低,nWBE1,0為高(無(wú)效)
32位時(shí)則是4字節(jié)對(duì)齊,也就是最低的兩個(gè)地址位A1,A0必須為0,即對(duì)于32位訪問,0x30000001, 0x30000002, 0x30000003都會(huì)導(dǎo)致異常(出錯(cuò))
對(duì)于32位訪問,0x30000000的下一個(gè)地址是0x30000004,因?yàn)檫@個(gè)地址是字節(jié)地址,但一下子就訪問了0x30000000~0x30000003四個(gè)字節(jié),也就是nWBE3~0四個(gè)信號(hào)一起反應(yīng)!!!
不同的CPU訪問的機(jī)制是不一樣的,這要具體看手冊(cè)了,是分開片選的