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

管脚描述
管脚名称
功能
A0 A1 A2
器件地址选择
SDA
串行数据/地址
SCL
串行时钟
WP
写保护
Vcc
+1.8V~ 6.0V 工作电压
Vss

了解了什么是AT24C02之后,我们具体要如何来操作它呢?

操作它之前,我们先来了解一下I2C总线,什么是I2C总线?

I2C总线(I2C bus,Inter-IC bus)是一个双向的两线连续总线,提供集成电路(ICs)之间的通信线路。I2C总线是一种串行扩展技术,最早由Philips公司推出,广泛应用于电视,录像机和音频设备。I2C总线的意思是“完成集成电路或功能单元之间信息交换的规范或协议”。Philips公司推出的I2C总线采用一条数据线(SDA),加一条时钟线(SCL)来完成数据的传输及外围器件的扩展;对各个节点的寻址是软寻址方式,节省了片选线,标准的寻址字节SLAM为7位,可以寻址127个单元。

I2c总线的模拟方法:

SDA:数据线

SCL:时钟线

1、I2C起始信号:这里是SDA先开始,都为高电平

- SCL是高电平,而SDA是由低电平变为高电平,建立SDA保持的时间要>4.7us

-- 在SCL的时钟信号在高电平期间SDL信号产生一个下降沿。
起始之后的SDL和SCL都为0,同样保持时间也要>4.7us

2、I2C停止信号:这里是SDA先,SDA之前是低电平

SCL高电平期间,SDA线由低电平向高电平的变化表示终止信号
- 当SCL高电平的时候,SDA要产生一个上升沿,SDA产生上跳沿之前是低电平,
建立从低电平到高电平这个期间,时间间隔要大于4us

3、逻辑"1"和逻辑"0"表示:
逻辑"0"。注意在SCL跳变读取期间,要保持SDA的稳定
         这是因为I2C总线读取数据SCL为高电平

如何发送一个字节:

1、首先发数据每次都是发一个字节,一个字节有8位的数据,所以我们需要定义一个8位的代表数据的变量,最可靠的就是unsigned char
   发数据的时候是一位一位的发,所以需要有一个循环来发,发送数据发8位要从最高位开始,所以要将数据线偏移到最高的位置也就是
   要右移7位,可以这么理解,看下图:

刚开始,dat表示:10000000  ,dat表示1
   现在要将dat偏移到最高位,那么dat要干掉所有的0,也就是要右移7位
   10000000 >> 7  =  1;

接着再循环将dat重新一位一位的往左移,也就是从高位移到地位 1 << 7 = 10000000 for(dat = 0 ; dat < 8 ; dat++);

如何接受一个字节:

1、接受和发送其实是一样的,区别在于发送是写数据,而接受是读数据

接下来我们来看看AT24C02的操作方法.

AT24C02的操作方法:

1 、24C02的硬件连接方法:
    引脚1、2、3、4接地线,7脚WE低电平有效
    6脚是时钟线,5脚是数据线
2、写入过程:
    1、发送器件地址
    2、发送要写入24C02的内存地址
    3、发送要写入的数据
发送器件地址的格式
__________________________________
|                             _  |
| 1 0  1  0   A2  A1  A0  R/W   |
|_________________________________|

高四位1010是24CXX系列的固定器件地址,接下来是
A2、A1、A0是根据器件连接来决定的,我们的原理图
都接地所以是000,R/W为是选择读还是写,1的时候是读
0的时候是写,所以些的地址为0xA0

3、读出过程:
    1、发送写入的器件地址(0xA0)
    2、发送要读的24C02的内存地址
    3、发送读出的器件地址(0xA1)
    4、独取数据

当读取的时候,地址的最后一位R/W位是选择读,也就是该位为1,
所以读取的地址是0xA1

接下来用51单片机来写一个驱动程序:

