一种改进的51单片机大容量数据存储器的系统扩展
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一种改进的51单片机大容量数据存储器的系统扩展
MCS-51单片机系统扩展时,一般使用P0口作为地址低8位(与数据口分时复用),而P2
口作为地址高8位,它共有16根地址总线,最大寻址空间为64KB。
在以往的扩展大容量数
据存储器的设计中,一般是用单片机的IO口直接控制大容量数据存储器的片选信号来实现,但是这种设计在运行以C51编写的程序往往会出现系统程序跑飞的问题,尤其是在程序访问
大容量数据存储器的同时系统产生异常,由于此时由IO口控制的片选使FLASH被选中而SRAM无法被选中,堆栈处理和函数参数的传递无法实现从而导致程序跑飞的现象。
该系统MCU采用89C52,译码逻辑的实现使用了一片EPM7128 CPLD芯片,系统扩展了一片128K的SRAM,一片4M字节的NOR FLASH,以上芯片均为5V供电。
2 系统的硬件组成
2.1系统的硬件组成
W241024A是128K×8位的静态RAM,共需17根地址线,其A0~A7接经CPLD锁存输出的
A0~A7,A8~A14接89C52的A8~A14,A15、A16分别接CPLD输出的SRAM_A15、SRAM_A16;
M29F032D是4M×8位的NOR型FLASH,共需22根地址线。
A0~A14的接法与W241024A的
相同,A15~A21接经CPLD锁存输出的AL15~AL21;所有数据存储器的读写控制线与MCU相
应的读写控制线相连。
SRAM和FLASH的片选信号由CPLD内部译码产生:/CS_SRAM接SRAM的片选,/CS_FLASH接FLASH的片选。
2.2 CPLD的功能实现
使用CPLD器件可以提高系统设计的灵活性,并且可以简化电路设计,节省很多常规电路中
的接口器件和I/O口线。
系统将单片机的地址线、各种控制和状态信号均引入CPLD,实现系
统的地址译码和部分I/O控制。
系统中CPLD采用的是MAX7000系列的EPM7128STC100-10。
AL15~AL22为系统锁存出来的高8位地址,该地址锁存器的地址为:0x7F00;状态缓冲器地
址为:0x7F20,通过状态缓冲器可以读取FLASH的当前状态,判断FLASH当前状态是忙还是
空闲,如果应用系统中还有其它状态信号可以接至该状态缓冲器的输入端。
/CS2~/CS7可以
用作其他器件的片选。
128K的SRAM被SRAM_A15和SRAM_A16分成4个BANK,每个BANK均为32K,其中
BANK0地址范围是:0x0000~0x7EFF,当A15为0时BANK0被选中,BANK0可用来存储用户
定义的各种变量,以LARGE方式编译的C51用户函数的参数传递也在该区实现,只要设置
C51编译器的片外SRAM的大小为0x7F00字节 (32K-256字节),起止地址为:0x0000。
这样
当系统在访问外部大容量数据存储器(如4M的FLASH)并且系统产生中断时,由于系统在
函数调用时自动使A15为0,故此时BANK0是可用的,这样保证了系统在这种情况下能稳定
的运行。
由于访问BANK1~BANK3时A15必须为1,故BANK1~BANK3的地址范围均为:0x8000~
0xFEFF,通过SRAM_A15和SRAM_A16来区分它们是属于哪个BANK的,访问BANK1~BANK3
的前提是AL22为0。
BANK1~BANK3可用来存储用户数据。
当AL22和A15均为1时4M的FLASH被选中,FLASH被AL15~AL21分成了128页,每页为32K。
下面介绍访问大容量数据存储器的软件实现。
3 软件处理方法
如用KEIL编译C51程序时,首先设置项目的编译模式为LARGE模式,并设置片外XRAM的
相关参数为:START:0x0000,SIZE:0x7F00。
访问BANK0时无需编写子程序,系统可以直接访问。
访问SRAM的BANK1~BANK3步骤为:①锁存高8位地址使AL22为0,设置BANK值(要访问SRAM的绝对物理地址除于32K,商为BANK值,余数为BANK内的偏移地址)②
在0x8000~0xFEFF地址范围内操作SRAM(A15=1)。
Write_Sram_Bank123函数的功能为写一个字节数据至片外SRAM的BANK1~BANK3,Read_Sram_Bank123函数的功能是从SRAM的BANK1~BANK3读一个字节数据。
相关C51示例代码如下:
void Write_Sram_Bank123(unsigned long address,unsigned char val)
{
unsigned char bank;unsigned int addr_bank;
bank = address / 0x8000;
if ((bank > = 1 ) && (bank <= 3))
{
addr_bank = address % 0x8000;
XBYTE [0x7f00] = bank;//AL22=0,设置BANK值。
XBYTE[0x8000+addr_bank] = val;
}
}
Unsigned char Read_Sram_Bank123(unsigned long address)
{
unsigned char bank;unsigned int addr_bank;
bank = address / 0x8000;
if ((bank > = 1 ) && (bank <= 3))
{
addr_bank = address % 0x8000;
XBYTE [0x7f00] = bank;
return XBYTE[0x8000+ addr_bank]; }
else return 0xff;
}
访问FLASH的步骤如下:①锁存高8位地址使AL22为1,同时设置要访问的7位页码值(要访问FLASH的绝对物理地址除于32K,商为页码值,余数为页内的偏移地址)② 在
0x8000~0xFEFF地址范围内操作FLASH(A15=1)。
Write_Flash函数实现了往4M FLASH写一个字节的功能;Read_Flash函数的功能是在FLASH里读取一个字节内容。
相关C51示例代码如下:
void Write_Flash(unsigned long address,unsigned char val)
{
unsigned char data page,unsigned int data addr_page;
page = address / 0x8000;
addr_page = address % 0x8000;
XBYTE [0x7f00] = 0x80 + page;
XBYTE[0x8000+addr_page] = val;
}
unsigned char Read_Flash(unsigned long address)
{
unsigned char data page,unsigned int data addr_page;
page = address / 0x8000;
addr_page = address % 0x8000;
XBYTE [0x7f00] = 0x80 + page;
return XBYTE[0x8000+addr_page];
}
4 结束语
由于采集图像时需要64K以上的RAM空间,并且当GPRS传输通道出现故障时需要把大量的图像信息暂存于FLASH中,因此,采用了上述硬件设计方法及软件处理方法,实践证明基于这种方法扩展大容量数据存储器的单片机应用系统具有对数据存储器操作简便、系统运行稳定的特点,解决了系统在访问大容量数据存储器并且产生异常时程序跑飞的问题。