匿名
未登录
登录
百问网嵌入式Linux wiki
搜索
查看“第012课 内存控制器与SDRAM”的源代码
来自百问网嵌入式Linux wiki
名字空间
页面
讨论
更多
更多
页面选项
Read
查看源代码
历史
←
第012课 内存控制器与SDRAM
因为以下原因,您没有权限编辑本页:
您所请求的操作仅限于该用户组的用户使用:
用户
该页面已被保护以防止编辑和其他操作。
您可以查看与复制此页面的源代码。
=第001节_辅线1_硬件知识_内存接口概念 = 首先来分析下操作GPIO控制器和操作UART控制器两者的区别。 如图是S3C2440是个片上系统,有GPIO控制器(接有GPIO管脚),有串口控制器 (接有TXD RXD引脚)。 <img src="./lesson/lesson1/lesson1_001.jpg"> 配置GPIO控制器相应的寄存器,即可让引脚输出高低电平;配置UART控制器相应的寄存器,即可让引脚输出波形。前者相对简单,类似门电路,后者相对复杂,属于协议类接口。类似的协议类接口还有iic、iis、spi等。 对于CPU是不管什么接口的,它只写相应的寄存器,由控制器根据寄存器的配置去控制具体的引脚。 那么CPU是如何访问各个不同的寄存器的呢? CPU只管发出一个地址,内存控制器根据该地址选择不同的模块,然后从模块中得到数据或者发送数据到模块中。 前面的GPIO/门电路接口、协议类接口,都不会把地址输出到外部,接下来的内存类接口,会把地址输出到外部,比如Nor Flash、网卡、SDRAM。 如图,SDRAM、DM9000网卡、Nor Flash都接在JZ2440的数据总线和地址总线上,CPU把数据和地址发送出去,然后内存控制器根据片选信号选择相应的设备接收地址和数据信号,互不干扰。 <img src="./lesson/lesson1/lesson1_002.jpg"> 片选信号和地址的关系怎么确定?这个是由2440芯片特性决定的。 <img src="./lesson/lesson1/lesson1_003.png"> * 当选择Nor Flash启动时,CPU发出的指令的地址范围处于0x0000000 - 0x08000000,内存控制器就会使nGCS0处于低电平(片选引脚被选中),Nor Flash被选中。 * 当CPU发出的指令的地址范围处于0x20000000 - 0x28000000,内存控制器就会使nGCS4处于低电平(片选引脚被选中),网卡被选中。 * 当CPU发出的指令的地址范围处于0x30000000 - 0x38000000,内存控制器就会使nGCS6处于低电平(片选引脚被选中),SDRAM被选中。 内存控制器根据不同的地址地址范围,发出不同的片选引脚,只有被片选引脚选中的芯片才能正常工作,不被选中的芯片就像不存在一样,不工作。 GPIO/门电路接口、协议类接口、内存类接口都属于CPU的统一编址。对于Nand Flash,在原理图上它的地址线并没有连接到CPU,因此它不参与CPU的统一编址。但它的数据线也接到了数据总线上,为了防止干扰,它也有一个片选信号(CE)。当CPU访问Nand Flash时,Nand Flash控制器才会片选Nand Flash,让其接收数据总线上的数据。 <img src="./lesson/lesson1/lesson1_004.jpg"> 再来看下Nor Flash的空间,0x00000000 * 0x08000000,为128M,即每一个片选信号可以选择的空间是128M=2^27,也就需要A0、A1……A26,共27根地址线。CPU发出的32位地址线,内存控制器根据地址范围,片选上相应的bank,并将地址转化为27位。 <img src="./lesson/lesson1/lesson1_005.jpg"> =第002节_辅线1_硬件知识_不同位宽设备的连接= 参考2440芯片手册,可以看到内存接口与8-bit ROM连接时,2440的A0与外部芯片的A0相连。 <img src="./lesson/lesson2/lesson2_001.png"> 当与两个8-bit ROM拼接成的一个16-bit ROM连接时,2440的A1与外部芯片的A0相连。 <img src="./lesson/lesson2/lesson2_002.png"> 当与四个8-bit ROM拼接成的一个32-bit ROM连接时,2440的A2与外部芯片的A0相连。 <img src="./lesson/lesson2/lesson2_003.png"> 当与一个16-bit ROM连接时,2440的A1与外部芯片的A0相连。 <img src="./lesson/lesson2/lesson2_004.png"> 可以看出外接芯片的位宽有变化时,地址线的接法也会有变化。那这个变化有什么规律呢? 假设CUP执行: MOV R0, #3 @去地址为3的内存上 LDRB R1, [R0] @ 从内存为3的地址上,读出一个字节 如图有8bitROM、16bitROM、32bitROM。 <img src="./lesson/lesson2/lesson2_005.jpg"> 8个bit组成一个字节,字节是计算机的最小的存储单位,因此我们读取数据肯定都是8bit的倍数。 * 对于8bitROM ,8bit是一次读写的最小单位,即0地址是第一个8bit,1地址是第二个8bit;CPU发出的命令是读取地址为3上的数据,即A0和A1都为1,8bitROM的A0和A1收到的也都是1,于是找到了ROM上地址为3的8bit数据,包含了我们需要的数据。 * 对于16bitROM ,16bit是一次读写的最小单位,即0地址是第一个16bit,里面有两个8bit数据;CPU发出的命令是读取地址为3上的数据,即A0和A1都为1,16bitROM的A0和A1分别收到的是1和0,于是找到了ROM上地址为1的16bit数据,包含了我们需要的数据,最后内存控制器再帮我们挑选出所需的8bit数据。 * 对于32bitROM ,32bit是一次读写的最小单位,即0地址是第一个32bit,里面有四个8bit数据;CPU发出的命令是读取地址为3上的数据,即A0和A1都为0,32bitROM的A0和A1收到的都是0,于是找到了ROM上地址为0的32bit数据,包含了我们需要的数据,最后内存控制器再帮我们挑选出所需的8bit数据。 {| class="wikitable" |- ! ROM/bit !! CPU发出地址 !! ROM收到地址 !! ROM返回数据 !! 内存控制器挑选出数据给CPU |- | 8bit(ROM)|| 000011 || 000011 || 编号3的存储单元中的8数据 ||编号3的存储单元中的8bit数据 |- | 16bit(ROM) || 000011 || 000001 || 编号1的存储单元中的16数据 || 根据”A0=1”,挑出低8bit数据 |- | 32bit(ROM) || 000011 || 000000 || 编号0的存储单元中的32数据 ||根据“A0A1=11”,挑出最低8bit数据 |} 接到芯片上的引脚用来确定读取芯片上的哪一个单元的数据,把这个单元的数据返回给内存控制器,内存控制器会根据没有连接芯片的引脚,来确定返回哪一个单元的数据给CPU, 再举一个例子: 假如传递一个32位的数据时 MOV R0, #4 LDR R1, [R0] @去地址4,读取4字节数据 执行过程如下: * 8bitROM: 当CPU发出地址(000100),内存控制器会把000100,000101,000110,000111处的地址转发给ROM,ROM会把得到的地址000100,000101,000110,000111,上的数据返回给内存控制器,内存控制器会把得到的4个8bit的数据组装成一个32位的数据返回给CPU。 * 16bitROM: 当CPU发出地址(000100),内存控制器会把00010,00011处的地址转发给ROM,ROM会把得到的地址00010,00011,上的数据返回给内存控制器,内存控制器会把得到的2个16bit的数据组装成一个32位的数据返回给CPU。 * 32bitROM: 当CPU发出地址(000100),内存控制器会把0001处的地址发送给ROM,ROM会把得到的地址0001上的数据返回给内存控制器,内存控制器会把得到的1个32bit数据返回给CPU。 怎样确定芯片的访问地址: 1. 根据片选信号确定基地址, 2. 根据芯片所接地址线确定范围 实例: Nor Flash 使用的是片选0(nGCS0),基地址为0,用到A20,A19......A1,A0共21条地址线,所以地址范围为0x00000000 ~ 0x1FFFFF也就是2M的空间大小。 网卡(Net)使用的是片选4(nGCS4),基地址为0x20000000,用到A2,A0共2根地址线,所以地址范围为0x20000000 ~ 0x20000005。 SDRAM使用的是片选6(nGCS6),基地址为0x30000000。 {| class="wikitable" |- ! - !! Nor Flash !! Net !! SDRAM | |- | 基地址(base) || 0x00000000 || 0x20000000 || 0x30000000 |- | 取址范围 || 0x00000000~0x1FFFFF || 0x20000000~0x20000005 || 比较特殊,后面讲解 |} <categorytree mode=all style="float:right; clear:right; margin-left:1ex; border:1px solid gray; padding:0.7ex; background-color:white;">ARM裸机加强版</categorytree> [[Category:ARM裸机加强版 ]]
返回至
第012课 内存控制器与SDRAM
。
导航
导航
WIKI首页
官方店铺
资料下载
交流社区
所有页面
所有产品
MPU-Linux开发板
MCU-单片机开发板
Linux开发系列视频
单片机开发系列视频
所有模块配件
Wiki工具
Wiki工具
特殊页面
页面工具
页面工具
用户页面工具
更多
链入页面
相关更改
页面信息
页面日志