jz2440裸机开发与分析:内存控制器4之SDRAM设置

jz2440裸机开发与分析:内存控制器4之SDRAM设置_第1张图片
LDR R0,=0X30000000
➡CPU发给内存控制器:①发出nGCS6;②根据(SDRAM)类型拆分地址:a,BANK地址,b,行地址, c,列地址 ;③读数据
LDR R1,[R0]

问题:如何拆分?行地址几条?列地址几条?

2440内存控制器设置

1、BWSCON寄存器配置=0x22000000
jz2440裸机开发与分析:内存控制器4之SDRAM设置_第2张图片
2、BANKCON6寄存器配置
jz2440裸机开发与分析:内存控制器4之SDRAM设置_第3张图片
3、REFRESH刷新寄存器配置
jz2440裸机开发与分析:内存控制器4之SDRAM设置_第4张图片
4、BANHSIZE配置
jz2440裸机开发与分析:内存控制器4之SDRAM设置_第5张图片
5、MRSRB6
jz2440裸机开发与分析:内存控制器4之SDRAM设置_第6张图片
jz2440裸机开发与分析:内存控制器4之SDRAM设置_第7张图片
SDRAM中有一个MR寄存器(含有CL),用来确定列地址到发出数据中间间隔的时间,而2440内的MRSRB6寄存器也有一个CL,2440根据内部CL设定的值,再通过发送数据去确定SDRAM中的CL,从而确定列地址到发出数据中间间隔的时间。
代码:

init.h
#ifndef _INIT_H
#define _INIT_H

void sdram_init(void);
int sdram_test(void);

#endif
init.c
#include "s3c2440_soc.h"

void sdram_init(void)
{
	BWSCON = 0x22000000;

	BANKCON6 = 0x18001;
	BANKCON7 = 0x18001;

	REFRESH  = 0x8404f5;

	BANKSIZE = 0xb1;

	MRSRB6   = 0x20;
	MRSRB7   = 0x20;
}

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;
}
main.c
#include "s3c2440_soc.h"
#include "uart.h"
#include "init.h"

int main(void)
{
	uart0_init();

	sdram_init();

	if (sdram_test() == 0)
		led_test();
	
	return 0;
}

你可能感兴趣的:(JZ2440学习笔记)