AT24C02数据存储I2C协议-串口通讯
I2C总线at24c02芯片使用说明

3.2.5 密码储存电路密码储存电路采用I2C总线at24c02存储芯片存放密码,可实现断电密码不消失,at24c02存储芯片可长期存储信息,可上百万次以上重新擦写。
图3-5 密码储存电路2.4.3 I2C总线密码存储芯片at24c02介绍图2-3 at24c02引脚图(1)引脚功能介绍及相关知识WP:写保护引脚,将该引脚接VCC E2PR0MI就实现写保护(只读)。
引脚接地或悬空,可以对器件进行读写操作。
SCL串行时钟引脚,串行输入输出时该引脚用于输入时钟。
SDA串行数据输入输出引脚,用来输入输出数据,该引脚为射极开路输出,需接上拉电阻。
(2)I2C总线协议只有总线非忙时才被允许进行数据传送,在传送时,当时钟线为高电平,数据线必须为固定状态,不允许有跳变。
时钟线为高电平时数据线的任何电平变化将被当作总线的启动或停止条件。
(3)起始条件起始调教必须在所有操作命令之前发送。
时钟线保持高电平期间,数据线电平从高到低跳变作为I2C总线的启动信号。
CAT24Cxx>一直监视SDA和SCL电平信号,直到条件满足时才响应。
(4)停止条件时钟线保持高电平期间,数据线电平从低到高跳变作为IC总线的停止信号。
(5)器件地址的约定主器件在发送启动命令后开始传送数据,主器件发送相应的从器件地址,8 位从器件地址的高四位固定为1010,接下来的 3 位用来定义存储器的地址,对2于,这三位无意义,对于,接下来的 2 位无意义,第三位是地址高位,中,第一位无意义,后两位表示地址高位。
最后一位为读写控制位,“1表”示对从器件进行读写操作,“0表”示写操作。
在主器件发送启动命令和一字节从器件地址后,如果与从器件地址吻合,CAT24C02各发送一个应答信号,然后再根据读/写控制为进行读或写操作。
(6)应答信号每次数据传送成功后,接收器件将发送一个应答信号。
当第九个时钟信号产生时,产生应答型号的器件将SDA下拉为低,通知已经接受到8位数据,接收到起始条件和从器件地址后,CAT24C02发送一个应答信号,如果为写操作,每接收到一个字节数据,CAT24C02发送一个应答信号。
I2C串行AT24C02实验

第4章实验01-I2C串行AT24C02实验
一、实验目的:
1、了解I2C总线的工作原理;
2、学习I2C总线与单片机的接口方法;
3、学习串行E2PROM芯片24CXX系列的读写方法;
4、单片机I2C总线接口的编程方法。
二、实验内容:
1、向24C02写入数据,然后读出数据检验,检验正确,点亮8个发光二极管;检验错误,熄灭8个发光二极管。
原理图:
流程图:
子程序开始子程序开始开始
发送启动条件发送启动条件I/O端口初始化
I2C初始化送出器件地址,设为送出器件地址,设为
“写”模式;“写”模式;I2C写1个字节
送出写入地址;送出写入地址;
送出写入数据;I2C读出1个字节
送出重启条件否
发送停止条件读出=写入?
送出器件地址,设为“读”是延时10ms 接收24C02送出的数据
灯灭灯亮
返回发送非应答条件
发送停止条件踏步
返回
2、编制程序,分别按字节模式和页模式向24C02芯片写入数据,比较写入速度的差别。
原理图:
流程图:
字节子程序主程序
一个字节程序I/O端口初始化
N I2C初始化
是否8次定时初始化
Y
返回启动定时0
页模式程序
页模式子程序关闭定时0
发送启动条件启动定时1
送出器件地址,设置字节子程序
“写”模式;关闭定时1
送出写入地址;N
T0<T1
Y
送出写入数据灯亮灯灭
N
是否8次?
Y 踏步
返回
T0 为定时器0的定时时间;T1为定时器T1的定时时间。
IIC总线操作AT24C02芯片详解

