📄 viic.htm
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0048)http://www.21ic.com/info/images/dpj/2001-201.htm -->
<HTML><HEAD><TITLE>一种采用曼码调制的非接触IC卡读写程序编制-单片机与嵌入式系统应用</TITLE>
<META content="text/html; charset=gb2312" http-equiv=Content-Type><LINK
href="VIIC.files/home.css" rel=stylesheet>
<STYLE type=text/css></STYLE>
<META content="MSHTML 5.00.2614.3500" name=GENERATOR></HEAD>
<BODY bgColor=white leftMargin=0 text=black topMargin=10 marginwidth="0"
marginheight="10">
<DIV align=center>
<CENTER>
<TABLE border=0 borderColor=#111111 cellSpacing=1 id=AutoNumber1
style="BORDER-COLLAPSE: collapse" width=750>
<TBODY>
<TR>
<TD width="18%"><IMG border=0 height=60 src="VIIC.files/21ic.gif"
width=158></TD>
<TD width="65%">
<SCRIPT language=javascript src="VIIC.files/ads.htm"></SCRIPT>
</TD>
<TD width="17%">
<OBJECT classid=clsid:D27CDB6E-AE6D-11cf-96B8-444553540000
codeBase=http://active.macromedia.com/flash2/cabs/swflash.cab#version=4,0,0,0
height=54 id=sho02 width=80><PARAM NAME="movie" VALUE="images/sho02.swf"><PARAM NAME="menu" VALUE="false"><PARAM NAME="quality" VALUE="high"><PARAM NAME="bgcolor" VALUE="#FFFFFF">
<EMBED src="images/sho02.swf" quality=high bgcolor=#FFFFFF
menu=false WIDTH=80 HEIGHT=54 TYPE="application/x-shockwave-flash"
PLUGINSPAGE="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash">
</EMBED></OBJECT></TD></TR></TBODY></TABLE></CENTER></DIV>
<CENTER>
<TABLE border=0 cellSpacing=0 width=750>
<TBODY>
<TR>
<TD height=0></TD></TR>
<TR>
<TD height=523>
<TABLE align=center border=0 cellPadding=0 cellSpacing=0 height=150
width=750>
<TBODY>
<TR>
<TD bgColor=#dfefff class=normal height=646 rowSpan=4 vAlign=top
width=150>
<DIV align=center></DIV>
<DIV align=center>
<TABLE align=center border=0 cellSpacing=0 width="100%">
<TBODY>
<TR bgColor=#5593dd>
<TD height=20 width=150>
<DIV align=center></DIV></TD></TR>
<TR>
<TD height=20> </TD></TR></TBODY></TABLE>
<P> </P></DIV></TD>
<TD height=646 rowSpan=4 vAlign=top width=2> </TD>
<TD bgColor=#333399 height=646 rowSpan=4 vAlign=top width=1><IMG
height=1 src="VIIC.files/blank.gif" width=1></TD>
<TD height=646 rowSpan=4 vAlign=top width=5></TD>
<TD class=normal height=646 rowSpan=4 vAlign=top width=597>
<DIV align=center>
<TABLE border=0 cellPadding=0 cellSpacing=0 height=100
width="100%"><TBODY>
<TR bgColor=#cccccc vAlign=bottom>
<TD height=12>
<DIV align=center>
<DIV align=center><B><BR>按平台模式设计的虚拟I2C总线软件包VIIC
</B></DIV></DIV>
<DIV align=center><BR><B>作者:</B>北京航空航天大学 何立民 </DIV></TD></TR>
<TR bgColor=#fdffff>
<TD background=VIIC.files/linebg.gif height=395>
<P
align=left><B><BR>摘要:</B>VIIC是主方式下的虚拟I2C总线软件包,用于80C51系列单片机的单主系统中。只需两根普通I/O口线就可随时扩展I2C总线外围器件。将VIIC1.0装入程序存储器中,对其中的符号单元赋值后,使用三条通用操作命令就可实现任何I2C总线外围器件的应用程序设计。本文以VIIC为例,介绍应用软件形式的广义平台设计方法,给出VIIC1.0程序文本。按照这一思路,也可移植到其他系列的嵌入式系统中。
</P>
<P align=left><B>关键词:</B>平台模式虚拟I2C总线VIIC应用程序设计</P>
<P align=left>一、 I2C总线及其虚拟应用<BR><B>1. I2C总线应用呼唤平台模式
<BR></B> 目前,单片机应用系统的外围扩展已从并行方式为主过渡到以串行方式为主的时代。许多新型外围器件都带有串行扩展接口。通常的串行扩展接口和串行扩展总线有UART的移位寄存器方式、MOTOROLA公司的SPI、NS公司的Microwire、Dallas公司的1\|Wire和Philips公司的I2C总线等。其中,I2C总线提供了较完善的总线协议、最简单的串行连接方式,并提供了总线操作的状态处理软件包,因而得到了广泛的应用。但厂家并未提供完善的平台模式应用软件包。因此,用户在扩展I2C总线外围器件时,还要在了解I2C总线协议、操作原理的基础上,采用直接方式进行I2C总线外围器件的应用程序设计。迄今为止,许多期刊的文章中还是以这种方式来介绍I2C总线的扩展应用。由于I2C总线协议的复杂性和操作管理的特殊性,从I2C总线结构原理到I2C总线应用的直接设计方式难度较大,使I2C总线推广应用较慢。因此,迫切呼唤推出I2C总线的应用软件平台,使人们不必了解I2C总线就能设计I2C总线应用程序。<BR> <B>2.
广泛使用的主工作方式</B>
<BR> I2C总线是1个十分完善的多主系统总线,总线上可以挂接多个MCU,因此有4种工作方式,即主发送、主接收、从发送、从接收。但实际的单片机应用系统绝大多数都是单个MCU系统,只用到I2C总线的主方式,即主发送与主接收。
<BR><B> 3. 虚拟I2C总线的广泛需求</B>
<BR> 目前,有许多外围器件带有I2C总线接口,然而,带有I2C总线接口的MCU只有少数厂家的个别型号,致使I2C总线难以推广。因此,人们便使用MCU通用的I/O口来虚拟I2C总线接口。早期东芝公司在彩电中就在自己的MCU中虚拟I2C总线接口,实现I2C总线外围器件扩展的虚拟应用。
<BR>采用虚拟I2C总线后,任何1个厂家的单片机都可以无障碍地使用I2C总线外围器件。同样,虚拟I2C总线的应用也呼唤平台模式。</P>
<P align=left><B>二、 VIIC1.0软件包设计</B></P>
<P
align=left> VIIC1.0是物化形式为软件包文档的广义平台,适合在80C51单片机系列单主系统中应用。<BR> 按照广义平台设计内容,VIIC有最佳包容性设计、后归一化设计、前归一化设计、物化设计和应用界面设计。
<BR><B>1. 最佳包容性设计</B>
<BR> 最佳包容性设计是广义平台适用范围的最佳选择性设计。完整的I2C总线有4种操作方式,并且有指定的端口,有地址寄存器(S1ADR)来设定MCU的地址。在VIIC的包容性设计中规定为主方式下的通用I/O口虚拟。规定为主方式后,避免了多主方式下极大难度的总线冲突仲裁处理程序设计,又保证了能满足绝大多数I2C总线扩展应用。采用通用I/O口的虚拟,使用户可随意规定虚拟I2C总线端口,扩大了虚拟I2C总线应用的灵活性。
<BR><B>2. 后归一化设计</B>
<BR> 后归一化设计是确定应用范围的相关设计。VIIC的后归一化设计有:
<BR>(1) 应用范围指定为带I2C总线的外围器件扩展; <BR>(2)
所有I2C总线外围器件的操作方式归一化为外围器件N个字节的读写操作; <BR>(3)
总线节点通信方式归一化为SLAW/SLAR节点寻址后的点对点的读写操作。 <BR><B>3. 前归一化设计</B>
<BR>前归一化设计是从I2C总线协议原理、操作方式、时序规则出发,实现后归一要求的设计。VIIC的前归一化设计有:
<BR>(1)
时序的指令模拟即模拟I2C总线操作时序。I2C总线操作的典型时序信号有起始位(STAR)、停止位(STOP)、发送应答位(MACK)、发送非应答位(MNACK)。
<BR>(2)
数据传送操作虚拟即模拟I2C数据传送过程。例如,应答位检查(CACK)、发送1个字节数据(WRBYT)、接收1个字节数据(RDBYT)。
<BR>(3) 外围器件读写操作虚拟。要求虚拟1个I2C总线读写操作过程(RDNBYT、WRNBYT)。 <BR><B>4.
VIIC1.0的结构设计</B> <BR>(1) VIIC1.0的组成。
根据归一化设计,主方式下虚拟I2C总线由下列9个子程序组成: · 时序模拟子程序STAR,STOP,MACK,MNACK;
· 操作模拟子程序CACK,WRBYT,RDBYT; · 数据读写子程序RDNBYT,WRNBYT。
由于篇幅所限,本文中省略了VIIC1.0软件包中这9个子程序的虚拟设计方法。需要详细了解的读者可参看文尾参考资料2中7.3节“I2C总线的串行扩展技术”的有关部分。
<BR>(2) 软件包的出口界面
软件包VIIC实现非介入性操作,出口界面是软件包应用时惟一的触及面。VIIC1.0中的出口界面为数据读写子程序
RDNBYT/WRNBYT。 <BR>(3) 软件包的符号单元
VIIC中的符号标记有发送数据缓冲区MTD、接收数据缓冲区MRD、传送字节数存放单元NUMBYT以及寻址字节SLAW/SLAR存放单元SLA。这些符号单元都采用了标准I2C总线状态处理软件包中规定的字符标记。
<BR><B>5. 应用界面设计</B>
<BR>VIIC1.0软件包规定了读写子程序RDNBYT/WRNBYT的惟一出口界面,因此RDNBYT/WRNBYT的调用操作命令,以及满足调用操作的初始化操作的三条命令为VIIC的应用界面,即:
<BR>MOV SLA,#SLAR/SLAW ;总线上节点寻址并确定传送方向<BR>MOV NUMBYT,#N
;确定传送字节数N<BR>LCALL RDNBYT/WRNBYT ;读/写操作调用<BR>三、 VIIC1.0软件包清单
<BR>VIIC1.0软件包清单如下。 <BR>①STAR:SETB VSDA;启动I2C总线<BR>SETB
VSCL<BR>NOP<BR>NOP<BR>CLR VSDA<BR>NOP<BR>NOP<BR>CLR
VSCL<BR>RET <BR>②STOP: CLR VSDA ;停止I2C总线数据传送<BR>SETB
VSCL<BR>NOP<BR>NOP<BR>SETB VSDA<BR>NOP<BR>NOP<BR>CLR
VSDA<BR>CLR VSCL<BR>RET<BR>③MACK: CLR VSDA ;发送应答位<BR>SETB
VSCL<BR>NOP<BR>NOP<BR>CLR VSCL<BR>SETB VSDA<BR>RET <BR>④MNACK:
SETB VSDA ;发送非应答位<BR>SETB VSCL<BR>NOP<BR>NOP<BR>CLR
VSCL<BR>CLR VSDA<BR>RET <BR>⑤CACK: SETB VSDA ;应答位检查<BR>SETB
VSCL<BR>CLR F0<BR>MOV C,VSDA<BR>JNC CEND<BR>SETB F0 CEND: CLR
VSCL<BR>RET <BR>⑥WRBYT: MOV R0,#08H ;向VSDA线上发送1个数 ;据字节 WLP:
RLC A<BR>JC WR1<BR>AJMP WR0 WLP1: DJNZ R0,WLP<BR>RET WR1: SETB
VSDA<BR>SETB VSCL<BR>NOP<BR>NOP<BR>CLR VSCL<BR>CLR
VSDA<BR>AJMP WLP1 WR0: CLR VSDA<BR>SETB
VSCL<BR>NOP<BR>NOP<BR>CLR VSCL<BR>AJMP WLP1 <BR>⑦RDBYT: MOV
R0,#08H ;从VSDA线上读取1个数 ;据字节 RLP: SETB VSDA<BR>SETB VSCL<BR>MOV
C,VSDA<BR>MOV A,R2<BR>RLC A<BR>MOV R2,A<BR>CLR VSCL<BR>DJNZ
R0,RLP<BR>RET <BR>⑧WRNBYT: MOV R3,NUMBYT ;虚拟I2C总线发送N个
;字节数据<BR>LCALL STA<BR>MOV A,SLA<BR>LCALL WRBYT<BR>LCALL
CACK<BR>JB F0,WRNBYT<BR>MOV R1,#MTD WRDA: MOV A,@R1<BR>LCALL
WRBYT<BR>LCALL CACK<BR>JB F0,WRNBYT<BR>INC R1<BR>DJNZ
R3,WRDA<BR>LCALL STOP<BR>RET ⑨RDNBYT: MOV R3, NUMBYT
;模拟I2C总线接收n个 ;字节数据<BR>LCALL STA<BR>MOV A,SLA<BR>LCALL
WRBYT<BR>LCALL CACK<BR>JB F0,RDNBTY RDN: MOV R1,#MRD RDN1:
LCALL RDBYT<BR>MOV @R1,A<BR>DJNZ R3,ACK<BR>LCALL
MNACK<BR>LCALL STOP<BR>RET ACK: LCALL MACK<BR>INC R1<BR>SJMP
RDN1<BR><B>四、 VIIC1.0应用指南</B> <BR><B>1. 适用范围</B>
<BR>VIIC1.0适用于80C51系列单主系统中I2C总线外围器件扩展的应用程序设计。由于时序模拟基于6MHz时钟设计,在高速时钟下,可适当增加时序模拟子程序中的空操作指令。
<BR><B>2. 资源占用</B> <BR>VIIC使用了R0,R1,R2,R3,F0,C等资源。 <BR><B>3.
符号单元</B> <BR>PVIIC中有许多符号标记,这些符号标记有:<BR>VSDA 虚拟I2C总线数据线;
<BR>VSCL虚拟I2C总线时钟线; <BR>SLA寻址字节存放单元;<BR>NUMBYT传送字节数存放单元;
<BR>MTD发送数据缓冲区; <BR>MRD接收数据缓冲区。 <BR><B>4. 归一化操作命令</B>
<BR>不论总线上扩展什么外围器件,都只须使用以下三条指令: <BR>MOV SLA,#SLAW/SLAR
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -