串行 EEPROM 存储器芯片AT24C32(兼容同系列AT24CXX)


一、应用场景?

有些单片机没有内部的EEPROM,或者说内部的EEPROM空间不够大,这时候,我们就想到了外挂一个EEPROM芯片,而AT24C32就是一种常用的串行EEPROM存储器,它适用于许多需要在系统掉电后保留数据的嵌入式应用场景。


二、AT24C32是什么?

AT24C32是一种常见的串行 EEPROM 存储器芯片,通常用于存储系统配置、用户数据、校准参数等。它具有以下特点,一般会在以下情况下被使用:

1.小容量数据存储:AT24C32的存储容量一般为32Kb,适合存储少量的配置信息、校准参数、设备标识等数据。
2.串行接口:AT24C32采用串行接口进行数据通信,这使得它在占用较少引脚的同时能够进行高效的数据读写操作,因此适合于资源受限的嵌入式系统或小型设备中使用。
3.数据保存与恢复:AT24C32通常被用于存储需要持久保存的数据,例如设备配置、校准参数等。它的非易失性存储特性意味着即使断电也能保持数据完整,可在下次上电时恢复。
4.嵌入式系统:由于其小巧的封装、低功耗和易于集成的特点,AT24C32常被嵌入式系统设计中用于管理系统配置、日志记录、用户个性化设置等数据。

三、使用步骤

1.引脚说明

在这里插入图片描述

1-3.A0~A2:地址输入引脚,共3个,用于设定芯片的I2C地址。
4.GND:地引脚,与VCC联合供电。
5.SDA:串行数据输入/输出引脚,用于与I2C总线进行通信。
6.SCL:串行时钟输入引脚,用于与I2C总线进行同步。
7.WP:写保护引脚,当WP引脚为高电平时,AT24C32将无法写入数据,起到了对AT24C32数据的保护作用。
8.VCC:供电引脚,连接正极电源。

其中,WP引脚是AT24C32的写保护引脚,用于控制AT24C32是否可以写入数据。当WP引脚处于高电平时,AT24C32将进入写保护模式,此时将无法写入数据。当WP引脚处于低电平时,AT24C32将退出写保护模式,此时可以向其写入数据。通常情况下,WP引脚需要连接到系统中的GPIO引脚上,以便在需要时能够动态控制AT24C32的写保护模式

2.示例代码

EEPROM设备都需要一个8位设备地址字,包含一个启动条件,以使芯片能够进行读或写操作。设备地址字前4位最高有效位为1010。这对所有串行EEPROM设备都是通用的。接下来的3位是EEPROM的A2、A1和A0设备地址位。设备地址的第8位是读写操作选择位。如果该位高,则进行读操作;如果该位低,则进行写操作。

综上,如果对AT24C32进行读操作,则设备地址为10100001B=A1H;如果对AT24C32进行写操作,则设备地址为10100000B=A0H.

2.1 读取一个字节数据代码如下(示例):

/*******************************************************************************
 * 函数名:AT24CXX_ReadOneByte
 * 描述  :从串行EEPROM指定地址处开始读取一个字节数据
 * 输入  :_usAddress地址
 * 输出  :读取的数据dat
 * 调用  :
 * 备注  :
 *******************************************************************************/
uint8_t AT24CXX_ReadOneByte(uint16_t _usAddress)
{
	uint8_t dat = 0;		  	    																 
	EE_IIC_Start();  
	if(EE_SIZE > ((128*16)))//>AT24C16
	{
		EE_IIC_Send_Byte(EE_DEV_ADDR);//发送写命令
		EE_IIC_Wait_Ack();
		EE_IIC_Send_Byte(_usAddress>>8);//发送高地址 
		EE_IIC_Wait_Ack(); 
	}		
    else
	{
		EE_IIC_Send_Byte(EE_DEV_ADDR + ((_usAddress/256)<<1));//发送器件地址0xA0,写数据		  
	}			
	EE_IIC_Send_Byte(_usAddress%256);//发送低地址
	EE_IIC_Wait_Ack();	    
	EE_IIC_Start();  	 	   
	EE_IIC_Send_Byte(EE_DEV_ADDR | I2C_RD);//进入接收模式0xA1			   
	EE_IIC_Wait_Ack();	 
	dat = EE_IIC_Read_Byte(0);		   
	EE_IIC_Stop();//产生一个停止条件	    
	return dat;
}

2.2 写入一个字节数据代码如下(示例):

/*******************************************************************************
 * 函数名:AT24CXX_WriteOneByte
 * 描述  :从串行EEPROM指定地址处开始写入一个字节数据
 * 输入  :_usAddress地址,_usWrite数据
 * 输出  :void
 * 调用  :
 * 备注  :
 *******************************************************************************/
void AT24CXX_WriteOneByte(uint16_t _usAddress,uint8_t _usWrite)
{
	EE_IIC_Start();
	if(EE_SIZE > ((128*16)))//>AT24C16
    {  
	    EE_IIC_Send_Byte(EE_DEV_ADDR);//发送写命令
		EE_IIC_Wait_Ack();
		EE_IIC_Send_Byte(_usAddress>>8);//发送高地址
	}
	else
	{
		EE_IIC_Send_Byte(EE_DEV_ADDR + ((_usAddress/256)<<1));//发送器件地址0xA0,写数据		  			
	}
	EE_IIC_Wait_Ack();	   
	EE_IIC_Send_Byte(_usAddress%256);//发送低地址
	EE_IIC_Wait_Ack(); 	 										  		   
	EE_IIC_Send_Byte(_usWrite);//发送字节							   
	EE_IIC_Wait_Ack();  		    	   
	EE_IIC_Stop();//产生一个停止条件 
	delay_syms(10);	 
}

