内存控制器
看芯片原理图SDRAM上面数据线有LDATA0-15 16根线,所以上面SDRAM存储结果逻辑图, 每一个格子都代表16位的数据
选中当中的某个格子的步骤
先发出片选信号选择SDRAM芯片,然后选择那个BANK,选择ROW,选择Column
举例分析
str R0,=0x3000 000
ldr R1,[R0]
将0x3000 000 发送给村控制器
内存控制器:
1、根据地址发出相对应的片选型号
2、根类型(SDRM)拆分地址
a、BANK 地址
b、行地址
c、列地址
如何拆分,需要我们设置,行地址几条,列地址几条
3、读数据
如何设置寄存器,去设置成我们需要的功能
看芯片手册可以看出使用的时LnGCS6片选引脚6所以可以得出我们使用的是BANK6
1、设置BWSCON寄存器
[25:24]=10 (32-bit)看上面芯片手册是有2个16位的组成一个32位的
设置[26]wait = 0 disable
wait引脚是当我当前模块反应不过来的时候,让CPU等待的时间,而看上面的芯片手册上面也没有这个引脚所以设置成disable
[27]
0 = Not using UB/LB (The pins are dedicated nWBE[3:0 )
(设置位写的byte)
1 = Using UB/LB (The pins are dedicated nBE[3:0])
(读写byte)
我们这里只需要设置成 = 0 (只需要写的时候写入哪个byte,读的时候是把整个32位数据都读取出来,然后自己去读取中间的某一个byte)
2、 设置BANKCON6寄存器
设置BANKCON6寄存器我们需要根据上面这个图PROGRAMMABLE ACCESS CYCLE程序读写周期图进行设置
里面的参数都是什么意思可以参考https://blog.csdn.net/weixin_43471255/article/details/108500591这个时序图
2.1 MT [16:15]
设置成SDRAM,所以=11
为了简便只需要设置Tacc > 70ns即可
HCLK = 100MHZ
1个clock需要的时间 1000/100 = 10
Tacc >= 8 clock
[10:8] = 101
2.3设置行地址,列地址的规则
SCAN 列地址位输(看对应的具体的芯片手册) 9bits
Trcd 先发出行地址再发出列地址中间delay的时间(看具体的芯片手册) 20ns 设置成2clocks
3、设置REFRESH寄存器
3.1 设置REFEN [23] enable
[23] = 1
3.2 设置TREFMD [22]
使用默认值自动刷新
3.3 设置 Trp [21:20] SDRAM RAS pre-charge Time
行所存时间
看芯片手册可能Trp >=20ns
取最小值
[21:20]=00
3.4 设置 Refresh Counter [10:0]
刷新周期
64ms 刷新8k
Refresh period = 64ms/8192 = 7.8ms
Refresh period = (211-refresh_count+1)/HCLK
==》refresh_count = 1269
3.5 设置Tsrc [19:18]
Trc >= 70ns 取Trc = 70ns
Trp>=20ns 取Trp = 20ns
Tsrc = 50ns
4、设置BANKSIZE寄存器
4.1 BK76MAP [2:0]有两个16位的组成64MB空间
4.2 BURST_EN [7] 可以突发访问
可以连续一次访问多个字节
如果disable 就不能突发访问不能一次连续访问多个字节
4.3 SCKE_EN [5]使能设置
poewe down mode 设置enable
4.4 SCLK_EN [4] 使用推介值1
5设置MRSRB6寄存器
这个寄存器中的值使用固定值即可
设置只需要设置CL位
内存控制器读SDRAM,发出BANK地址,行地址,列地址
需要等待一会数据才好
等待时间可以看芯片手册
这里我们设置2clock
一旦设置了这个值之后,当SDRAM接收到列地址之后会等待2clock,之后把数据发送给JZ2440
设置MRSR的CL位的时候,会像SDRAM使得SDRAM中MR寄存器中CL与其一样