machao 发表于 2004-12-29 01:12:40

AVR外部并行接口器件(外扩总线)扩展应用参考(选自《M128》上)

5.5 外部并行接口器件扩展

    ATmega128片内的RAM有4K字节,这在8位单片机中算佼佼者。因此,设计一般的应用系统,应尽量不采用外部扩展并行器件的设计。这样不仅方便PCB板的设计,减少PCB板的面积,同时也提高了系统的抗干扰性。

    对于必须采用外部并行器件扩展的设计,ATmega128的PORTA(低8位地址线和8位数据线复用)、PORAC(高8位地址线)口提供了并行扩展接口。尽管并行接口的基本使用原理同一般的单片机相同,但由于ATmega128的结构上的特点,以及其使用了增强型的并行接口,因此在使用并行扩展接口时还需要仔细的设计。其主要特性有:

*外部并行扩展的地址从0x1100开始;

*使用外部并行扩展时,应将MCUCR寄存器中的SRE位置“1”,允许外部并行扩展;

*可将PORTC口高位不用的地址线释放,作为普通的I/O口使用;

*可设置对不同区域采用不同的读写操作时序(加等待),用于配合扩展使用不同时序操作的外部并行器件。



5.5.1 外部扩展RAM存储器的设计

    图5.6给出一个外部扩展32K的RAM(6264)的译码参考电路。

http://cache.amobbs.com/bbs_upload782111/files_1/armok0122722.jpg



    图中使用了一片74HC138和与门,与门的输出作为6264的片选信号,其地址空间为0x0000 –0x8FFF。74HC138其它7个引脚输出用于在地址大于0x9000以上空间扩展其它更多的并行接口器件,每根线选通的地址空间为4K。

    由于ATmega128的RAM空间前4352个字节分配给芯片内部的通用寄存器、I/O寄存器和4K字节的内部SRAM,所以外部并行扩展器件的起始地址是从0x1100开始的(见第二章内容)。当MCU在对0X0000-0X10FF范围的SRAM地址空间操作时,实际是对芯片内部的SRAM或寄存器操作,尽管会影响地址总线、数据总线和ALE,但此时 和 不受影响,因此对相应的处在这段地址范围的外部扩展的存储器没有影响。在图5.6的设计中,实际上已经把6264中地址范围在0x0000-0x0FFF的一段存储单元“移”到ATmega128的RAM地址空间高端0x8000-0x8FFF处。当用户程序对0x8000-0x8FFF寻址操作时,实际是对外部存储器RAM芯片6264的0x0000-0x0FFF操作,即将外部RAM芯片的前4K个单元“移” 到ATmega128的32K地址空间后面了,因此系统总共有36KB可以使用的线形连续RAM。

    当外部扩展RAM的起始地址是从0x1100开始的,即与内部RAM空间连续时,使用ICCAVR或CVAVR编写系统程序前,建议先使用程序生成器来生成一个使用外部扩展RAM的初始化程序作为参考。在程序生成器生成的初始化程序中,会将MCUCR寄存器中的SRE位置“1”(允许使用外部并行接口),还能帮助你正确的选择和设定并产生对不同区域使用不同操作时序的设置语句,以及如何将变量定义在特定的地址空间等。此外,在编译程序前,还要正确设置芯片的编译选项,告诉编译器使用外部RAM,以及大小等,这样编译器会自动的将变量分配到外部RAM空间。



5.5.2 外部扩展并行I/O接口设计

    图5.7给出一个简单的外部扩展32位数字输入接口的参考电路。ATmega128外部并行扩展4片74HC373芯片(图中只画出1片),每选通一片74HC373,读入8位数字信号。

http://cache.amobbs.com/bbs_upload782111/files_1/armok0122723.jpg

    4片74HC373的选通信号由一片74HC00产生,选通地址分别为:0x2100、0x2200、0x2400、0x2800(或0x3100、0x3200、0x3400、0x3800)。注意,系统没有扩展外部的RAM,因此地址空间0x0000-0x10FF为片内SRAM,而空间范围在0x1100-0x20FF的一段为空地址,4个74HC373的选通地址也是不连续的。在这个设计中,ATmega128的高位地址线A6、A7没有使用,可以释放作为普通的I/O线使用。

    下面是在ICCAVR环境下的应用例程。

