title: 2440內存管理
tags: ARM
date: 2018-10-17 19:08:49
---
2440內存管理
特性
大/小端(通過軟件選擇)
地址空間:每個 Bank 有 128M 字節(總共 1G/8 個 Bank)
除了 BANK0(16/32 位)之外【引導ROM,其總線寬度由硬件接線決定,在第一個 ROM 訪問前決定 BANK0 的總線寬度】,其它全部 BANK 都可編程訪問寬度(8/16/32 位)
所有存儲器 Bank 的訪問周期可編程
外部等待擴展總線周期
支持 SDRAM 自刷新和掉電模式
總共 8 個存儲器 Bank
- 6 個存儲器 Bank 為 ROM,SRAM 等
- 其余 2 個存儲器 Bank 為 ROM,SRAM,SDRAM 等
7 個固定的存儲器 Bank 起始地址
1 個可變的存儲器 Bank 起始地址并 Bank 大小可編程
- bank7,為了與bank6組成雙通道,所以其起始地址是bank6地址的尾地址,bank6=bank7大小
內存地址分配
工作方式
GPIO/門電路接口、協議類接口、內存類接口都屬于CPU的統一編址內存控制器根據不同的地址地址范圍,發出不同的片選引腳.比如當CPU發出的指令的地址范圍處于0x20000000 - 0x28000000,內存控制器就會使nGCS4處于低電平.
對于Nand Flash,在原理圖上它的地址線并沒有連接到CPU,因此它不參與CPU的統一編址。但它的數據線也接到了數據總線上,為了防止干擾,它也有一個片選信號(CE)。當CPU訪問Nand Flash時,Nand Flash控制器才會片選Nand Flash,讓其接收數據總線上的數據。
位寬與基址
位寬分為8/16/32,程序的最小存儲單位為1個字節也就是8位寬.假設地址信號為【An,An-1......A3,A2,A1,A0】
位寬(數據線) | 地址線 | |
---|---|---|
8 | 【An,An-1......A3,A2,A1,A0】 | |
16 | 【An,An-1......A3,A2,A1】 | |
32 | 【An,An-1......A2】 |
所謂位寬,也就是一個存儲單元存儲了幾個位.比如32位的,也就是一次取值是4字,地址序列為[0,4,8,12]>[0b0000,0000>0b0000,0100>0b0000,1000>0b0000,1100],也就是低2位為0.
基址,也就是片選信號在哪里,基址就在哪里.
尋址范圍
尋址范圍與位寬無關,只與地址線有關.比如接了[A0,A2],那么就能尋址[0,1,4,5]也就是尋址[0--5].如果地址線是[A0--A20],尋址到[0----2^21]也就是2M
引腳描述
- nWE OUTPUT nWE (Write Enable) indicates that the current bus cycle is a write cycle.
- nOE OUTPUT nOE (Output Enable) indicates that the current bus cycle is a read cycle.
- nWAIT INPUT nWAIT requests to prolong a current bus cycle. As long as nWAIT is L, the
current bus cycle cannot be completed.
內存接口的時序
NorFLASH
開發板使用的NORFLASH是MX29LV160DBTI
,2M大小,接在nGCS0,所以基址是0.
Taa 地址信號Taa后數據有效70ns
Tce 片選信號后Tce后數據有效70ns
Toe 數據在Oe后Toe后有效30ns
Toh 數據保持時間0ns
Tdf 在Tdf內數據不穩定,也就是不允許訪問其他芯片,30ns一般不需要理會這個,因為再次訪問的時候,還需要時序前面的Taa等,等到穩定的時候,數據已經穩定了
Trc 讀周期時間,最小70ns,也就是速度性能 70ns
為了簡單把地址數據(Addresses),片選信號(CE#),讀信號(OE#),同時發出,然后讓它們都等待70ns(等待信號有效)。對應S3C2440的Nor Flash控制器的讀時序圖,需要讓地址信號A[24:0]、片選信號nGCS、讀信號nOE同時發出,保持Tacc大于等于70ns。然后設置讀之后的那些時序tdf,toh為0[因為下一次使用會又有片選的70ns]
位寬設置
為什么上電就能使用NOR
這里的Tacc
默認值是111
最大值為14
個時鐘,這也是為什么我們不用設置NORFLASH就能開機使用.上電的時候是使用晶振12M
,也就是tacc=14*Hclk=1/12M*14=1166ns
>70ns
設置寄存器
- BWSCON中Bank0不需要設置
- 將HCLK設置為100MHz,T=1000/100=10ns,Tacc需要大于等于70ns,因此設置Tacc等于101,8個clocks即可。
- BANKCONn其他位不需要設置,保持0,也就是說將地址、片選、地址同時發出,讀后不保持時間.
void bank0_tacc_set(int val)
{BANKCON0 = val << 8;//設置【10:8】
}
測試:燒錄到NOR啟動,實際測了一下使用5個周期都是可以的
SDRAM
內存知識補遺
SDRAM學習筆記(二)
- P-Bank, 物理位寬,要等同于CPU的數據總線寬度,也是北橋內存總線寬度,適用于SDRAM以及以前產品,在RDRAM中以通道代替
- SDRAM synchronous Dynamic Random Access Memory 同步動態隨機存儲器
- SIMM single In-line Memory moudle 單列內存模組
- DIMM double in-line Memory moudle 雙列內存模組
- SDRAM 芯片位寬 SDRAM芯片的數據總線
- 內存顆粒==內存芯片
- L-bank logic bank ,SDRAM芯片內部的bank,一般4個
- 內存芯片容量=行*列*L-bank*位寬
- 引腳
- Dqn 數據總線
- An 行列地址線
- DQM 數據掩碼
- CAS# 列選中
- RAS# 行選中
- CK 時鐘信號
- CKE 時鐘有效
- Ban L-bank線
- WE# 寫有效
使用簡介
首先器件上電----對SDRAM進行初始化(因為內部有邏輯電路部分,狀態機部分)----對SDRAM進行200us的穩定期(參數INIT_PER)----預充電,對所有的L-Bank進行預充電(預充電時間間隔tRP)----8個預先刷新周期(手冊規定至少2個周期來刷新邏輯塊,在設計中一般直接給8個周期,參數REF_PER)----模式寄存器的配置(行選通周期參數tRCD,由于SDRAM內部結構導致更新存儲陣列需要時間---數據輸出延時時間tCL---突發長度BL設置) https://www.cnblogs.com/raymon-tec/p/5147217.html
初始化協商 MSR 模式寄存器
SDRAM 在上電的時候需要BIOS對其初始化設置MSR 模式,也就是協商一些參數,下圖是板載的模式字
- 操作模式
- CAS 潛伏期 列地址潛伏期,設置后發送列地址后cas周期后發送數據
- BT 突發傳輸模式
- BL 突發長度
尋址
[(允許同時)CS片選,L-bank選擇,行有效]列有效
數據讀
有個參數 CAS Latency,CAS 潛伏期=又被稱為讀取潛伏期(RL,Read Latency),這個在初始化時設定
數據寫
注意參數 twr 回寫時間
突發模式
連續讀取,只需要發送起始列地址,BL在協商的時候規定了
板載SDRAM
JZ2440連接的是EM63A165TS-6G
,其規格是16M x 16 bit
=32M,兩通道也就是64M
4M word x 16-bit x 4-bank,說明內部4個bank,位寬16
CLK
CKE Clock Enable,時鐘使能
BA0,BA1 Bank Activate,Bank選擇
A0-A12 Address Inputs,Row(行)=A0-A12,column= A0-A8 with A10Duringa Precharge command, A10 is sampled to determine if all banks are to be precharged(A10 = HIGH).
CS# Chip Select
RAS# Row Address Strobe:
CAS# Column Address Strobe
WE# Write Enable
LDQM,UDQM Data Input/Output Mask 掩碼
DQ0-DQ15 Data I/O
地址計算
行=A0~A12,列=A0~A8,16位位寬,一個單元兩個字節,4個Bank,所以1個bank=
2^13*2^9*2/1024/1024
=8M,4個Bank=32M.32位尋址,所以要忽略
CPU2440
的低兩位地址線[0,1]bank線如何確認?總共是雙通道,32位位寬,所以實際上選中一個bank其實是選中了兩個物理的Bank=16M=
2^24
,所以地址線在[24,25],或者也可以這么理解尋址64M,4個片選也就是64/4=16M,16M=2^(20+4),所以0->2^23=16M,其再高1位就是24線了
BANK6的起始地址為0x30000000,所以SDRAM的訪問地址為0x30000000~低0x33FFFFFF,共64MB
程序設計
時序參數
板子只用到了Bank6的片選,BANK0--BANK5只需要設置BWSCON和BANKCONx(x為0~5)兩個寄存器;BANK6、BANK7外接SDRAM時,除BWSCON和BANKCONx(x為6、7)外,還要設置REFRESH、BANKSIZE、MRSRB6、MRSRB7等4個寄存器。
void sdram_init(void)
{BWSCON = 0x22000000; //選擇sdram,32位寬BANKCON6 = 0x17001; //時間參數BANKCON7 = 0x17001;REFRESH = 0x8404f5; //刷新周期BANKSIZE = 0xb1; //size=64MMRSRB6 = 0x20; //CASMRSRB7 = 0x20;
}//測試SDRAM地址
int sdram_test(void)
{volatile unsigned char *p = (volatile unsigned char *)0x30000000;int i;// write sdramfor (i = 0; i < 1000; i++)p[i] = 0x55;// read sdramfor (i = 0; i < 1000; i++)if (p[i] != 0x55)return -1;return 0;
}