一、内存控制器简介

  • nGCSx片选信号是内存控制器自动选择的

假设CPU请求地址0x3000_0010的数据内存控制器会自动片选nGCS6请求Bank6的数据

  • 每个Bank128MB大小
  • 内存控制器配置的本质就是让各个Bank满足外接的内存设备时序要求,所以需要结合外接设备芯片手册分析

一、Norflash简单例子

根据韦东山老师分析外接Norflash只要满足Tacc$\geq$70ns就能满足时序要求
这里配置BANKCON0[10:8],初始化上电是HCLK=12M(外接晶振)14个时钟就是1166ns,满足要求绰绰有余。初始化时钟之后HCLK=100M,1个时钟就是10ns所以配置为101也就是8个时钟就能满足要求

只读寄存器BWSCON,这里只关心BANK0相关位,根据外部引脚决定位宽


注意示例代码需要在norflash上才能观察到现象

二、SDRAM

接在开发板BANK6,起始地址0x3000_0000

BWSCON


DW6设置为32-bit,Bank7没有用到习惯上设置为一样

BANKCON6


MT设置为11 SDRAM, Trcd表示发送row地址到column地址之间的间隔,这里设置为20ns,因为HLCK=100M一个时钟是10ns这里设置为00,列地址CA0~CA8一共是9位,设置为0x00018001
FPGA的SDRAM写操作时序参考
数据手册

REFRESH

  • 23位 设置为1 使能刷新
  • 22位 设置为0 自动刷新
  • [21:20]位 预充电时钟 设置为20ns两个周期00

  • [19:18]位 trc设置为70ns 7个周期 所以tsrc设置为5个周期 01

  • [10:0]位 刷新周期根据数据手册8192 refresh cycles / 64ms算出是7.8us,根据示例设置为1296

最终设置值为0x008404f5

BANKSIZE

  • 7位设置为突发写入 一次写入多字节
  • 5位 使能休眠模式 1
  • 4位 设置为1
  • [21:20]位 64M 设置为001

最终设置为0x000000b1

MRSRB6

  • 选择fixed标记的位
  • [6:4]位 CAS Latency表示发送地址之后几个时钟出数据,设置为2 3 都可以,这里设置为2

FPGA读时序
这个寄存器就是配置SDRAM的模式寄存器的和FPGA里初始化最后一个LMR命令一样
FPGA初始化流程
这里设置为0x00000020

代码

需要把BANK7相关寄存器也需要一起设置代码才会生效,原因目前不明

#include "s3c2440.h"

void Init_SDRAM(){
    BWSCON = 0x22000000;

    BANKCON6 = 0x00018001;
    BANKCON7 = 0x00018001;

    REFRESH = 0x008404f5;

    BANKSIZE = 0x000000b1;

    MRSRB6 = 0x00000020;
    MRSRB7 = 0x00000020;
}

int SDRAM_Test(){
    volatile unsigned char *p = (volatile unsigned char *)0x30000000;
    int i;

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

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

    return 0;
}

完整代码


Kyseng
1 声望3 粉丝

电子爱好者一枚,利用工作空余时间记录一下学习过程