AT24C02(IIC)原理及应用详解:一篇文章带你全面了解

AT24C02

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

主要特点:

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

芯片管脚图如下

图一
![在这里插入图片描述](https://i3.wp.com/i-blog.csdnimg.cn/direct/35621ca335724b40bd6ae105612fb591.png
图二
该图来自芯片手册中,简单介绍一下各个引脚的功能

  • A0、A1、A2:器件地址选择
  • SDA:数据线
  • SCL:时钟线
  • WP:写保护线(如果WP管脚连接到Vcc,所有的内容都被写保护只能读。当WP管脚连接到Vss or GND 或悬空允许器件进行正常的读/写操作)
  • IIC通信协议

    iic为主从通信协议,采用一主多从模式即一个主机控制多个从机

    图三
    从机都挂载在时钟线和数据线上,每个从机都有所对应的通信地址
    AT24C02的通信地址由芯片地址地址控制字控制字组成
    芯片地址:芯片手册得知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;    
    }
    

    接下来就是发送7位地址码(还有一位是读写位),理论上可以挂载128个从机设备
    (信号读取规则为时钟线高电平期间读取数据线上的数据)

    //发送一个字节
    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写入

    AT24C02读取

    代码如下所示

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

    以上代码都是基于这种接发编写 通信地址为0xA0,写保护为0关闭状态

    作者:脑袋空空1

    物联沃分享整理
    物联沃-IOTWORD物联网 » AT24C02(IIC)原理及应用详解:一篇文章带你全面了解

    发表回复