IIC总线操作AT24C02芯片详解一IIC总线操作规范起始和终止信号:SCL线为高电平期间,SDA线由高电平向低电平的变化表示起始信号;SCL线为高电平期间,SDA线由低电平向高电平的变化表示终止信号。
数据传送格式: 每一个字节必须保证是8位长度。
数据传送时,先传送最高位(MSB),每一个被传送的字节后面都必须跟随一位应答位(即一帧共有9位)。
如果一段时间内没有收到从机的应答信号,则自动认为从机已正确接收到数据。
二.AT24C02芯片定义和功能该芯片是一个有2K(256*8)存储单元的EEPROM.1010为固定,A0,A1,A2正好与芯片的1,2,3引角对应.对通过这三个引脚设定可编程地址.若这三个引脚都接地,则地址如下图片:在IIC总线上读写AT24C02要遵循以下规范三,程式实例void init() //初始化{SCL=1;delay();SDA=1;delay();}void start() //启动信号{SDA=1;delay();SCL=1;delay();SDA=0;delay();}void stop() //停止信号{SDA=0;delay();SCL=1;delay();SDA=1;delay();}void respons() //回应信号{uchar i=0;SCL=1;delay();while((SDA==1)&&(i<255))i ;SCL=0;delay();}void writebyte(uchar date)// 写一个字节{uchar i,temp;temp=date;for(i=0;i<8;i ){temp=temp<<1;SCL=0;delay();SDA=CY;delay();SCL=1;delay();}SCL=0;delay();SDA=1;delay();}uchar readbyte() //读一个字节{uchar i,j,k;SCL=0;delay();SDA=1;for(i=0;i<8;i ){SCL=1;delay();if(SDA==1)j=1;elsej=0;k=(k<<1)|j;SCL=0;delay();}delay();return k;}Void write_add(uchar address,uchar info) //指定地址写一个字节数据{start();writebyte(0xa0);respons();writebyte(address);respons();writebyte(info);respons();stop();}uchar read_add(uchar address) //指定地址读一个字节数据{uchar dd;start();writebyte(0xa0);respons();writebyte(address);respons();start();writebyte(0xa1);respons();dd=readbyte(); stop();return dd;}。
I2C总线AT24C02芯片运用

I2C总线AT24C02芯片运用1,I2C总线介绍:I2C总线(Inter IC Bus)由飞利浦公司推出,是近年来微电子控制领域广泛采用的一宗新型总线标准,它使同步通信的一种特殊形式,具有接口少、控制简单、器件封装形体小、通信速率较高等优点(可达400Kbps)。
在主从通信中,可以有多个I2C 总线器件同时接到I2C总线上,所有与I2C总线兼容的器件都具有标准的接口,通过地址来识别通信对象,是她可以经由I2C总线相互直接通信。
I2C总线由数据线和时钟线SDA和SCL两条线构成,可发送数据可接收数据。
于CPU 及被控IC间、IC与IC间均可双向传送,各器件均并于总线上,各自有唯一地址。
信息传输中,I2C总线上的各器件既是被控又是控制器件,既是发送器又是接收器。
CPU 发出的控制信号分为地址码和数据码两部分;地址码选址;数据码送数。
故而各IC虽同并于总线上但却各自独立。
I2C总线硬件结构图图中:ACL时钟,SDA数据接上拉电阻,故总线空闲是高电平,任一器件变低均将拉低电平故曰:各器件的时钟线及数据线乃“与”关系。
通信格式为时钟高时下跳开始寻地址发送一字节 8位中低位为数据方向 0为我党要向下面发指令形象的为“O”,俗称为蛋,如川蛋:“川O001”,陕蛋:“陕O001”都是当官的向下发指令,发飙的,当然,单片机哎平方C系统呢有点民主成分,从机可以向主机传信息,既发1,形象的成为“1”:咦你们小麻虾小老百信还要上方发信息呀??!!事实上是的 0为下蛋-----下传数据;1为上访-----上传数据。
记住了吧!时钟为高SCL=1时数据那得稳定俗称维稳期间当然时钟撤了 SCL=0时随便你虾子变化数据。
发送启动信号那得我们主机发了党外人士没这个权利在时钟为高警察在的时候主机发一个下跳沿信号表示开会了开始了既:SCL=1时 SDA 你们老百姓就等着查户口吧!当官的在警察在时下跳了于是衙门发令查户口高七位为你我家庭住址,最低一位为数据方向上面已表在此老子不说了。
I2C总线原理介绍AT24C02内部原理介绍

