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