AT24C01/AT24C02系列EEPROM芯片单片机读写驱动程序

26 篇文章 1 订阅
19 篇文章 2 订阅

EEPROM芯片读写程序相关索引

1.AT24C01/AT24C02系列EEPROM芯片单片机读写驱动程序
2.AT24C04、AT24C08、AT24C16系列EEPROM芯片单片机读写驱动程序
3.AT24C32、AT24C64、AT24C128、AT24C256、AT24C512系列EEPROM芯片单片机读写驱动程序
4.x24Cxx系列EEPROM芯片C语言通用读写程序

一、概述

EEPROM是嵌入式开发中比较常用的芯片,用来保存参数及掉电记忆的数据等,最常用的是ATMEL的AT24Cxx系列的IIC接口,也有其他厂家的如罗姆Rohm的BR24Gxx系列、ST的M24Cxx系列等。该系列芯片容量不等,如AT24C01即为1kbit,AT24C02为2kbit…
本文记录AT24C01/AT24C02的读写驱动。用到的IIC总线读写驱动可参考本人的另一篇博文4位数码管显示模块TM1637芯片C语言驱动程序

二、芯片介绍

在这里插入图片描述

型号容量bit容量byte页数字节/页器件寻址位可寻址器件数WordAddress位数/字节数
AT24C011k128168A2A1A087/1
AT24C022k256328A2A1A088/1

上表为根据芯片手册总结的两种规格芯片的参数,这两种芯片除了容量的区别外,读写程序可以通用,下面会详细介绍手册中的相关内容。

2.1 引脚说明

在这里插入图片描述
A0、A1、A2是硬件连接的设备地址输入引脚,在1个总线上最多可寻址8个1Kbit或2Kbit器件。

2.2 存储结构

在这里插入图片描述
在这里插入图片描述
AT24C01内有16页,每页8个字节,需要7bit的 word address寻址;AT24C02内有32页,每页8个字节,需要8bit的 word address寻址。

2.3 器件寻址

在这里插入图片描述
1kbit和2kbit的EEPROM器件,需要在起始条件后,跟着一个8bit的器件地址来使能读或写操作。
器件的地址字,高4位强制为1010即0xA,如图7-1,这一点对所有的串行EEPROM器件都通用。
后面3个bit是A2,A1,A0,即1k或2k EEPROM的器件地址,必须与硬件连接的响应输入引脚对应,以使器件应答。
器件地址的第8个bit是读/写操作选择位,1为读,0为写。
器件地址与A2,A1,A0输入引脚硬件连接比对有效后,EEPROM会输出一个0(应答);如果比较不成功,芯片会返回待机状态。

三、读写时序

3.1 写操作

3.1.1 Byte Write写一个字节

在这里插入图片描述
写单字节,需要在发送器件地址,收到应答信号之后,发送一个8位的word address(需要写入数据的地址),收到EEPROM收到这个地址后,会再次发送一个0(应答),然后接收8位的数据(需要写入的数据),再输出一个0(应答),寻址设备,如单片机,必须发送停止信号来结束写操作。同时,EEPROM进入了内部定时写周期(twr,即写入时的延时,一般为10ms),在写入周期内,禁止所有输入,在写结束前,EEPROM不会响应。

3.1.2 Page Write写一页

在这里插入图片描述
在这里插入图片描述
1kb/2kb的EEPROM支持8字节页写。
页写的开始于字节写一样,但是单片机发送在第一个数据后不发送停止信号,而是在收到EEPROM对第一个数据的应答后,可继续发送多达7个字节的数据。EEPROM在收到每个字节数据后均会应答。单片机必须发送停止信号终止页写操作。
在收到每个数据字节Data后,Word Address的低3位会在内部自动增加,高5位不增加,保存内存页的行地址(因为每页8个字节,所以一次页写最多只能写8个字节,所以发送Word Address实际就是需要写入的首地址,然后每发一个byte的数据,EEPROM内部会将Word Address自动递增,最多再递增7次,只需要3最低的bit即可,注意这个递增是自动的,主机不需要发送;而高5位实际就是“页数”)。当内部递增生成的Word Address到达页的边界时,下一个数据字节将会写入同一页的开始位置,所以如果发送8个以上数据,会发送“翻转”现象,前面的字节会被覆盖。

3.2 读操作

读操作的开始和写操作相似,除了设备地址字节里的读/写选择位不同,0为写,1为读。有3种写操作:读当前地址、读任意地址、顺序读。

3.2.1 读当前地址

