问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

一文看懂AT24C02(IIC)的原理及应用

创作时间:
作者:
@小白创作中心

一文看懂AT24C02(IIC)的原理及应用

引用
CSDN
1.
https://m.blog.csdn.net/m0_74219261/article/details/140733081

AT24C02是一款常用的I2C总线串行EEPROM芯片,广泛应用于各种嵌入式系统中。本文将详细介绍AT24C02的硬件特性、I2C通信协议以及具体的代码实现,帮助读者快速掌握其原理及应用。

AT24C02简介

AT24C02是一个2K位串行CMOS E2PROM,内部含有256个8位字节。CATALYST公司的先进CMOS技术显著降低了器件的功耗。AT24C02具有16字节页写缓冲器,通过I2C总线接口进行操作,并提供专门的写保护功能。

主要特点

  • 存储容量:2 Kbit(256 字节),适合保存小块配置数据或用户设置。
  • 接口类型:I2C,支持7位总线地址,允许多个EEPROM挂载在同一总线上。
  • 电源电压:工作电压范围为1.8V至5.5V,适应不同电源要求。
  • 操作温度范围:-40°C至+85°C,适用于各种环境。
  • 数据保持时间:高达100年,确保数据长期可靠保存。
  • 写入时间:典型写入时间约为5ms,适合需要快速更新的应用。
  • 写保护:芯片具有写保护功能,防止意外数据修改。

芯片管脚图


图一


图二

各引脚功能说明:

  • A0、A1、A2:器件地址选择
  • SDA:数据线
  • SCL:时钟线
  • WP:写保护线(连接Vcc时写保护,连接Vss或悬空时可读写)

I2C通信协议

I2C是一种主从通信协议,支持一主多从模式。所有从机都挂载在时钟线和数据线上,每个从机都有对应的通信地址。

AT24C02的通信地址由芯片地址和控制字组成:

  • 芯片地址:固定为1010(高四位)
  • 控制字:由A2、A1、A0和R/W组成
  • 形成八位二进制编码:1010A2A1A0R/W(R/W为0时为读,1为写)

通信流程


通讯开始时时钟线高电平期间数据线拉低

代码实现

起始信号

void I2CStart(void)
{
    sda = 1;
    scl = 1;
    I2C_Delay(DELAY_TIME);
    sda = 0;
    I2C_Delay(DELAY_TIME);
    scl = 0;    
}

发送一个字节

void I2CSendByte(unsigned char byt)
{
    unsigned char i;
    for(i=0; i<8; i++){
        scl = 0;
        I2C_Delay(DELAY_TIME);
        if(byt & 0x80){
            sda = 1;
        }
        else{
            sda = 0;
        }
        I2C_Delay(DELAY_TIME);
        scl = 1;
        byt <<= 1;
        I2C_Delay(DELAY_TIME);
    }
    scl = 0;  
}

接收一个字节

unsigned char I2CReceiveByte(void)
{
    unsigned char da;
    unsigned char i;
    for(i=0;i<8;i++){   
        scl = 1;
        I2C_Delay(DELAY_TIME);
        da <<= 1;
        if(sda) 
            da |= 0x01;
        scl = 0;
        I2C_Delay(DELAY_TIME);
    }
    return da;    
}

等待应答

unsigned char I2CWaitAck(void)
{
    unsigned char ackbit;
    scl = 1;
    I2C_Delay(DELAY_TIME);
    ackbit = sda; 
    scl = 0;
    I2C_Delay(DELAY_TIME);
    return ackbit;
}

发送应答

void I2CSendAck(unsigned char ackbit)
{
    scl = 0;
    sda = ackbit; 
    I2C_Delay(DELAY_TIME);
    scl = 1;
    I2C_Delay(DELAY_TIME);
    scl = 0; 
    sda = 1;
    I2C_Delay(DELAY_TIME);
}

停止信号

void I2CStop(void)
{
    sda = 0;
    scl = 1;
    I2C_Delay(DELAY_TIME);
    sda = 1;
    I2C_Delay(DELAY_TIME);
}

AT24C02写入

void write_at24c02(unsigned char addr,unsigned char date)
{
    I2CStart();
    I2CSendByte(0xA0);
    I2CWaitAck();
    I2CSendByte(addr);
    I2CWaitAck();
    I2CSendByte(date);
    I2CWaitAck();
    I2CStop();
    Delay100ms(); //延时函数必须加
}

AT24C02读取

unsigned char read_at24c02(unsigned char addr)  
{
    unsigned char dat;
    I2CStart();
    I2CSendByte(0xA0);
    I2CWaitAck();
    I2CSendByte(addr);
    I2CWaitAck();
    I2CStart();
    I2CSendByte(0xA1);
    I2CWaitAck();        //发送数据后必须加等待函数
    dat = I2CReceiveByte();
    I2CSendAck(1);      //接收之后必须加一个发送应答
    I2CStop();
    Delay100ms(); //延时函数必须加
    return dat;
}

注意事项

信号在被拉低或置高后,需要加入一定时间的延时来稳定信号,一般为5us。延时代码如下:

#define DELAY_TIME	5
sbit sda = P1^6;
sbit scl = P1^7;
static void I2C_Delay(unsigned char n)
{
    do
    {
        _nop_();_nop_();_nop_();_nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();_nop_();		
    }
    while(n--);      	
}

以上代码基于I2C通信地址0xA0编写,写保护为关闭状态。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号