一、SDRAM(HY57V561620F)连线分析
1、 S3C2440 有27根地址线ADDR[26:0],8根片选信号ngcs0-ngcs7,对应bank0-bank7,当访问bankx 的地址空间,ngcsx引脚为低电平,选中外设。
2^27=128MByte, 8*128Mbyte = 1Gbyte,所以S3C2440 总的寻址空间是1Gbyte。但市面上很少有32位宽度的单片SDRAM,一般选择2片16位SDRAM 扩展得到32位SDRAM.
2、这里选择的SDARM是HY57V561620F,4Mbit * 4bank *16I/O,共32Mbyte。
首先了解下SDRAM 的寻址原理。 SDRAM 内部是一个存储阵列,可以把它想象成一个表
格。和表格的检索原理一样,先指定行,再指定列,就可以准确找到所需要的存储单元。这个表格称为逻辑BANK。目前的SDRAM基本都是4个BANK。寻址的流程就是先指定BANK地址,再
指定行地址,最后指定列地址。这就是SDRAM的寻址原理。存储阵列示意图如下:
查看HY57V561620F 的资料,可知这个SDRAM有13根行地址线 RA0-RA12, 9根列地址线CA0-CA8,2根BANK选择线 BA0-BA1。
SDRAM 的地址引脚是复用的,在读写SDRAM存储单元时,操作过程是将读写的地址分两次输入到芯片中,每一次都由同一组地址线输入。两次送到芯片上去的地址分别称为行地址和列地址。它们被锁存到芯片内部的行地址锁存器和列地址锁存器。
/RAS是行地址锁存信号,该信号将行地址锁存在芯片内部的行地址锁存器中;
/CAS 是列地址锁存信号,该信号将列地址锁存在芯片内部的列地址锁存器中。
地址连线如下图:
问题1:SDRAM:的A0接S3C2440的ADDR2,A0 为什么不接ADDR0?
要理解这种接法,首先要清楚在CPU的寻址空间中,字节(8位)是表示存储容量的唯一单位。用2片HY57V561620F扩展成32位SDRAM,可以认为每个存储单元是4个字节。因此当它的地址线A1:A0=01 时,处理器上对应的地址线应为ADDR3:ADDR2=01(因为CPU的寻址空间是以Byte 为单位的)。所以SDRAM的A0引脚接到了S3C2440的ADDR2 地址线上。同理,如果用1片HY57V561620F,数据线是16位,因为一个存储单元是2个字节,这时SDRAM的A0要接到S3C2440的ADDR1上。
PS:这里解释得可能还是不太明白,2440或2410中地址线都是从ADDR2中开始连接的,即A0-ADDR2、An- ADDR(n+2)、这是因为ARM是32位处理器所以它一次处理数据都是以32位为单位的,也就是说它读或者写数据时,地址只能为0x0000_0000、0x0000_0004、0x0000_0008。。。即4字节对齐,因为一般DDR的数据线都为16位,所以为了得到32位的数据,一般都是将2个DDR连在一起,它们的地址相同,所以对已DDR而言是一个地址对应4个字节(因为一个DDR对应2个字节,两个DDR就对因4个字节),但是对于CPU而言一个地址只对应1个字节,所以这里就存在一个地址转换问题,即使CPU的0~3地址里的数据对应DDR的0地址数据,CPU的4~7地址的数据对应DDR的1地址的数据,所以CPU的0地址对应DDR的0地址,0X04地址对应DDR中1地址,0x08地址对应DDR中2地址,可以看出,DDR的地址刚好是CPU寻址向右移动两位,所以2440或2410中地址线都是从ADDR2开始连接的。
就是说SDRAM的A0接S3C2440的哪一根地址线是根据整个SDRAM的数据位宽来决定的。
问题2:上图接线中,BA0,BA1接ADDR24,ADDR25,为什么用这两根地址线呢?
BA0~BA1代表了SDRAM 的最高地址位。因为CPU的寻址空间是以字节(Byte)为单位的,本系统SDRAM容量为64MByte,那就需要A25~A0(64M=2^26)地址线来寻址,所以BA1~BA0地址线应该接到S3C2440的ADDR25~ADDR24 引脚上。
13根行地址线 + 9根列地址线 = 22根地址线。另外HY57V561620F一个存储单元是2个字节(16I/O),相当于有了23根地址线。BA0,BA1是最高地址位,所以应该接在ADDR24,ADDR25 上。
就是说SDRAM的BA0,BA1接S3C2440的哪几根地址线是根据整个SDRAM的容量来决定的。二、NOR FLASH(AM29LV160DB)的接线分析
NOR FLASH 的地址线和数据线是分开的。AM29LV160DB 是一个2Mbyte 的NOR FLASH,分区结构是:
1个16Kbyte扇区,2个8Kbyte扇区,1个32Kbyte扇区,31个64Kbyte扇区(字节模式);
1个8Kbyte扇区,2 个4Kbyte扇区,1个16Kbyte扇区,31个32Kbyte扇区(半字模式);
共35个扇区。引脚如下:
设计原理图如下:
说明:
AM29LV160DB 第47 脚是BYTE#脚,BYTE#接高电平时,器件数据位是16 位,接低电平时,数据位是8 位。
上图BYTE#接VCC,D0-D15 做为数据输入输出口。A0-A19 是地址线,在半字模式下,D0-D15 做为数据输入输出口。因为数据位是16 位,A0-A19 可以选择2^20 = 1M *2BYTE = 2Mbyte。正好是AM29LV160DB 的容量。
S3C2440 的ADDR1要接AM29LV160DB 的A0。上图中AM29LV160DB 的A20,A21是空脚,分别接的是LADDR21,LADDR22。这应该是为了以后方便扩展NOR FLASH 的容量。LADDR21,LADDR22 对AM29LV160DB是没用的。
当BYTE#接低电平时,D0-D7 做为8 位数据输入输出口,D15做为地址线A-1。相当于有了A-1,A0-A19共21 根地址线。这个时候S3C2440 的ADDR0 应该接在D15(A-1)………,ADDR20 接A19。21根地址线的寻址空间是2^21 = 2Mbyte。正好是AM29LV160DB的容量。
三、与NAND FLASH(K9F1208)的接线分析
1 、K9F1208 结构如下图
K9F1208 位宽是8位(I/O0~I/O7)。
一页:1Page = 512byte + 16byte 最后16byte是用于存储校验码和其他信息用的,不能存放实际的数据。
一块有32 page:1block = 32* (512byte + 16byte) =(16k+512)byte
K9F1208 有4096 个块:
1 device = 4096 *32* (512byte + 16byte) = (64M+2M)byte,总共有64Mbyte可操作的芯片容量
NAND FLASH 以页为单位读写数据,以块为单位擦除数据。
其引脚如下:
S3C24440 和K9F1208 的接线图如下:
当选定一个NAND FLASH 的型号后,要根据选定的NAND FLASH 来确定S3C2440 的NCON,GPG13,GPG14,GPG15 的状态。
下图是S3C2440 中4个脚位状态的定义
K9F1208 的一页是512byte,所以NCON 接低电平,GPG13 接高电平。
K9F1208 需要4个寻址命令,所以GPG14 接高电平
K9F1208 的位宽是8,所以GPG15 接低电平。
NAND FLASH 寻址:
对K9F1208 来说,地址和命令只能在I/O[7:0]上传递,数据宽度是8 位。地址传递分为4 步,如下图:
说明:
第1 步发送列地址,既选中一页512BYTE中的一个字节。512byte需要9bit来选择,这里只用了A0 -A7,原因是把一页分成了2部分,每部分256 字节。通过发送的读命令字来确定是读的前256 字节还是后256 字节。
当要读取的起始地址(Column Address)在0~255 内时我们用00h 命令,
当读取的起始地址是在256~511 时,则使用01h 命令。
一个块有32 页,用A9-A13 共5位来选择一个块中的某个页。
总共有4096 个块,用A14-A25 共12位来选择一个块。
K9F1208 总共有64Mbyte,需要A0-A25 共26个地址位。
例如:要读NAND FLASH 的第5000字节开始的内容。
把5000分解成列地址和行地址。
Column_address = 5000%512 = 392
因为column_address>255,所以用01h 命令读
Page_address = (5000>>9) = 9
发送命令和参数的顺序是:
NFCMMD = 0x01;从后256 字节开始读
NFADDR = column_address & 0xff;取column_address 的低8 位送到数据线
NFADDR = page_address & 0xff;发送A9-A16
NFADDR = (page_address >>8) & 0xff; 发送A17-A24
NFADDR = (page_address >> 16) & 0xff;发送A25
上面的NFCMMD,NFADDR.是S3C2440 的NAND FLASH 控制寄存器。读取的数据会放在NFDATA 中。
四、S3C2440 开发板中SDRAM NOR NAND地址分配
(1)SDRAM地址分配
这是S3C2440 的存储器地址分配图,SDARM只能接在BANK6 或BANK7。
从分析SDRAM接线图可以看到,SDRAM接的是ngcs6,也就是接在BANK6,因为选择的SDRAM 是2片32Mbyte,总容量是64Mbyte,所以SDRAM 的地址范围是0x3000 0000 --- 0x33ff ffff。
(2)NORFLASH地址分配
S3C2440启动方式如下:
上文讲述的NORFLASH 是16bit 数据位宽,选择从NOR FLASH 启动,所以
OM0 接VDD,OM1 接VSS。
从分析NOR FLASH 接线的接线图可看到,NOR FLASH接的ngcs0,也就是接在BANK0。因为选择NORFLASH是2Mbyte,所以NOR FLASH 的地址范围是0x0000 0000 --- 0x001f ffff。
上电时,程序会从Norflash中启动,ARM直接取Norflash 中的指令运行。
(3)NANDFLASH地址分配
最后来看NANDFLASH,NANDFLASH 以页为单位读写,要先命令,再给地
址,才能读到NAND 的数据。NANDFLASH是接在NANDFLASH 控制器上而不是系统总线上,所以没有在8 个BANK 中分配地址。如果S3C2440 被配置成从Nand Flash 启动, S3C2440 的Nand Flash 控制器有一个特殊的功能,在S3C2440 上电后,Nand Flash 控制器会自动的把Nand Flash 上的前4K 数据搬移到4K 内部SRAM 中,系统会从起始地址是0x0000 0000 的内部SRAM 启动。
程序员需要完成的工作,是把最核心的启动程序放在Nand Flash 的前4K 中,也就是说,你需要编写一个长度小于4K 的引导程序,作用是将主程序拷贝到SDRAM 中运行。由于NandFlash 控制器从NandFlash中搬移到内部RAM的代码是有限的,所以在启动代码的前4K 里,我们必须完成S3C2440 的核心配置以及把启动代码(U-BOOT)剩余部分搬到RAM中运行。
至于将2440 当做单片机玩裸跑程序的时候,就不要做这样的事情,当代码小于4K 的时候,只要下到nand flash 中就会被搬运到内部RAM 中执行了。
不管是从NOR FLASH启动还是从NANDFLASH 启动,ARM都是从0x0000 0000 地址开始执行的。