单片机模拟I2C总线及AT24C01应用实例文档格式.docx

上传人:b****8 文档编号:22559073 上传时间:2023-02-04 格式:DOCX 页数:16 大小:156.67KB
下载 相关 举报
单片机模拟I2C总线及AT24C01应用实例文档格式.docx_第1页
第1页 / 共16页
单片机模拟I2C总线及AT24C01应用实例文档格式.docx_第2页
第2页 / 共16页
单片机模拟I2C总线及AT24C01应用实例文档格式.docx_第3页
第3页 / 共16页
单片机模拟I2C总线及AT24C01应用实例文档格式.docx_第4页
第4页 / 共16页
单片机模拟I2C总线及AT24C01应用实例文档格式.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

单片机模拟I2C总线及AT24C01应用实例文档格式.docx

《单片机模拟I2C总线及AT24C01应用实例文档格式.docx》由会员分享,可在线阅读,更多相关《单片机模拟I2C总线及AT24C01应用实例文档格式.docx(16页珍藏版)》请在冰豆网上搜索。

单片机模拟I2C总线及AT24C01应用实例文档格式.docx

图2

2.5 

应答信号:

接收数据的IC在接收到8bit数据后,向发送数据的IC发出特定的低电平脉冲,表示已收到数据。

CPU向受控单元发出一个信号后,等待受控单元发出一个应答信号,CPU接收到应答信号后,根据实际情况作出是否继续传递信号的判断。

若未收到应答信号,由判断为受控单元出现故障。

2.6 

总线基本操作

  I2C规程运用主/从双向通讯。

器件发送数据到总线上,则定义为发送器,器件接收数据则定义为接收器。

主器件和从器件(本文为AT24C01)都可以工作于接收和发送状态。

总线必须由主器件(通常为微控制器CPU)控制,主器件产生串行时钟(SCL)控制总线的传输方向,并产生起始和停止条件。

SDA线上的数据状态仅在SCL为低电平的期间才能改变,SCL为高电平的期间,SDA状态的改变被用来表示起始和停止条件。

参见图2。

  

3.I2C应用实例AT24C01

  AT24C系列串行E2PROM具有I2C总线接口功能,功耗小,宽电源电压(根据不同型号2.5V~6.0V),工作电流约为3mA,静态电流随电源电压不同为30μA~110μA。

3.1 

AT24C系列E2PROM接口及地址选择

  由于I2C总线可挂接多个串行接口器件,在I2C总线中每个器件应有唯一的器件地址,按I2C总线规则,器件地址为7位数据(即一个I2C总线系统中理论上可挂接128个不同地址的器件),它和1位数据方向位构成一个器件寻址字节,最低位D0为方向位(读/写)。

器件寻址字节中的最高4位(D7~D4)为器件型号地址,不同的I2C总线接口器件的型号地址是厂家给定的,如AT24C系列E2PROM的型号地址皆为1010,器件地址中的低3位为引脚地址A2A1A0,对应器件寻址字节中的D3、D2、D1位,在硬件设计时由连接的引脚电平给定。

图3

  对于E2PROM的片内地址,容量小于256字节的芯片(AT24C01/02),8位片内寻址(A0~A7)即可满足要求。

然而对于容量大于256字节的芯片,则8位片内寻址范围不够,如AT24C16,相应的寻址位数应为11位(211=2048)。

若以256字节为1页,则多于8位的寻址视为页面寻址。

在AT24C系列中对页面寻址位采取占用器件引脚地址(A2、A1、A0)的办法,如AT24C16将A2、A1、A0作为页地址。

凡在系统中引脚地址用作页地址后,该引脚在电路中不得使用,作悬空处理。

AT24C系列串行E2PROM的器件地址寻址字节如图4所示,表中P0 

P1 

P2表示页面寻址位。

图4

3.2 

AT89S51单片机与AT24C01 

E2PROM通讯的硬件实现

  图5是用AT89S51P2口模拟I2C总线与E2PROM连接电路图(以AT24C01为例),由于AT24C01是漏极开路,图中R1、R2为上拉电阻(5.1k)。

A0~A2地址引脚脚均接地。

图5 

AT24C01与51单片机接口

3.3 

AT24C系列E2PROM读写操作软件实现方法

  对AT24C系列E2PROM的读写操作完全遵守I2C总线的主收从发和主发从收的规则。

3.3.1 

AT24C01的写操作

  写操作分为字节写和页面写两种操作,对于页面写根据芯片的一次装载的字节不同有所不同。

关于页面写的地址、应答和数据传送的时序参见图6 

和图7。

连续写操作是对E2PROM连续装载n个字节数据的写入操作,n随型号不同而不同,一次可装载字节数也不同。

AT24C01/02 

8字节/每页

AT24C04/08/16 

16字节/每页

图6写一个字节的时序图

图7写一页的时序图

3.3.2 

AT24C01的读操作

  读操作有三种基本操作:

当前地址读、随机读和顺序读。

图10给出的是顺序读的时序图。

应当注意的是:

最后一个读操作的第9个时钟周期不是“不关心”。

为了结束读操作,主机必须在第9个周期间发出停止条件或者在第9个时钟周期内保持SDA为高电平、然后发出停止条件。

  AT24C系列片内地址在接收到每一个数据字节地址后自动加1,故装载一页以内规定数据字节时,只须输入首地址,若装载字节多于规定的最多字节数,数据地址将“上卷”,前面的数据被覆盖。

  连续读操作时为了指定首地址,需要两个伪字节写来给定器件地址和片内地址,重复一次启动信号和器件地址(读),就可读出该地址的数据。

