嵌入式linux学习笔记--20200224--SDRAM的介绍与使用 基于JZ2440V3 S3C2440
在写这篇文章之前 参阅了很多大佬的博客,发现自己距离大佬的差距是那么的遥远。不过我还是要写这篇,这是我自己的感悟以及理解。
以下几个链接是我参考比较多的 写的非常棒的。
高手进阶,终极内存技术指南。 https://blog.****.net/qq_16748819/article/details/83037781
https://blog.****.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 也是对的。