在这里插入图片描述
内部地址计数器会保持上次读或写操作的地址,增加1。只要芯片有电,这个地址都会保持有效,当读到最后一页的最后一个字节时,也会“翻转”到第1页的第1个字节。
EEPROM接收到读写选择位置为1的器件地址且应答后,即开始发送当前地址的数据。单片机不应答,而是发送一个停止信号。

3.2.2 读任意地址

在这里插入图片描述
在这里插入图片描述

笔者注:此处random如果直接翻译为“随机”,则无法表达出该操作的含义,这里random是指“任意”。)任意读需要发送一个伪字节的写时序,来载入数据字节的地址(就是读指定单个地址的数据)。EEPROM接收到器件地址和数据地址且应答后,单片机必须产生新的起始信号,发送器件起始,读写选择位置1,开始“读当前地址”操作。EEPROM应答器件地址,并输出数据字。单片机不应答,而是发送一个停止信号。

3.2.3 顺序读

在这里插入图片描述
在这里插入图片描述
顺序读,既可以由“读当前地址”开始,也可以由“任意读”开始(由“读当前地址”开始,则读取的地址是地址计数器里的地址+1,由“任意读”开始,则需要先发送一个地址)。
单片机收到一个数据,回复一个应答信号,只要EEPROM收到应答,就继续自动递增数据的地址,并输出数据。当到达存储地址的极限时,也会发生“翻转”现象,继续“顺序读”。顺序读直到单片机不应答而是产生停止信号才停止。

四、读写驱动程序主要代码

在实际使用中,一般只会用到读取某个地址的数据,或者向某个地址写入数据,不会用到“读当前地址”,因此只编写“读/写任意地址”、“读/写一页的功能”的程序。

4.1 写单个字节(写任意地址)

先对器件地址等信息进行宏定义:

#define READ_CMD				1
#define WRITE_CMD				0

#define x24C02//器件名称,x24C01或x24C02

#define DEV_ADDR				0xA0					//设备硬件地址

#ifdef x24C01
	#define PAGE_NUM			16						//页数
	#define PAGE_SIZE			8						//页面大小(字节)
	#define CAPACITY_SIZE		(PAGE_NUM * PAGE_SIZE)	//总容量(字节)
	#define ADDR_BYTE_NUM		1						//地址字节个数
#endif 
 
#ifdef x24C02
	#define PAGE_NUM			32						//页数 
	#define PAGE_SIZE			8						//页面大小(字节)
	#define CAPACITY_SIZE		(PAGE_NUM * PAGE_SIZE)	//总容量(字节)
	#define ADDR_BYTE_NUM		1						//地址字节个数
#endif

通过总结3.1.1节的描述,可以得出,对任意地址写入单个字节的时序为:
发送起始信号–>发送器件地址(包含写入命令)–>收到应答–>发送需要写入数据的地址(8bit)–>收到应答–>发送需要写入的数据–>收到应答–>发送停止信号

/*******************************************************************************
  * 函数名:x24Cxx_WriteByte
  * 功  能:写一个字节
  * 参  数:u16Addr要写入的地址
			u8Data要写入的数据
  * 返回值:无
  * 说  明:无
*******************************************************************************/
void x24Cxx_WriteByte(uint16_t u16Addr, uint8_t u8Data)
{
	x24Cxx_WriteEnable();//使能写入
	IIC_Start();//起始信号
	IIC_WriteByte(DEV_ADDR | WRITE_CMD);//器件寻址+写+页选择位
	IIC_WaitAck();//等待应答
	IIC_WriteByte((uint8_t)(u16Addr & 0xFF));//只取地址的低字节
	IIC_WaitAck();//等待应答
	IIC_WriteByte(u8Data);
	IIC_WaitAck();//等待应答
	IIC_Stop();
	x24Cxx_WriteDisble();//禁止写入
}

4.2 写一页

时序:
发送起始信号–>发送器件地址(包含写入命令)–>收到应答–>发送需要写入数据的首地址(8bit)–>收到应答–>发送需要写入的第1个数据–>收到应答–>发送需要写入的第2个数据–>收到应答…–>发送需要写入的第n个数据–>收到应答–>发送停止信号