I2C总线原理介绍AT24C02内部原理介绍I2C总线原理介绍:I2C (Inter-Integrated Circuit)总线是一种用于在集成电路之间进行通信的串行通信总线协议。
它最初由飞利浦半导体公司(现在的NXP半导体)开发,旨在解决多个IC之间的通信问题。
I2C总线协议包括了两种设备,即主设备和从设备。
主设备负责控制总线及发送和接收数据,而从设备则依从主设备的控制。
主设备通过发送一个起始条件开始通信,并通过发送地址和数据进行控制。
从设备则根据主设备发送的地址和数据进行相应的响应。
1.双向通信:I2C总线允许主设备和从设备之间双向通信,即主设备可以发送数据给从设备,也可以从从设备接收数据。
2.多主模式:I2C总线支持多个主设备同时驱动总线,这可以实现多个主设备之间的协同工作。
3.硬件地址和数据传输:I2C总线使用7位或10位地址来寻址从设备,并以字节为单位传输数据。
4.起始和停止条件:I2C总线使用起始和停止条件来控制通信的开始和结束。
5.错误检测:I2C总线通过校验和来检测传输过程中的错误。
6.时钟同步:I2C总线使用时钟信号来同步主设备和从设备之间的通信。
AT24C02内部原理介绍:AT24C02是一种常见的I2C EEPROM (Electrically Erasable Programmable Read-Only Memory)芯片,用于存储数据。
它的内部原理如下:1.存储单元:AT24C02由256个8位字节构成,每个字节具有一个唯一的地址。
地址范围从0到255,可以存储共计2048位的数据。
2.寻址和读写:AT24C02通过I2C总线进行寻址和读写操作。
主设备发送启始条件和设备地址,然后发送要读取或写入的数据的地址,最后发送或接收实际数据。
3.数据传输:AT24C02的数据以字节为单位被写入和读取。
写入操作通过I2C总线将字节数据写入到指定地址处。
读取操作通过I2C总线将字节数据从指定地址读出。
IIC总线及AT24C02

单片机IIC总线及AT24C02的应用一:IIC和24C02的关系IIC是一种通信协议,IIC总线:由时钟线和数据线构成。
IIC和24C02的关系:24C02是芯片,24C02和其他设备通信使用的是IIC总线。
二:24C02和EEPROM的关系24C02和EEPROM的关系:24C02是一款数据存储芯片,它的存储介质是EEPROM。
三:EEPROM是什么,有什么特点?EEPROM是一款存储介质,电可擦除,可编程的存储介质。
数据可读可写,数据掉电不丢失。
四:EEPROM和单片机的关系EEPROM和单片机的关系:24C02的存储介质是EEPROM,24C02通过IIC总线和单片机通信,单片机把需要掉电不丢失的数据存储在24C02的EEPROM里面。
ROM:程序存储器,数据可读不能写,掉电不丢失。
RAM:数据存储器,数据可读可写,掉电丢失。
EEPROM:数据存储器,数据可读可写,掉电丢失。
容量小,价格高,可以随机读写擦除。
FLASH:数据存储器,数据可读可写,掉电丢失。
快擦除,价格较低,容量较大。
出现坏掉的概率相对较高。
五:AT24C02怎么控制总线—启动,停止,读,写。
(时序图可得)1.启动总线:时钟线是高电平的时候,数据线上的电平由高到低的跳变。
2.停止总线:时钟线是高电平的时候,数据线上的电平由低到高的跳变。
3.正常传输数据要改变的话:时钟线处于低电平。
设备地址:每个硬件设备地址,设备地址可以理解为器件地址。
A0H(实际应用而定)字地址:芯片内部数据存放的地址,256字节空间。
00H~FFHA:写操作(根据写操作时序图)1.启动总线2.写芯片地址(写设备地址)等待应答3.应答有效后,写芯片内部地址(字地址)4.写数据,等待应答5.结束,B:读操作(根据读操作时序图)1.启动总线2.写芯片地址(写设备地址)等待应答3.应答有效后,写芯片内部地址(字地址)4.重启总线(根据读的时序图得:先写操作后才读操作(只有写操作才有读写))5.发送设备地址(目的是把写改为读),6.结束模块化模块的分割:一个.c配一个.h文件,.C文件用来写实体函数。
IIC总线协议及EEPROMAT24C02

