精华内容
下载资源
问答
  • 在Arduino项目中使用Atmels EEPROM AT24C32 / AT24C64 / AT24C128 / AT24C256 / AT24C512的库。 有关定义和差异的信息,请参见 。 由Christian Paul撰写,2014年-2015年。该软件根据MIT许可条款发行。 有关详细信息...
  • AT24C256

    千次阅读 2013-12-20 21:23:12
    at24c256与at24c02的区别在于以2个字节来控制地址 其中首字节最高位忽略,其余7位和下一字节的高2位 构成9位的页地址,共512页,低字节的剩余6位为页内地址,共64BYTE。 另外要注意的是整片写数据时在翻页时需要给...

    at24c256与at24c02的区别在于以2个字节来控制地址 其中首字节最高位忽略,其余7位和下一字节的高2位 构成9位的页地址,共512页,低字节的剩余6位为页内地址,共64BYTE。 另外要注意的是整片写数据时在翻页时需要给一定的延时,不然会造成翻页失败,导致下一页写操作失败。读取数据时可不用延时。最后一点,读取数据的时候如果对速度要求比较高,可以省略掉延时的部分,可能不太妥当,但是IIC的速度就是没有办法和SDHC卡比。整片的存储大小也就32K,512(page)*64(byte)。

    需要说明的是在当前页内,不论是读取还是写入,操作完成后要主动接收或者发送ACK。这样做的目的是告知芯片信息已经收到,芯片会自动将当前字节地址+1,如果已是最后一字节,则地址指针会自动回滚当前页第0字节,重新写入或者读取。如果是写入页的最后一个字节,在ACK后要发送END信号。如果是接收当前页的最后一字节,接收完后不发送ACK直接发送END信号

    /****************************************************************************
    函数名称:AT24C256_DataCopy
    功    能:将单片机上的长数组写入AT24C256芯片中
    入口参数:pbuf:指向返回数据指针
    返 回 值:最大页号	
    备    注:只完成了基本功能,漏洞还是有的,比如存入任意大小的字符串时,
    		  对最后一页不够64字节的数据存储还不太精确。
    *****************************************************************************/
    unsigned char AT24C256_DataCopy(unsigned char *pbuf, unsigned int BufLength)
    {
    	unsigned int PageCnt = 0x0000;			  //页计数			  2bytes
    	unsigned int Cnt = 0;					  //字节计数
    	unsigned int i;
    	unsigned char addr[2] = {0x00,0x00};  	  //PageCnt进行地址运算结果
    
    	while(1)
    	{	
    		addr[0] = 0x7f&(PageCnt >> 2);		//at24c256页地址计算	   XPPP,PPPP,PPBB,BBBB  X不关心,P页地址,B字节地址
    		addr[1] = PageCnt & 0x0003;
    		addr[1] = addr[1] << 6;	
    
    
    		AT24C02_Start();            			//起始信号
    	    AT24C02_SendByte(AT24C02_ADD_WR);     	//发送设备地址+写信号
    	    AT24C02_SendByte(addr[0]);     			//发送存储单元地址2bytes  与PageCnt
    		AT24C02_SendByte(addr[1]);
    		if((BufLength - Cnt) > 64)
    		{
    		    for (i=0; i<PAGE_SIZE; i++)				//写入一页的数据
    		    {
    		        AT24C02_SendByte(pbuf[Cnt]);
    				Cnt++;
    		    }
    		}
    		else
    		{
    			for (i=0; i<(BufLength - Cnt); i++)		//写入不到一页的数据
    		    {
    		        AT24C02_SendByte(pbuf[Cnt]);
    				Cnt++;
    		    }		 
    			return PageCnt;
    		}
    	    AT24C02_Stop();             			//停止信号
    		Delay_ms(20);							//非常重要的延时,不然造成下一页来不及转换,写数据失败
    		PageCnt++;					//页地址加1
    		
    		
    		if(PageCnt >= 512)
    		{
    			PageCnt = 0;
    			Cnt = 0;
    			return 1;
    		}
    
    	}
    }
    /******************************************************************************
    函数名称:AT24C256_AllDataOut
    功    能:将所有的数据输出给串口
    入口参数:pbuf:指向返回数据指针,数据的长度
    返 回 值:无	
    备    注:原理大致相同
    *******************************************************************************/
    void AT24C256_AllDataOut(unsigned char *pbuf, unsigned int BufLength)
    {
    	unsigned int PageCnt = 0x0000;			  //页计数			  2bytes
    	unsigned int Cnt = 0;					  //字节计数
    	unsigned int i;
    	unsigned char addr[2] = {0x00,0x00};  //PageCnt进行地址运算结果
    	while(1)
    	{
    		addr[0] = PageCnt >> 2;			 	//at24c256页地址计算	   XPPP,PPPP,PPBB,BBBB  X不关心,P页地址,B字节地址
    		addr[1] = PageCnt & 0x0003;
    		addr[1] = addr[1] << 6;	
    
    
    		AT24C02_Start();            			//起始信号
    	    AT24C02_SendByte(AT24C02_ADD_WR);     	//发送设备地址+写信号
    	    AT24C02_SendByte(addr[0]);		     		//发送存储单元地址2bytes
    		AT24C02_SendByte(addr[1]);
    	    AT24C02_Start();            			//起始信号
    	    AT24C02_SendByte(AT24C02_ADD_RD);     	//发送设备地址+读信号
    		if((BufLength - Cnt) > 64)
    		{
    		    for (i=0; i<PAGE_SIZE; i++)				//读取一页数据
    		    {
    		        pbuf[i] = AT24C02_RecvByte();
    		        if (i == (PAGE_SIZE-1))
    		        {
    		            AT24C02_SendACK(NOACK); 		//最后一个数据需要NAK
    		        }
    		        else
    		        {
    		            AT24C02_SendACK(ACK); 			//回应ACK
    		        }
    				uart_send_char(pbuf[i]);			//发送到串口查看
    				Cnt++;
    		    }
    		}
    		else
    		{
    			for (i=0; i<(BufLength - Cnt); i++)				//读取一页数据
    		    {
    		        pbuf[i] = AT24C02_RecvByte();
    		        if (i == (BufLength - Cnt-1))
    		        {
    		            AT24C02_SendACK(NOACK); 		//最后一个数据需要NAK
    		        }
    		        else
    		        {
    		            AT24C02_SendACK(ACK); 			//回应ACK
    		        }
    				uart_send_char(pbuf[i]);			//发送到串口查看
    				Cnt++;
    		    }
    			break;
    		}
    	    AT24C02_Stop();             			//停止信号
    		
    		
    
    		PageCnt++;						//页地址加1		
    		if(PageCnt >= 512)
    		{
    			PageCnt = 0;
    			Cnt = 0;
    			break;
    		}
    	}
    }


    展开全文
  • 驱动AT24C256

    2018-01-19 12:30:36
    基于LPC2292的AT24C256驱动程序,详细的介绍了II2C的使用方法!
  • AT24C256 STM32F103 例程

    2021-05-19 09:08:25
    AT24C256 STM32F103 例程
  • at24c256 开发程序

    2018-07-25 11:37:35
    at24c256开发代码,自己编写的代码已经测试过的,可以用的。
  • at24c256中文手册.doc

    2020-04-23 17:30:36
    AT24C256是ATMEL公司256kbit串行电可擦的可编程只读存储器,8引脚双排直插式封装,具有结构紧凑、存储容量大等特点,可以在2线总线上并接4片该IC,特别适用于具有高容量数据储存要求的数据采集系统。AT24C256采用SOP...
  • AT24C256源代码

    2018-09-07 11:45:40
    AT24C256源代码,C语言,驱动,可以读,可以写 单片机
  • AT24C01~AT24C256通用读写程序(C51),为AT24C01~AT24C256的读写程序,各人可根据自己的需要应用。 在buf1中填入需要写入的内容,buf2的大小可根据需要定义。 addr可根据使用的芯片选择,可从任何位置读写,只要在...
  • AT24C256是ATMEL公司256kbit串行电可擦的可编程只读存储器,8引脚双排直插式封装,具有结构紧凑、存储容量大等特点,可以在2线总线上并接4片该IC,特别适用于具有高容量数据储存要求的数据采集系统。本文将介绍该IC...
  • 基于stm32f103,IO模拟IIC总线实现对AT24C256读写操作,对不同系列的AT24CXX适用,只需稍微修改既可以使用。
  • AT24C256C-pu

    2012-05-05 08:09:18
    EEPROM AT24C256C的英文原版资料
  • STM32 AT24C256驱动IO模拟

    2015-11-21 13:53:19
    STM32 , AT24C256驱动IO模拟,本人亲测,完全没问题!!绝对好用
  • 文章目录AT24C256 地址AT24C256AT24C256写操作AT24C02读操作注意 AT24C256 地址 前四位(1010)是固定的,A2, A1, A0 与硬件连接有关系,外部输入电压为高时是1,外部电压输入为低是0。 本设计中A2, A1, A0都是接地...

    AT24C256 地址

    在这里插入图片描述
    前四位(1010)是固定的,A2, A1, A0 与硬件连接有关系,外部输入电压为高时是1,外部电压输入为低是0。

    本设计中A2, A1, A0都是接地,所以我的设备地址是1010000X,也就是10100000 或10100001。

    最后一位R/W是读写位,读操作时为0,写操作时为1。

    对于linux IIC子系统,读写位驱动会自动添加,实际设备地址位高七位 1010000B 也就是0x50。

    AT24C256页

    在这里插入图片描述
    这里需要特别注意EEPROM的页操作,在24C256中,存储空间是 64bytr * 512page = 32768 byte, 其中它被分为512页,每页 64 byte。

    在进行页操作的时候,word address的低6位用来表示页内的地址其它所有高位表示页地址

    比如word address =0 0000 0001 000001B,表示第1页的第一个地址。现在如果往0 0000 0001 000001B的存储地址写入64个数值:1,2,3,… ,64,当写到数值63时,第一页已经写满,那么64会被写到第一页的0地址位置。这时会把第一页0位置的信息被覆盖。

    关于IIC EEPROM 页写问题

    无论从那个地址连续写,不能超过(跨过)一整页。

    AT24CXX 系列的 EEPROM 为了提高写效率,提供了页写功能,内部有个一页大小的写缓冲RAM,地址范围当然就是从00到一页大小,发生写操作时,开始送入的地址对应的页被选中,并将其内容映像到缓冲RAM,数据从低端地址对应的缓冲RAM地址开始修改,超过这个地址范围就回到00,写完后,就会把开始确定的 EEPROM 页擦除,再把一整页RAM数据写入。所有写数据都发生在开始写地址时确定的页上。

    如页容量为128,一页都是从00开始按128字节分成一个个的页,0页就是0~ 7F,1页就是80~ FF,类推,边界就是128字节的整数倍地址。页RAM的地址范围为7位00~ 7F,写入时高端地址就是页号。发生写操作,开始送入的地址对应的页被锁存,后续不论写多少,都在这个页中,只是一个页内的地址进行加一,超过就归零开始。从F0开始写32个字节,那么开始送入的地址为F0,就会锁定在1号页(第2个页)上,底端7位页内部地址开始从70H开始写,到达7F时回到00再到10H,也就是写在了F0FF,808F。也就是,从01开始写也只能到7F,再往80写就跑到00上去了,这就是写操作的翻卷,datasheet上都有说明。就是从边界前写两个字节也要分两次写。

    页是绝对的,按整页大小排列,不是从开始写入的地址开始算。

    读没有页的问题,可以从任意地址开始读取任意大小数据,只是超过整个存储器容量时地址才回卷。但一次性访问的数据长度也不要太大。
    所以分页的存储器要做好存储器管理,尽量同时读写的数据放在一个页上。

    AT24C256写操作

    写操作分为一个字节写和分页写,时序如下图。
    在这里插入图片描述
    一个字节写时序:

    发送开始信号
    ->发送设备地址
    ->等待ACK
    ->发送需要写入的地址
    ->等待ACK
    ->发送需要写入的数值
    ->等待ACK
    ->发送停止信号。

    分页写时序与写一个字节基本相同,只是在发送第一个需要写入的数据之后不发送停止信号,继续发送数据,直到数据发送完之后再发停止信号。

    AT24C02读操作

    读操作分为:从当前地址读;随机地址读;连续地址读;
    在这里插入图片描述
    在这里插入图片描述

    解析:

    当前地址读:24c256内部的data word address 会保存上次读或是写的存储地址,当执行当前地址读时,读取的是data word address counter + 1地址上的指。这里需要主要,在页尾时会出现地址翻转,实际会读取到该页的第一个字节数据。与上面提到的也写操作中的一样。data word address 中保存的值掉电就会丢失。

    随机地址读取:注意上图中的Dummy Write。随机读实际上是通过写入一个地址改变eeprom里面data word address 的值,然后再进行当前地址读。

    连续读:

    连续读由当前地址读和随机地址读启动,只要给eeprom 一个应答信号,他的data word address 就会增加,主控器就可以继续读数据,直到data word address 增加到一个页的末尾后,又回到该页的起始位置地址。当接收到IIC的停止信号的时候结束传输。

    注意

    最后eeprom 还有一个WP 控制引脚。该引脚为低电平的时候,可以正常的读写数据。当该引脚为高电平的时候。eeprom进入写保护模式。这时数据是写不进去的。

    展开全文
  • at24c256 芯片资料

    2010-08-20 19:05:52
    EE2ROM,ATMEL at24c256芯片资料,地址为A0,可以用I2C连接,在ATMEL网站上下载的
  • AT24C256 的 EEPROM 屏蔽: ://www.emartee.com/product/41950/Arduino-EEPROM-Shield-With-256K-AT24C256 如果你需要在 Arduino 中做一些数据存储,那么使用 EEPROM 可能是最简单的做法。 实际上,Arduino ...
  • at24c02系列和at24c256系列的比较

    千次阅读 2014-05-16 15:41:23
    at24c02系列包括的有: at24c256系列包括的有:

    编号的含义:

    at24c02系列包括的有:


    128(1K),256(2K),512(4K),1024(8K),2048(16K)字节(B)

    at24c256系列包括的有:


    16384(128K),32768字节(256K)(B)

    02系列eeprom

    两者比较:

    at24c02系列分1.8V,2.5V,2.7V能保证的写的次数100 0000.数据能保存的时间100年。01,02每页8字节。04,08,16每页16字节的写模式。

    at24c256系列1.8V,2.5V,2.7V 能保证的血的次数10 0000,数据能保存的时间40年。每页64字节的写模式。

    展开全文
  • 实现对AT24C256的读写操作,并将写入的数据读出在LCD1602,串口中显示
  • AT24C256资料

    2015-12-03 14:37:03
    1. 自己总结的文档:24C256.pdf 2. 51程序: 包括:网上找到的一个适合01-256的程序 自己修改的程序 我的开发板上的一个例程 3. 430程序 4. 24C256的典型电路 5. 24Cxx官方手册 6. 学习期间在网上收集的一些...
  • AT24C256(EEPROM)读写程序

    热门讨论 2011-03-20 14:05:00
    模拟IO口通信方式下的,与AT24C256(EEPROM)的I2C通信程序
  • 在单片机的工业控制中,当系统从新上电时,一定要注意AT24C256存储器的数初始化操作过程
  • 一个通用的24C01-24C256共9种EEPROM的字节读写操作程序,此程序有五个入口条件,分别为读写数据缓冲区指针, 进行读写的字节数,EEPROM首址,EEPROM控制字节, 以及EEPROM类型。此程序结构性良好,具有极好的容错性...
  • lpc2103 I2C读写AT24C256

    2012-05-14 18:55:50
    适用于lpc系列ARM通过I2C读写AT24C256。本人亲测通过
  • Android 9 读写eeprom at24c256 linux 读取eeprom相对来说比较简单,因为内核中集成了大部分eeprom的驱动,文件目录在kernel/drivers/misc/eeprom/at24.c 。 而且我们不用区分at24cxx的不同容量导致的读写方式不同,...

    Android 9 读写eeprom at24c256

    linux 读取eeprom相对来说比较简单,因为内核中集成了大部分eeprom的驱动,文件目录在kernel/drivers/misc/eeprom/at24.c 。
    而且我们不用区分at24cxx的不同容量导致的读写方式不同,只要将at24.c编译到内核,然后dts中注册相应的i2c通道即可。手中的模块a0 a1 a2 都是接地,所以器件地址为0xa0,而dts中注册为七位地址,即0x50.

    &i2c1 {
    	status = "okay";
    	clock-frequency = <300000>;
    	pinctrl-names="default";
    	pinctrl-0=<&i2c1_h_pins>;
    	at24c256@50{
    		compatible = "at24,24c256";
    		reg = <0x50>;
    		status = "okay";
    	};
    };
    

    按理说升级编译好的kernel后,就应该在对应的i2c节点下找到eeprom的节点,可是找来找去都没有找到这个节点,查看代码发现有这么个东西。

    	at24->nvmem_config.name = dev_name(&client->dev);
    	at24->nvmem_config.dev = &client->dev;
    	at24->nvmem_config.read_only = !writable;
    	at24->nvmem_config.root_only = true;
    	at24->nvmem_config.owner = THIS_MODULE;
    	at24->nvmem_config.compat = true;
    	at24->nvmem_config.base_dev = &client->dev;
    	at24->nvmem_config.reg_read = at24_read;
    	at24->nvmem_config.reg_write = at24_write;
    	at24->nvmem_config.priv = at24;
    	at24->nvmem_config.stride = 1;
    	at24->nvmem_config.word_size = 1;
    	at24->nvmem_config.size = chip.byte_len;
    	at24->nvmem = nvmem_register(&at24->nvmem_config);
    	if (IS_ERR(at24->nvmem)) {
    		err = PTR_ERR(at24->nvmem);
    		goto err_clients;
    	}
    

    原来新的内核中引入了nvmem的架构对eeprom操作。重新配置内核,打开nvmem的编译选项,重新升级后,找到了nvmem的节点。
    在这里插入图片描述
    应用层对eeprom的操作,都是通过这个节点。

    写个应用层代码:

    #include <unistd.h>
    #include <fcntl.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <errno.h>
    #include <string.h>
    #include "android/log.h"
    #include <cutils/properties.h>
    #include <stdbool.h>
    #include <linux/input.h>
    
    #define FILE_PATH  "/sys/bus/nvmem/devices/1-00500/nvmem"
    
    int main()
    {
    	int fd;
    	int size;
    	
    	char data[512] = {0};
    	char r_data[64] = {0};
    	char *w_data = "Hello World!Good Day!\n";
    	fd = open(FILE_PATH, O_RDWR);
    	if (fd < 0) {
    	
    		printf("Can't open file %s\r\n", FILE_PATH);
    		return -1;
    	}
    
    	lseek(fd,0,SEEK_SET);
    	write(fd,data,sizeof(data)); //erase eeprom
    	lseek(fd,0,SEEK_SET);
    	write(fd,w_data,strlen(w_data));
    	lseek(fd,0,SEEK_SET);
    	size = read(fd,r_data,sizeof(r_data));
    	printf("read data==%s\n",r_data);
    	close(fd);
    	return 0;
    }
    

    Android.mk

    LOCAL_PATH:= $(call my-dir)
    include $(CLEAR_VARS)
    LOCAL_SRC_FILES:= max.c
    LOCAL_MODULE := max
    LOCAL_MODULE_TAGS := optional
    LOCAL_SHARED_LIBRARIES += \
    	libcutils \
    	liblog 
    LOCAL_MODULE_PATH :=$(PRODUCT_OUT)/vendor/bin
    include $(BUILD_EXECUTABLE)
    

    在这里插入图片描述
    运行结果如图

    展开全文
  • 用C语言写的AT24C系列的EPROM读写程序,适用于刚学单片机编程的初学者
  • 关于STM32使用硬件i2c读写AT24C256实验遇到的问题,这个代码只是一部分,下载后需要将他放在官方HAL库en.stm32cubef1 V1.7.0-》Projects-》STM32F103RB-Nucleo-》Examples-》I2C目录下,参照帖子里关于这个工程的...
  • I_2C总线器件AT24C256的性能特点及应用

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 7,762
精华内容 3,104
关键字:

at24c256