/*******************************************************************************
  * 函数名:x24Cxx_WritePage
  * 功  能:页写
  * 参  数:u16Addr要写入的首地址;
			u8Len写入数据字节数,最大为PAGE_SIZE
			pData要写入的数据首地址
  * 返回值:无
  * 说  明:最多写入1页,防止翻卷,如果地址跨页则去掉跨页的部分
*******************************************************************************/
void x24Cxx_WritePage(uint16_t u16Addr, uint8_t u8Len, uint8_t *pData)
{
	uint8_t i;
	x24Cxx_WriteEnable();//使能写入
	IIC_Start();//起始信号
	IIC_WriteByte(DEV_ADDR | WRITE_CMD);//器件寻址+写
	IIC_WaitAck();//等待应答
	IIC_WriteByte((uint8_t)(u16Addr & 0xFF));//只取地址的低字节
	IIC_WaitAck();//等待应答
	if (u8Len > PAGE_SIZE)//长度大于页的长度
	{
		u8Len = PAGE_SIZE;
	}
	if ((u16Addr + (uint16_t)u8Len) > CAPACITY_SIZE)//超过容量
	{
		u8Len = (uint8_t)(CAPACITY_SIZE - u16Addr);
	}
	if (((u16Addr % PAGE_SIZE) + (uint16_t)u8Len) > PAGE_SIZE)//判断是否跨页
	{
		u8Len -= (uint8_t)((u16Addr + (uint16_t)u8Len) % PAGE_SIZE);//跨页,截掉跨页的部分
	}
	
	for (i = 0; i < u8Len; i++)
	{
		IIC_WriteByte(*(pData + i));
		IIC_WaitAck();//等待应答
	}
	IIC_Stop();	
	x24Cxx_WriteDisble();//禁止写入
}

4.3 读单个字节(读任意地址)

发送起始信号–>发送器件地址(包含写入命令)–>收到应答–>发送需要读取数据的地址–>收到应答–>发送起始信号–>发送器件地址(包含读取命令)–>收到应答–>读取数据–>不应答–>发送停止信号

/*******************************************************************************
  * 函数名:x24Cxx_ReadByte
  * 功  能:读一个字节
  * 参  数:u16Addr要读取的地址
  * 返回值:u8Data读出的数据
  * 说  明:无
*******************************************************************************/
uint8_t x24Cxx_ReadByte(uint16_t u16Addr)
{
	uint8_t u8Data = 0;
	IIC_Start();//起始信号	
	IIC_WriteByte(DEV_ADDR | WRITE_CMD);//器件寻址+写
	IIC_WaitAck();//等待应答
	IIC_WriteByte((uint8_t)(u16Addr & 0xFF));//只取地址的低字节
	IIC_WaitAck();//等待应答
	IIC_Start();//起始信号
	IIC_WriteByte(DEV_ADDR | READ_CMD);//器件寻址+读
	IIC_WaitAck();//等待应答
	u8Data = IIC_ReadByte();
	IIC_NoAck();
	IIC_Stop();
	return u8Data;
}

4.4 读一页

发送起始信号–>发送器件地址(包含写入命令)–>收到应答–>发送需要读取数据的首地址–>收到应答–>发送起始信号–>发送器件地址(包含读取命令)–>收到应答–>读取第1个数据–>发送应答–>读取第2个数据–>发送应答…–>读取第n个数据–>不应答–>发送停止信号

/*******************************************************************************
  * 函数名:x24Cxx_ReadPage
  * 功  能:页读
  * 参  数:u16Addr要读取的首地址;
			u8Len读取数据字节数,最大为PAGE_SIZE
			pBuff读取数据存入的缓存
  * 返回值:无
  * 说  明:无
*******************************************************************************/
void x24Cxx_ReadPage(uint16_t u16Addr, uint8_t u8Len, uint8_t *pBuff)
{
	uint8_t i;
	IIC_Start();//起始信号	
	IIC_WriteByte(DEV_ADDR | WRITE_CMD);//器件寻址+写
	IIC_WaitAck();//等待应答
	IIC_WriteByte((uint8_t)(u16Addr & 0xFF));//只取地址的低字节
	IIC_WaitAck();//等待应答
	IIC_Start();//起始信号
	IIC_WriteByte(DEV_ADDR | READ_CMD);//器件寻址+读
	IIC_WaitAck();//等待应答
	if (u8Len > PAGE_SIZE)//长度大于页的长度
	{
		u8Len = PAGE_SIZE;
	}
	if ((u16Addr + (uint16_t)u8Len) > CAPACITY_SIZE)//超过容量
	{
		u8Len = (uint8_t)(CAPACITY_SIZE - u16Addr);
	}
	if (((u16Addr % PAGE_SIZE) + (uint16_t)u8Len) > PAGE_SIZE)//判断是否跨页
	{
		u8Len -= (uint8_t)((u16Addr + (uint16_t)u8Len) % PAGE_SIZE);//跨页,截掉跨页的部分
	}
	for (i = 0; i < (u8Len - 1); i++)
	{
		*(pBuff + i) = IIC_ReadByte();
		IIC_Ack();
	}
	*(pBuff + u8Len - 1) = IIC_ReadByte();
	IIC_NoAck();//最后一个不应答
	IIC_Stop();
}

