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;
}