一.芯片简介

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.引脚定义


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

3.参考电路


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

三.通信接口

1.芯片读写地址

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

如上图,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.7usI2C_SDA = 0;I2C_Delay10us();//保持时间是>4usI2C_SCL = 0;          I2C_Delay10us();
}//终止信号:在I2C_SCL时钟信号高电平期间I2C_SDA信号产生一个上升沿
void I2C_Stop()
{I2C_SDA = 0;I2C_Delay10us();I2C_SCL = 1;I2C_Delay10us();//建立时间大于4.7usI2C_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.7usI2C_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都是0I2C_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再次启动->发送器件地址,其中读写标志位为读->从器件读出数据->返回所读取的数据;

// 读取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();    }
}

如需AT24C02相关资料及例程, 请关注公众号,首页回复AT24C02获取资料

详解数据存储芯片AT24C02的应用及编程相关推荐

  1. oracle 增加ora容量_案例:Oracle报错ORA-01144 详解数据文件大小32GB的限制的原因

    天萃荷净 Oracle数据文件大小的限制,运维DBA在向Oracle数据库添加一个32G的数据文件的时候报错ORA-01144,分析原因为数据库针对文件有32G限制 1.添加数据文件报错ORA-011 ...

  2. 详解数据中心灾备切换技术

    <详解数据中心灾备切换技术> 目录 1.网络切换技术 (1)基于IP地址的切换 (2)基于DNS服务器的切换 (3)基于负载均衡设备的切换 2.应用切换技术 (1)主备集群 (Cluste ...

  3. 4.6 51单片机-EEPROM存储芯片(AT24C02)

    4.6 EEPROM存储芯片(AT24C02) 4.6.1 原理图介绍 图4-6-1 图4-6-2 实验板上的EEPROM型号是AT24C02N,通信接口是IIC,接在单片机的P2.1(SCL)和P2 ...

  4. 深度学习领域最常用的10个激活函数,一文详解数学原理及优缺点

    来源:机器之心.信息网络工程研究中心本文约2400字,建议阅读5分钟本文从激活函数的数学原理出发,详解了十种激活函数的优缺点. 激活函数是神经网络模型重要的组成部分,本文作者Sukanya Bag从激 ...

  5. 神经网络最常用的10个激活函数,一文详解数学原理及优缺点

    激活函数是神经网络模型重要的组成部分,本文从激活函数的数学原理出发,详解了十种激活函数的优缺点. 激活函数(Activation Function)是一种添加到人工神经网络中的函数,旨在帮助网络学习数 ...

  6. 详解数据血缘的「整体设计」与「评价方案」

    数据血缘描述了数据的来源和去向,以及数据在多个处理过程中的转换.数据血缘是组织内使数据发挥价值的重要基础能力.本文从字节的数据链路概况开始,介绍了数据血缘在字节的应用场景,总体设计,数据模型以及衡量指 ...

  7. 6500字详解数据中台,一份完整的数据中台手册!

    内容索引: 1. 数据中台定义 2. 数据中台价值 3. 数据中台VS业务中台 4. 数据中台功能架构 5. 数据中台技术架构 6. 数据中台构建的三大路径 7. 数据中台构建5步法 数据中台定义 数 ...

  8. 详解数组中的reduce方法

    前言 这几天面试被问到了数组的方法有哪些,回答得简直一塌糊涂,面试官说reduce的功能很强大,于是想对这个方法进行总结,在红宝书中对这个方法的描述并不算多,我也是参考了其他文章才进行总结的,下面就开 ...

  9. 福利直播 | 12年阿里巴巴大数据之路亲历者详解数据中台

    疫后新生! 春暖花开之时,生存和发展成为众多企业面临的至急难题. 业务停摆已久,对内如何提升效率,对外如何运营获客? 重新按下启动键,谁能更快补上落后的进度,先人一步? 与自己较量,与对手竞速,在看得 ...

最新文章

  1. 为什么蚂蚁永远不会堵车?
  2. phpstorm 提示请配置PHP解释器的解决办法
  3. 2019年北航OO第四单元(UML任务)及学期总结
  4. 个人笔记:ORACLE大页内存hugepage和SGA、PGA的经验,SGA并不是越大越好
  5. jsp内置对象------session
  6. java程序员招聘现场
  7. java合并list_怎么把两个list合并
  8. 睡眠音频分割及识别问题(十二)--基于IOS的YAMNet音频识别(总结)
  9. ECCV 2020 论文大盘点-视频目标分割篇
  10. 配置TOMCAT和IIS协同工作
  11. TortoiseGit推送
  12. matlab中找不到指定的模块,Matlab装好后启动提示找不到指定模块如何解决?很急...
  13. 第九届蓝桥杯 明码(三种方法)
  14. 太平洋服务器cpu型号,Intel正式发布:新一代6W的超低功耗平台CPU
  15. 计算机图形学:光线追踪原理(ray tracing)
  16. Python周刊488期
  17. 全国最大直男论坛的性感女神翻车了,网友:乔碧萝第二
  18. gpu浮点计算能力floaps_认识GPU浮点计算精度
  19. java纳秒级时间戳_golang的time包:秒、毫秒、纳秒时间戳输出方式
  20. 及时备份数据可以保护计算机系统吗,电脑数据的保护和备份

热门文章

  1. 小米抢购页面源码分析2014年03月11号
  2. 单例模式——一个类只有一个实例
  3. JavaScript 实现搜索框联想功能
  4. 《程序员》卷首语-呼唤明星
  5. Windows XP 如何设置系统自动关机任务
  6. 智慧小区 HC 系统安装配置简单流程(V2022-09-28)
  7. html5游戏开发-零基础开发RPG游戏-开源讲座(三)-卷轴对话实现
  8. KMP经典超简约模板
  9. 【RPC框架、RPC框架必会的基本知识、手写一个RPC框架案例、优秀的RPC框架Dubbo、Dubbo和SpringCloud框架比较】
  10. win10修改中文名为英文名完整版keilmdk安装修改中文名