五、注意事项

1.仅适用于x24C01、x24C02系列EEPROM芯片;
2.器件地址必须与A2/A1/A0引脚的硬件连接对应;
3.调用写入程序(无论是单字节写入还是页写),需要延时10ms(即twr,有的芯片手册说是5ms)后再对器件进行操作,否则这段时间内器件不响应命令;

  • 6
    点赞
  • 84
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
### 回答1: BL24C512是一款串行EEPROM存储器芯片,通常用于工业自动化、汽车电子、智能家居等领域。为了使计算机能够读写BL24C512芯片,需要使用EEPROM驱动程序EEPROM驱动程序一般由操作系统提供,它负责与硬件接口通信,将计算机中的数据读写芯片中。 在编写BL24C512 EEPROM驱动程序时,需要遵循一定的规范和流程。首先要通过数据手册了解芯片的规格和特性,确定读写操作的序列和时序。其次,需要使用合适的编程语言,如C语言,编写驱动程序代码。在编写驱动程序时,需要注意使用正确的寄存器操作和位操作,确保读写操作的正确性和稳定性。此外,还需要考虑驱动程序与操作系统接口的兼容性,确保驱动程序能够与特定版本的操作系统协同工作。 最后,还需要测试EEPROM驱动程序的稳定性和性能。通过测试能够发现程序中可能存在的问题,及时进行调整和优化。在开发完成后,还需要对程序进行维护和更新,以适应不断发展的硬件和操作系统环境。总之,编写BL24C512 EEPROM驱动程序需要耐心和细心,只有在不断实践和总结中才能不断提高驱动程序的质量和效率。 ### 回答2: BL24C512是一种串行EEPROM芯片,由BLX IC Design Corp.制造。EEPROM是一种可重复编程的电子存储器,可以在不损坏存储器的情况下修改数据。 BL24C512 EEPROM驱动程序是一个软件模块,用于与BL24C512 EEPROM芯片进行通信,并实现对EEPROM中存储的数据的读写操作。驱动程序控制收发数据的协议和通信接口,以读取和写入EEPROM芯片的数据。 BL24C512 EEPROM驱动程序的开发需要熟悉该芯片的规范和数据手册。该驱动程序应该能够使用通用串行总线(SPI)协议与芯片进行通信,并实现对EEPROM中512K字节数据的读取和写入。 驱动程序应该包括适当的错误处理和故障排除功能,以确保EEPROM数据的完整性和安全性。此外,驱动程序的开发应该考虑到EEPROM读写操作的效率和速度,以改善系统的性能。 总之,BL24C512 EEPROM驱动程序可以实现硬件和软件之间的通信,并对EEPROM芯片进行正确,高效,安全的数据操作,为系统的可靠性和性能做出贡献。 ### 回答3: BL24C512 EEPROM是一种基于I2C总线协议通讯的存储设备,其驱动程序需要对硬件设备进行控制,使用I2C总线进行通信传输数据。 BL24C512 EEPROM驱动程序需要以下几个方面的内容: 1. 硬件初始化 在使用BL24C512 EEPROM前,需要先对硬件进行初始化,包括I2C总线的初始化和地址等属性参数的设置。 2. 读写数据操作 BL24C512 EEPROM的读写操作需要使用I2C总线进行数据传输。在读操作时,驱动程序需要发送读取命令,并接收EEPROM中的数据。在写操作时,需要发送写入命令和数据到EEPROM中保存。 3. 缓存控制 由于EEPROM的读写速度较慢,驱动程序通常会使用缓冲区进行数据缓存,当需要进行读写操作时,先将数据保存在缓冲区中,再进行传输操作。 4. 错误处理 在EEPROM读写过程中,有可能发生传输错误,驱动程序需要检测并处理这些错误,如重新传输数据等。 综上所述,BL24C512 EEPROM驱动程序需要对硬件设备、数据读写、缓存控制和错误处理进行控制。通过有效的驱动程序,可以实现对EEPROM的读写操作,从而实现数据存储和传输等功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值