由于伪字节写中并未执行写操作,地址没有加1。

以后每读取一个字节,地址自动加1。

在读操作中接收器接收到最后一个数据字节后不返回肯定应答(保持SDA高电平)随后发停止信号。

图8读当前地址内容

图9读任意地址内容

图10读连续地址内容

汇编写的24C01单字节读写程序

;

=======================================================

 

24C01存储器I2C总线实验 

汇编语言例子

ew51仿真编程器 

配套实验板学习例程

中山单片机学习网 

智佳科技 

站长:

逸风

E-mail:

SDA 

EQU 

P2.0

SCL 

P2.1

Address 

08H

I2CData 

09H

ORG0000H

START:

MOV 

SP,#60H

Address,#00H

I2CData,#55H

CALL 

I2C_WRITE 

;

写入数据

I2CDATA,#0AAH 

I2C_READ

I2CData,A 

读出数据

NOP

MAIN:

JMP 

MAIN

/*=======================================================

写一个字节 

Address地址 

I2CDatata写入的数据

=======================================================*/

I2C_WRITE:

I2C_WRITE_A:

LCALL 

I2C_START;

启动开始传送信号

MOV 

A,#B;

I2C写入控制字

I2C_SEND8BIT

I2C_ACK

JC 

I2C_WRITE_A 

=1,表示无确认,再次发送

A,Address;

I2C写入从地址00H开始

I2C_ACK 

A,I2CData;

I2C写入数据AAH

I2C_STOP

RET

读一个字节 

Data读出的数据

I2C_READ:

真正读之前先设置好读的控制字(采用写入方式通知I2C)然后读,注意又要重新从启动I2C开始。

I2C_READ_A:

启动开始信号

设置I2C为读

I2C_ACK

I2C_READ_A;

设置读出地址

I2C_SEND8BIT;

写入读出地址

应答

I2C_READ_B:

读出I2C数据

A,#B;

I2C读出

写入I2C控制字读出

I2C_READ_B

I2C_RECEIVE8BIT;

I2CData,A

RET

=======================================================

发送开始信号

I2C_START:

SETB 

SCL

SDA

CLR 

SDA

发送结束信号

I2C_STOP:

发送接收确认信号

I2C_ACk:

应答信号

JB 

SDA,I2C_ACK0

SJMP 

I2C_ACK_END

I2C_ACK0:

C

I2C_ACK_END:

送八位数据

I2C_SEND8BIT:

B,#08H

I2C_SEND8BIT_A:

RLCA

SDA,C

CLRSCL

DJNZ 

B,I2C_SEND8BIT_A

接收八位数据

I2C_RECEIVE8BIT:

CLRA

SETB 

I2C_RECEIVE8IT_A:

C,SDA

RLC 

A;

将读取数据通过C逐为移入累加器A中8次移动后就完成一个字节的接收。

SCL;

SCL为低电平时才允许SDA数据改变数据指针自动加1指向下一位数据。

B,I2C_RECEIVE8IT_A

5.C语言写的24C01单字节读写程序

24C01存储器I2C总线实验 

C语言例子 

#include

sbit 

SDA=0x90;

SCL=0x91;

//函数声明

unsignedchari2c_read(unsignedchar);

voidi2c_write(unsignedchar,unsignedchar);

voidi2c_send8bit(unsignedchar);

unsignedchari2c_receive8bit(void);

voidi2c_start(void);

voidi2c_stop(void);

biti2c_ack(void);

//=======================================================

voidmain(void)

{

unsignedchardd;

i2c_write(0x00,0x55);

_nop_();

dd=i2c_read(0x00);

for(;

{}

}

i2c_write(地址,数据),写一个字节

voidi2c_write(unsignedcharAddress,unsignedcharData)

do{

i2c_start();

i2c_send8bit(0xA0);

}while(i2c_ack());

i2c_send8bit(Address);

i2c_ack();

i2c_send8bit(Data);

i2c_stop();

return;

i2c_read(地址,数据),写一个字节

unsignedchari2c_read(unsignedcharAddress)

unsignedcharc;

//=1,表示无确认,再次发送

i2c_send8bit(0xA1);

c=i2c_receive8bit();

return(c);

//发送开始信号

voidi2c_start(void)

SDA=1;

SCL=1;

SDA=0;

SCL=0;

//发送结束信号

voidi2c_stop(void)

//发送接收确认信号

bit 

i2c_ack(void)

bit 

ack;

if 

(SDA==1)

ack=1;

else

ack=0;

return 

(ack);

//送八位数据

voidi2c_send8bit(unsignedcharb)

unsigned 

chara;

for(a=0;

a<

8;

a++)

{

((b<

A)&

0X80)FONT<

>

else 

}

//接收八位数据

unsignedchari2c_receive8bit(void)

unsignedcharb=0;

b=b<

<

1;

if(SDA==1)

b=b|0x01;

//按位或

(b);

6.在I2C总线的应用中应注意的事项总结为以下几点:

1)严格按照时序图的要求进行操作

2)若与口线上带内部上拉电阻的单片机接口连接,可以不外加上拉电阻。

3)程序中为配合相应的传输速率,在对口线操作的指令后可用NOP指令加一定的延时。

4)为了减少意外的干扰信号将EEPROM内的数据改写可在EEPROM内部没有用的空间写入标志字,每次上电时或复位时做一次检测,判断EEPROM是否被意外改写。

说明:

本文的前3节是由本人从网上收集的各种文章中,修改、整理而成。

第4节和第5节软件部份是本人自已编写的,由于水平有限,错误之处敬请谅解。

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

当前位置:首页 > 农林牧渔 > 林学

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

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