2.3 读取若干数据代码如下(示例):

/*******************************************************************************
 * 函数名:AT24CXX_ReadBytes
 * 描述  :从串行EEPROM指定地址处开始读取若干数据
 * 输入  : usAddress : 起始地址
 *			_pReadBuf : 存放读到的数据的缓冲区指针
 *			 _usSize : 数据长度,单位为字节
 * 输出  :0 表示失败,1表示成功
 * 调用  :
 * 备注  :
 *******************************************************************************/
void AT24CXX_ReadBytes(uint16_t _usAddress, uint8_t *_pReadBuf, uint16_t _usSize)
{
    while(_usSize)
	{
		    *_pReadBuf++ = AT24CXX_ReadOneByte(_usAddress++);
			 _usSize--; 
	}
}

2.4 写入若干数据代码如下(示例):

/*******************************************************************************
 * 函数名:AT24CXX_WriteBytes
 * 描述  :向串行EEPROM指定地址写入若干数据
 * 输入  :_usAddress : 起始地址 
 *			 _pWriteBuf : 存放读到的数据的缓冲区指针
 *			 _usSize : 数据长度,单位为字节
 * 调用  :0 表示失败,1表示成功
 * 备注  :
 *******************************************************************************/
void AT24CXX_WriteBytes(uint16_t _usAddress, uint8_t *_pWriteBuf, uint16_t _usSize)
{
    while(_usSize--)
	{
		AT24CXX_WriteOneByte(_usAddress,*_pWriteBuf);
        _usAddress++;
		_pWriteBuf++;
	}
}

2.5 测试代码如下(示例):

/*******************************************************************************
 * 函数名:DEBUG_test_AT24C32
 * 描述  :测试AT24C32
 * 输入  :void
 * 输出  :void
 * 调用  :
 * 备注  :
 *******************************************************************************/
void DEBUG_test_AT24C32(void)
{
	uint8_t i,j;
	if(EE_CheckOk() == 1)//检测设备是否存在
	{
		printf("Check OK \r\n");
		 
        for(i = 0; i < 16; i++)
	    {
		    test_buf1[i] = i;
	    }	
	    AT24CXX_WriteBytes(0x20,test_buf1,16);
	 
	    AT24CXX_ReadBytes(0x20,test_buf2,16);
        for(j=0;j<16;j++)
	    {
		    printf("test_buf2 = %d\r\n",test_buf2[j]);
	    }			 
	}
    else
	{
		 printf("Check Fail \r\n");
	}	 
}

3.测试结果

和测试代码写的结果是一样,测试代码首先把0-15写入到test_buf1数组里面,再通过写函数把它写入到EEPROM芯片,最后通过读函数将它读取出来给到test_buf2数组,再打印出来。

在这里插入图片描述


四、总结

今天主要讲了AT24C32的应用驱动,这个驱动我也只是在AT24C32上验证过,是否可以兼容AT24CXX同类型的芯片需要自行验证,有兴趣的可以下载驱动附件参考,感谢你的观看,谢谢!

在这里插入图片描述

  • 29
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
EEPROM存储器AT24C02驱动是一种用于控制和操作AT24C02 EEPROM芯片的软件程序。AT24C02是一种2K位串行电路编程只读存储器EEPROM),能够以字节为单位进行读写操作。下面是一个简单的EEPROM存储器AT24C02驱动的实现示例: 首先,需要确定与AT24C02芯片通信的硬件接口。一般来说,AT24C02芯片使用I2C(TWI)总线进行通信。因此,需要确保控制器上的I2C总线控制器(如I2C模块)已正确配置和初始化。 其次,需要实现与AT24C02芯片通信的相关函数,如写入数据、读取数据等。这些函数可以通过在控制器上通过I2C总线传输控制字节和数据字节来执行相关的EEPROM操作。 例如,实现写入数据的函数,可以按照以下步骤进行: 1. 通过发出启动条件向AT24C02芯片发送设备地址。设备地址应包括芯片的固定地址和A0、A1和A2引脚的状态,用来识别芯片的物理位置。 2. 发送一个字节的内存地址,确定要写入数据的EEPROM存储器地址。 3. 发送要写入的数据字节。 4. 等待写操作完成,可以通过轮询芯片或等待I2C总线中断来检查。 5. 发送停止位,结束写操作。 同样,读取数据的函数也可以按照类似的步骤进行实现,只不过在发送内存地址之后需要切换到读操作模式,并在读取数据后保存数据字节。 在驱动程序的应用中,可以使用这些函数来存储和检索数据。通过提供适当的地址,可以将数据写入或读取到AT24C02芯片的特定地址中。此外,除了基本的读写功能之外,还可以实现其他操作,如块写入、页写入等。 总之,EEPROM存储器AT24C02驱动程序通过I2C总线控制器与AT24C02芯片进行通信,实现了对EEPROM芯片的读写操作。驱动程序应提供适当的函数来进行数据存储和检索,并可以根据应用需求扩展其他功能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xiaobuding_QAQ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值