AT24C02的单次读写和连续读写

AT24C02是一款由Atmel公司生产的串行EEPROM存储器芯片,具有2KB(2048字节)的存储容量。它通过I2C(也称为两线式)总线进行通信,广泛应用于各种电子设备中,用于存储需要频繁读写的非易失性数据。

该芯片的基本特性如下:

存储容量:2KB
工作电压:1.8V至5.5V
通信接口:I2C总线接口
支持快速模式(400kHz)
低功耗工作
工作温度范围广
支持页面写入功能
支持随机读取功能
8脚PDIP、SOIC、TSSOP封装类型
AT24C02的I2C总线包含两条线:一条数据线(SDA)和一条时钟线(SCL)。设备支持多个设备在同一总线上操作,通过地址识别来区分不同的设备。AT24C02的地址由硬件地址引脚和软件地址共同决定,从而允许在同一总线上挂载多片相同容量的EEPROM。

在使用AT24C02时,开发者需要遵循I2C协议的规范,通过发送特定的命令序列来读写数据。该芯片适用于需要微控制器或其他处理器保存配置信息、日志数据或其他小量数据的场合。

下面我将介绍基于STM32F4系列的AT24C02的单次读写操作和连续读写操作(采用标准库函数编程)

一、AT24C02的单次读写操作

1.IIC模块编程