#define ext_PORT1 (*(volatile unsigned char *)0x2100)

#define ext_PORT2 (*(volatile unsigned char *)0x2200)

#define ext_PORT3 (*(volatile unsigned char *)0x2400)

#define ext_PORT4 (*(volatile unsigned char *)0x2800)



void main(void)

{

    unsigned char DATA;

    MCUCR = 0x80;                // 允许外部并行扩展接口

    XMCRA = 0x00;         // external memory

    XMCRB = 0x02;                // 释放PC7,PC6,作为通用I/O引脚使用

    DDRC= 0xff;                // PC7,PC6用于输出,(不影响PC0-PC5地址线)

    PORTC = 0x00;                // PC7,PC6输出0,(不影响PC0-PC5地址线)



    DATA = ext_PORT1;                //读取外部抗战接口1的数据到变量DATA中

    If (ext_PORT3) PORTC |= 0x80;                //外部接口3不为0时,PC7输出1

        ………

}



    程序中的4句#define使用了ICCAVR的强制指针变量的方式,在RAM绝对地址空间0x2100、0x2200、0x24000、x2800处定义了变量ext_PORT1~extPORT4,在程序中就可以方便的使用这4个变量对外部4个扩展口操作了。由于没有用到高位地址线PC7、PC6寻址和译码,程序中将起释放,作为普通的I/O口使用,也充分利用了ATmega128的特点。

    在这个设计中,由于实际上并没有外部的扩展RAM,所以在编译程序前,要注意正确设置芯片的编译选项,告诉编译器不使用外部RAM,防止编译器将其它的变量分配到外部RAM空间中。

    在CVAVR环境中,在RAM绝对地址空间0x2100、0x2200、0x24000、x2800处定义变量ext_PORT1~extPORT4应使用CVAVR的专用变量定义语句:

unsigned char ext_PORT1 @0x2100,ext_PORT1 @0x2100,ext_PORT1 @0x2100,ext_PORT1 @0x2100;

    在编译程序前,也要注意正确设置芯片的编译选项,告诉编译器不使用外部RAM,防止编译器将其它的变量分配到外部RAM空间中。


-----此内容被machao于2005-03-07,22:36:46编辑过

hotpower 发表于 2004-12-29 01:58:22

哈哈...阿莫败退了...



最后激活时间 登录名 中文名 派别 等级 主题数 回复数 基本分 总分

1 01:57:03 hotpower---- ------ 19 372 0 407

2 01:56:45 cock ---- ---- ------ 1 16 0 18

3 01:42:13 machao ---- ---- ------ 13 36 400 462

hotpower 发表于 2004-12-29 02:01:22

马老师此论主要讲技术...但实际肯定都会首选高速SPI或IIC接口的芯片...

hotpower 发表于 2004-12-29 02:02:30

下课了...AVR菜鸟最近又多长了几根"毛"...不知与听课是否有关????





最后激活时间 登录名 中文名 派别 等级 主题数 回复数 基本分 总分

1 02:01:52 hotpower---- ------ 19 374 0 409

2 01:58:30 cock ---- ---- ------ 1 16 0 18




-----此内容被hotpower于2004-12-29,02:04:43编辑过

hotpower 发表于 2004-12-29 02:16:38

又开课了...当马老师的学生真难呀...



最后激活时间 登录名 中文名 派别 等级 主题数 回复数 基本分 总分

1 02:15:48 hotpower---- ------ 19 376 0 411

2 02:04:19 machao ---- ---- ------ 13 37 400 463

hotpower 发表于 2004-12-29 02:23:05

这次让我"穿着衣服光着身"也不来了...



谢谢马老师的教诲...



最后激活时间 登录名 中文名 派别 等级 主题数 回复数 基本分 总分

1 02:21:02 hotpower---- ------ 19 378 0 413

armok 发表于 2004-12-29 02:29:25

呵呵,谁退了! 我仍在!



1 02:29:31 armok 阿莫 ---- ------ 347 2898 0 3517

2 02:23:13 hotpower---- ------ 19 379 0 414

machao 发表于 2004-12-29 02:31:03

