转载:初识内存与SDRAM
文章目录
1.分析读写NOR FLASH的读写时序
看一下S3C2440的数据手册中内存控制器这部分:
读时序:
写时序:
1.1为什么需要通过编程来控制读写时序呢?
因为2440可以接很多种不同型号的内存芯片,这些芯片的性能有差别,有些性能很强,只要我发出读信号,立马就可以读取内存数据,这样就可以把等待时间减少,加快内存读取速度,假如性能比较弱的话就需要去调整时间了,所以说根据外接不同的芯片需要设置不同的时序时间,而这个时间需要CPU和外接内存时序匹配才可以,所以还需要看外接内存NOR FLASH 的读取时序图。
1.2 S3C2440如何能读写NOR FALSH的数据?
答:使2440发出的读写时序,满足NOR FLASH 的读写时序。
在这里使用NOR FALSH的芯片型号是:MX29LV160DBTI,查看他的数据手册。
先来看几个名词,时序图的交流特性:
1.2.1NOR FLASH 读时序
1.2.2 设计一个程序去读NOR FLASH
我们的目的是需要2440的读时序能满足NOR FALSH的读时序、
为了方便,我们让2440同时发出片选信号,读信号,和地址信号。保持至少70ns的时间,也就是设置下图的Tacc大于70ns,
其他的都可以默认设置为0,即可满足nor flash的读取要求.
1.2.3 程序具体配置
第一步,设置BANKCON0寄存器(NOR FLASH 接在片选0)
第二步,位宽寄存器:采用默认设置
因为bank0为只读,通过OM[1:0]引脚硬件配置
1.2.4 代码(在UART程序上添加)
main.c
/* main.c */
#include "my_printf.h"
#include "uart.h"
#include "SetTacc.h"
int main()
{
char c;
Uart0Init();
puts("Enter the value of tacc:");
while (1)
{
c = getchar();
if(c == '\n')
putchar('\r');
if(c == '\r')
putchar('\n');
putchar(c); /* 回显输入语句 */
if (c >= '0' && c <= '7')
SetTacc(c - '0'); /* 根据输入设置Tacc的值,当输入0-4时Tacc<8clock,程序无法工作 ;c-'0'是是类型转换*/
else
printf("Error val,tacc should betwen 0-7");
}
return 0;
}
/* SetTacc.c */
#include "s3c2440_soc.h"
void SetTacc(int val)
{
BANKCON0 = val << 8;
}
SetTacc.h
#ifndef _SETTACC_H
#define _SETTACC_H
void SetTacc(int val);
#endif