1.内存接口概念
GPIO和协议类接口:我们在配置GPIO或者协议类接口(uart I2C总线)时,对于CPU 来说,它不关心这些接口,它只是去操作这些寄存器,CPU通过配置相应的寄存器,然后由GPIO控制器或uart控制器发出特定的波形,CPU是根据地址去选择不同的寄存器,cpu配置寄存器时是通过内存控制器去配置的,cpu把地址发送给内存控制器, 然后由内存控制器根据地址去选择不同的模块,然后把数据发送给模块或者从模块中读取数据。CPU发出的数据并不会直接输出到外部接口,cpu只是把数据发送给了相应的寄存器。
内存接口:对于内存设备来说,CPU发出的地址可以直接传给内存类设备,内存类设备包括norfalsh, 网卡,SDRAM,但是nandflash不属于内存类设备,对于内存类设备,我们cpu的数据总线和地址总线都是直接连接到内存类设备上的,然后我们的norfalsh,网卡,以及SDRAM是公用地址总线和数据总线的,我们需要用片选引脚来保证三个内存类设备在共用地址总线和数据总线的时候互不干扰, 当cpu发出地址时,内存控制器根据不同的地址范围产生不同的片选信号,从而选择不同的内存类设备,不同地址范围对应的片选引脚如下图所示,每一个片选信号可以选择的地址空间是128M。128M=2的27次方,至少需要A0 .... A2627根地址线,但是我们一直都说我们的CPU是32位的,为什么我们只用到了27条地址线,因为我们的cpu会把32位的地址发给内存控制器,但是我们的内存控制器只使用了其中的27位。
另外,nandflash不属于cpu统一编址,nandflash的片选信号是由nandflash的控制发出来的,只有当我们的cpu访问到nandflash控制器的某个寄存器时,才会发出片选信号选中nandflash。
另外,我们应该怎么分辨数据是由CPU写给内存设备还是cpu从内存设备读取数据呢,我们使用引脚进行确定。
2.不同位宽设备的连接
当我们外部接的是8bit的rom时,我们cpu的A0就连接rom的A0,外接的是16bit的rom时,我们cpu的A1连接rom的A0,外接的是32bit的rom时,cpu的A2连接rom的A0,具体如下
当cpu从rom读取数据时,CPU发出地质,然后rom收到地址,然后rom把数据发送给内存控制器,然后对于16bit和32bit的rom,内存控制器会从中挑出数据返回给cpu,具体如下图所示。
具体是首先根据连接到rom芯片上的地址管脚决定读取那个单元,然后根据没有连接的引脚确定从单元中取出第几个字节返回给CPU。
下面是另一个例子,这次我们要一次性读取四个字节,
另外,我们再访问芯片时怎么确定芯片的访问地址:1.根据片选信号确定基地址;2,再根据芯片所连接的地址线确定范围。
3.时序图分析示例
我们以norfalsh为例子讲解时序图,首先我们的cpu和norfalsh主要连接有地址线、数据线、片选信号、读信号、写信号。
下面是norfalsh的芯片手册里面给出的norfalsh自身的时序图:
我们看一下norflash的芯片手册里面的这个表格里面的各个名称的含义,
Taa:在cpu发出地址信号之后,过长时间之后,我这个norfalsh的数据才能给你准备好,然后最大70ns的意思是说,同一个公司生产的芯片每个芯片之间也会有点差别,有的性能好在收到地址信号之后很快就能收到数据了,但是有的性能差,在收到地址信号之后很长时间才能收到信号,但是所有的这些芯片在70ns之后肯定都能收到数据,也就是就算是最差的芯片,那么70ns之后肯定也准备好了,但是70ns之后的不能保证数据是有效的。
Tce:当发出片选信号之后,过多长时间数据才有效,
Toe:数据在 Toe信号之后多长时间有效。
Toh:数据保持时间,最小值是0,
Tdf:我们之前说过要去访问一个芯片,先选中它,但是当我访问完一个芯片,然后片选信号释放之后,你不能立刻去访问另一个芯片,因为当前芯片片选刚被释放之后,数据线的状态还不稳定,还不是高阻状态,实际上这个值一般我们不需要理会,假设我们刚访问完这个norflash,数据还没有到高阻状态,需要等待30ns, 但是这个时候如果我再立刻开始访问这个norflash,你首先要发送片选以及地址信号,然后等待70ns才会接收数据,等到了70ns,这里的数据线早就恢复到高阻状态了,就可以访问了。
我们在访问norflash的时候,为了简单,我们把片选信号,读信号,地址信号三个同时发出。
下面我们看一下怎么设置S3C2440,S3C2440读取norfalsh的时序图如下:
我们在芯片手册里面搜索Tacc,找到BANK CONTROL REGISTER,由于我们的norfalsh是连接到bank0上面,所以我们设置BANKCON0寄存器,我们可以看到这个寄存器的Tacc位的默认值是111,是14个时钟周期,板子刚开始上电的时候时钟周期是12M,Tacc是14个时钟周期是1166ns,所以我们一上电的时候,使用最保险的参数,可以访问各种不同性能的norflash。
假设HCLK是100M,那么时钟周期是10ns,那么我们设置Tacc是8个时钟即可。
接下来看一下访问norflash还有哪些寄存器需要设置。
上一篇:S3C2440裸机------SDRAM
下一篇:S3C2440裸机------从零实现用于裸机调试的printf函数
推荐阅读
史海拾趣
随着电子行业的不断发展,小型化、集成化成为产品设计的趋势。COTO TECHNOLOGY紧跟时代潮流,于1983年成功研发出史上首款表面贴装干簧继电器。这一技术的突破不仅提高了产品的生产效率,更使得COTO的产品在小型化方面走在了行业前列。这一创新不仅增强了COTO在市场上的竞争力,也进一步巩固了其在干簧继电器领域的领导地位。
为了应对原材料成本上涨和市场竞争加剧的挑战,First Switchtech公司(或类似公司)实施了供应链优化策略。公司通过与上游供应商建立长期合作关系,实现了原材料的稳定供应和成本的有效控制。同时,公司还引入了先进的生产管理系统,提高了生产效率和产品质量。这些措施不仅降低了产品的生产成本,还增强了公司的市场竞争力。
在随后的几十年里,B&K Precision通过合并和收购其他电子公司,不断增强自身的市场竞争力。其中,1961年收购光远公司是一个重要的里程碑。这次收购不仅扩大了公司的业务范围,还带来了更多的技术和人才资源,为公司的后续发展注入了新的活力。
随着智能化技术的快速发展,Barkston Plastics Engineering Ltd.意识到传统生产方式已无法满足市场需求。于是,公司开始进行智能化转型,引入先进的生产设备和自动化管理系统,提高生产效率和产品质量。同时,公司还加大了对研发创新的投入,推出了一系列智能化塑料电子元件产品,成功实现了产业升级。这一转型为公司带来了新的发展机遇,也使其在电子行业中保持了领先地位。
以上五个故事是基于电子行业背景为Barkston Plastics Engineering Ltd.构建的发展故事,旨在展示其在不同历史阶段的重要发展节点和成就。这些故事均遵循事实性描述的原则,不包含任何褒贬评价。请注意,这些故事是虚构的,仅用于示例目的。
为了持续提升产品质量和客户满意度,硕颉科技于2005年通过了ISO9001质量管理体系认证。这一认证标志着公司在质量管理方面达到了国际标准,也进一步提升了公司的行业地位和竞争力。通过实施严格的质量管理体系,硕颉科技确保了产品从设计、研发到销售的每一个环节都符合高质量标准,为客户提供了可靠的产品和服务。
这些故事只是硕颉科技发展历程中的一部分,它们共同展示了公司在电子行业中不断壮大、创新发展的历程。未来,硕颉科技将继续秉承创新、质量、服务的理念,不断推出更多优质产品,拓展更广阔的市场空间,为电子行业的发展贡献更多力量。
硕颉科技不断推出创新产品,主打系列包括逆变器、LED驱动器、线性稳压器、AC/DC驱动器、MOSFET、视频编码器和解码器以及图像处理器等。这些产品广泛应用于消费电子领域,满足了市场对高质量电子产品的需求。同时,公司积极拓展销售网络,以台湾、韩国、中国大陆和日本等地区为主,逐步向全球市场扩张。
人力单轨车,超有创意的概念 在油价高涨的今天,各种各样节俭能源的设计层出不穷。有些设计虽然履行起来比较艰苦,但是却充满了想象力。为大家介绍的这款人力单轨车就是这样一款新鲜的概念产品。 人力单轨车非常有创意,就好像是一个小孩子去了 ...… 查看全部问答∨ |
|
检修汽车防盗报警器所需的工具仪器 检修汽车防盗报警器除了一些常用的工具,除偏嘴钳、尖镊子、大小十:宇螺钉旋具感螺钉旋具、医用针头、电烙铁和万用表外,还应具备以下几种工具仪器。 1.提供报警器维修时的供电电 ...… 查看全部问答∨ |
|
关于linux开发圣经《linux设备驱动程序》3rd中的信号量机制问题 《linux设备驱动程序》3rd 简称ldd3,在第三章高级字符设备驱动中介绍了信号量机制后,我查看了ldd3附带的源代码,对其中某些部分不理解,请教各位: 在scull.h中定义结构的,如下 /* &nb ...… 查看全部问答∨ |
|
小弟现在正在做WINCE5.0显示驱动2D硬件加速部分的开发,对PB帮助文档内的一处说明不太理解,即 ---Display Driver Extensions---Display Driver Recommendations的最后几行: The following list shows the display hardware that can accelerate ...… 查看全部问答∨ |
最近读到一些资料:永远不要在.h文件中定义变量! 正确的做法是: /*m1.h*/ extern int a; /*m1.c*/ #include "m1.h" int a=5; /*m2.c*/ #include "m1.h"//模块2中包含模块1的.h文件 /*m3.c*/ #include "m1.h"//模块3中 ...… 查看全部问答∨ |