AT24C02数据存储

3 篇文章 0 订阅
2 篇文章 0 订阅
本文详细介绍了使用IIC协议对AT24C02存储器进行读写操作的过程。在写操作中,通过IIC_Start()、IIC_Write_Byte()等函数实现数据写入,并在末尾加入5ms延时确保操作完成。读操作则利用内部地址计数器自动递增的特点,提供单字节读取和连续读取两种方式。测试代码验证了读写的正确性。
摘要由CSDN通过智能技术生成

一、引脚说明

引脚图述

WP:当该引脚接GND时可读可写,接Vcc只读。

二、器件地址

器件地址
开发板原理图:
开发板原理图
所以器件写地址为0xA0,读地址为0xA1。

三、写操作

字节写

void AT24C02_ByteWrite(uint8_t addr,uint8_t data)
{
	IIC_Start();
	IIC_Write_Byte(dev_addr | write_bit);
	IIC_Wait_Ack();
	IIC_Write_Byte(addr);
	IIC_Wait_Ack();
	IIC_Write_Byte(data);
	IIC_Wait_Ack();
	IIC_Stop();
	Delay_ms(5);
}

一定要在末尾延时一段时间,不然无法读取成功。 原因如下
延时
在这里插入图片描述
延时最大5ms,所以代码最后延时了5ms。
在这里插入图片描述

void Page_Write(uint8_t addr,uint8_t * data,uint8_t size)
{
	uint8_t i;
	IIC_Start();
	IIC_Write_Byte(dev_addr | write_bit);
	IIC_Wait_Ack();
	IIC_Write_Byte(addr);
	IIC_Wait_Ack();
	for(i=0;i<size;i++)
	{
		IIC_Write_Byte(*(data++));
		IIC_Wait_Ack();	
	}
	IIC_Stop();
	Delay_ms(5);
}

四、读操作

读取当前地址的下一位字节数据
在这里插入图片描述
内部数据字地址计数器保持在上一次读或写操作期间访问的最后一个地址。每读取一个字节,地址就自动加1.所以读取的内容是上一次地址的+1的数据。

uint8_t CurAddr_Read(void){uint8_t data;
IIC_Start();
IIC_Write_Byte( dev_addr | read_bit );
IIC_Wait_Ack();

data = IIC_Byte_Read();
IIC_No_Ack();
IIC_Stop();

return data;
}

测试代码如下

	AT24C02_ByteWrite(0x02,7);
	AT24C02_ByteWrite(0x01,6);
	printf("%x", CurAddr_Read());

在这里插入图片描述
-------------------------------------------------------分割线---------------------------------------------------
指定地址读取字节数据
在这里插入图片描述

uint8_t Ran_Read(uint8_t addr)
{
	uint8_t data;
	IIC_Start();
	IIC_Write_Byte(dev_addr | write_bit);
	IIC_Wait_Ack();
	IIC_Write_Byte(addr);
	IIC_Wait_Ack();
	IIC_Start();
	IIC_Write_Byte( dev_addr | read_bit );
	IIC_Wait_Ack();
	data = IIC_Byte_Read();
	IIC_No_Ack();
	IIC_Stop();
	
	return data;
}

测试代码如下:

	AT24C02_ByteWrite(0x02,7);
	AT24C02_ByteWrite(0x01,6);
	printf("%x", Ran_Read(0x01));

在这里插入图片描述
连续读:
在这里插入图片描述

void Seq_Read(uint8_t addr,uint8_t *data,uint8_t size)
{
	uint8_t i;
	IIC_Start();
	IIC_Write_Byte(dev_addr | write_bit);
	IIC_Wait_Ack();
	IIC_Write_Byte(addr);
	IIC_Wait_Ack();
	IIC_Start();
	IIC_Write_Byte( dev_addr | read_bit );
	IIC_Wait_Ack();
	for(i=0;i<size;i++)
	{
		(*data) = IIC_Byte_Read();
		data ++;
		IIC_Ack();
	}
	IIC_No_Ack();
	IIC_Stop();
}

效果如图:
在这里插入图片描述
测试代码

uint8_t data[] = {5,4,5,2,1};
uint8_t read[5]={0};
Page_Write(0x00,data,sizeof(data));
Seq_Read(0x00,read,sizeof(data));
for(i=0;i<sizeof(data);i++)
{
	printf("%x\n", read[i]);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值