1.内存接口概念
S3C2440是个片上系统,有GPIO控制器(接有GPIO管脚(GPA-GPH)),有串口控制器 (接有TXD RXD引脚),有memory controller内存控制器,有Nand控制器等...
1.不同类型的控制器:
(1)GPIO控制器属于门电路,不涉及到时序,相对简单。 (2)串口控制器属于协议类接口,类似的协议类接口还有iic、iis、spi等。 (3)前面的GPIO/门电路接口、协议类接口,都不会把地址输出到外部设备,仅仅只是将地址写入到相应的控制器。 接下来的内存类接口,会把地址输出到外部,cpu将地址写入内存控制器,内存控制器还需访问外部设备,比如NorFlash、网卡、SDRAM。
2.CPU是如何访问各个不同的寄存器的呢?
GPIO/门电路接口、协议类接口、内存类接口都属于CPU的统一编址。但对于Nand Flash,它没有独立的地址线和cpu的地址总线相连接,因此它不参与CPU的统一编址。
(1)对于门电路接口、协议类接口,直接访问寄存器即可。
(2)对于内存类接口,交给内存控制器去处理。下面详细分析:
CPU只管发出一个地址,内存控制器根据该地址范围选择不同的模块,然后从模块中得到数据或者发送数据到模块中。
如下图,SDRAM、DM9000网卡、Nor Flash都接在JZ2440的数据总线和地址总线上,CPU把数据和地址发送出去,然后内存控制器根据地址范围确定要拉低选中哪个片选信号(nCS),再根据片选信号(nCS)选择相应的设备,进行收发地址和数据,互不干扰。
(1)当CPU发出的指令的地址范围处于0x00000000 - 0x08000000, 内存控制器就会使nGCS0处于低电平(片选引脚被选中),NorFlash被选中。(NorFlash启动时才行,nand启动时nGCS0这块对应SRAM) (2)当CPU发出的指令的地址范围处于0x20000000 - 0x28000000, 内存控制器就会使nGCS4处于低电平(片选引脚被选中),网卡DM9000被选中。 (3)当CPU发出的指令的地址范围处于0x30000000 - 0x38000000, 内存控制器就会使nGCS6处于低电平(片选引脚被选中),SDRAM被选中。
内存控制器根据不同的地址地址范围,发出不同的片选引脚,只有被片选引脚选中的芯片才能正常工作,不被选中的芯片就像不存在一样,不工作。
从2440 datasheet中我们得知内存控制器可访问的地址范围有1G(0x0000,0000-0x4000,0000),8个bank,每个bank_size为128M。理论上需要2^30,30条地址线来确定是哪个bank,哪个地址。但是实际上只用到了27条,那么是怎么确定是哪个bank被选中了呢?
cpu每次发给内存控制器的地址都是Addr[31:0],但是内存控制器发给外设(sdram,nor,dm9000)却只用到了A[26:0]。第[29:27]被用来确定要拉低哪个nGCS,即要选中哪个bank。
bit[29:27] bit[26:0] 0b000 -> 0x000,0000-0x7ff,ffff (bank0 128M) 0b001 -> 0x800,0000-0xfff,ffff (bank1 128M) ... ... 0b110 -> 0x000,0000-0x7ff,ffff (bank6 128M) 0b111 -> 0x800,0000-0xfff,ffff (bank7 128M)
那么对于大容量的nandflash,理论上需要更多的地址线来确认访问地址,那既然没有地址线,cpu是如何访问nand的呢?当然是通过nand控制器,nand是地址、命令、数据都共用数据总线。这里只是引入一个话题,具体内容后面讲。
来源:https://www.cnblogs.com/fuzidage/p/12010420.html