这里是 单片微型计算机原理及接口技术 的第九章知识点
STC单片机并行总线扩展
单片机的并行总线技术
- 单片机片内的数据存储器与程序存储器的容量不能满足需要的情况下,需要进行存储器的容量扩展。
- 当单片机的I/O口数量或者功能不能满足系统要求时,需要进行I/O口的扩展
- 单片机扩展分为并行扩展和串行扩展,本章介绍并行扩展的基本方法
- 单片机并行扩展的关键是构建系统总线
- 单片机系统中,为简化组成结构,把具有共性的连线归并成一组公共连线,称为总线(BUS)
- 专门用于数据传输的连线:数据总线(Data Bus,DB)
- 专门用于地址传输的连线:地址总线(Address Bus,AB)
- 专门用于实施控制的连线:控制总线(Control Bus,CB)
- 51单片机属于总线型结构,片内各功能部件都是按总线关系设计并集成为整体的。这些总线称为片内总线。
- 总线结构是影响计算机性能的关键部件
51单片机有两种外设连接方式:
- I/O方式——采用片内RAM指令访问外设
例如 MOV P0 , A (片内地址80H,90H,A0H,B0H) - 总线方式——采用片外RAM指令访问外设
例如 MOVX @DPTR ,A(片外RAM 0~0FFFFH)
1.P0口作为低8位地址/数据总线
受引脚数目限制,P0口既用作低8位地址总线,又用作数据总线(分时复用),因此需增加一个8位地址锁存器。
单片机访问外部扩展的存储器单元或I/O接口寄存器时,先发出低8位地址送地址锁存器锁存,锁存器输出作为系统的低8位地址(A7~ A0)。随后,P0口又作为数据总线口(D7~ D0)
2.P2口的口线作为高位地址线
P2口用作系统的高8位地址线,再加上地址锁存器提供的低8位地址,便形成了系统完整的16位地址总线。
3.控制信号线
除地址线和数据线外,还要有系统的控制总线。这些信号有的就是单片机引脚的第一功能信号,有的则是P3口第二功能信号。常规的51系列单片机包括:
(1)PSEN作为外扩程序存储器的读选通控制信号。
(2)RD和WR为外扩数据存储器和I/O的读、写选通控制信号。
(3)ALE作为P0口发出的低8位地址锁存控制信号。
(4)EA为片内、片外程序存储器的选择控制信号。
STC15系列单片机内部集成可达64K的程序存储器,因此外部程序存储器扩展可以不用考虑。仅需考虑外部RAM和I/O扩展即可。其控制总线只保留了 三个控制信号 P45(ALE), P44(!RD),P42(!WD)
锁存器——74HC373,74LS573
结构:带有三态输出门的八-D触发器
原理:当/OE端为低电平,LE端为高电平时,1D-8D端的数据可由1Q-8Q端锁存输出; LE为低电平时D端与Q端隔离。
时序关系:
一个读写周期分为5个读写时段,每个时段时长可以由特殊功能寄存器BUSSPEED设定为1,2, 4, 8个时钟周期
读周期:
在第一个时段,P2口送高8位地址,P0口送低8位地址,ALE高电平,P0被锁存到地址总线;
第二时段,地址保持,ALE拉低,锁存器和P0口隔离;
第三个时段末,读信号P44拉低,开始读取数据;
第四、第五个时段,数据保持,等待数据读取完毕写周期:
在第一个时段,P2口送高8位地址,P0口送第8位地址,ALE高电平,P0被锁存到地址总线;
第二时段,地址保持,ALE拉低,锁存器和P0口隔离;
第三个时段末,数据送P0口;
第四个时段,写信号P42拉低,数据写入外部RAM
第五个时段,写信号P42拉高无效,数据保持
特殊功能寄存器
存取时间:
访问片内xram
地址分配
单片机通过地址总线发出地址,可以选择某一外部存储器单元并对其进行读入或写出操作。要保证正确完成这种功能,需要经过两种选择:一是必须选择该存储器芯片或I/O接口芯片,这称为片选;二是必须选择该芯片的某一存储单元,称为字选。
高位片选地址加上字选单元地址,构成一个地址。
地址分配———对存储器芯片的片选
◆线选:P2口的一根高位地址线接到扩展芯片片选端。
◆地址译码:
低位地址线作为芯片的字选,用于确定片内地址;
译码器对高位地址线译码,进行片选线。
根据高位地址线是全部还是部分参与译码,地址译码分为:
①全译码方式 ②部分译码方式
线选法扩展外部数据存储器电路图
用线选可扩展3片6264,对应的存储器空间见下表。
译码法扩展外部数据存储器电路图
用译码法扩展外部数据存储器的接口电路如数据存储器
典型总线方式接口电路
接线关系:
/OE→地,LE→正脉冲源,D0~D7→P0,Q0~Q7→外设地址端
P0口此时无需上拉电阻(总线方式)
外部RAM测试程序:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38/************* 功能说明 **************
测试外挂的32K xdata程序。
测试方式:
1: 写入0x55, 并读出判断是否全部是0x55.
2: 写入0xaa, 并读出判断是否全部是0xaa.
#include "STC15Fxxxx.H"
/************* 本地常量声明 **************/
#define XDATA_LENTH 32768 //xdata长度
u8 TestXRAM(void);
void Xdata_Test(void);
void main(void)
{ GPIO(); //初始化端口
BUS_SPEED_1T(); // BUS_SPEED = 0 ,1T ExternalRAM_enable();
// AUXR.1= 1,允许外部XRAM,禁止使用内部1024RAM
InternalRAM_enable();
// AUXR.1=0,禁止外部XRAM,允许使用内部1024RAM
while(1)
{if (!key) //按键启动测试
{Test-XRAM(); //单字节命令
}
。。。。
}
}
/************* 测试xdata函数 *****************/
u8 TestXRAM(void)
{ u16 ptc;
u8 xdata *ptx;
for(ptx=0; ptx<XDATA_LENTH; ptx++)
*ptx = 0x55; //测试是否有位短路
for(ptx=0; ptx<XDATA_LENTH; ptx++)
if(*ptx != 0x55) return 1; //测试0x55错误
for(ptx=0; ptx<XDATA_LENTH; ptx++)
*ptx = 0xaa; //测试是否有位短路
for(ptx=0; ptx<XDATA_LENTH; ptx++)
if(*ptx != 0xaa) return 2; //测试0xaa错误
return 0;
}