按平台模式设计的虚拟I2C总线软件包VIIC
MOV SLA,#SLAR/SLAW ;总线上节点寻址并确定传送方向
MOV NUMBYT,#N ;确定传送字节数N
LCALL RDNBYT/WRNBYT ;读/写操作调用
三、VIIC1.0软件包清单
VIIC1.0软件包清单如下。
①STAR:SETB VSDA;启动I2C总线
SETB VSCL
NOP
NOP
CLR VSDA
NOP
NOP
CLR VSCL
RET
②STOP: CLR VSDA ;停止I2C总线数据传送
SETB VSCL
NOP
NOP
SETB VSDA
NOP
NOP
CLR VSDA
CLR VSCL
RET
③MACK: CLR VSDA ;发送应答位
SETB VSCL
NOP
NOP
CLR VSCL
SETB VSDA
RET
④MNACK: SETB VSDA ;发送非应答位
SETB VSCL
NOP
NOP
CLR VSCL
CLR VSDA
RET
⑤CACK: SETB VSDA ;应答位检查
SETB VSCL
CLR F0
MOV C,VSDA
JNC CEND
SETB F0 CEND: CLR VSCL
RET
⑥WRBYT: MOV R0,#08H ;向VSDA线上发送1个数 ;据字节 WLP: RLC A
JC WR1
AJMP WR0 WLP1: DJNZ R0,WLP
RET WR1: SETB VSDA
SETB VSCL
NOP
NOP
CLR VSCL
CLR VSDA
AJMP WLP1 WR0: CLR VSDA
SETB VSCL
NOP
NOP
CLR VSCL
AJMP WLP1
⑦RDBYT: MOV R0,#08H ;从VSDA线上读取1个数 ;据字节 RLP: SETB VSDA
SETB VSCL
MOV C,VSDA
MOV A,R2
RLC A
MOV R2,A
CLR VSCL
DJNZ R0,RLP
RET
⑧WRNBYT: MOV R3,NUMBYT ;虚拟I2C总线发送N个 ;字节数据
LCALL STA
MOV A,SLA
LCALL WRBYT
LCALL CACK
JB F0,WRNBYT
MOV R1,#MTD WRDA: MOV A,@R1
LCALL WRBYT
LCALL CACK
JB F0,WRNBYT
INC R1
DJNZ R3,WRDA
LCALL STOP
RET ⑨RDNBYT: MOV R3, NUMBYT ;模拟I2C总线接收n个 ;字节数据
LCALL STA
MOV A,SLA
LCALL WRBYT
LCALL CACK
JB F0,RDNBTY RDN: MOV R1,#MRD RDN1: LCALL RDBYT
MOV @R1,A
DJNZ R3,ACK
LCALL MNACK
LCALL STOP
RET ACK: LCALL MACK
INC R1
SJMP RDN1
四、VIIC1.0应用指南
1.适用范围
VIIC1.0适用于80C51系列单主系统中I2C总线外围器件扩展的应用程序设计。由于时序模拟基于6MHz时钟设计,在高速时钟下,可适当增加时序模拟子程序中的空操作指令。
2. 资源占用
VIIC使用了R0,R1,R2,R3,F0,C等资源。
3.符号单元
PVIIC中有许多符号标记,这些符号标记有:
VSDA 虚拟I2C总线数据线;
VSCL虚拟I2C总线时钟线;
SLA寻址字节存放单元;
NUMBYT传送字节数存放单元;
MTD发送数据缓冲区;
MRD接收数据缓冲区。
4.归一化操作命令
不论总线上扩展什么外围器件,都只须使用以下三条指令:
MOV SLA,#SLAW/SLAR
MOVNUMBYT,#N
LCALLWRNBYT/RDNBYT
5.VIIC的装载
由于WRNBYT/RDNBYT都使用长调用命令LCALL,故VIIC1.0可放在程序存储器的任意空间。 图1
6.通用的应用界面
VIIC1.0的应用界面如图1所示。与VIIC1.0有关的只是3条归一化操作命令;与硬件电路相关的是器件地址与引脚地址构成的寻址字节和由器件规定的数据操作格式。
javascript:window.open(this.src);" style="cursor:pointer;"/>
五、VIIC1.0应用示例
在本文参考文献2中给出了一些基于VIIC软件包的外围串行扩展应用实例。现就带I2C总线接口LED显示驱动器SAA1064扩展8位LED显示电路来示范VIIC1.0的应用。
1.硬件电路与寻址字节
用2片SAA1064扩展的8位LED显示电路如图2(b)所示,图2(a)为SAA的引脚排列图。设80C51用P1.1/P1.0来虚拟SDA/SCL口线。两片SAA1064的ADR引脚分别接地和VCC。SAA1064(1)、(2)的器件地址为0111,引脚地址为000和111,因此它们的寻址字节SLAW/SLAR分别为70H/71H和76H/77H。
2.显示原理与数据操作格式
在I2C总线外围器件的数据手册中,都给出了实现器件功能的数据操作格式,以及实现功能的控制命令与寄存器的管理模式。
(1) SAA1064的数据操作格式 80C51只须对SAA1064进行写操作,便实现了LED的显示驱动控制。SAA1064的写数据操作格式如下:
S | SLAW | A | SUBADR | A | COM | A | data1 | A | data2 | A | data3 | A | data | A | P |
只须对SAA1064中首地址为SUBADR的5个寄存器单元中依次写入控制命令COM和4个LED共阴极段码datal~data4,SAA1064的SUBADR=00H。
控制命令COM格式及位功能规定如下:
D7 D0
—— | C6 | C5 | C4 | C3 | C2 | C1 | C0 |
C0 静、动态显示选择。C0=1,动态显示。
C1 显示位1,3暗亮选择。C1=1,选择亮。
C2 显示位2,4暗亮选择。C2=1,选择亮。
C3 测试位。C3=1,所有段点亮。
C4,C5,C6 驱动电流控制位。C4,C5,C6为 “1”时,驱动电流分别为3mA,6mA,12mA;皆为1时输出驱动电流最大,达21mA。
3.应用程序设计
按下列步骤完成图2(b)的8位LED显示程序设计。
javascript:window.open(this.src);" style="cursor:pointer;"/>
(1) 将VIIC1.0装入程序存储器中。
(2) 根据硬件电路及资源分配,将VIIC1.0中的符号单元赋值如下:
VSDA EQU P1.1 ;用P1.1虚拟SDA
VSCL EQU P1.0 ;用P1.0虚拟SCL
SLA EQU 50H ;50H为寻址字节存放单元
NUMBYT EQU 51H ;51H为传送字节数据存放单元
MTD EQU 30H ;30H为发送缓冲区首地址
(3) 8位LED显示子程序设计
这里介绍1个在图2(b)LED显示器上显示“bUAA0706”固定字符的子程序。
根据SAA1064的数据操作格式,点亮4个LED只须依首地址SUBADR顺序送入控制命令COM和4个LED共阴极段选码data1~data4。
设LED驱动电流为18 mA(C6,C5为高电平;C4为低电平)动态显示要求(C2,C1,C0为高电