精华内容
下载资源
问答
  • AT24C02存储芯片C51读写程序。这是I2c的EPROM芯片。按照I2C规则读写,用数码管显示。
  • 单片机驱动AT24C02存储芯片

    万次阅读 多人点赞 2016-02-20 17:35:16
    AT24C02是一个2K位串行CMOS E2PROM, 内部含有256个8位字节,CATALYST公司的先进CMOS技术实质上减少了器件的功耗。AT24C02有一个8字节页写缓冲器。该器件通过IIC总线接口进行操作,有一个专门的写保护功能。 管脚...

    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信号产生一个下降沿。
    起始之后的SDLSCL都为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
    234接地线,7WE低电平有效
        6
    脚是时钟线,5脚是数据线
    2
    、写入过程:
        1
    、发送器件地址
        2
    、发送要写入24C02的内存地址
        3
    、发送要写入的数据
    发送器件地址的格式
    __________________________________
    |                             _  |
    | 1 0  1  0   A2  A1  A0  R/W   |
    |_________________________________|

    高四位101024CXX系列的固定器件地址,接下来是
    A2
    A1A0是根据器件连接来决定的,我们的原理图
    都接地所以是000R/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.7us
    		SCL = 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   0000
    	I2C_SendByte(addr, 1); //发送要读取的地址
    	I2C_Start_signal();
    	I2C_SendByte(0xa1, 1); //发送读器件地址
    	num=I2cReadByte(); //读取数据
    	I2C_Stop_signal();
    	return num;	
    }




    展开全文
  • MCU_AT24C02存储芯片

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

    转自:

    https://blog.csdn.net/morixinguan/article/details/50705428

     

    /*******************************************************************************************************************

    *Author:JYW

    *Time:2019_02_20

    *Describe:学而有益故转以习之

    ***************************************************************************************************/

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

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

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

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

    I2c总线的模拟方法:

    SDA:数据线

    SCL:时钟线

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

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

     

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

     

    如何发送一个字节:

    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、接受和发送其实是一样的,区别在于发送是写数据,而接受是读数据

     

    /*--------------------------------------------------------------------------
    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.7us
            SCL = 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   0000
        I2C_SendByte(addr, 1); //发送要读取的地址
        I2C_Start_signal();
        I2C_SendByte(0xa1, 1); //发送读器件地址
        num=I2cReadByte(); //读取数据
        I2C_Stop_signal();
        return num;    
    }

     

    展开全文
  • 24C02中带有片内地址寄存器。每写入或读出一个数据字节后,该地址寄存器自动加1,以实现对下一个存储单元的读写。所有字节均以单一操作方式读取。为降低总的写入时间,一次操作可写入多达8个字节的数据。;这是将0600...

    24C02中带有片内地址寄存器。每写入或读出一个数据字节后,该地址寄存器自动加1,以实现对下一个存储单元的读写。所有字节均以单一操作方式读取。为降低总的写入时间,一次操作可写入多达8个字节的数据。

    ;这是将0600H地址中以下的8个数据写到24C02的01H为首址单元中去的汇编程序

    ORG 0000H

    SCL BIT P3.4;定义24C02的串行时钟线

    SDA BIT P3.5;定义24C02的串行数据线

    LJMP START

    START:LCALL STAR;调用

    MOV R2,#08H;一个数据有8位

    MOV DPTR,#0600H;定义源数据的位置

    LOOP:MOV A,#00H

    MOVC A,@A+DPTR

    LCALL SDATA

    LCALL ACK

    JC LOOP

    INC DPTR

    DJNZ R2,LOOP

    LCALL STOP;调用停止子程序

    STAR:SETB SDA

    SETB SCL

    NOP

    NOP

    NOP

    NOP

    CLR SDA

    NOP

    NOP

    NOP

    NOP

    CLR SCL

    RET

    SDATA:MOV R0,#08H

    LOOP0:RLC A

    MOV SDA,C

    NOP

    NOP

    SETB SCL

    NOP

    NOP

    NOP

    NOP

    CLR SCL

    DJNZ R0,LOOP0

    RET

    ACK:SETB SDA

    NOP

    NOP

    SETB SCL

    NOP

    NOP

    NOP

    NOP

    MOV C,SDA

    CLR SCL

    RET

    STOP:CLR SDA

    NOP

    NOP

    NOP

    NOP

    SETB SCL

    NOP

    NOP

    NOP

    NOP

    SETB SDA

    NOP

    NOP

    NOP

    NOP

    RET

    ORG 0600H

    DB 0A0H,10H,01H,02H,03H,04H,05H,06H

    END

    读写子程序如下:

    ;写串行E2PROM子程序EEPW

    ; R3=10100000(命令1010+器件3位地址+读/写。 器件地址一个芯片,是000)

    ; (R4)=片内字节地址

    ; (R1)=欲写数据存放地址指针

    ; (R7)=连续写字节数n

    EEPW: MOV P1,#0FFH

    CLR  P1.0  ;发开始信号

    MOV  A,R3  ;送器件地址

    ACALL  SUBS

    MOV  A,R4  ;送片内字节地址

    ACALL SUBS

    AGAIN: MOV A,@R1

    ACALL SUBS ;调发送单字节子程序INC   R1

    DJNZ  R7,AGAIN;连续写n个字节

    CLR    P1.0  ;SDA置0, 准备送停止信号

    ACALL DELAY ;延时以满足传输速率要求

    SETB   P1.1  ;发停止信号

    ACALL DELAY

    SETB   P1.0

    RET

    SUBS: MOV R0,#08H ;发送单字节子程序

    LOOP: CLR P1.1

    RLC  A

    MOV  P1.0,C

    NOP

    SETB P1.1

    ACALL DELAY

    DJNZ R0,LOOP ;循环8次送8个bit

    CLR  P1.1

    ACALL DELAY

    SETB P1.1

    REP: MOV C,P1.0

    JC  REP  ;判应答到否,未到则等待

    CLR  P1.1

    RET

    DELAY: NOP

    NOP

    RET

    ;读串行E2PROM子程序EEPR

    ;(R1)=欲读数据存放地址指针

    ;; R3=10100001(命令1010+器件3位地址+读/写。 器件地址一个芯片,是000)

    ;(R4)=片内字节地址

    ;(R7)=连续读字节数

    EEPR: MOV P1,#0FFH

    CLR  P1.0  ;发开始信号

    MOV  A,R3  ;送器件地址

    ACALL SUBS   ;调发送单字节子程序

    MOV A,R4   ;送片内字节地址

    ACALL SUBS

    MOV P1,#0FFH

    CLR P1.0   ;再发开始信号

    MOV A,R3

    SETB ACC.0  ;发读命令

    ACALL SUBS

    MORE: ACALL SUBR

    MOV @R1,A

    INC R1

    DJNZ R7,MORE

    CLR P1.0

    ACALL DELAY

    SETB P1.1

    ACALL DELAY

    SETB P1.0 ;送停止信号

    RET

    SUBR: MOV  R0,#08H ;接受单字节子程序

    LOOP2: SETB  P1.1

    ACALL DELAY

    MOV C,P1.0

    RLC A

    CLR P1.1

    ACALL DELAY

    DJNZ R0,LOOP2

    CJNE R7,#01H,LOW

    SETB P1.0  ;若是最后一个字节置A=1

    AJMP SETOK

    LOW: CLR P1.0  ;否则置A=0

    SETOK: ACALL DELAY

    SETB  P1.1

    ACALL DELAY

    CLR  P1.1

    ACALL DELAY

    SETB P1.0  ;应答毕,SDA置1

    RET

    程序中多处调用了DELAY子程序(仅两条NOP指令),这是为了满足I2C总线上数据传送速率的要求,只有当SDA数据线上的数据稳定下来之后才能进行读写(即SCL线发出正脉冲)。另外,在读最后一数据字节时,置应答信号为“1”,表示读操作即将完成。

    展开全文
  • 该程序已通过测试,完全可用。整个程序采用模块化编程,用汇编语言编写,易懂,易扩展。
  • 本节来学习I2C接口下的AT24C02存储芯片分析,本节学完后,再来学习Linux下如何使用I2C操作AT24C02 1、I2C通信介绍 它是由数据线SDA和时钟线SCL构成的串行总线,可发送和接受数据,是一个多主机的半双工通信方式。 ...

    https://www.cnblogs.com/lifexy/p/7793686.html

    本节来学习I2C接口下的AT24C02存储芯片分析,本节学完后,再来学习Linux下如何使用I2C操作AT24C02


    1、I2C通信介绍

    它是由数据线SDA和时钟线SCL构成的串行总线,可发送和接受数据,是一个多主机的半双工通信方式。

    每个挂接在总线上的器件都有个唯一的地址。

    位速在标准模式下可达100kbit/s,在快速模式下可达400kbit/s,在高速模式下可达3.4Mbit/s。

     

    2、I2C总线系统结构,如下图所示:

    其中SCL时钟线的频率由主机提供,且从机不能主动来引起数据传输,必须等待主机先发信号才行,两个或多个主机同时发起数据传输时,可以通过冲突检测和仲裁来防止数据被破坏。

     

    3、I2C时序介绍

    1)空闲状态

    当总线上的SDA和SCL两条信号线同时处于高电平时,便是空闲状态,如上面的硬件图所示,当我们不传数据时,SDA和SCL被上拉电阻拉高,即进入空闲状态。

    2)起始信号

    当SCL为高电平期间,SDA由高电平到低电平的跳变;便是总线的起始信号,只能由主机发起,且在空闲状态下才能启动该信号,如下图所示:

    3)停止信号

    当SCL为高电平期间,SDA由低电平到高电平的跳变;便是总线的停止信号,表示数据已经传输完成,如下图所示:

    4)传输数据格式

    当发了起始信号后,就开始传输数据,传输的数据格式如下图所示:

    当SCL为高电平时,便会获取SDA数据值,其中SDA数据必须是稳定的(若SDA不稳定就会变成起始/停止信号)

    当SCL为低电平时,便是SDA的电平变化状态

    若主从机在传输数据期间,需要完成其他功能(例如一个中断),可以主动拉低SCL,使I2C进入等待状态,直到处理结束再释放SCL,数据传输会继续

    5)应答信号ACK

    I2C总线上的数据都是以8位数据(字节)进行的,当发送了8位数据后,发送方会在第9个时钟脉冲期间释放SDA数据,当接收方接收字节成功,便会输出一个ACK应答信号,当SDA为高电平,表示非应答信号NACK,当SDA为低电平,表示为有效应答信号ACK

    PS:

    当主机为接收方时,收到最后一个字节后,主机可以不发送ACK信号,直接发送停止信号来结束传输。

    当从机为接收方时,没有发送ACK,则表示从机可能在忙其他事、或者不匹配地址信号和不支持多主机发送,主机可以发送停止信号,再次发送起始信号启动新的传输

    6)完整的数据传输

    如下图所示,发送起始信号后,便发送一个8位的设备地址,其中第8位是对设备的读写标志,后面紧跟着的就是数据了,直到发送停止信号终止

    PS:当我们第一次是读操作,然后想换成写操作时,可以再次发送一个起始信号,然后发送读的设备地址,不需要停止信号便能实现不同的地址转换

     

    4、AT24C02介绍

    AT24C02是通过I2C实现通讯的,是一个存储芯片,能够存储2kb(256字节)数据

    4.1 它的硬件图如下:

    其中A2~A0,是这个AT24C03设备的硬件地址,接GND表示硬件地址都为0

    4.2 其中AT24C02的数据格式如下所示:

    4.3 打开AT24C02数据手册,它的设备地址如下图所示:

    其中A2~A0表示硬件地址,P2~P0表示page页地址

    bit[0]地址:表示读/写状态,1:读,0:写(所有I2C器件都是这样的,最低位表示方向位)

    4.3.1 为什么需要page页地址?

    因为I2C的数据位是8位,而AT24CXX的读写地址值最大可以为2048(2^11),超过了I2C的数据位,而page页地址就是用来解决这个问题的

    比如AT24C16:

    当发送:0XA2(设备地址P[2:0]=0x01),0x00(读地址)时:

    表示要读的真正地址=0x01(页地址)*256+0(读地址)=0x100,转化为二进制=1 0000 0000

    当发送:0xA0(设备地址),0x00(读地址时):
    表示要读的真正地址=0x00*256+0xFF=0XFF,转化为二进制=0 1111 1111

    4.3.2 如上图所示,对于AT24C02来讲:

    • 芯片的容量小于等于2^8(256)字节,那么读写地址就用8bit来表示,所以设备地址里没有P2~P0
    • 读操作时,发送的设备地址等于0xA1
    • 写操作时,发送的设备地址等于0xA0

     

    5、AT24C02时序图介绍

    5.1 写时序介绍

    当随机写一个字节时,只需要先发送一个起始信号,然后跟上0xA0设备地址,以及要写的起始地址值,后面便是要写入地址的data,如果需要连续写数据,只需要连续写入dat,地址会自动加1,直到发送停止信号结束

    5.2 读时序介绍

    当随机读一个字节时,先发送第一个起始信号,然后写入0XA0设备地址和要读的地址值,

    接着发送第二个起始信号,然后写入0xA1设备地址,接着就是要读的data,如果需要连续读数据,只需要连续读出data,地址会自动加1,直到发送停止信号结束

     

     

    最后总结一下:

    展开全文
  •  AT24C02是一款EEPROM芯片,IIC接口,就是两条线:SDA与SCL;不过对于单单操纵这款芯片而言,没有设计到IIC总线协议之中所谓的仲裁。因而,大体看下了芯片手册,心中就知道大概怎么操作了。  另外,24C02的2K是指...
  • AT24C02:EEPROM存储芯片

    2020-02-27 18:41:33
    该工程基于蓝桥杯CT107D开发板,IAP15F2K61S2单片机,AT24C02:EEPROM存储芯片,实现了对EEPROM芯片读出和写入数据(注释掉的部分实现了一次性写入和读出多个数据)
  • AT24C02驱动

    2014-08-20 19:56:44
    AT24C02存储芯片的驱动程序,以及AT24C02存储芯片的资料内容。
  • IIC通信 IIC总线是双向、二线制、同步串行总线,是...AT24C02:EEPROM存储芯片,是一个2K位串行CMOS EEPROM,内部含有256个8位字节。EEPROM是指带电可擦可编程读写存储器,掉电不丢失数据。 AT24C02芯片原理图: ...
  • AT24C02_51程序

    2018-09-06 19:41:54
    AT24C02存储芯片的51代码,代码中有引脚连接说明,下载后可以直接使用。代码适用AT24CXX一系列的存储芯片。
  • AT24C02 STM32程序

    2018-09-06 19:39:17
    AT24C02存储芯片的STM32代码,代码中有引脚连接说明,下载后可以直接使用。代码适用AT24CXX一系列的存储芯片。
  • AT24C02_STM8

    2018-09-06 19:43:41
    AT24C02存储芯片的STM8代码,代码中有引脚连接说明,下载后可以直接使用。代码适用AT24CXX一系列的存储芯片。
  • 详解数据存储芯片AT24C02的应用及编程

    千次阅读 多人点赞 2019-12-15 18:25:14
    AT24C02是一个2K位串行CMOS E2PROM,内部含有256个8位字节,采用先进CMOS技术实质上减少了器件的功耗。AT24C02有一个8字节页写缓冲器,该器件通过IIC总线接口进行操作,有一个专门的写保护功能。 二.芯片参数 1....
  • 【硬见小百科】AT24C02芯片工作原理

    千次阅读 2019-03-01 10:01:11
    AT24C02芯片工作原理 在IIC通信时,一般有写和读两种操作,我们用AT24C02来具体讲解。 AT24C02芯片工作原理 AT24C02芯片是以IIC接口的EEPROM器件。所谓EEPROM即电可擦除可编程只读存储器,是ROM的一种。它是只读...
  • 现在很多地方都有应用到eeprom存储芯片,主要是因为它现在存储空间越来越大,价格越来越便宜,我使用的mini2440开发板上贴的是AT24C02,与S3C2410的IIC相连接,为了更好的学习Linux的IIC子系统,了解IIC芯片操作方式...
  • 利用AT24C02进行数据存储

    万次阅读 2019-03-16 15:56:23
    24C02是一个2K Bit的串行EEPROM存储器(掉电不丢失),内部含有256个字节。在24C02里面有一个8字节的页写缓冲器。 来看引脚: A0,A1,A2:硬件地址引脚 WP:写保护引脚,接高电平只读,接地允许读和写 SCL和SDA:IIC...
  • 我造轮子,你造车,创客... 本文介绍X-CTR100控制器 板载EEPROM存储芯片AT24C02的使用,EEPROM常用于参数存储,系统掉电后也可以保存数据。 对比FLASH容量小,但是具有更高的擦写寿命。 原理 AT24C02是一个2K...
  • AT24C02通过C程序

    2013-01-21 17:20:22
    51单片机对外部存储芯片AT24C02的读写C程序 已经通过测试
  • 芯片简介AT24C02是一个2K位串行CMOS E2PROM,内部含有256个8位字节,采用先进CMOS技术实质上减少了器件的功耗。AT24C02有一个8字节页写缓冲器,该器件通过IIC总线接口进行操作,有一个专门的写保护功能。二.芯片...
  • stm32f103cbt6,开发环境RT-THREAD STUDIO,组件包at24cxx,存储芯片at24c02,rtt版本为4.0.2,文章链接:https://blog.csdn.net/13011803189/article/details/113766765
  • 51单片机读写EEPROM(AT24C02

    千次阅读 多人点赞 2018-03-18 10:52:14
    AT24C02存储容量为2K bit,内容分成32页,每页8Byte,共256Byte,操作时有两种寻址方式:芯片寻址和片内子地址寻址。 (1)芯片寻址:AT24C02芯片地址为1010,其地址控制字格式为1010A2A1A0R/W。其中A2,A1,A0...
  • IIC及AT24C02的读写(单片机实验)

    千次阅读 2020-07-21 14:29:59
    通过IIC总线扩展1片AT24C02芯片 ,实现单片机对存储器24C02 的读写,并通过LED灯或8段数码管显示存储单元的状态。进行软件仿真,实验仪实现或焊接制作具体实物。 目录 1 项目分析 1 1.1 设计内容 1 1.1.1 设计任务 1 ...
  • (2)密码存储单元:AT24C02芯片,有掉电存储功能,能够存储密码,仿真中有时不太容易体现,实物效果明显; (3)密码输入单元:4×4矩阵键盘,只需要4行+4列共计 8 个控制和引脚即可扫描 16 个按键,节省...
  • AT24C02断电保存,数据写入(rct6)

    千次阅读 2019-01-13 09:49:07
    AT24C02存储容量为2K bit,内容分成32页,每页8Byte,共256Byte,操作时有两种寻址方式:芯片寻址和片内子地址寻址。 (1)芯片寻址:AT24C02芯片地址为1010,其地址控制字格式为1010A2A1A0R/W。其中A2,A1,A0...
  • 然后我们打开官方给我们AT24301的数据手册 找到地址位介绍的 可以看到地址位是由内存大小 A2 A1 P1 P0 R/W来决定的 于是我们打开官方给我们的原理图 找到IIC想对应的芯片 官方的是M24C02MN6和我们的有些出路 但是...

空空如也

空空如也

1 2 3 4 5 6
收藏数 104
精华内容 41
关键字:

at24c02存储芯片