c语言sscanf函数的用法是什么
280
2022-11-28
用CPLD实现单片机与ISA总线并行通信
1 系统总体设计方案
本系统用CLPD实现单片机与PC104 ISA总线接口的并行通信。由于PC104主要完成其它方面的数据采集工作,只是在空闲时才能接收单片机送来的数据,所以要求双方通信的实时性很强,但数据量不是很大。因此,在系统设计中单片机中断方式接收数据,PC104采用查询方式接收数据。系统设计方案如图1所示。
2 基于MAX+plus II的硬件实现
本系统是用ALTERA公司的CPLD开发工具MAX+plusII。它支持多种输入方式,给设计开发提供了极大的方便。系统的主体部分仍是用原理图输入方式。由于库中提供了现在的芯片,所以使用很方便。原理图输入部分如图2和图3所示。图2主要完成单片机与ISA接口通信中的数据传输和握手判断。
D[0..7] 单片机的8位双向数据总线;
PCD[0..7] ISA接口的8位双向数据总线;
PCRD ISA接口的读有效信号;
PCWR ISA接口的写有效信号;
判断单片机已写数据或读走数据;
PCSTATE 单片机用此查询ISA接口已取走数据;
MSCRD 单片机的读有效信号;
MCSWR 单片机的写有效信号;
INT0 单片机的外部中断信号;
当PCWR信号有效后,PC104把数据锁存于74LS374(2)中,此时,INT0变为低电闰,单片机产生外部中断,使MCSRD信号有效,从数据锁存器74LS374(2)中取走装饰,INT0变为高电平。PC104用STATE信号选通74LS244判断数据位PCD1是否为高电平,如果为高电平,说明单片机取走了数据,可以发送下一个数据。 PC104与单片机进行通信,最关键的就是速度匹配问题。由于PC104的速度快,而单片机的速度较慢,所以,要在PC104的IOCHRDY处插入等待周期,如图3所示。
IOCHRDY 用来使ISA接口等待5个时钟周期;
DLY_D 延时输入信号;
DLY_CK 延时等待时钟信号;
DLY_CLR 等待清除信号,为开始下一次送数周期作准备;
DELAY 延时5个时钟周期后的输出信号,作为DLY_CLR信号的输入;
SYSCLK ISA接口的系统时钟信号。
在MCS51与PC104进行通信的过程中,DLY_D信号一直有效(高电平)。在信号SYSCLK的作用下,每5个时钟周期DELAY信号有效一次,即为高电平。此时DLY_CLR信号有效(低电平),IOCHRDY信号变为高电平,PC104可以读写数据。
(
PCA[9..0] : INPUT;
AEN,IOR,IOW : INPUT;
RESETDR,DELAY : INPUT;
A[15..14] :INPUT;
RD,WR : INPUT;
DLY_D : OUTPUT;
DLY_CK : OUTPUT;
DLY_CLR : OUTPUT;
STATE : OUTPUT;
PCRD : OUTPUT;
PCWR : OUTPUT;
MCURD : OUTPUT;
MCUWR : OUTPUT;
)
BEGIN
!DLY_CLR=RESETDR#DELAY;
DLY_D=!AEN & (PCA[9..1]= =H"110");
DLY_CK=!AEN & (PCA[9..1]= =H"110")&(!IOR # ! IOW);
!PCWR=!AEN&(PCA[9..0]= =H"220")& !IOW;
!PCRD=!AEN&(PCA[9..0]= =H"220")& !IOR;
!STATE=!AEN&(PCA[9..0]= =H"221")&!IOR;
!MCSRD=([15..14]= =H"1")& !RD;
!MCSWR=(A[15..14]= =H"2"& !WR;
END;
说明:PCA[9..0]是PC104的地址信号,A[15..14]是单片机的地址信号,PC104用到端口地址220H和221H。
3 通信软件设计
PC104是基于ISA总线的,在系统软件设计中要防止地址冲突。PC104中使用A0~A9地址位来表示I/O端口地址,即可有1024个口地址:前512个供系统板使用,后512个供扩充槽使用。当A9=0时表示为系统板上的口地址;A9=1时,表示扩充插槽接口卡上的口地址[2]。因此,采用保留的口地址220H和221H,保证不会发生地址冲突。
本程序中PC104采用查询方式接收数据,单片机用中断方式接收数据。
#define pcrdstate 0x221 /*PC104查询状态口地址*/
PC104写数据函数:
Void pcwrite(int port,unsigned char ch)
{ outportb(pcreadwrite,ch);
while ((inportb(pcrdstate)&0x02)!=0x02); /*等待单片机读走数据*/
{ }
}
单片机读子程序:
MCUWR:MOV DPTR,#4000H
MOVX A,@DPTR
PC104读数据函数:
Unsigned char pcread(int port)
{ while((inportb(pcrdstate)&0x01)!=0x01);/*等待单片机写数据*/
{}
return inportb(pcreadwrite);
}
单片机写子程序:
MCUWR:MOV DPTR,#8000H
MOVX @DPTR,A
;等待PC104读走数据
RET
4 结论
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~