2440内存管理


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大小

    mark

内存地址分配

mark

工作方式

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.

内存接口的时序

mark

NorFLASH

开发板使用的NORFLASH是MX29LV160DBTI,2M大小,接在nGCS0,所以基址是0.

mark

mark

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]

mark

位宽设置

mark

为什么上电就能使用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 突发长度

mark

寻址

[(允许同时)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 A10
			Duringa 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

mark

mark

地址计算

  • 行=A0A12,列=A0A8,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

mark

mark

程序设计

时序参数

mark

板子只用到了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=64M

	MRSRB6   = 0x20;		//CAS
	MRSRB7   = 0x20;
}

//测试SDRAM地址
int sdram_test(void)
{
	volatile unsigned char *p = (volatile unsigned char *)0x30000000;
	int i;

	// write sdram
	for (i = 0; i < 1000; i++)
		p[i] = 0x55;

	// read sdram
	for (i = 0; i < 1000; i++)
		if (p[i] != 0x55)
			return -1;

	return 0;
}

mark

原文地址:https://www.cnblogs.com/zongzi10010/p/10023594.html