不要太绝对,如果做10M网络接口,或使用CH375设计USB主机,则必须使用并行扩展,否则速度不够了。我是讲,尽量使用串行扩展,是针对传统的8051+138+573的模式,你看一下51的书就知道了。实际上针对一般的产品,使用AVR不必并行扩展。这也说明为什么AVR的许多芯片不支持并行扩展,他不是盲目的。51的RAM128个,AVR 1K!够了。AVR RAM的增多,带来硬件设计上的变化,为使用高级语言编写程序打下基础,以及程序的实现方式都需要改观。请看一下我对USART、I2C接口的编程思路。如果手头有《M128》,可看看第三章中我给出的汇编程序(实现一个时钟),都使用了缓存(BUFFER),使程序的功能化单一、结构好等。目前大部分单片机书中的程序设计,都没有体现出这种思想和方法。还是请仔细体会我在网上的一些技术帖子,对比51教课书上的例子,有无不同之处?

z_zt 发表于 2009-9-17 23:59:07

记号

AVR_DIY 发表于 2010-3-18 15:37:45

mark

1181zjf 发表于 2010-3-18 15:57:09

好老的帖子

AVR_DIY 发表于 2010-3-22 15:57:53

回复【楼主位】machao
                           5.5 外部并行接口器件扩展
    ATmega128片内的RAM有4K字节,这在8位单片机中算佼佼者。因此,设计一般的应用系统,应尽量不采用外部扩展并行器件的设计。这样不仅方便PCB板的设计,减少PCB板的面积,同时也提高了系统的抗干扰性。
    对于必须采用外部并行器件扩展的设计,ATmega128的PORTA(低8位地址线和8位数据线复用)、PORAC(高8位地址线)口提供了并行扩展接口。尽管并行接口的基本使用原理同一般的单片机相同,但由于ATmega128的结构上的特点,以及其使用了增强型的并行接口,因此在使用并行扩展接口时还需要仔细的设计。其主要特性有:
*外部并行扩展的地址从0x1100开始;
*使用外部并行扩展时,应将MCUCR寄存器中的SRE位置“1”,允许外部并行扩展;
*可将PORTC口......
-----------------------------------------------------------------------
马老师,我想问一下,如果外部扩展的是FLASH芯片,编译器该怎样设置呢?设置成不使用外部RAM吗?

machao 发表于 2010-3-22 20:21:40

楼上的,学过微机原理和数字逻辑电路等专业的基础课程吗?

你指的FLASH芯片是什么接口的?串口当然不用外部扩展RAM的功能,如果是并行总线方式的接口(8080模式),还是要采用扩展RAM方式的。

wo_didiao 发表于 2010-3-22 22:55:57

驱动高速并口彩屏这个是最佳方案!嘿嘿!

AVR_DIY 发表于 2010-3-23 11:12:51

回复【12楼】machao
楼上的,学过微机原理和数字逻辑电路等专业的基础课程吗?
你指的FLASH芯片是什么接口的?串口当然不用外部扩展RAM的功能,如果是并行总线方式的接口(8080模式),还是要采用扩展RAM方式的。
-----------------------------------------------------------------------

谢谢马老师!
我用的是并行的FLASH编译器使用的是CVAVR,你说的"不使用外部RAM"是不是要在下图设置? 把外部SRAM设置为0?
http://cache.amobbs.com/bbs_upload782111/files_27/ourdev_540405.jpg
CVAVRmega128 设置截图 (原文件名:QQ截图未命名.jpg)

machao 发表于 2010-3-23 18:55:34

真的不懂什么是“并行的FLASH编译器”。

你到底要做什么?连基本的概念都说不清楚,怎么做事情?

你是想使用M128,外部再扩展一片FLASH存储芯片,用于固定长期保存数据吗?那么你的FLASH存储芯片是什么信号的?接口是什么类型的?

如果没有基础谁也帮不了你的。

AVR_DIY 发表于 2010-3-24 21:33:57

回复【15楼】machao
真的不懂什么是“并行的FLASH编译器”。
你到底要做什么?连基本的概念都说不清楚,怎么做事情?
你是想使用M128,外部再扩展一片FLASH存储芯片,用于固定长期保存数据吗?那么你的FLASH存储芯片是什么信号的?接口是什么类型的?
如果没有基础谁也帮不了你的。

-----------------------------------------------------------------------

