i2c EEPROM读写注意事项

AT24C02是一款由Atmel公司(现Microchip Technology)生产的基于I2C接口的2Kb(256字节)电可擦除可编程只读存储器(EEPROM)。以下是AT24C02的主要特性:

存储容量:2Kb,即256字节,组织为32页,每页8字节 (M24C02 每页16字节)。
接口标准:采用两线制I2C串行接口,包括SDA(Serial Data Line)和SCL(Serial Clock Line)。
工作电压:通常为2.5V至5.5V。
寻址方式:7位I2C地址,可以通过硬件连线调整其中的部分位来支持多片AT24C02在同一总线上工作。
写入操作:写入一个字节后,需要最小5ms的写周期才能保证数据被正确写入。写操作支持页写,一页为8字节,但不支持跨页写入。

在使用AT24C02时,需要注意每次写入一页(8字节)数据后,确保有足够的写周期延时,然后再进行下一页的写入操作。读取数据时,则可以根据地址连续或随机读取任意位置的字节。

/*-------------------------------------------------*/
/*函数名:24C02写入一字节数据                      */
/*参  数:addr:地址  wdata:需要写入的数据        */
/*返回值:0:正确 其他:错误                       */
/*-------------------------------------------------*/
uint8_t M24C02_WriteByte(uint8_t addr, uint8_t wdata)
{
	i2c_Start();                           //发送起始信号
	i2c_SendByte(M24C02_WADDR);           //发送24C02写操作器件地址
	if(i2c_WaitAck()!=0) return 1;     //等待应答,错误的话,返回1
	i2c_SendByte(addr);                   //发送内部存储空间地址
	if(i2c_WaitAck()!=0) return 2;     //等待应答,错误的话,返回2
	i2c_SendByte(wdata);                  //发送数据
	if(i2c_WaitAck()!=0) return 3;     //等待应答,错误的话,返回3
	i2c_Stop();                            //发送停止信号
	return 0;	                           //正确,返回0
}
/*-------------------------------------------------*/
/*函数名:24C02写入一页(16字节)数据              */
/*参  数:addr:地址  wdata:需要写入的数据指针    */
/*返回值:0:正确 其他:错误                       */
/*-------------------------------------------------*/
uint8_t M24C02_WritePage(uint8_t addr, uint8_t *wdata){
	
	uint8_t i;                                  //用于for循环
	
	i2c_Start();                                //发送起始信号
	i2c_SendByte(M24C02_WADDR);                //发送24C02写操作器件地址
	if(i2c_WaitAck()!=0) return 1;          //等待应答,错误的话,返回1
	i2c_SendByte(addr);                        //发送内部存储空间地址
	if(i2c_WaitAck()!=0) return 2;          //等待应答,错误的话,返回2
	for(i=0;i<EE_PAGE_SIZE;i++){                          //循环16次写入一页
		i2c_SendByte(wdata[i]);                //发送数据
		if(i2c_WaitAck()!=0) return 3+i;    //等待应答,错误的话,返回3+i
	}
	i2c_Stop();                                 //发送停止信号
	return 0;	                                //正确,返回0
}
/*---------------------------------------------------------*/
/*函数名:24C02读取数据                                    */
/*参  数:addr:地址  rdata:接收缓冲区 datalen:读取长度   */
/*返回值:0:正确 其他:错误                               */
/*---------------------------------------------------------*/
uint8_t M24C02_ReadData(uint8_t addr, uint8_t *rdata, uint16_t datalen){
	
	uint8_t i;                                  //用于for循环
	
	i2c_Start();                                //发送起始信号
	i2c_SendByte(M24C02_WADDR);                //发送24C02写操作器件地址
	if(i2c_WaitAck()!=0) return 1;          //等待应答,错误的话,返回1
	i2c_SendByte(addr);                        //发送内部存储空间地址
	if(i2c_WaitAck()!=0) return 2;          //等待应答,错误的话,返回2
	i2c_Start();                                //再次发送起始信号
	i2c_SendByte(M24C02_RADDR);                //发送24C02读操作器件地址
	if(i2c_WaitAck()!=0) return 3;          //等待应答,错误的话,返回3
	for(i=0;i<datalen-1;i++){                   //循环datalen-1次,一个字节一个字节接收数据
		rdata[i] = IIC_Read_Byte(1);            //接收数据,发送应答给从机
	}
	rdata[datalen-1] = IIC_Read_Byte(0);        //接收最后一个字节,不发送应答信号
	i2c_Stop();                                 //发送停止信号
	return 0;		                            //正确,返回0
}

/*-------------------------------------------------*/
/*函数名:把OTA_Info结构体缓冲区数据保存到24C02    */
/*参  数:无                                       */
/*返回值:无                                       */
/*-------------------------------------------------*/
void M24C02_WriteOTAInfo(void)
{
	uint8_t i;                               //用于for循环
	uint8_t *wptr;                           //uint8_t类型指针
	
	wptr = (uint8_t *)&OTA_Info;             //wptr指向OTA_Info结构体首地址
	for(i=0;i<OTA_INFOCB_SIZE/EE_PAGE_SIZE;i++){       //每次写入一页16个字节
		M24C02_WritePage(i*EE_PAGE_SIZE,wptr+i*EE_PAGE_SIZE);    //写入一页数据
		delay_ms(5);                         //延时-------必须加延时保证成功写入
	}		
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值