I2C总线 24C02芯片的读写应用.docx

上传人:b****8 文档编号:30155449 上传时间:2023-08-05 格式:DOCX 页数:14 大小:263.59KB
下载 相关 举报
I2C总线 24C02芯片的读写应用.docx_第1页
第1页 / 共14页
I2C总线 24C02芯片的读写应用.docx_第2页
第2页 / 共14页
I2C总线 24C02芯片的读写应用.docx_第3页
第3页 / 共14页
I2C总线 24C02芯片的读写应用.docx_第4页
第4页 / 共14页
I2C总线 24C02芯片的读写应用.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

I2C总线 24C02芯片的读写应用.docx

《I2C总线 24C02芯片的读写应用.docx》由会员分享,可在线阅读,更多相关《I2C总线 24C02芯片的读写应用.docx(14页珍藏版)》请在冰豆网上搜索。

I2C总线 24C02芯片的读写应用.docx

I2C总线24C02芯片的读写应用

I2C总线24C02芯片的读写应用

什么是I2C总线?

I2C(Inter-IntegratedCircuit)总线是一种由PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备。

也可以简单地理解为I2C是微控制器与外围芯片的一种通讯协议。

在不同的书籍中,可能会称为I2C,IIC,或者I平方C,但是概念也是一样的,只是叫法不同。

一﹑I2C总线特点

I2C总线的优点非常多,其中最主要体现在1:

硬件结构上具有相同的接口界面;2:

电路接口的简单性;3:

软件操作的一致性。

I2C总线占用芯片的引脚非常的少,只需要两组信号作为通信的协议,一条为数据线(SDA),另一条为时钟线(SCL)。

因此减少了电路板的空间和芯片管脚的数量,所以降低了互联成本。

总线的长度可高达25英尺,并且能够以10Kbps的最大传输速率支持40个组件。

I2C总线还具备了另一个优点,就是任何能够进行发送和接收数据的设备都可以成为主控机。

当然,在任何时间点上只能允许有一个主控机。

图5-20(总线连接图)

二﹑I2C总线工作原理

图5-20为I2C总线的连接图。

I2C总线是由数据线SDA和时钟线SCL构成的串行总线,可发送和接收数据。

在单片机与被控IC之间,最高传送速率100kbps。

各种I2C器件均并联在这条总线上,就像电话线网络一样不会互相冲突,要互相通信就必须拨通其电话号码,每一个I2C模块都有唯一地址。

并接在I2C总线上的模块,既可以是主控器(或被控器),也可以是发送器(或接收器),这取决于它所要完成的功能。

I2C总线在传送数据过程中共有四种类型信号,它们分别是:

起始信号、停止信号﹑应答信号与非应答信号。

三﹑I2C总线数据的传送规则

起始信号:

在I2C总线工作过程中,当SCL为高电平时,SDA由高电平向低电平跳变,定义为起始信号,起始信号由主控机产生。

如图5-21所示

图5-21(开始信号)

停止信号:

当SCL为高电平时,SDA由低电平向高电平跳变,定义为停止信号,此信号也只能由主控机产生。

如图5-22所示。

图5-22(停止信号)

应答信号:

I2C总线传送的每个字节为8位,受控的器件在接收到8位数据后,在第9个脉冲必须输出低电平作为应答信号,同时,要求主控器在第9个时钟脉冲位上释放SDA线,以便受控器发出应答信号,将SDA拉低,表示接收数据的应答(如图5-23所示)。

若果在第9个脉冲收到受控器的非应答信号(如图5-24所示),则表示停止数据的发送或接收。

图5-23(应答信号)5-24(非应答信号)

其次,每启动一次总线,传输的字节数没有限制。

主控件和受控器件都可以工作于接收和发送状态。

总线必须由主器件控制,也就是说必须由主控器产生时钟信号﹑起始信号﹑停止信号。