马老师不要激动,“我用的是并行的FLASH,编译器使用的是CVAVR” 这句话打掉了一个逗号而已,不好意思!
我的问题已经解决了!不过还是谢谢你!
我想做的是 用 MEGA128扩展一片FLASH来存放数据。

machao 发表于 2010-3-24 23:39:03

解决就好。我想我在12楼已经正确的回答了你的问题。

那么你到底是设置成“不使用”还是“使用”外部RAM?如何在CVAVR中设置的?到底是少打了一个逗号,还是概念确实不清楚?

AVR_DIY 发表于 2010-3-25 09:40:22

回复【17楼】machao
解决就好。我想我在12楼已经正确的回答了你的问题。
那么你到底是设置成“不使用”还是“使用”外部RAM?如何在CVAVR中设置的?到底是少打了一个逗号,还是概念确实不清楚?
-----------------------------------------------------------------------


其实在扩展外部并行FLASH的时候CVAVR编译器不需要设置的,只需要在程序中将允许外部扩展的寄存器使能一下就OK!开始我总以为要设置编译器。
确实是少打了一个逗号,呵呵,不好意思!

machao 发表于 2010-3-25 15:39:05

其实在扩展外部并行FLASH的时候CVAVR编译器不需要设置的,只需要在程序中将允许外部扩展的寄存器使能一下就OK!开始我总以为要设置编译器。

============================================================
并不是如此简单的。 CVAVR编译器还是需要设置的。首先14楼的表格中,外部SRAM设置为设计扩展的容量,这样编译器在分配内存变量时,才能正确把变量分配的外部的RAM中。

另外,如果你扩展使用的RAM速度比较慢,还必须根据实际情况选择和设置插入等待的时钟数。

建议你仔细查看手册,然后配合CVAVR的代码生成向导,生成一个系统代码框架,此时看看CVAVR的配置以及初始化代码如何。

AVR_DIY 发表于 2010-3-26 12:40:12

回复【19楼】machao
其实在扩展外部并行FLASH的时候CVAVR编译器不需要设置的,只需要在程序中将允许外部扩展的寄存器使能一下就OK!开始我总以为要设置编译器。
============================================================
并不是如此简单的。 CVAVR编译器还是需要设置的。首先14楼的表格中,外部SRAM设置为设计扩展的容量,这样编译器在分配内存变量时,才能正确把变量分配的外部的RAM中。
另外,如果你扩展使用的RAM速度比较慢,还必须根据实际情况选择和设置插入等待的时钟数。
建议你仔细查看手册,然后配合CVAVR的代码生成向导,生成一个系统代码框架,此时看看CVAVR的配置以及初始化代码如何。

-----------------------------------------------------------------------

马老师,我18楼说的指的是外部扩展并行FLASH时的情况。
外部扩展SRAM是需要设置编译器的。

machao 发表于 2010-3-26 16:42:54

我18楼说的指的是外部扩展并行FLASH时的情况。
外部扩展SRAM是需要设置编译器的。

你的“并行FLASH”是什么概念的接口?是采用读写RAM的8080模式(地址、数据、WR、RD)?还是其它的模式,需要用并行I/O口模拟?

概念要清楚,要说明白。我在12楼已经问你了,能明白吗?

AVR_DIY 发表于 2010-3-27 14:42:15

回复【21楼】machao
我18楼说的指的是外部扩展并行FLASH时的情况。
外部扩展SRAM是需要设置编译器的。
你的“并行FLASH”是什么概念的接口?是采用读写RAM的8080模式(地址、数据、WR、RD)?还是其它的模式,需要用并行I/O口模拟?
概念要清楚,要说明白。我在12楼已经问你了,能明白吗?
-----------------------------------------------------------------------

当然是总线方式的并行8080模式接口啊,128有外部总线 ,我还模拟干嘛?自己给自己添麻烦呵呵!

machao 发表于 2010-4-8 02:17:07

那我在19楼没说错。

需要使用M128的外部总线扩展功能,同时还需要对编译器进行设置。

hyghyg1234 发表于 2011-9-7 11:53:02

mark

79301110 发表于 2011-11-29 22:06:02

这个要看扩展

哇嘎 发表于 2012-4-26 15:58:00

标记。谢谢!
页: [1]
查看完整版本: AVR外部并行接口器件(外扩总线)扩展应用参考(选自《M128》上)