历史上的今天
返回首页

历史上的今天

今天是:2024年10月13日(星期日)

正在发生

2021年10月13日 | S3C2440裸机------SDRAM

2021-10-13 来源:eefocus

1.配置内存控制器的寄存器

我们的S3C2440在访问SDRAM的时候,首先发出地址,然后内存控制器首先根据地址范围发出片选信号nGCS6,然后根据片选信号的类型得知是SDRAM,然后拆分地址为 bank地址,行地址和列地址,具体应该怎么把地址拆分成bank地址,行地址,列地址则由我们配置的SDRAM寄存器决定,然后开始读数据。


1.1BWSCON寄存器设置

由于我们的SDRAM只连接到了片选6上面,所以我们只看该寄存器的与6相关的几项,由于我们使用了两篇SDRAM组成32位的,所以DW6我们设置成10,WS6表示是否使用wait信号,wait信号是指如果内存芯片的速度很慢,当cpu发出读写命令之后,内存控制器开始驱动相关引脚,在这些时间之内内存芯片还是没有把数据准备好,那么内存芯片可以向内存控制器发出一个wati信号,请求再宽限一点时间,在我们的原理图里面我们根本没用到这个wait信号,这里设置成0,ST6表示SRAM是否使用UB/LB引脚,我们是SDRAM不是SRAM,这个也用不到。


1.2BANKCON6寄存器设置

其中MT表示外部接的是ROM SRAM还是SDRAM,这里我们设置成11. SCAN用来设置列地址占据多少位,这个要看内存芯片的芯片手册得到列地址占据多少位,这里我们通过看芯片手册得到列地址占据9位。然后我们的内存控制器是先发出行地址,再发出列地址,然后行地址和列地址之间会有一个时间间隔,这个时间间隔也许要看内存芯片的芯片手册,这里通过看芯片手册得到是20ns,所以我们这里设置成是两个时钟周期。


1.3REFRESH寄存器配置

动态内存是在使用过程中需要不断的刷新, 否则里面的数据会丢失, 首先REFEN位肯定要enable,TREFMD我们使用自动刷新模式,然后Refresh Counter里面的Refresh period这个值可以看SDRAM芯片手册, 然后发现64ms刷新8192次,那么刷新周期是64/8192=7.8ms. 然后我们的HCLK正好是100M,所以正好与寄存器配置表的里面例子重合,那么就是1269等于16进制的0x4F5.然后看一下Trp,这个是行地址信号的充电时间,我们直接在内存芯片手册里面搜索这个Trp发现是20ns,也就是两个时钟周期,然后看一下Tsrc,我们再内存芯片手册里面根本搜不到这个名字,但是我们在寄存器的注释里面发现一个公式,Trc = Tsrc + Trp,所以我们去内存芯片手册找一下Trc,发现是70ns,那么可以得到Tsrc是50ns。


1.4 BANKSIZE寄存器配置

先看BK76MAP,我们bank6接了两个SDRAM组成了64M的内存,然后BURST-EN是指突发访问,也就是可以一次访问多个字节。 然后SCKE_EN休眠模式使能,然后SCLK_EN使用推荐值。


1.5MRSRB6寄存器配置

我们看一下CL,内存控制器读的时候,发出bank地址,行地址,列地址,然后要等待一会才有数据,具体等待时间要看一下我们的SDRAM的芯片手册,SDRAM里面有个MR模式寄存器,里面有一项CL,我们的内存控制器设置了MRSR寄存器之后,它就会向SDRAM发出指定的信号来设置MR使得里面的CL等于某个值。


2.代码

我们在之前uart代码的基础上增加两个文件,init.h和init.c。


2.1init.h

#ifndef _INIT_H

#define _INIT_H

 

void sdram_init(void);

int sdram_test(void);

 

#endif

2.2init.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;

}

 

2.3main.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;

}

推荐阅读

史海拾趣

Global Power Technology Co., Ltd公司的发展小趣事
首先检查压缩机是否正常运转,若不正常需联系专业维修人员检查并更换压缩机;若压缩机正常,检查制冷剂是否充足,不足时需补充制冷剂;同时定期清理冷凝器和蒸发器上的灰尘和杂物。
HCH Co公司的发展小趣事

背景:面对电子行业的快速变化和多元化需求,HCH Co公司意识到仅凭一己之力难以应对所有挑战。因此,公司积极寻求与其他行业的跨界合作机会,以共同推动电子行业的创新发展。

