0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

数据存储芯片AT24C02简介

CHANBAEK 来源:CSDN-_会飞_的鱼 作者:CSDN-_会飞_的鱼 2023-03-07 14:55 次阅读

一. 芯片简介

AT24C02是一个2K位串行CMOS E2PROM,内部含有256个8位字节,采用先进CMOS技术实质上减少了器件的功耗。 AT24C02有一个8字节页写缓冲器,该器件通过IIC总线接口进行操作,有一个专门的写保护功能。

二. 芯片参数

1.特点

  • 工作电压:1.8V~5.5V;
  • 低功耗CMOS技术,工作电流1mA,待机电流1uA;
  • 应用在内部结构:128x8(1K),256x8(2K),512x8(4K),1024x8(8K),2048x8(16K);
  • 二线串行接口,支持标准IIC通信协议;
  • 双向数据传输协议;
  • 兼容 400KHz传输速率(1.8V,2.5V,2.7V,3.6V);
  • 支持硬件写保护功能;
  • 擦出次数可达10000次;
  • 存储数据时间超过100年;

2.引脚定义

截图20230301181839.png

A0-A2引脚为芯片地址,用于多器件工作模式; SDA、SCL分别为IIC通信的数据线和时钟线; WP为写保护引脚,当该引脚接 GND 时,允许正常的读/写操作。 当该引脚接 VCC 时,芯片启动写保护功能;

3.参考电路

截图20230301181839.png

A0-A2接到GND上,地址固定为0; SCL、SDA引脚内部为开漏输出,所以需接上拉电阻; WP引脚接GND,表示芯片可读可写。

三. 通信接口

1.芯片读写地址

在进行I2C通信时,主机发送启动信号后,再发送寻址信号。 器件的地址有7位和10位,以7为地址寻址为例; 寻址信号由一个字节构成,高7位为地址位,最低位为方向位,用来表示主机与从器件的数据传输方向;

方向位0代表主机接下来对从器件进行写操作; 方向位为1,表明主机接下来对器件进行读操作。

截图20230301181839.png

如上图,AT24C02的高4位是固定的,为1010b,低3位则由A0/A1/A2信号线的电平决定。 按照我们此处的连接, A0/A1/A2 均为 0,所以 EEPROM 的 7 位设备地址是:1010 000b ,即 0x50。

由于 I2C 通讯时常常是地址跟读写方向连在一起构成一个 8 位数,且当R/W 位为 0 时,表示写方向,所以加上 7 位地址,其值为“ 0xA0”,常称该值为 I2C 设备的“写地址”; 当 R/W 位为 1 时,表示读方向,加上 7 位地址,其值为“ 0xA1”,常称该值为“读地址”。

A0/A1/A2输入脚用于多个器件级联时设置器件地址,当这些脚悬空时默认值为0。 当使用AT24C02 时最大可级联8个器件。 如果只有一个AT24C02被总线寻址,这三个地址输入脚(A0、A1、A2 )可悬空(接地也可以)或连接到Vss,如果只有一个AT24C01被总线寻址这三个地址输入脚(A0、A1、A2 )必须连接到Vss。

2.IIC通信

由于51单片机内部无集成IIC控制硬件资源,所以需要软件模拟IIC通信。 函数有四个,分别为IIC起始信号、IIC停止信号、IIC读取字节、IIC写入字节等函数。

/*********************IIC.h*************************************/


//--定义使用的IO口--//
sbit I2C_SCL = P2^1;
sbit I2C_SDA = P2^0;




//--声明全局变量--//
void I2C_Delay10us();
void I2C_Start();           //起始信号:在I2C_SCL时钟信号在高电平期间I2C_SDA信号产生一个下降沿
void I2C_Stop();            //终止信号:在I2C_SCL时钟信号高电平期间I2C_SDA信号产生一个上升沿
uchar I2C_SendByte(uchar dat, uchar ack);//使用I2c读取一个字节
uchar I2C_ReadByte();       //通过I2C发送一个字节。在I2C_SCL时钟信号高电平期间,保持发送信号I2C_SDA保持稳定




/*********************IIC.c*************************************/




//延时:1us
void I2C_Delay10us()
{
  uchar a, b;
  for(b=1; b>0; b--)
  {
    for(a=2; a>0; a--);
  }
}




// 起始信号:在I2C_SCL时钟信号在高电平期间I2C_SDA信号产生一个下降沿
void I2C_Start()
{
  I2C_SDA = 1;
  I2C_Delay10us();
  I2C_SCL = 1;
  I2C_Delay10us();//建立时间是I2C_SDA保持时间>4.7us
  I2C_SDA = 0;
  I2C_Delay10us();//保持时间是>4us
  I2C_SCL = 0;      
  I2C_Delay10us();    
}




//终止信号:在I2C_SCL时钟信号高电平期间I2C_SDA信号产生一个上升沿
void I2C_Stop()
{
  I2C_SDA = 0;
  I2C_Delay10us();
  I2C_SCL = 1;
  I2C_Delay10us();//建立时间大于4.7us
  I2C_SDA = 1;
  I2C_Delay10us();    
}




