2440裸机-12-3内存控制器与SDRAM_分析NOR FLASH时序

转载:初识内存与SDRAM

文章目录

    • 1.分析读写NOR FLASH的读写时序
      • 1.1为什么需要通过编程来控制读写时序呢?
      • 1.2 S3C2440如何能读写NOR FALSH的数据?
      • 1.2.1NOR FLASH 读时序
      • 1.2.2 设计一个程序去读NOR FLASH
      • 1.2.3 程序具体配置
      • 1.2.4 代码(在UART程序上添加)

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
        /* 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

1
2
3
4
5
6
#ifndef _SETTACC_H
#define _SETTACC_H

void SetTacc(int val);

#endif