搜档网
当前位置:搜档网 › I2C总线简介

I2C总线简介

I2C总线简介
I2C总线简介

I2c总线原理及其在单片机接口中的应用实例The Principle of I2C-Bus and its Realization in MCU Interface

摘要:本文介绍了I2C总线的结构及通信原理,并以串行芯片E2PROM存储芯片AT24C02为例,给出了在单片机上,利用基本I/O口实现I2C总线的方法。

关键词:I2C AT24C02

I2C总线介绍:

I2C总线是英文INTER IC BUS或 IC TO IC BUS的简称,十多年前由PHILIPS公司推出,是近年来微电子通信控制领域广泛采用的一种新型总线标准,它是同步通信的一种特殊形式,具有接口线少,控制方便简化,器件封装形式小,通信速率较高等优点。在主从通信中,可以有多个I2C总线器件同时接到I2C总线上,所有I2C兼容的器件都具有标准的接口,通过地址来识别通信对象,使它们可以经由I2C总线互相直接通信。

I2C总线是由数据线SDA和时钟线SCL构成的串行总线,可发送和接收数据。在CPU与被控IC之间、IC与IC之间进行双向传送,最高传送速率为400kb/s,各种被控电路均并联在这条总线上,每个电路都有唯一的地址。在信息的传输过程当中,I2C总线上并联的每一个模块电路既是被控器(或是主控器),又是发送器(或是接收器),这取决于它所要完成的功能。CPU 发出的控制信号分为地址码和数据码两部分:地址码用来选址,及接通需要控制的电路;数据码是通信的内容,这样各控制电路虽然挂在同一条总线上,却彼此独立。

I2C总线的数据传输:

在传输数据开始前,主控器件应发送起始位,通知从器件做好接收准备;在传输数据结束时,主控器件应发送停止位,通知从器件停止接收,

起始位时序:当SCL位为高位时,SDA线由高到低的转换。

停止位时序:当SCL位为高位时,SDA线由低到高的转换。

SDA上的数据在时钟高电平期间必须保持稳定,在SCL低电平期间才可以改变,输出到SDA 线上的每个字节必须是8位,每次传输的字节不受限制,每个字节必须有一个确认位(又称应答位ACK),与确认位对应的时钟脉冲由主控器产生,发送器在应答期间必须拉低SDA线。SDA线连续写操作数据状态为:(S表示开始信号START,A表示应答信号ACK,P表示停止信号STOP )

器件寻址(写)片内地址

器件寻址(写)片内地址器件寻址(读)

AT24C02与80C51的连接及模拟软件程序

AT24CXX系列芯片是采用I2C总线标准的常用串行E2PROM存储芯片,AT24C02是其中之一,它具有2KBITS(256BYTE)的存储容量,工作于从器件方式,页写的最大8个字节,而且此系列片内地址在接收到每一个数据字节后自动加1,故装载一页以内数据字节时,只需输

入首地址,如果写到此页的最后一个字节,主器件继续发送数据,数据将从该页的首地址写入

图1 51单片机与AT24C02的连接电路图

解决办法是:在第8个数据后将地址强制加一,或是将下一页的 首地址付给寄存器。

数据传送格式是以主设备发送启动信号开始,跟着发送第一字节,此字节的高7位为从设备地址,最低位为指明数据传送方向的R/W (读写)位,该位为0表示主设备向从设备发送数据,为1表示从设备向主设备发送数据。如果地址的高4位不是全0或全1,则接着就可发送所需的数据字节。

总线每次传送的字节数没有限制,但是各字节之间必须插入一个应答位,数据字节从最高位开始发送,全部数据发送完后,就发送停止信号完成一次数据传送。应答位是在发送每个字节之后主设备发出的第9个时钟脉冲的高电平期间,由接收设备拉低SDA ,以这一低电平作为数据字节已被接受的应答,发送设备也于此期间释放(拉高)SDA 线。

51单片机与AT24C02

的连接电路原理图如图1所示,A2~A0为地址引脚(按照000~111的顺序与VCC 和GND 相连,因只用了一片,所以将A 2A 1A 0设置为000),WP 为写保护引脚,因AT24C02不具备写保护的功能,将其接地,