//通过I2C发送一个字节。在I2C_SCL时钟信号高电平期间, 保持发送信号I2C_SDA保持稳定
uchar I2C_SendByte(uchar dat, uchar ack)
{
  uchar a = 0,b = 0;//最大255,一个机器周期为1us,最大延时255us。
  for(a=0; a<8; a++)//要发送8位,从最高位开始
  {
    I2C_SDA = dat >> 7;   //起始信号之后I2C_SCL=0,所以可以直接改变I2C_SDA信号
    dat = dat << 1;
    I2C_Delay10us();
    I2C_SCL = 1;
    I2C_Delay10us();//建立时间>4.7us
    I2C_SCL = 0;
    I2C_Delay10us();//时间大于4us    
  }
  I2C_SDA = 1;
  I2C_Delay10us();
  I2C_SCL = 1;
  while(I2C_SDA && (ack == 1))//等待应答,也就是等待从设备把I2C_SDA拉低
  {
    b++;
    if(b > 200)   //如果超过200us没有应答发送失败,或者为非应答,表示接收结束
    {
      I2C_SCL = 0;
      I2C_Delay10us();
      return 0;
    }
  }
  I2C_SCL = 0;
  I2C_Delay10us();
   return 1;    
}




// 使用I2c读取一个字节
uchar I2C_ReadByte()
{
  uchar a = 0,dat = 0;
  I2C_SDA = 1;      //起始和发送一个字节之后I2C_SCL都是0
  I2C_Delay10us();
  for(a=0; a<8; a++)//接收8个字节
  {
    I2C_SCL = 1;
    I2C_Delay10us();
    dat <<= 1;
    dat |= I2C_SDA;
    I2C_Delay10us();
    I2C_SCL = 0;
    I2C_Delay10us();
  }
  return dat;    
}

.控制程序

实现了基本IIC通讯函数后,就可对AT24C02进行操作,主要是写入数据和读取数据两个函数。

芯片寻址可对内部256B中的任一个进行读/写操作,其寻址范围为00FF,共256个寻址单位。 所以可任意在00FF地址写入我们需要保存的数据。

1.AT24C02写入数据

时序顺序为: 发送开始信号,IIC启动->发送器件地址,其中读写标志位为写->发送器件内部存储地址->向器件中写入数据->发送停止信号,IIC停止;

//函数功能 : 往24c02的一个地址写入一个数据
void At24c02Write(unsigned char addr,unsigned char dat)
{
  I2C_Start();
  I2C_SendByte(0xa0, 1);//发送写器件地址
  I2C_SendByte(addr, 1);//发送要写入内存地址
  I2C_SendByte(dat, 0);  //发送数据
  I2C_Stop();
}

2.AT24C02读取数据

时序顺序为: 发送开始信号,IIC启动->发送器件地址,其中读写标志位为写->发送器件内部->发送开始信号,IIC再次启动->发送器件地址,其中读写标志位为读->从器件读出数据->返回所读取的数据;

截图20230301181839.png

// 函数功能 :读取24c02的一个地址的一个数据
unsigned char At24c02Read(unsigned char addr)
{
  unsigned char num;
  I2C_Start();
  I2C_SendByte(0xa0, 1); //发送写器件地址
  I2C_SendByte(addr, 1); //发送要读取的地址
  I2C_Start();
  I2C_SendByte(0xa1, 1); //发送读器件地址
  num=I2C_ReadByte(); //读取数据
  I2C_Stop();
  return num;  
}

3.AT24C02读写数据

实现以上的读写功能,就可以使用AT24C02来实现我们需要的功能。 功能为:使用按键1,写入num0; 按键2,读取num0; 按键3,使num0加1; 按键4,清零num0;

void main()
{
  unsigned int num0 = 0,num1 = 0,num2 = 0,n;




  LcdInit();
  while(1)
  {
    if(K1 == 0)     //按键1按下,将num0写入eeprom
    {
      Delay10ms(1);
      if(K1 == 0)
        {At24c02Write(2,num0);
        At24c02Write(3,num0);}
      while((n < 20)&&(K3==0))
      {
        n++;
        Delay10ms(1);  
      }      
      n=0;
      n=0;
    }
    if(K2 == 0)     //按键2按下,读取eeprom数据
    {
      Delay10ms(1);
      if(K2 == 0)
        {num1 = At24c02Read(2);
        num2 = At24c02Read(3);  }
      while((n < 20)&&(K2 == 0))
      {
        n++;
        Delay10ms(1);  
      }      
      n=0;
    }      
    if(K3 == 0)     //按键3按下,使num0自加1
    {
      Delay10ms(1);
      if(K3 == 0)
        num0++;
      while((n < 50)&&(K3 == 0))
      {
        n++;
        Delay10ms(1);  
      }      
      n=0;
      if(num0==256)
        num0=0;
    }
    if(K4 == 0)     //按键4按下,清零
    {
      Delay10ms(1);
      if(K4 == 0)
        num0 = 0;
      while((n < 50) && (K4 == 0))
      {
        n++;
        Delay10ms(1);  
      }      
      n=0;
    }
    LCD_Display();  
  }
}
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 接口
    +关注

    关注

    33

    文章

    7639

    浏览量

    148495
  • 缓冲器
    +关注

    关注

    6

    文章

    1566

    浏览量

    44879
  • 数据存储
    +关注

    关注

    5

    文章

    895

    浏览量

    50584
  • 存储芯片
    +关注

    关注

    11

    文章

    796

    浏览量

    42451
