|
|
| | -文章搜索 - 最新文章 - | |
用汇编实现I2CBUS总线协议 |
| 发布时间:2006年5月27日 点击次数:546 |
| 来源:电子产品世界 作者:华中理工大学电信系 况荣华 容太平 |
摘要:本文简要介绍了I2C串行总线结构和特点,并结合其在单片机(GMS97C2051)上的应用,以24LC01BEEPROM为例,给出了用汇编语言实现该协议的程序。 关键词:I2C总线 单片机 I2C总线 PHILIPS公司早在十几年前就推出了I2C串行总线,它具备多主机系统所需的包括裁决和高低速设备同步等功能高性能串行总线。 I2C总线硬件结构 I2C串行总线有两根信号线,一根是双向的数据线SDA,另一根是时钟线SCL。所有接到I2C总线睥设备的串行数据SDA都接到总线的SDA线,各设备的时钟线SCL接到总线的SCL。典型的I2C总线结构如图1。 为了避免总线信号的混乱,要求各设备连接到总线的输出端必须是开漏输出或集电极开路输出的电路结构。设备与总线的接口电路如图2所示。 I2C总线数据传送率可达每秒十万位,高速方式可高达每秒四十万位。总线上允许连接设备数以总线上的电容量不超过400pF为限。 I2C数据传输 在I2C总线传输过程中,将两种特定的情况定义为开始和停止条件(如图3):录SCL保持“高”,SDA由“高”变为“低”时为开始条件,SCL保持“高”,SDA由“低”变为“高”是为停止条件。开始和停止条件由主控器产生。使用硬件接口可以很容易地检测开始和停止条件,没有这种接口的微机必须以每时钟周期至少两次对SDA取样以便检测这种变化。 SDA线上的数据在时钟“高”期间必须是稳定的,只有当SCL线上的时钟信号为低时,数据线上的“高”或“低”状态才可以改变。输出到SDA线上的每个字节必须是8位,每次传输的字节不受限制,每个字节必须有一个应答ACK。如果一接收器件在完成其他功能(如一内部中断)前不能接收另一数据的完整字节时,它可以保持时钟线SCL为低,以促使发送器进入等待状态,当接收器准备好接受数据的其它字节并释放时钟SCL后,数据传输继续进行。I2C数据总线传达时序如图4。 数据传送具有应答是必须的。与应答对应的时钟脉冲由主控制产生,发送器在应答期间必须下拉SDA线。当导址的被控器件不能应答时,数据保护为高,接着主控制产生停止条件终止传输。 I2C总线的应用 下面就是用GMS97C2051(武汉力源公司产品,与AT89C2051兼容)的通用I/O口作为I2C总线接口,由软件控制实现数据传送,图5为其连线路图。 在单主控器的系统中,时钟线仅由主控器驱动,因此可以用51的一根I/O线作为SCL信号线,将其设置为输出方式,由软件控制产生串行时钟信号, 以下用51汇编语言实现启始、停止、读、写、应答的程序。 (1)启始位程序: ACK:CLR P1.3 NOP NOP SETB P1.2 NOP NOP NOP CPL P1.3 ;P1.3=1 NOP NOP NOP DENGDAI:JB P1.2,DENGDAI RET (2)读数据程序: 读字节可以在当前地址读(CURRENT READ),可以随机读(RANDOM READ),读出数据的最后一个字节后不用加应答信号。 READ:PUSH 0EH CLR P1.4 LCALL BSTART;START MOV A,#0A0H;SEND THE CONTROL BYTE LCALL SENDBYTE LCALL ACK MOV A,R1;SEND THE ADDRESS LCALL SENDBYTE LCALL ACK LCALL BSTART;START MOV A,#0A1H;SEND THE CONTROL BYTE LCALL SENDBYTE LCALL ACK LCALL READBYTE LCALL BSTOP POP 0EH RET 送字节子程序: SENDBYTE:PUSH 0EH PUSH 00H MOV R0,#08H LOOP1:CLR P1.3 NOP NOP RLC A MOV P1.2,C CPL P1.3; P1.3=1 NOP NOP DJNZ R0,LOOP1 POP 00H POP 0EH RET 读字节子程序: READBYTE:PUSH 0EH PUSH 00H MOV R0,#08H; READ THE CONTENT CLR A LOOP4:CLR P1.3 NOP NOP NOP SETB P1.3;P1.3=1 MOV C,P1.2 RLC A DJNZ R0,LOOP4 MOV R2,A POP 00H POP 0EH RET (3)写数据程序: WRITE:PUSH 0EH CLR P1.4 LCALL BSTART MOV A,#0A0H LCALL SENDBYTE; SEND CONTROL BYTE LCALL ACK MOV A,R1;SEND THE ADDRESS LCALL SENDBYTE CLALL ACK MOV A,R2;WERITE THE CONTENT LCALL SENDBYTE LCALL ACK LCALL BSTOP POP 0EH RET 连续写的两个字节之间最好是要有10ms的延时。当然,也可以进行页写(PAGE WTITE),一次性连续写8个字节,每个字节后要一个应答信号。 (4)停止位程序: BSTOP:CL的P1.3 NOP NOP CLR P1.2 NOP NOP NOP SETB P1.3 NOP NOP NOP SETB P1.2 RET |
|
|
|
|
[嵌入式系统] 相关文章: 用SoC/嵌入系统工具权衡软硬件简介:
组网设备的开发者,正竞争 相采用CARDtools系统公司的NitorVP 6.0版SoC/嵌入系统协同设计及仿真工具包。NitroVP上市刚刚几个月,设计人员可以使用它来建立虚拟原形,对硬件与软件进行协同仿真,或进行权衡分析。 ST公司高级系统技术组系统建模工程师Marcello Coppola是率先使用NitroVP的人员之一,Coppola所在的小组研究通信应用系统以及设计这类系统的工具。 Coppola把NitroVP作为其工具包的一部分,为ST公司研制新的SoC,供宽带网络终端与设备(...... 嵌入式系统用Java语言
嵌入式系统硬件抽象层的原理与实现
视频采集卡Windows95驱动程序设计
开放的多媒体应用平台OMAPTM
一种基于MCU内部Flash的在线仿真器设计方法
ISA数据采集卡的WDM驱动程序实现
基于AVR微控制器的电力机车智能辅保系统的实现
嵌入式系统中的JTAG接口编程技术
FLEX10K系列EAD的应用 |
|
|
|