IIC总线协议及EEPROMAT24C02IIC总线协议及EEPROMAT24C02IIC总线协议是一种串行通信协议,用于在电子设备之间进行数据传输。
它也被称为I2C(Inter-Integrated Circuit)协议。
IIC总线协议由Philips(现在的NXP Semiconductors)在1982年开发,用于同一电路板上的集成电路芯片之间的通信。
IIC总线是一种主从式结构,其中一个设备作为主设备,其他设备作为从设备。
主设备负责控制数据传输和通信的时序。
每个从设备都有一个唯一的地址,主设备根据地址选择要与之通信的从设备。
从设备根据主设备发出的命令来执行特定的操作,例如读取数据或写入数据。
EEPROM是一种可擦写可编程只读存储器(Electrically Erasable Programmable Read-Only Memory),用于存储非易失性数据。
AT24C02是Microchip Technology公司制造的一种EEPROM芯片,具有容量为2Kbit的存储能力。
AT24C02采用了IIC总线协议,因此可以通过IIC总线与其他设备进行通信。
它有一个7位地址寄存器,可以设置其作为IIC总线上的从设备的地址。
在与主设备通信时,主设备发送一个启动条件,然后发送从设备地址,接下来是读写位和数据。
AT24C02根据主设备的指令来执行读取或写入操作。
AT24C02有一个内部的写保护电路,可以保护存储的数据被误写。
它还支持分页写入,即可以一次写入多个字节的数据,从而提高写入效率。
总结:IIC总线协议是一种用于串行通信的协议,适用于设备之间的数据传输。
AT24C02是一种采用IIC总线协议的EEPROM芯片,具有2Kbit的存储容量。
它通过主设备的控制来进行读写操作,同时具有写保护和分页写入等特性。
I2C_24C02总线通信协议实例详解(附详细示波器实测波形图)