/*******************************************************************
 * Function  : IIC初始化
 * Parameter : void
 * Return    : void
 * Comment   : IIC_SCL--PB8   IIC_SDA--PB9  开漏输出
********************************************************************/
void IIC_Init(void)
{
	RCC_AHB1PeriphClockCmd (RCC_AHB1Periph_GPIOB,ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStruct;
	GPIO_InitStruct.GPIO_Mode      =GPIO_Mode_OUT;//输出模式
	GPIO_InitStruct.GPIO_OType     =GPIO_OType_OD;//开漏输出
	GPIO_InitStruct.GPIO_Pin       =GPIO_Pin_8| GPIO_Pin_9 ;//引脚
	GPIO_InitStruct.GPIO_Speed     =GPIO_Speed_2MHz;//GPIO_Low_SPeed低速
 
	GPIO_Init (GPIOB, &GPIO_InitStruct);
	SCL_H;
	SDA_H;
}
 
/*******************************************************************
 * Function  : SDA输出模式
 * Parameter : void
 * Return    : void
 * Comment   :
********************************************************************/
void IIC_SDA_Output(void)
{
	GPIO_InitTypeDef GPIO_InitStruct;
	GPIO_InitStruct.GPIO_Mode      =GPIO_Mode_OUT;//输出模式
	GPIO_InitStruct.GPIO_Pin       =GPIO_Pin_9 ;//引脚
 
	GPIO_Init (GPIOB, &GPIO_InitStruct);
}
 
/*******************************************************************
 * Function  : SDA输入模式
 * Parameter : void
 * Return    : void
 * Comment   :
********************************************************************/
void IIC_SDA_Input(void)
{
	GPIO_InitTypeDef GPIO_InitStruct;
	GPIO_InitStruct.GPIO_Mode      =GPIO_Mode_IN;//输入模式
	GPIO_InitStruct.GPIO_Pin       =GPIO_Pin_9 ;//引脚
 
	GPIO_Init (GPIOB, &GPIO_InitStruct);
}
 
/*******************************************************************
 * Function  : 起始条件
 * Parameter : void
 * Return    : void
 * Comment   : SCL高电平,SDA 由高电平到低电平  建立时间  保持时间
********************************************************************/
void IIC_Start(void)
{
	IIC_SDA_Output();
	SCL_H;
	SDA_H;
	delay_us(1);//起始条件的建立时间
	SDA_L;
	delay_us(1);//起始条件的保持时间
	SCL_L;
}
 
/*******************************************************************
 * Function  : 停止条件
 * Parameter : void
 * Return    : void
 * Comment   : SCL高电平,SDA 由低电平到高电平  建立时间  
********************************************************************/
void IIC_Stop(void)
{
	IIC_SDA_Output();
	SCL_H;
	SDA_L;
	delay_us(1);//停止条件的建立时间
	SDA_H;
}
 
/*******************************************************************
 * Function  : 发送数据
 * Parameter : u8 data
 * Return    : u8 应答
 * Comment   : 数据准备时间(SCL低电平)  数据发送时间(SCL高电平)
********************************************************************/
u8 IIC_SendByte(u8 data)
{
	IIC_SDA_Output();//主机输出
	SCL_L;
	for(u8 i=0;i<8;i++)
	{
		if(data&(0x80>>i))
		{
			 SDA_H;
		}
		else
		{
			 SDA_L;
		}
		delay_us(2);//数据准备时间
		SCL_H;
		delay_us(1);//数据发送时间
		SCL_L;
	}
	return IIC_RecACK();
}
 
/*******************************************************************
 * Function  : 接收应答
 * Parameter : void
 * Return    : u8
 * Comment   : 
********************************************************************/
u8 IIC_RecACK(void)
{
	 u8 ACK;
	 IIC_SDA_Input();//输入模式
	 SCL_L;
	 delay_us(2);//从机准备数据时间
	 SCL_H;
	 delay_us(1);//从机发送数据时间
	 if(Read_SDA)
	 {
		 ACK=1;
	 }
	 else
	 {
		 ACK=0;
	 }
	 SCL_L;
	 return ACK;
}
 
/*******************************************************************
 * Function  : 接收数据
 * Parameter :  u8 ACK
 * Return    :  u8
 * Comment   : 
********************************************************************/
u8 IIC_RecByte(u8 ACK)
{ 
	 u8 data=0;
	IIC_SDA_Input();//输入模式
	for(u8 i=0;i<8;i++)
	{
		SCL_L;
		delay_us(2);//从机数据准备时间
		SCL_H;
		delay_us(1);//从机数据发送时间
		if(Read_SDA)
		{
			data|=(0x80>>i);
		}
	}
	SCL_L;
	IIC_SendACK(ACK);
	return data;
}
 
/*******************************************************************
 * Function  : 发送应答
 * Parameter : u8 ACK
 * Return    : void
 * Comment   : 
********************************************************************/
void IIC_SendACK(u8 ACK)
{
	IIC_SDA_Output();
	 SCL_L;
	if(ACK)
	{
		SDA_H;
	}
	else
	{
		SDA_L;
	}
	delay_us(2);
	SCL_H;
	delay_us(1);
	SCL_L;
}

2.AT24C02模块编程

/*******************************************************************
 * Function  : AT24C02初始化
 * Parameter : void
 * Return    : void
 * Comment   : 器件写地址:0xa0,器件读地址:0xa1
********************************************************************/
void AT24C02_Init(void)
{
	IIC_Init();
}
 
/*******************************************************************
 * Function  : AT24C02写单字节
 * Parameter : u8 data,u8 addr
 * Return    : void
 * Comment   : 器件写地址:0xa0
********************************************************************/
void AT24C02_WriteByte(u8 data,u8 addr)
{
	//第一步:起始条件
	 IIC_Start();
	//第二步:发送器件写地址
	 if(IIC_SendByte(0Xa0)) IIC_Stop();
	//第三步:发送字地址
	 if(IIC_SendByte(addr)) IIC_Stop();
	//第四步:发送数据
	 IIC_SendByte(data);
	//第五步:停止条件
	  IIC_Stop();
	delay_ms(5);
}
 
/*******************************************************************
 * Function  : AT24C02读单字节
 * Parameter : u8 addr
 * Return    : u8 
 * Comment   : 器件写地址:0xa0
********************************************************************/
u8 AT24C02_ReadByte(u8 addr)
{
	u8 data=0;
	//第一步:起始条件
	 IIC_Start();
	//第二步:发送器件写地址
	 if(IIC_SendByte(0Xa0)) IIC_Stop();
	//第三步:发送字地址
	 if(IIC_SendByte(addr)) IIC_Stop();
	//第四步:发送重复起始条件
	 IIC_Start();
	//第五步:发送器件读地址
	 if(IIC_SendByte(0xa1)) IIC_Stop();
	//第六步:接收数据
	  data= IIC_RecByte(0);
	//第七步:停止条件
	  IIC_Stop();
	 return data;
}

二、AT24C02的连续读写操作

IIC模块和单次读写一致,这里不在赘述。

AT24C02的连续读写模块

/*******************************************************************
 * Function  : AT24C02初始化
 * Parameter : void
 * Return    : void
 * Comment   : 器件写地址:0xa0,器件读地址:0xa1
********************************************************************/
void AT24C02_Init(void)
{
	IIC_Init();
}

/*******************************************************************
 * Function  : AT24C02写单字节
 * Parameter : u8 data,u8 addr
 * Return    : void
 * Comment   : 器件写地址:0xa0
********************************************************************/
void AT24C02_WriteByte(u8 data,u8 addr)
{
	//第一步:起始条件
	 IIC_Start();
	//第二步:发送器件写地址
	 if(IIC_SendByte(0Xa0)) IIC_Stop();
	//第三步:发送字地址
	 if(IIC_SendByte(addr)) IIC_Stop();
	//第四步:发送数据
	 IIC_SendByte(data);
	//第五步:停止条件
	  IIC_Stop();
	 delay_ms(5);
}

/*******************************************************************
 * Function  : AT24C02读单字节
 * Parameter : u8 addr
 * Return    : u8 
 * Comment   : 器件写地址:0xa0
********************************************************************/
u8 AT24C02_ReadByte(u8 addr)
{
	u8 data=0;
	//第一步:起始条件
	 IIC_Start();
	//第二步:发送器件写地址
	 if(IIC_SendByte(0Xa0)) IIC_Stop();
	//第三步:发送字地址
	 if(IIC_SendByte(addr)) IIC_Stop();
	//第四步:发送重复起始条件
	 IIC_Start();
	//第五步:发送器件读地址
	 if(IIC_SendByte(0xa1)) IIC_Stop();
	//第六步:接收数据
	  data= IIC_RecByte(0);
	//第七步:停止条件
	  IIC_Stop();
	 return data;
}

/*******************************************************************
 * Function  : AT24C02页写
 * Parameter : u8*buff,u8 addr
 * Return    : void
 * Comment   : 器件写地址:0xa0
********************************************************************/
void AT24C02_PageWrite(u8 *buff,u8 addr)
{
	//第一步:起始条件
	 IIC_Start();
	//第二步:发送器件写地址
	 if(IIC_SendByte(0Xa0)) IIC_Stop();
	//第三步:发送字地址
	 if(IIC_SendByte(addr)) IIC_Stop();
	//第四步:发送数据
	for(u8 i=0;i<(8-addr%8);i++)
	{
		if(IIC_SendByte(buff[i]))  IIC_Stop();
		delay_ms(5);
	}
	//第五步:停止条件
	  IIC_Stop();
}


/*******************************************************************
 * Function  : 连续写
 * Parameter : u8 ADDR,u8*buff,u8 num
 * Return    : void
 * Comment   : 
********************************************************************/
void AT24C02_Write(u8 ADDR,u8 *buff,u8 num)
{
	for(u8 i=0;i<num;i++)
	{
	 AT24C02_WriteByte(buff[i],ADDR+i);
		delay_ms(5);
	}
}

/*******************************************************************
 * Function  : 连续读
 * Parameter : u8 ADDR,u8*buff,u8 num
 * Return    : void
 * Comment   : 
********************************************************************/
void AT24C02_Read(u8 ADDR,u8 *buff,u8 num)
{
	for(u8 i=0;i<num;i++)
	{
	buff[i]= AT24C02_ReadByte(ADDR+i);
		delay_ms(5);
	}
}

PS:想要完整工程的可以私信我

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值