在时钟信号为高电平期间,数据线上的数据必须保特稳定,数据线上的数据状态仅在时钟为低电平的期间才能改变(如图5-25),而当时钟线为高电平的期间,数据线状态的改变被用来表示起始和停止条件(如图5-21与5-22所示)。

图5-25(数据的有效性)

图5-26为总线的完整时序,在这里有一点要加以说明的,当主控器接收数据时,在最后一个数据字节,必须发送一个非应答信号,使受控器释放数据线,以便主控器产生一个停止信号来终止总线的数据传送。

图5-26(总线的完整时序)

下面我们来看一下关于I2C总线的读操作与写操作:

图5-27(总线写格式)

写操作就是主控器件向受控器件发送数据,如图5-27所示。

首先,主控器会对总线发送起始信号,紧跟应该是第一个字节的8位数据,但是从地址只有7位,所谓从地址就是受控器的地址,而第8位是受控器约定的数据方向位,“0”为写,从图5-26中我们可以清楚地看到发送完一个8位数之后应该是一个受控器的应答信号。

应答信号过后就是第二个字节的8位数据,这个数多般是受控器件的寄存器地址,寄存器地址过后就是要发送的数据,当数据发送完后就是一个应答信号,每启动一次总线,传输的字节数没有限制,一个字节地址或数据过后的第9个脉冲是受控器件应答信号,当数据传送完之后由主控器发出停止信号来停止总线。

图5-28(总线读格式)

读操作指受控器件向主控器件发送数,其总线的操作格式如图5-28。

首先,由主控器发出起始信号,前两个传送的字节与写操作相同,但是到了第二个字节之后,就要从新启动总线,改变传送数据的方向,前面两个字节数据方向为写,即“0”;第二次启动总线后数据方向为读,即“1”;之后就是要接收的数据。

从图5-28的写格式中我们可以看到有两种的应答信号。

一种是受控器的,另一种是主控器的。

前面三个字节的数据方向均指向受控器件,所以应答信号就由受控器发后出。

但是后面要接收的N个数据则是指向主控器件,所以应答信号应由主控器件发出,当N个数据接收完成之后,主控器件应发出一个非应答信号,告知受控器件数据接收完成,不用再发送。

最后的停止信号同样也是由主控器发出。

四﹑支持I2C总线的器件

在当今市面上有部分的单片机是内置硬件I2C总线的,用户只需要设置好内部相关的寄存器就可以灵活地运用它。

但是如果不内置硬件I2C,我们在使用过程中可以用普通的I/O端口进行模拟。

如实验板的AT89S52芯片,如果要用到I2C协议就得要用到软件模拟。

而在非单片机类的芯片当中,如时钟芯片PCF8563,存储器24Cxx系列等都是使用I2C协议进行数据的操作,而我们实验板用的则是24C02。

下面我们先来介绍一下24C02的引脚功能和内部结构,然后再介绍如何利用单片机模拟I2C协议与24C02进行数据的传送。

五﹑I2C器件24C02

24C02是一个2K串行CMOSE2PROM,内部含有256个8位字节,该器件通过I2C总线接功能列表。

图5-29(24Cxx引脚排列)

管脚名称

功能

A0﹑A1﹑A2

这三个引脚用于多个器件同时使用时设置区分器件地址,当这些引脚悬空时默认为0。

在同一总线中最多可同时使用8个24C02器件。

如果总线只

有一个24C02器件被寻址,这三个地址可悬或接地。

SDA

双向串行数据/地址管脚,用于器件所有数据的发送或接收,SDA是一个

开漏输出管脚。

SCL

串行时钟。

串行时钟输入管脚用于产生器件所有数据发送或接收的时钟,

这是一个输入管脚

写保护引脚。

当WP引脚连接到VCC时芯片里面的内容为只读内容而不能进行写操作。

而当WP引脚连接到VSS时芯片里面的内容可进行正常

WP

的读/写操作。

VCC

+1.8V~6.0V工作电压