收藏 人收藏

    评论

    相关推荐

    直插AT24C02存储芯片认识与使用#pcb设计

    fpga芯片存储芯片24CAT24C02
    jf_97106930
    发布于 :2022年08月27日 10:00:34

    at24c02数据存储和读写的子程序

    at24c02数据存储和读写的子程序,用汇编语言,谢谢,非常感谢咱们论坛的高手
    发表于 05-22 16:38

    如何保存float型数据AT24C02或flash 存储芯片

    chat和int型数据保存到AT24C02或flash芯片中,这个好办,但是如何保存float型数据AT24C02或flash
    发表于 02-07 00:14

    【OneNET麒麟座试用体验】6.EEPROM存储AT24C02的使用

    AT24C02是一款EEPROM存储芯片存储大小只有256字节,没有听错,就是字节,相比我们512K的Flash,那么这么小的空间能干什么呢? 因为Flash只能整页擦出再重新写,而且Flash
    发表于 04-01 10:36

    AT24C02的使用

    在I2C总线这块,使用AT24C02作为存储器,作用就是存储密码,但是不是很理解其中说的器件地址是啥意思,目前就是一个AT24C02与单片机
    发表于 05-14 17:36

    AT24C02芯片硬件电路设计原理

    视频讲解AT24C02的电源电压范围是1.7V~5.5V,存储空间是256×8(2K),存储读写操作是I2C通信。AT24C01
    发表于 09-23 08:58

    AT24C02芯片工作原理是什么

    AT24C02芯片工作原理在IIC通信时,一般有写和读两种操作,我们用AT24C02来具体讲解。AT24C02芯片工作原理
    发表于 07-29 09:04

    如何使用IIC总线和AT24C02存储芯片去读写代码呢

    AT24C02存储芯片有哪些功能特性?IIC总线有哪些特征呢?如何使用IIC总线和AT24C02存储芯片去读写代码呢?
    发表于 11-25 06:45

    AT24C02的相关资料推荐

    AT24C02(I2C总线)_AT24C02数据存储&秒表(定时器扫描按键数码管)小白极客的51单片机笔记(自用)第一部分—
    发表于 12-10 06:15

    如何解决AT24C02数据读取问题的

    AT24C02的读写操作**说明:**最近我在做基于EEPROM存储24c02存储的电子锁时遇到了一些问题:每次向24C02写入
    发表于 01-12 07:08

    读写AT24C02 并显示

    关于AT24C02存储芯片的介绍,便于各位查阅
    发表于 05-16 17:38 11次下载

    EEPROM存储芯片AT24C02芯片手册

    EEPROM存储芯片AT24C02芯片手册(嵌入式开发培训需要学多久)-EEPROM存储芯片AT24C02
    发表于 07-30 13:20 178次下载
    EEPROM<b class='flag-5'>存储芯片</b><b class='flag-5'>AT24C02</b><b class='flag-5'>芯片</b>手册

    蓝桥杯单片机——AT24C02存储

    为基础)AT24C02存储器容量为256*8(2kB),通信接口采用双线串行接口(SCL时钟线、SDA串行数据线);双线数据传送协议为:ISO/IEC7816-3同步协议。写字节时序:
    发表于 11-23 17:36 27次下载
    蓝桥杯单片机——<b class='flag-5'>AT24C02</b><b class='flag-5'>存储</b>器

    单片机驱动AT24C02存储芯片手册

    AT24C02是一个2K位串行CMOS E2PROM, 内部含有256个8位字节,CATALYST公司的先进CMOS技术实质上减少了器件的功耗。AT24C02有一个8字节页写缓冲器。该器件通过IIC总线接口 进行操作,有一个专门的写保护功能。
    发表于 08-29 10:07 2次下载

    Linux驱动开发-编写(EEPROM)AT24C02驱动

    AT24C02是IIC接口的EEPROM存储芯片,这颗芯片非常经典,百度搜索可以找到非常多的资料,大多都是51、STM32单片机的示例代码,大多采用模拟时序、裸机系统运行。当前文章介绍在Linux
    的头像 发表于 09-17 15:29 3022次阅读
    Linux驱动开发-编写(EEPROM)<b class='flag-5'>AT24C02</b>驱动