lPC1788驱动SDRAM
Sdram型号为hy57v256
#ifndef __SRAM_H_
#define __SRAM_H_
#include "common.h"
#include "delay.h"
#include "stdlib.h"
#include "debugserial.h"
#define SDRAM_DEBUG
#define SDRAM_BASE_ADDR 0xA0000000
#define SDRAM_SIZE 0x10000000
#define MHZ *10000001
#define SYS_FREQ 60//MHZ
#if SYS_FREQ == (120)
#define SDRAM_PERIOD 8.33 // 96MHz
#elif SYS_FREQ == (96)
#define SDRAM_PERIOD 10.4 // 96MHz
#elif SYS_FREQ == (72)
#define SDRAM_PERIOD 13.8 // 72MHz
#elif SYS_FREQ == (60)
#define SDRAM_PERIOD 16.67 // 60MHz
#elif SYS_FREQ == (57)
#define SDRAM_PERIOD 17.4 // 57.6MHz
#elif SYS_FREQ == (48)
#define SDRAM_PERIOD 20.8 // 48MHz
#elif SYS_FREQ == (36)
#define SDRAM_PERIOD 27.8 // 36MHz
#elif SYS_FREQ == (24)
#define SDRAM_PERIOD 41.7 // 24MHz
#elif SYS_FREQ == (12)
#define SDRAM_PERIOD 83.3 // 12MHz
#else
#error Frequency not defined
#endif
#define P2C(Period) (((Period<SDRAM_PERIOD)?0:(uint32_t)((float)Period/SDRAM_PERIOD))+1)
#define SDRAM_REFRESH 7813
#define SDRAM_TRP 20
#define SDRAM_TRAS 45
#define SDRAM_TAPR 1
#define SDRAM_TDAL 3
#define SDRAM_TWR 3
#define SDRAM_TRC 65
#define SDRAM_TRFC 66
#define SDRAM_TXSR 67
#define SDRAM_TRRD 15
#define SDRAM_TMRD 3
void sdram_io_init(void);
void sdram_init(void);
u8 sdram_text(void);
#endif
#include "sdram.h"
void sdram_io_init(void)
{
/************** init SDRAM **********/
/* init EMC_CAS */
LPC_IOCON->P2_16 = 0x21;
/* init EMC_RAS */
LPC_IOCON->P2_17 = 0x21;
/* init EMC_CLK0 */
LPC_IOCON->P2_18 = 0x21;
/* init EMC_DYCS0 */
LPC_IOCON->P2_20 = 0x21;
/* init EMC_CKE0 */
LPC_IOCON->P2_24 = 0x21;
/* init EMC_DQM0 */
LPC_IOCON->P2_28 = 0x21;
/* init EMC_DQM1 */
LPC_IOCON->P2_29 = 0x21;
/* init EMC_DQM2 */
LPC_IOCON->P2_30 = 0x21;
/* init EMC_DQM3 */
LPC_IOCON->P2_31 = 0x21;
/************** init SDRAM DATA PIN**********/
/* init EMC_D0 */
LPC_IOCON->P3_0 = 0x21;
/* init EMC_D1 */
LPC_IOCON->P3_1 = 0x21;
/* init EMC_D2 */
LPC_IOCON->P3_2 = 0x21;
/* init EMC_D3 */
LPC_IOCON->P3_3 = 0x21;
/* init EMC_D4 */
LPC_IOCON->P3_4 = 0x21;
/* init EMC_D5 */
LPC_IOCON->P3_5 = 0x21;
/* init EMC_D6 */
LPC_IOCON->P3_6 = 0x21;
/* init EMC_D7 */
LPC_IOCON->P3_7 = 0x21;
/* init EMC_D8 */
LPC_IOCON->P3_8 = 0x21;
/* init EMC_D9 */
LPC_IOCON->P3_9 = 0x21;
/* init EMC_D10 */
LPC_IOCON->P3_10 = 0x21;
/* init EMC_D11 */
LPC_IOCON->P3_11 = 0x21;
/* init EMC_D12 */
LPC_IOCON->P3_12 = 0x21;
/* init EMC_D13 */
LPC_IOCON->P3_13 = 0x21;
/* init EMC_D14 */
LPC_IOCON->P3_14 = 0x21;
/* init EMC_D15 */
LPC_IOCON->P3_15 = 0x21;
/* init EMC_D16 */
LPC_IOCON->P3_16 = 0x21;
/* init EMC_D17 */
LPC_IOCON->P3_17 = 0x21;
/* init EMC_D18 */
LPC_IOCON->P3_18 = 0x21;
/* init EMC_D19 */
LPC_IOCON->P3_19 = 0x21;
/* init EMC_D20 */
LPC_IOCON->P3_20 = 0x21;
/* init EMC_D21 */
LPC_IOCON->P3_21 = 0x21;
/* init EMC_D22 */
LPC_IOCON->P3_22 = 0x21;
/* init EMC_D23 */
LPC_IOCON->P3_23 = 0x21;
/* init EMC_D24 */
LPC_IOCON->P3_24 = 0x21;
/* init EMC_D25 */
LPC_IOCON->P3_25 = 0x21;
/* init EMC_D26 */
LPC_IOCON->P3_26 = 0x21;
/* init EMC_D27 */
LPC_IOCON->P3_27 = 0x21;
/* init EMC_D28 */
LPC_IOCON->P3_28 = 0x21;
/* init EMC_D29 */
LPC_IOCON->P3_29 = 0x21;
/* init EMC_D30 */
LPC_IOCON->P3_30 = 0x21;
/* init EMC_D31 */
LPC_IOCON->P3_31 = 0x21;
/************** init SDRAM ADDR PIN**********/
/* init EMC_A0 */
LPC_IOCON->P4_0 = 0x21;
/* init EMC_A1 */
LPC_IOCON->P4_1 = 0x21;
/* init EMC_A2 */
LPC_IOCON->P4_2 = 0x21;
/* init EMC_A3 */
LPC_IOCON->P4_3 = 0x21;
/* init EMC_A4 */
LPC_IOCON->P4_4 = 0x21;
/* init EMC_A5 */
LPC_IOCON->P4_5 = 0x21;
/* init EMC_A6 */
LPC_IOCON->P4_6 = 0x21;
/* init EMC_A7 */
LPC_IOCON->P4_7 = 0x21;
/* init EMC_A8 */
LPC_IOCON->P4_8 = 0x21;
/* init EMC_A9 */
LPC_IOCON->P4_9 = 0x21;
/* init EMC_A10 */
LPC_IOCON->P4_10 = 0x21;
/* init EMC_A11 */
LPC_IOCON->P4_11 = 0x21;
/* init EMC_A12 */
LPC_IOCON->P4_12 = 0x21;
/* init EMC_A13 */
LPC_IOCON->P4_13 = 0x21;
/* init EMC_A14 */
LPC_IOCON->P4_14 = 0x21;
/************** init SDRAM WE PIN**********/
/* init EMC_WE */
LPC_IOCON->P4_25 = 0x21;
}
void sdram_init(void)
{
volatile u32 i;
volatile unsigned long Dummy;
LPC_SC->PCONP |= (1<<11);//使能emc模块
//初始化IO
sdram_io_init();
//设置命令延迟时间 芯片数据手册上有标准
LPC_SC->EMCDLYCTL |= (8<<0);
//设置输入数据采样延迟
LPC_SC->EMCDLYCTL |=(8<<8);
//设置时钟输出延迟
LPC_SC->EMCDLYCTL |= (0x08 <<16);
//使能emc 正常地址映射 正常模式非低功耗模式
LPC_EMC->Control =1;
//读取配置设置为命令延迟策略
LPC_EMC->DynamicReadConfig = 1;
//设置ras延时为3个clk cas延时为3 以下设置都需要根据SDRAM数据手册来设置
LPC_EMC->DynamicRasCas0 = 0;
LPC_EMC->DynamicRasCas0 |=(3<<8);
LPC_EMC->DynamicRasCas0 |= (3<<0);
//设置预充电的时钟延迟 20us
LPC_EMC->DynamicRP = P2C(20);
//设置选中到预充电的命令周期 45us
LPC_EMC->DynamicRAS = P2C(45);
//设置自刷新退出时间
LPC_EMC->DynamicSREX = P2C(67);
//最后数据输出到有效命令时间
LPC_EMC->DynamicAPR = 1;
//选择数据到有效命令时间
LPC_EMC->DynamicDAL = SDRAM_TDAL+P2C(20);
//写入恢复时间 3
LPC_EMC->DynamicWR = 3;
//选择有效到有效命令周期
LPC_EMC->DynamicRC = P2C(65);
//选择自刷新周期
LPC_EMC->DynamicRFC = P2C(66);
//自刷新到有效命令时间
LPC_EMC->DynamicXSR = P2C(67);
//选择有效组A到组B的延时
LPC_EMC->DynamicRRD = P2C(15);
//装载模式寄存器到有效时间
LPC_EMC->DynamicMRD = 3;
//选择cs0的配置
/*4:3 = 00 = SDRAM
12:7 = 001001 = 128 Mb (8Mx16), 4 banks, row length = 12, column length = 9
14 = 1 = 32bit
0100 0100 1000 0000
32bit 128 Mb (8Mx16), 4 banks, row length = 12, column length = 9*/
LPC_EMC->DynamicConfig0 = 0x0004480;
//时钟受高电平驱动,clkout持续运行 发出nop命令
LPC_EMC->DynamicControl = 0x0183;
//等待一段时间让sdram启动
for(i= 200*40; i;i--);
//发布pall指令,预充电
LPC_EMC->DynamicControl = 0x0103;
//首先设置动态刷新周期为32个clk
LPC_EMC->DynamicRefresh = 2;
//等待至少128个clk
for(i= 256; i; --i); // > 128 clk
//设置新的动态刷新周期
LPC_EMC->DynamicRefresh = P2C(SDRAM_REFRESH) >> 4;
//发布mode指令
LPC_EMC->DynamicControl = 0x00000083;
//进行一次伪读取
Dummy = *((volatile u32 *)(SDRAM_BASE_ADDR | (0x32<<13)));
// 进入normal模式 自刷新时钟禁止 空闲时钟禁止 正常操作非掉电
LPC_EMC->DynamicControl = 0x0000;
//使能芯片缓冲
LPC_EMC->DynamicConfig0 |=(1<<19);
for(i = 100000; i;i--);
}
u8 sdram_text(void)
{
u32 i;
volatile u32 *wr_ptr;
volatile u8 *char_wr_ptr;
wr_ptr = (u32 *)SDRAM_BASE_ADDR;
char_wr_ptr = (u8 *)wr_ptr;
for (i=0; i<(SDRAM_SIZE/4)/1024; i++)
{
*char_wr_ptr++ = 0x11;
*char_wr_ptr++ = 0x22;
*char_wr_ptr++ = 0x33;
*char_wr_ptr++ = 0x44;
}
wr_ptr = (u32 *)SDRAM_BASE_ADDR;
for ( i= 0; i < (SDRAM_SIZE/8)/1024; i++ )
{
if ( *wr_ptr != 0x44332211 ) /* be aware of endianess */
{
return 1;
}
wr_ptr++;
}
return 0;
}
lPC1788驱动SDRAM的更多相关文章
- FPGA之驱动sdram控制兼容性移植实验
cb早在2012年就推出了VIP 视频开发板 V1.4 这套开发板是ep2的,摄像头是ov7670,虽然不如当前的vip20强大,但也算是其雏形. 在vip20后期,cb对sdram以及其他模块进行 ...
- STM32F429驱动SDRAM
1 SDRAM控制原理 1.1 SDRAM信号线 1.2 SDRAM地址线 SDRAM包含有“A”以及“BA”两类地址线: A:行(Row)与列(Column)共用的地址线 BA:独立的用于指定SDR ...
- 【黑金原创教程】【FPGA那些事儿-驱动篇I 】实验十八:SDRAM模块① — 单字读写
实验十八:SDRAM模块① — 单字读写 笔者与SDRAM有段不短的孽缘,它作为冤魂日夜不断纠缠笔者.笔者尝试过许多方法将其退散,不过屡试屡败的笔者,最终心情像橘子一样橙.<整合篇>之际, ...
- SDRAM和dcfifo的联合
SDRAM和dcfifo的联合 设计原理 在"SDRAM突发读写页"实验中,留下了一个问题,就是从SDRAM读取数据的速度要与SDRAM的驱动时钟同步,这就造成了读出的数据的速率过 ...
- SDRAM基础知识
SDRAM知识普及 在学习SDRAM之前,必须先了解"SDRAM"这个概念性的东西,并有感性的认识转变到一种理性的认识,所谓理性的认识就是实质性的东西…….不多说,相信你已经迫不急 ...
- FMC—扩展外部 SDRAM
本章参考资料:< STM32F4xx 参考手册 2>.< STM32F4xx 规格书>.库帮助文档< stm32f4xx_dsp_stdperiph_lib_um.chm ...
- 第26章 FMC—扩展外部SDRAM
本章参考资料:<STM32F76xxx参考手册2>.<STM32F7xx规格书>.库帮助文档<STM32F779xx_User_Manual.chm>. 关于SDR ...
- 第26章 FMC—扩展外部SDRAM—零死角玩转STM32-F429系列
第26章 FMC—扩展外部SDRAM 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/ ...
- 【转】如何把变量或者数组定义到SDRAM及任意位置
我们开发软件的时候,经常会遇到到一个问题,就是内存不够,这个时候就纠结了,怎么办,有两种方法,第一种是扩展内存,外加SRAM或者SDRAM:第二种应该就是优化代码,也就是通常所说的把数组大小减一减,代 ...
随机推荐
- HDU1492/The number of divisors(约数) about Humble Numbers
题目连接 The number of divisors(约数) about Humble Numbers Time Limit: 2000/1000 MS (Java/Others) Memory L ...
- linux命令chown和chmod什么区别
chown一般用来 更改属主.也就是文件所属用户.chmod功能要比chown要强大.可更改文件所有属性和权限.只有管理员账户才有权限用此命令. chown 是修改文件的所有者(owner),和所属组 ...
- ReactiveCocoa / RxSwift 笔记一
原创:转载请注明出处 ReactiveCocoa / RxSwift Native app有很大一部分的时间是在等待事件发生,然后响应事件,比如 1.等待网络请求完成, 2.等待用户的操作, 3.等待 ...
- android viewpager 深究
参考: http://blog.csdn.net/xushuaic/article/details/42638311 GitHub上相关的ViewPager动画的项目 https://github.c ...
- PAT (Advanced Level) 1114. Family Property (25)
简单DFS. #include<cstdio> #include<cstring> #include<cmath> #include<vector> # ...
- PAT1005
水题,和中文没啥区别不说了. #include<cstdio> #include<cstdlib> #include<iostream> #include<a ...
- delphi第2节
- C#入门经典第八章面向对象编程-3-Windows应用程序中的OOP
实例一:使用对象.代码如下: 首先从工具箱中拖一个按钮,并添加事件. private void button2_Click(object sender, EventArgs e) {//按钮的Butt ...
- JavaScript 面向对象(一)
参考:http://www.iteye.com/topic/1123555
- USACO Section 1.3 Barn Repair 解题报告
题目 题目描述 某农夫有一个养牛场,所有的牛圈都相邻的排成一排(共有S个牛圈),每个牛圈里面最多只圈养一头牛.有一天狂风卷积着乌云,电闪雷鸣,把牛圈的门给刮走了.幸运的是,有些牛因为放假,所以没在自己 ...