I2C详解I2C总线是PHLIPS公司推出的一种串行总线,是具备多主机系统所需的包括总线裁决和高低速器件同步功能的高性能串行总线。
I2C总线只有两根双向信号线:一根是数据线SDA,另一根是时钟线SCL。
I2C总线通过上拉电阻接正电源。
当总线空闲时,两根线均为高电平。
连到总线上的任一器件输出的低电平都将使总线的信号变低,即各器件的SDA及SCL都是线“与”关系。
在有些情况下,可能没接上拉电阻I2C也能正常通信,但是建议读者最好接上拉电阻。
本文最后将给出有接上拉电阻和没接两种情况下的I2C通信波形,可以明显的看出来,接了上拉电阻波形更漂亮,通信也更稳定。
本文将以24C02来详细讲解I2C 协议。
因为本文的重点是讲解I2C,所以这里只简单的介绍24C02,有关24C02的更为详细的资料,读者可以查阅其数据手册,在这里就其必需的部分进行简单的讲解。
一、 AT24C02简介AT24C02是美国ATMEL公司的低功耗CMOS串行EEPROM,它是内含256×8位(2K)存储空间,具有工作电压宽(2.5~5.5V)、擦写次数多(大于10000次)、写入速度快(小于10ms)等特点。
它的典型应用电路如图1:图1 AT24C02典型应用电路图1中AT24C02的1、2、3脚是三条地址线,用于确定芯片的硬件地址。
在本文都将其接地,表示其地址为000。
第5脚SDA为串行数据输入/输出,数据通过这条双向I2C总线串行传送,第6脚SCL为串行时钟输入线。
当用单片机I/O 口模拟I2C通信时,这两个引脚可以接任意的I/O口。
SDA和SCL都需要接一个上拉电阻,其阻值一般为4.7K~10K。
第7脚是写保护引脚,可以接IO口也可以直接接地,接地就不再具有保护功能。
这里将其直接接地。
二、 I2C总线的构成及信号类型I2C总线是由数据线SDA和时钟线SCL构成的串行总线,可发送和接收数据。
I2C总线进行数据传送时,时钟信号为高电平期间,数据线上的数据必须保持稳定,只有在时钟线上的信号为低电平期间,数据线上的高电平或低电平状态才允许变化。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
void RS_Byte(uchar R_Byte)
{
SBUF = R_Byte;
while(TI == 0);//查询法
TI = 0;
}
/******************************************/
//串口发送字符串数据
void RS_String(uchar *p)
uchar EEPROM_ReadBuffer[20];
//函数声明
/******************************************/
//延时子函时,
//参数d_time控制延时的时间
//作用,灯亮和熄灭必须持续一定时间,人眼才能看到
void delay(unsigned int time);}BitCoun Nhomakorabeaer--;
}while(BitCounter);
return(temp);
}
//I2C写入多个字节数据
void WrToROMs(uchar *iData,uchar Address,uchar Num)
{
uchar i;
Start();//发送启动信号
Send(0xa0);//发送SLA+W
Sda=1;
_nop_();_nop_();_nop_();_nop_();
}
//I2C应答位
void Ack(void)
{
Sda=0;
_nop_();_nop_();_nop_();_nop_();
Scl=1;
_nop_();_nop_();_nop_();_nop_();
Scl=0;
}
//I2C反向应答位
Scl=1;
_nop_();_nop_();_nop_();_nop_();
if(Sda)//如果Sda=1
temp=temp|0x01;//temp的最低位置1
else
temp=temp&0xfe;//否则temp的最低位清0
if(BitCounter-1)
{
temp1=temp<<1;
temp=temp1;
{
uchar i = 0;
while(*(p+i) != '\0' )
{
RS_Byte(*(p+i));
i++;
}
}
/******************************************/
//主函数
void main(void)
{
uchar LED;//LED灯输出变量
Uart_Init();
RS_String("Writing Data to AT24C02 .... Address = 0x00 \n");
WrToROMs(EEPROM_WriteBuffer,0x00,sizeof(EEPROM_WriteBuffer));//向AT24C02写入数据,起始地址0x00
delay(50000);
{
P0 = (LED << i);//按照原理图,单片机输出低电平时,LED发光
delay(10000);//延时
}
LED = 0x7f;//高位向低位流动
for(i=0;i<8;i++)
{
P0 = (LED >> i);//按照原理图,单片机输出低电平时,LED发光
delay(10000);//延时
#include <intrins.h>
//宏定义
#define uchar unsigned char
#define uint unsigned int
//引脚定义
sbit Scl= P3^6;//AT24C0x串行时钟
sbit Sda= P3^7;//AT24C0x串行数据
//全局变量
uchar EEPROM_WriteBuffer[] = {""};
串口输出数据,串口是单片机程序调试种
最常用最重要的工具。在使用前需要主要
开发板当前晶振频率是否为11.0592MHz,如
不是,请更换晶振,或者自行计算定时器
数值。
时间:2011-8-23
******************************************/
//头文件
#include "reg51.h"
RS_String("We got message text is : \"");
RS_String(EEPROM_ReadBuffer);
RS_String("\" \n");
RS_String("Going to Main Loop.. \n");
while(1)//主程序循环
{
uchar i;//循环变量
//I2C起始位
void Start(void)
{
Sda=1;
Scl=1;
_nop_();_nop_();_nop_();_nop_();
Sda=0;
_nop_();_nop_();_nop_();_nop_();
}
//I2C停止位
void Stop(void)
{
Sda=0;
Scl=1;
_nop_();_nop_();_nop_();_nop_();
//RI = 0;
//REN = 1;
}
//------------------------------------------------串口显示----------------------------------------------------------
/******************************************/
//毫秒级延时子函数
void mDelay(uchar j)
{
uchar i;
for(;j>0;j--)
for(i=0;i<125;i--);
}
//------------------------------------------------串口初始化------------------------------------------------------
RS_String(" Bytes ! \n ");
delay(50000);
RS_String("Reading Data form AT24C02....Address = 0x00 \n");
RdFromROM(EEPROM_ReadBuffer,0x00,sizeof(EEPROM_WriteBuffer));//从AT24C02读取数据,起始地址0x00
delay(10000);//延时
}
LED = 0x80;
for(i=0;i<8;i++) //低位向高位流动
{
P0 = ~(LED >> i);//按照原理图,单片机输出低电平时,LED发光
delay(10000);//延时
}
LED = 0xfe;//高位向低位流动
for(i=0;i<8;i++)
Stop();
}
}
//------------------------------------------------串口初始化------------------------------------------------------
void Uart_Init( void )
{//波特率9600
Ack();
Send(Address);//发送地址
Ack();
for(i=0;i<Num;i++)
{
Send(iData[i]);
Ack();
}
Stop();
mDelay(4); //延时4ms。。。。
}
//I2C读取多个字节数据
void RdFromROM(uchar Data[],uchar Address,uchar Num)
RS_String("Uart Initializing...... \n");
delay(50000);
RS_String("Uart Initializing Finished !! \n");
delay(50000);
RS_String("Welcome to use Green Shield Products ! \n");
uchar temp;//中间变量控制
do
{
temp=Data;
Scl=0;
_nop_();_nop_();_nop_();_nop_();
if((temp&0x80)==0x80)//如果最高位是1
Sda=1;
else
Sda=0;
Scl=1;
temp=Data<<1;//RLC
Data=temp;
{
uchar i;
uchar *PData;
PData=Data;
for(i=0;i<Num;i++)
{
Start();
Send(0xa0);
Ack();
Send(Address+i);
Ack();
Start();
Send(0xa1);
Ack();