您尚未登录。

楼主 #1 2018-05-10 10:23:56

xinxiaoci
会员
注册时间: 2018-04-18
已发帖子: 71
积分: 71

内存控制器配置 nor/SDRAM

《单片机小白转嵌入式Linux学习记录,基于S3C2440----目录》
CPU 通过地址线/数据线访问 -> GPIO控制器
-> UART/I2C/I2S/SPI控制器
-> NAND控制器
-> 内存控制器 NOR flash/SDRAM/网卡
所有的外设控制器和内存设备都属于CPU统一编址,NAND控制属于内存编址,NAND flash 不属于CPU统一编址。

NOR flash/SDRAM/网卡 共用地址线/数据线,如何互不干扰?
答:通过片选信号来区分,根据访问地址范围来使能不同的片选信号。每个地址范围128MB = 2^27 所以地址线有A0~A26 27条线。片选用来使能不同的内存设备,LnOE 控制读信号,LnWE控制写信号。SDRAM只用LnWE一条线来控制读/写,低电平写,高电平读。

------------------------------------------------------------

CPU发出32位内存地址 -> 内存控制器 ->A[26:0]->外部内存设备

数据位宽与地址线的接线方式

8位宽 A0 -> A0
16位宽 A1 -> A0 内存控制器根据未发出位A0的值来判断是高8位还是第8位
32位宽 A2 -> A0 内存控制器根据未发出位A0,A1的值来组装数据返回给CPU

高位宽在访问大量数据时,内存控制器需要发送1/2(16bit) 或1/4(32bit)次读写即可,提高访问速度。

怎么确定内存设备的地址范围?
答:1.根据片选信号确定基址。
2.根据地址线确定范围。

----------------------------------------------------------
Nor flash
时序图 MX29LV160DBTI-70G(NOR FLASH).pdf P32-33
CPU 可编程时序 P205

接线
LnOE 读信号
LnWE 写信号
nGCS0 片选
nREST 复位
LDATA[15:0] 数据线 16位宽
LADDR[20:1] 地址线 2^21 = 2MB 容量

寄存器设置
BANKCON0(0x48000004) = 0x0500
Tacc 0b101 80ns>70ns 访问时钟

BWSON(0x48000000) 不用设置

DW0[2:1] 只读不需要设置,根据OM[1:0]电平选择位宽 0b01 16bit 0b10 32bit

通过修改BANKCON0[10:8]可以修改norflash的读取速度。只有在Nor启动下才能感觉到程序的差异。

------------------------------------------------------
SDRAM

步骤

1.内存控制器根据地址发出nGCS6片选

2.根据内存类型(SDRAM)拆分地址
a.L_BANK地址
b.行地址
c.列地址
-> 怎么拆分地址,通过寄存器来配置
3.读写数据

BANK6 寄存器配置 SDRAM

BWSON(0x48000000) = 0x22000000 P207 Bus width & wait status control register
ST6[27] SRAM UB/LB专用引脚 SDRAM不用
WS6[26] 等待信号未用到
DW6[25:24] 0b10 32位宽 -> 0b10 32bit

BANK7不用 配置成与BANK6 一样

BANKCON6(0x4800001C) = 0x00018001 P210
BANKCON7(0x48000020) = 0x00018001
MT[16:15] 0b11 Sync.DRAM 确定内存类型
Trcd[3:2] 0b00 2clock=20ns RAS to CAS delay 行地址到列地址延时 在芯片手册中搜索 Trcd P18 最大21ns
SCAN[1:0] 0b01 9bit 列地址内存块数量
REFRESH(0x48000024) = 0x008404F5 SDRAM refresh control register
REFEN[23] 1 SDRAM 刷新使能
TREFMD[22] 0 SDRAM 刷新模式 0自动刷新
Trp[21:20] 0b00 20ns RAS行访问预充电时间 手册21ns
Tsrc[19:18] 0b01 50ns SDRAM Semi Row cycle time Trc=Tsrc+Trp 行地址保持时间 = 时钟周期-充电时间
Refresh Counter[10:0] 0x4F5(1269) 64ms/8k=7.8us 刷新计数时间
BANKSIZE(0x48000028) = 0xb1 Flexible bank size register 灵活的块大小配置寄存器
BURST_EN[7] 1 突发操作使能
SCKE_EN[5] 1 休眠模式使能
SCLK_EN[4] 1 SCLK 仅在访问时活跃
BK76MAP[2:0] 0b001 BANKCON6/BANK7 64M/64M 内存映射大小
MRSRB6(0x4800002C) = 0x20
MRSRB7(0x48000030) = 0x20
WBL[9] 0 写突发长度 默认值
TM[8:7] 0b00 测试模式 默认值
CL[6:4] 0b010 CAS 列访问后延时 2或3时钟周期 根据芯片手册
BT[3] 0 突发类型 固定值
BL[2:0] 0b000 突发长度 固定值

测试代码

#define BANKCON0 (*(volatile unsigned int *)0x48000004)	//volatile 防止编译器优化
#define BWSON (*(volatile unsigned int *)0x48000000)	//位宽控制
#define BANKCON6 (*(volatile unsigned int *)0x4800001C)	
#define BANKCON7 (*(volatile unsigned int *)0x48000020)
#define REFRESH (*(volatile unsigned int *)0x48000024)
#define BANKSIZE (*(volatile unsigned int *)0x48000028)
#define MRSRB6 (*(volatile unsigned int *)0x4800002C)
#define MRSRB7 (*(volatile unsigned int *)0x48000030)

/* Nor 初始化 */
void norflash_init(void)
{
	BANKCON0 = 0x0500;	//Tacc	0b101  80ns>70ns	访问时钟
}
/* SDRAM 初始化 */
void sdram_init(void)
{
	BWSON = 0x22000000;
	BANKCON6 = 0x18001;
	BANKCON7 = 0x18001;
	REFRESH = 0x8404F5;
	BANKSIZE = 0xb1;
	MRSRB6 = 0x20;
	MRSRB7 = 0x20;
}

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

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

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

	return 0;
}

离线

页脚

工信部备案:粤ICP备20025096号 Powered by FluxBB

感谢为中文互联网持续输出优质内容的各位老铁们。 QQ: 516333132, 微信(wechat): whycan_cn (哇酷网/挖坑网/填坑网) service@whycan.cn


东莞哇酷科技有限公司开发