以下是完整的I2C 读写程序,在写串行E2PROM 子程序E2PW 中,(R3)=器件地址,(R4)=片内字节地址,(R1)=欲写数据存放地址指针,(R7)=连续写字节数N ;在读串行E2PROM 子程序E2PR 中,(R1)=欲读数据地址指针,(R3)=器件地址,(R4)=片内字节地址,(R7)=连续读字节数,

SDA BIT P2.1

SCL BIT P2.0

ORG 0000H

AJMP INIT

ORG 0100H

INIT: CLR RS0

CLR RS1

MOV R1,#30H

MOV A,#50H

MOV R7,#08H

MOV R3,#0A0H

MOV R4,#00H

LOOP: MOV @R1,A

INC R1

INC A

DJNZ R7,LOOP ;初始化存储器的值,将数据50H~57H 发送到内部30H~37H 单元

E2PW:MOV P2,#0FFH ; 置p2.0, p2.1 均为1

CLR P2.1 ; 发开始信号

MOV A,R3; 送器件地址

ACALL SUBS

MOV A,R4; 送片内字节地址

ACALL SUBS 调发送单字节子程序

MOV R1,#30H

MOV R7,#08H ; AT24C02一次可装载的字节数为8个

AGAIN:MOV A,@R1

ACALL SUBS

INC R1

DJNZ R7,AGAIN; 发送8个字节到IIC模块

CLR P2.1 ; 发送完8个数据后,先将SDA拉低,准备发停止位 ACALL DELAY

SETB P2.0 ; 将SCL拉高

ACALL DELAY

SETB P2.1 ; 在由主设备将SDA拉高,送出停止位

MOV R7,#08H ;再一次给R7赋值,准备读数据

E2PR: MOV R1,#40H

MOV P2,#0FFH ;置p2.0, p2.1 均为1

CLR P2.1;发开始信号

MOV A,R3;发器件地址

ACALL SUBS;调发送单字节子程序

MOV A,R4;送片内字节地址

ACALL SUBS

MOV P2,#0FFH; 置p2.0, p2.1 均为1

CLR P2.1;再发开始信号

MOV A,R3

SETB ACC.0;发读命令

ACALL SUBS

MORE: ACALL SUBR ; 进入读数据模式

MOV @R1,A

INC R1

DJNZ R7,MORE; 读8个字节到内部40H~47H

CLR P2.1

ACALL DELAY

SETB P2.0

ACALL DELAY

SETB P2.1;送停止信号

ajmp $

SUBS: MOV R0,#08H;发送单字节子程序

LOOP1: CLR P2.0 ; 只有在SCL为低电平时才能改变SDA的值

RLC A

MOV P2.1 ,C

NOP

SETB P2.0 ; SCL置1,保持数据

ACALL DELAY; 需要保持一段时间

DJNZ R0,LOOP1;循环8次送8个位

CLR P2.0

ACALL DELAY

SETB P2.0 ; 进入第9个时钟脉冲

REP: JB P2.1,$; 判断答到否,未到则等待。这里SDA由接受端拉低 CLR P2.0

RET

DELAY: MOV R5,#20H;为满足传输速率要求延时子程序

DELAY2: MOV R6,#10H

DELAY3: DJNZ R6,DELAY3

DJNZ R5,DELAY2

RET

SUBR: MOV R0,#08H;接收单字节子程序

LOOP2:SETB P2.0 ;直接将SCL置1,准备接收

ACALL DELAY

MOV C, P2.1

RLC A ;将收到的位循环到0位上

CLR P2.0

ACALL DELAY

DJNZ R0,LOOP2

CJNE R7 ,#01H, LOWA

SETB P2.1;若是最后一个字节,置SDA=1

AJMP SETOK

LOWA: CLR P2.1;否则置SDA=0

SETOK: ACALL DELAY

SETB P2.0

ACALL DELAY

CLR P2.0

ACALL DELAY

SETB P2.1;应答完毕,SDA置1

RET

END

注意在接收的时候,应该在SCL高电平时,即保持时间段时读数据。

结束语:

随着I2C总线在通信,控制等方面的普遍应用,本文以实例的方式给出了I2C总线在单片机上的实现方法,具有一定的实用性与可移植性。

相关主题