/*--------------------------------------------------------------------------
I2C.H这个头文件主要是模拟I2C总线的发送和接收还有AT24C02的使用,
因为51单片机本身不带有I2C的总线的功能。本文件分为以下6个接口:1、I2C总线的起始信号2、I2C总线的结束信号3、I2C总线发送数据4、I2C总线接收数据5、AT24C02写数据6、AT24C02读数据日期:2015年9月27日开发者:杨源鑫备注:用户在使用该程序模块的时候只需调用最后两个函数即可,也就是AT24C02的函数。
--------------------------------------------------------------------------*/#ifndef __I2C_H
#define __I2C_H
#include <reg51.h>
#include "i2c.h"sbit SCL=P2^1;      //时钟线
sbit SDA=P2^0;    //地址线/*** 函数: void At24c02Write(unsigned char addr,unsigned char dat);* 函数功能:AT24C02写数据.* 使用方法:用户想要往里写数据的话就调用本函数,传入地址和数据即可**/void At24c02Write(unsigned char addr,unsigned char dat);/*** 函数: unsigned char At24c02Read(unsigned char addr);* 函数功能:AT24C02读数据.* 使用方法:用户想要读数据的话就调用本函数,传入地址即可**/unsigned char At24c02Read(unsigned char addr);/*** 函数: void I2C_Start_signal(void);* 函数功能:I2C总线的起始信号**/void I2C_Start_signal(void);/*** 函数: void I2C_Stop_signal(void);* 函数功能:I2C总线的结束信号**/void I2C_Stop_signal(void);/*** 函数: unsigned char I2C_SendByte(unsigned char dat, unsigned char ack);* 函数功能:I2C总线的写数据**/unsigned char I2C_SendByte(unsigned char dat, unsigned char ack);/*** 函数: unsigned char I2cReadByte();* 函数功能:I2C总线的读数据**/
unsigned char I2cReadByte();/*** 函数: void Delay10us();* 函数功能:10us延时**/void Delay10us();#endif   //__I2C_H
#include "i2c.h"/*******************************************************************************
* 函数名         : Start_signal(void)
* 函数功能       : I2C总线起始信号
* 输入           : 无
* 输出             : 无
*******************************************************************************/void I2C_Start_signal(void)
{SDA = 1 ;Delay10us();SCL = 1 ;Delay10us();SDA = 0 ;Delay10us();SCL = 0 ;Delay10us();
}/*******************************************************************************
* 函数名         : Start_signal(void)
* 函数功能       : I2C总线终止信号
* 输入           : 无
* 输出             : 无
*******************************************************************************/void I2C_Stop_signal(void)
{SDA = 0 ;Delay10us();SCL = 1 ;Delay10us();Delay10us();SDA=1;Delay10us();
}/*******************************************************************************
* 函数名         : I2C_SendByte(unsigned char dat, unsigned char ack)
* 函数功能       : I2C总线发送数据
* 输入           : dat,一个字节的数据
* 输出             : 发送成功返回1,发送失败返回0
* 备    注       : 发送完一个字节I2C_SCL=0, 需要应答则应答设置为1,否则为0
*******************************************************************************/unsigned char I2C_SendByte(unsigned char dat, unsigned char ack)
{unsigned char a = 0,b = 0;//最大255,一个机器周期为1us,最大延时255us。
Replay:b = 0 ;         for(a=0; a<8; a++)//要发送8位,从最高位开始{SDA = dat >> 7;     //起始信号之后I2C_SCL=0,所以可以直接改变I2C_SDA信号dat = dat << 1;Delay10us();SCL = 1;Delay10us();//建立时间>4.7usSCL = 0;Delay10us();//时间大于4us        }SDA = 1;Delay10us();SCL = 1;while(SDA && (ack == 1))//等待应答,也就是等待从设备把I2C_SDA拉低{b++;if(b > 200)   //如果超过200us没有应答发送失败,或者为非应答,表示接收结束{SCL = 0;Delay10us();//    return 0;goto Replay ;   //如果超过200us没有应答则发送失败,或者为非应答,这时候系统启动重发机制//使用goto语句返回到上面接着发}}SCL = 0;Delay10us();return 1;
}/*******************************************************************************
* 函数名         : I2cReadByte()
* 函数功能       : I2C总线接收数据
* 输入           : 无
* 输出             : dat,数据
*******************************************************************************/unsigned char I2cReadByte()
{unsigned char a=0,dat=0;SDA=1;          Delay10us();for(a=0;a<8;a++)//接收8个字节{SCL=1;Delay10us();dat<<=1;dat|=SDA;Delay10us();SCL=0;Delay10us();}return dat;
}/*******************************************************************************
* 函数名         : Delay10us()
* 函数功能       : 延时
* 输入           : 无
* 输出             : 无
*******************************************************************************/void Delay10us()
{unsigned char a,b;for(b=1;b>0;b--)for(a=2;a>0;a--);
}/*******************************************************************************
* 函 数 名         : void At24c02Write(unsigned char addr,unsigned char dat)
* 函数功能         : 往24c02的一个地址写入一个数据
* 输    入         : 地址和数据
* 输    出         : 无
*******************************************************************************/void At24c02Write(unsigned char addr,unsigned char dat)
{I2C_Start_signal();I2C_SendByte(0xa0, 1);//发送写器件地址I2C_SendByte(addr, 1);//发送要写入内存地址I2C_SendByte(dat, 0);   //发送数据I2C_Stop_signal();}/*******************************************************************************
* 函 数 名         : unsigned char At24c02Read(unsigned char addr)
* 函数功能         : 读取24c02的一个地址的一个数据
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/unsigned char At24c02Read(unsigned char addr)
{unsigned char num;I2C_Start_signal();I2C_SendByte(0xa0, 1); //发送写器件地址     1010   0000I2C_SendByte(addr, 1); //发送要读取的地址I2C_Start_signal();I2C_SendByte(0xa1, 1); //发送读器件地址num=I2cReadByte(); //读取数据I2C_Stop_signal();return num;
}

单片机驱动AT24C02存储芯片相关推荐

  1. 单片机驱动DM9000网卡芯片(详细调试过程)【下】

    http://hi.baidu.com/mcu8031/blog/item/c95903138671c625dc540171.html 单片机驱动DM9000网卡芯片(详细调试过程)[下] 4.验证初 ...

  2. 单片机led闪烁代码_单片机驱动LED发光二极管的电路以及编程

    一.单片机驱动单个发光二极管 1.电路 代码: 1.点亮单个LED二极管 #include<reg51.h> sbit LED1=P1^0:void main(void){LED1=1:w ...

  3. Linux驱动(3)--单片机驱动与Linux驱动的区别

    单片机驱动与Linux驱动的区别 1. MCU与MPU的区别 2. 单片机驱动与Linux驱动的区别 1. MCU与MPU的区别 首先我们先聊一下MCU与MPU之间的区别然后在去关心两者的驱动的不同. ...

  4. 控制led闪烁次数_单片机驱动LED灯的进阶之路

    对于大多数单片机的学习者或者是从事单片机行业的工程师来说,单片机驱动LED闪烁起来的时候,基本都是我们入坑的开始,同时当时的那种兴奋与喜悦都是难以忘怀的,从LED灯亮起,到闪烁,再到各种流水灯,能开心 ...

  5. K_A08_004 基于 STM32等单片机驱动MX1919模块按键控制直流电机正反转加减速启停

    目录 一.资源说明 二.基本参数 1.参数 2.引脚说明 三.驱动说明 1.MX1919模块驱动时序 2.对应程序: 3.PWM信号 四.部分代码说明 接线说明 1.STC89C52RC+MX1919 ...

  6. 【经验分享】调试STM32F107VC单片机驱动DP83848以太网PHY芯片时遇到的问题

    调试时使用的程序:https://blog.csdn.net/ZLK1214/article/details/105457370 [杜邦线(或普通电线)影响时钟信号的完整性] 笔者调试STM32F10 ...

  7. firefly-rk3288开发板Linux驱动——AT24C02 E2PROM驱动

    一.Linux I2C设备体系 Linux源码中I2C驱动目录介绍: 目录/文件 介绍 i2c-core.c I2C核心功能以及proc/bus/i2c*接口 i2c-dev.c I2C适配器的设备文 ...

  8. 【解决方案】STM32L152单片机驱动段码LCD屏,执行HAL_LCD_Init函数失败返回HAL_TIMEOUT,长时间卡在LCD_FLAG_RDY的while循环里面的解决办法

    STM32L152单片机驱动段码LCD屏,HAL_LCD_Init函数执行失败,卡在LCD_FLAG_RDY里面,函数返回HAL_TIMEOUT /*!< Wait Until the LCD ...

  9. 按键控制c51单片机驱动unl2003控制步进电机正反转停止及程序调速-萌新入门

    ** 按键控制c51单片机驱动unl2003控制步进电机正反转停止及程序调速 ** 分享一个萌新入门小工程 一.原件连接: 第一种直接用51开发板 第二种用最小单元加unl2003驱动 二.开发板电路 ...

最新文章

  1. mysql导入600万数据_mysql如何导出600万条记录的数据表?
  2. 从计算机视觉的小白变为大神,你需要经历这七个阶段
  3. 函数调用oracle,oracle 函数调用
  4. python中的format什么意思中文-python的format什么意思
  5. 【C++】 C++标准模板库(九) Bitsets
  6. JavaScript Select和Option列表元素上下左右移动
  7. 90 % Java 程序员被误导的一个性能优化策略
  8. 出现画面抖动_连续抖动20小时!虎门大桥桥面如波浪翻滚,专家:个人感觉没问题...
  9. 关于putty连接服务器提示server unexpectedly closed connection解决方法
  10. 从图(Graph)到图卷积(Graph Convolution):漫谈图神经网络模型 (一)
  11. 8-1 数据结构图的主要遍历实验流程图_ReactDOM渲染流程图
  12. linux删除几日的文件脚本,Windows Linux 删除N天之前文件脚本
  13. SVM 学习心得
  14. poj 动态规划总结
  15. 在Ubuntu下安装ros
  16. 1400+款调色预设LR/PS/PR/FCPX/达芬奇lightroom滤镜LUT素材
  17. VEP视频文件怎么转换成普通视频文件mp4
  18. 机器视觉实验一(matlab实现)
  19. 投资学翻译2 Digesting Anomalies An Investment Approach
  20. DHCP与DHCP中继

热门文章

  1. G2调整legend文字的字体颜色
  2. csr_matrix矩阵压缩
  3. 亲自部署LIO-SAM、LVI-SAM的全过程经历01——跑通
  4. 基于SSH的硬件销售管理系统
  5. 推动量子计算与AI融合,飞桨成为中国首个支持量子机器学习的深度学习平台...
  6. 【4】单机游戏序列化与反序列化
  7. Chrome插件MV3简单开发
  8. 清除系统LJ(绿色单文件版)
  9. 2022-2028全球与中国紫外线发生器市场现状及未来发展趋势
  10. Vue初入,了解Vue的发展与优缺点