新闻中心

EEPW首页>嵌入式系统>设计应用> I2C总线在单片机上的实现

I2C总线在单片机上的实现

作者: 时间:2012-03-07 来源:网络 收藏

图5是一个伺服系统的结构图。它用8XC752的PWM输出经放大后来驱动电机,电机的转速由测速机测取并直接送到8XC752片内的A/D电路。处理后的有关信息经送到LCD驱动芯片PCF8577以驱动64段LCD显示板。

3.2 通用I/O端口作为接口

目前,51、96系列的应用很广,但是由于它们都没有接口,从而限制了在这些系统中使用具有I2C总线接口的器件。通过对I2C总线时序的分析,可以用51的两根I/O线来实现I2C总线的功能。接I2C总线规定:SCL线和SDA线是各设备对应输出状态相“与”的结果,任一设备都可以用输出低电平的方法来延长SCL的低电平时间,以迫使高速设备进入等待状态,从而实现不同速度设备间的时钟同步。因此,即使时钟脉冲的高、低电平时间长短不一,也能实现数据的可靠传送,可以用软件控制I/O口做I2C接口。下面就是用GMS97C2051的通用I/O口来作为I2C总线接口,并由软件控制实现数据传送的例子,图6为其连线图。

在单主控器的系统中,时钟线仅由主控器驱动,因此可以用51系列的一根I/O线作为SCL的信号线,将其设备为输出方式,并由软件控制来产生串行时钟信号。在实际系统中使用了P1.3。另一根I/O线P1.2作为I2C总线的串行数据线,可在软件控制下在时钟的低电平期间读取或输出数据。系统传输数据的过程如下:先由单片机发出一个启始数据信号,接着送出要访问器件的7位地址数据,并等待被控器件的应答信号。当收以应答信号后,根据访问要求进行相应的操作。如果是读入数据,则数据线可一直设为输入方式,中间不需要改变SDA线的工作方式,每读入一个字节均应依次检测应答信号;如果是输出数据,则首先将SDA设置为输出方式,当发送完一个字节后,需要改变SDA线为输入方式,此时读入被控器件的应答信号就完成了一个字节的传送。当所有完毕后,应向SDA发出一个停止信号,以结束该次

下面给出51系列用汇编语言实现启始、停止、读、写、应答的程序,读者也可以根据I2C总线时序在96系列或其它单片机上实现I2C总线接口。

a.启动位程序

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

b.读数据程序

读字节可以在当前地址读(CURRENT READ),也可以随机读(RANDOM READ),读出数据的最后一个字节后不用加应答信号。

READ:PUSH 0EH

CLR P1.4

LCALL BSTART ;START

MOV A,#0A0H ;SEND THE CNOTROL BYTE

LCALL SENDBYTE

LCALL ACK

MOV A,R1 ;SEND THE ADDRESS

LCALL SENDBYTE

LCALL ACK

LCALL BSTART ;START



评论


相关推荐

技术专区

关闭