|
图3 I2C总线数据传输格式
3 I2C总线在单片机8031中的实现 因为8031单片机不带有I2C总线硬件接口,只能靠编写软件来模拟I2C总线时序。这里以单片机应用系统中较为常见的E2PROM中AT24C02为例,给出了在8031上利用I/O线实现I2C串行总线的方法和软件设计。根据I2C总线时序图和I2C总线的数据传输规范,给出详细的AT24C02起始、停止、发送和接收R7个字节的驱动程序清单。

图4 I2C总线接口原理图
ORG ×××× ;程序开始地址。 SCL EQU P1.1 ;选择P1.1作时钟线。 SDA EQU P1.0 ;选择P1.0作数据线。 功能:WRITE是写入程序。将R1指示的R7个片内字节写入AT24C02中,写入首址由R0指示。 WRITE:ACALL STAR ;发出起始信号。 MOV A,#0A0H ;发出写命令。 ACALL OUTB JC WBE ;无回答,结束操作。 MOV A,R0 ;发出E2PROM首址。 ACALL OUTB JC WBE ;无回答,结束操作。 WR1: MOV A,@R1 ;取一字节内容。 ACALL OUTB ;写入E2PROM中。 JC WBE ;无回答,结束操作。 INC R1 ;指向下一字节。 DJNZ R7,WR1 ;写完全部字节。 WBE: AJMP STOP ;发出结束信号。 功能:READ是读出程序。将R1指示的R7个E2PROM字节读入片内RAM中,首址由R0指示。 READ: ACALL STAR ;发出起始信号。 MOV A,#0A0H ;发出写命令。 ACALL OUTB JC RDE ;无回答,结束操作。 MOV A,R1 ;发出E2PROM首址。 ACALL OUTB JC RDE ;无回答,结束操作。 ACALL STOP ;发出结束信号。 NOP ;延时。 NOP ACALL STAR ;再次发出起始信号。 MOV A,#0A1H ;发出读命令。 ACALL OUTB JC RDE ;无回答,结束操作。 RD1: MOV B,#08H ;每移出8位组成一字节。 RD2: CLR SCL ;移出一个时钟脉冲。 NOP SETB SCL ;时钟脉冲上升沿。 NOP MOV C,SDA ;读入一位。 RLC A ;拼装到累加器中。 NOP DJNZ B,RD2 ;拼完一字节。 MOV @R0,A ;存入片内。 INC R0 ;指向下一地址。 CLR SCL ;时钟脉冲下降沿。 CJNE R7,#1,RD3 ;是最后一个字节吗? SETB SDA ;最后一个字节不给回答信号。 SJMP RD4 RD3: CLR SDA ;准备好回答信号。 RD4: NOP SETB SCL ;时钟脉冲上升沿。 NOP ;等待E2PROM读取回答信号 NOP CLR SCL ;回答完毕。 SETB SDA ;准备读入下一字节。 DJNZ R7,RD1 ;读完全部字节。 CLR C RDE: AJMP STOP ;发出结束信号。 功能:OUTB是向E2PROM发出一字节信息的子程序。 OUTB: MOV B,#08H ;一字节8位。 OUT1: CLR SCL ;将时钟线拉低。 RLC A ;移出一位。 MOV SDA,C ;放到数据线上。 SETB SCL ;将时钟线升高。 NOP ;等待一位信息送入E2PROM中。 DJNZ B,OUT1 ;发送完8位。 CLR SCL ;将时钟线拉低。 SETB SDA ;准备接收回答信号。 SETB SCL ;将时钟线升高。 NOPMOV C,SDA ;接收回答信号。 CLR SCL ;将时钟线拉低。 RET 功能:STAR是起始信号。 STAR: SETB SDA ;将数据线升高。 SETB SCL ;将时钟线升高。 NOP ;延时。 CLR SDA ;将数据线拉低,发出起始信号。 NOP ;延时。 CLR SCL ;将时钟线拉低。 RET 功能:STOP是结束信号。 STOP: CLR SCL ;将时钟线拉低。 CLR SDA ;将数据线拉低。 NOP SETB SCL ;将时钟线升高。 NOP SETB SDA ;将数据线升高,发出结束信号。 RET END
4 结束语 本文给出了用8031汇编语言模拟I2C总线的时序的起始、停止及主控器向I2C总线的发送和接收R7字节的程序,读者也可根据I2C总线的操作时序在ATMEL89系列、68HC05系列等单片机及其外设接口如8255、8155或74LS377上实现I2C总线的操作,具有一定的通用性,且易于嵌入移植。
参考文献 1 Atmel Integrated Circuit Date Book,1994 2 武汉力源公司.CMOS串行EEPROM原理及应用 3 王卓人,邓晋钧,刘宗祥.IC卡的技术与应用.北京:电子工业出版社,1999.2 |