VSS

图5-30(24Cxx引脚功能)

六﹑24C02的从地址

图5-31(24C02从器件地址)

图5-32(实验电路)

从图5-31中我们可以看到从地址的高4位是固定的,而低4位是可根据A0﹑A1﹑A2引脚的接法与数据的方向位来确定的,其中R/W为“0”时表示写,为“1”时表示读。

而图5-32为实验板电路,A0﹑A1﹑A2均接地,即为0﹑0﹑0。

所以在实验板中24C02器件的写从地址为10100000(转为十六进制数为0xa0),读从地址为10100001(转为十六进制数为0xa1)。

下面是测试过可以读取和写入的程序,只供参考、个人保留:

#include

#include

#defineucharunsignedchar

#defineuintunsignedint

sbitSCL=P3^3;

sbitSDA=P3^4;

bitask;

voidDelay_Us(ucharus)

{

while(us--)

{

}

}

voidDelay_Ms(ucharms)

{

uchari;

while(ms--)

{

for(i=0;i<110;i++);

}

}

voidI2C_Start()

{

SDA=1;

Delay_Us

(1);

SCL=1;

Delay_Us

(1);

SDA=0;

Delay_Us

(1);

SCL=0;

Delay_Us

(1);

}

voidI2C_Stop()

{

SDA=0;

Delay_Us

(1);

SCL=1;

Delay_Us

(1);

SDA=1;

Delay_Us

(1);

}

voidAck()//应答

{

SDA=1;

Delay_Us

(1);

SCL=1;

Delay_Us

(1);

if(SDA==1)

ask=1;

else

ask=0;

SCL=0;

Delay_Us

(1);

SDA=1;

Delay_Us

(1);

}

voidNoAck()//非应答

{

SCL=0;

SDA=1;

Delay_Us

(1);

SCL=1;

Delay_Us

(1);

while(SDA==1);

Delay_Us

(1);

SCL=0;

Delay_Us

(1);

}

voidI2C_Write_Byte(ucharc)//I2C写

{

uchari,temp;

temp=c;

for(i=0;i<8;i++)

{

temp=temp<<1;

SDA=CY;

Delay_Us

(1);

SCL=1;

Delay_Us

(1);

SCL=0;

Delay_Us

(1);

}

}

ucharI2C_Read_Byte()

{

uchari,temp;

SDA=1;

for(i=0;i<8;i++)

{

SCL=1;

Delay_Us

(1);

temp=temp<<1;

if(SDA==1)

temp=temp|0x01;

SCL=0;

}

returntemp;

}

voidI2C_Ack()

{

uchari=0;

SCL=1;

Delay_Us

(1);

while((SDA==1)&&(i<200))i++;

SCL=0;

Delay_Us

(1);

}

voidI2C_Write_Dat(ucharadd,ucharsubadd,ucharc)

{

I2C_Start();

I2C_Write_Byte(add);

I2C_Ack();

I2C_Write_Byte(subadd);

I2C_Ack();

I2C_Write_Byte(c);

I2C_Ack();

I2C_Stop();

}

ucharI2C_Read_Dat(ucharadd,ucharsubadd)

{

ucharc;

I2C_Start();

I2C_Write_Byte(add);

Ack();

I2C_Write_Byte(subadd);

Ack();

I2C_Start();

I2C_Write_Byte(add+1);

Ack();

c=I2C_Read_Byte();

returnc;

}

voidmain()

{

uchartemp,i,c=0x55;

while

(1)

{

temp=I2C_Read_Dat(0xa0,i);

P2=temp;

i++;

Delay_Ms(200);

Delay_Ms(200);

Delay_Ms(200);

}

//while

(1)

//{

//I2C_Write_Dat(0xa0,i,c);

//c=~c;

//P2=c;

//i++;

//Delay_Ms(200);

//Delay_Ms(200);

//Delay_Ms(200);

//}

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 外语学习 > 法语学习

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1