嵌入式linux学习笔记--20200224--SDRAM的介绍与使用 基于JZ2440V3 S3C2440

在写这篇文章之前 参阅了很多大佬的博客,发现自己距离大佬的差距是那么的遥远。不过我还是要写这篇,这是我自己的感悟以及理解。

以下几个链接是我参考比较多的  写的非常棒的。

高手进阶,终极内存技术指南。   https://blog.csdn.net/qq_16748819/article/details/83037781 

https://blog.csdn.net/weixin_42547860/article/details/88998037

SDRAM   同步动态随机存储器,原理是电容充电的原理,相较于SRAM 价格便宜,但是速度比较慢。电脑中常用的4G 8G 16G 的内存都是这个的加强版本  本质其实都是动态内存。  动态内存 的动态主要体现在为了维持数据 需要不断的去进行数据的刷新。

SRAM(Static Random-Access Memory,SRAM) 和SDRAM 相比较没有 dynamic 这个特性,不需要去对电容进行充电读写更快,一般用来做CPU内部的cache 。SRAM的实现是利用数字逻辑电路去实现的,集成度达不到DRAM那么高,所以价格相对较贵。

这是一个 SDRAM 的datesheet,  JZ2440 选用的是-6G版本  从特性来看 我们可以知道 这个芯片的容量是32MB (256Mbit),内部分成了四个bank 芯片的极限速度是166MHz  旁边还有些具体的 时间参数,暂时先不分析。

存储容量的计算  4M word * 4bank = 16M word = 32M byte  ,这里比较绕,  因为是16位的位宽所以一个地址上面就是一个16bit的 1 word  换算成byte 就是2byte

芯片支持brust 读取 1/2/4/8 、whole page  可以一次性连续读取1个(16bit) 2个(16bit *2 )、、、

后面开启了 mmu 之后  mmu  应该会有整页搬到内部cache里面的动作。 这样可以提高效率。

根据上面表格的地址线的数量我们可以知道 这个芯片的 内部 col = 2^9 = 512 个  row = 2^13

col * row *bank = 2^9  *   2^13  *  2^2   = 2^24 = 16M(word)   = 32M byte = 256M bit

因为我们使用的 S3C2440  带有SDRAM的 控制单元,所以具体的 硬件时序 我们就不去分析了,  我们只去关心几个关键的参数。

在S3C2440 的技术手册的第五章是关于内存控制的介绍  

在概述部分介绍了  S3C2440 的内存控制单元的特性。

每个内存单元可寻址范围是128Mbyte   除了bank0 之外的内存接口芯片都可以编程控制使用8/16/32位带宽的芯片(bank0 是因为是启动地址,而且bank0 的位宽选择是由硬件决定的,通过选择启动方式自动选择对应的位宽)。

这里面还特别提到了SDRAM的 专门的bank    也就是我们即将使用的bank6  bank7

接下来就是配置这两个bank 的分析  第一步就是配置  bank 的位宽 

根据开发板的原理图 我们可以看出来  开发板上的设计是把俩个芯片并在一起当成  32bit 位宽的一个芯片使用 

表格中的bit 27 是byte_enable    用来屏蔽指定的byte,因为S3C2440内部有内存控制器可以去实现  byte 的分离  所以就不需要在设置了。

接下来就是 BANKCON6 寄存器

这一部分的设置是 BANK的 控制寄存器,对速度暂时不去追求,所以就用默认的速度就可以了(最慢的速度)

col的值去9bit  这个是前面提到的 地址线推算出来的

这个寄存器是 SDRAM 的自动刷新控制寄存器 Trp 时间根据芯片手册我们可以查到

我们取最小值 2个clock = 20ns = (Trp =2clock)

Tsrc  我们可以根据公式

Trc=Tsrc+Trp

 反推出来  。已知 Trp = 2clk

trc = 6 clk  所以算出来 tsrc = 4clk 

bit [19:18] = 00

最后得到这个 counter 值的计算是 根据 SDRAM 的刷新时间和 HCLK 的频率计算的

刷新时间的信息在SDRAM的技术手册上面,  period = 64ms/8192 =

刚好就满足手册上面的那个公式  

所以我们可以计算出来 

REFRESH = 0x8404f5

接下来的寄存器是 banksize

 这部分主要是内存的大小的设置

芯片手册上面提示的 CL可以是2 或者是3.  刚刚的寄存器其实是给 SOC内部设置的数据,SOC会将数据转存到 SDRAM的寄存器中。

最后我们的初始化程序的参数就是这样算出来了。  BWSCON 应该是等于 0x02000000 但是0x22000000 也是对的。

发布了35 篇原创文章 · 获赞 30 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_41534481/article/details/104483387