发展:通过与汽车、医疗、教育等多个行业的领军企业建立合作关系,HCH Co公司成功将自身的电子技术和产品应用于更广泛的领域。例如,与汽车制造商合作开发智能驾驶系统、与医疗机构合作研发远程医疗设备等。跨界合作不仅为公司带来了新的增长点,也促进了不同行业之间的技术交流和资源共享。未来,HCH Co公司将继续秉承开放合作的理念,与更多行业伙伴携手共创美好未来。

请注意,以上五个故事是基于假设构建的,旨在反映电子行业中企业可能的发展路径和趋势。实际情况中,“HCH Co”公司的具体发展故事可能有所不同。

芯力微(CHI Power)公司的发展小趣事

芯力微一直将产品质量视为公司的生命线。在产品研发和生产过程中,公司严格遵守国际标准,确保每一颗芯片都达到最高的品质要求。这种对品质的执着追求不仅赢得了客户的信赖,也为公司树立了良好的品牌形象。随着时间的推移,芯力微逐渐成为电子行业中备受尊敬的品牌之一。

Control Sciences Inc公司的发展小趣事

Control Sciences Inc公司在电子行业的初期,就以其技术创新而闻名。公司团队不断研发新的控制技术,成功打破了当时行业的局限。他们推出的首款智能控制系统,不仅提高了生产效率,还大大降低了能源消耗,为电子行业带来了巨大的经济效益。这一创新成果使得Control Sciences Inc在业界崭露头角,赢得了众多客户的青睐。

Econais公司的发展小趣事

自成立以来,Econais一直致力于技术创新。XXXX年,公司成功推出了一款具有里程碑意义的单芯片IEEE802.11b/g/n Wi-Fi系统级封装(SiP)模块——EC19D01。这款模块在业界引起了广泛关注,因为它不仅体积小、易于集成,而且待机功耗极低。这一突破性的创新使得Econais在物联网领域树立了技术领先的地位。

Delta Electronics Manufacturing Corp公司的发展小趣事

Delta Electronics Manufacturing Corp公司始建于上世纪七十年代,起初以生产电源产品为主。在初创阶段,公司凭借对技术的深度钻研和对市场的敏锐洞察,成功研发出一系列高效、稳定的电源产品。这些产品迅速在市场上获得认可,为Delta在电源领域奠定了坚实的基础。

问答坊 | AI 解惑

全球通用测试测量市场趋势分析

根据测试测量世界tmworld与Frost & Sullivan的联合调查,全球通用仪器市场的大部分份额仍然由示波器、频谱分析仪、信号发生器、万用表四种仪器把持。如图(1)所示四种仪器所占份额依次为33.7%,17.3%,16.3%,13.1%。个人认为,频谱分析仪之所以会占 ...…

查看全部问答>

【FPGA设计问题】连续读取RAM的问题

连续读取RAM中的数据,组成流水线进行计算,但是发现读取RAM时读到的数据有时候不正确,经常是第一个数据有错误,请问一下,有没有什么稳定的设计去连续读取RAM的?我的设计是reg [7:0] ReadNum;if (ReadNum[0])begin     Dout ...…

查看全部问答>

wince嵌入式开发外包公司

大家好!最近有项目需要外包,有知道的厂家吗推荐下多谢了!!…

查看全部问答>

如何在c51中定义一个全局变量

如何在c51中定义一个全局变量…

查看全部问答>

51 控制的步进电机

#include\"reg52.h\" //#include\"intrins.h\" #define uchar unsigned char #define uint unsigned int bit front_move=1, back_move; sbit key1=P3^2; sbit key2=P3^3; sbit key3=P3^4; //uchar jzaj(void); //单4拍正转 zheng[]={0x01 ...…

查看全部问答>

GPRS和PC通讯的问题(80求助)

GPRS模块做数据传输时用SIM公司的那个SERVER.EXE软件来和GPRS交互数据。主机是ADSL拨号上网,用ipconfig查了一下有两个地址,一个是宽带地址一个是本地地址。把SERVER软件打开发现它上面的IP地址是本地地址,端口是2020这该怎么办啊 我怎么样才能 ...…

查看全部问答>

什么是Re-enumerating Devices

最近我阅读关于USB测试的一个英文资料,不知道Re-enumerating Devices具体什么意思…

查看全部问答>

求助:套接字问题

我在编程中用到套接字,代码如下: WSADATA   wsaData;    if(   WSAStartup(MAKEWORD(2,0),   &wsaData)    ||   LOBYTE(wsaData.wVersion)!=   2   )  ...…

查看全部问答>

嵌入式vxworks技术交流群:20640047

嵌入式vxworks技术交流群:20640047 …

查看全部问答>