十三届蓝桥杯嵌入式EEPROM

目录

原理 

代码

注意事项:

原理 

通过查看AT24C02的数据手册我们可以知道

十三届蓝桥杯嵌入式EEPROM_第1张图片十三届蓝桥杯嵌入式EEPROM_第2张图片

 24C02对应的器件地址:AT24C02对应2K         也就是1010 0000->0xa0

 内部组织了32页,每页8字节,每个字节8位,一共是32*8*8=2048个数据,也就是2K,2K需要一个8位数据字地址的随机字寻址。

十三届蓝桥杯嵌入式EEPROM_第3张图片

写一个字节的时序:

1.起始信号

2.写入器件地址

3.等待应答信号

4.写入片内单元地址+0=写

5.等待应答信号

6.写入数据

7.等待应答信号

8.停止信号 

十三届蓝桥杯嵌入式EEPROM_第4张图片

 读取时序:

1.起始信号
2.写入器件地址+0=写
3.等待应答信号
 4.写入片内单元地址
5.等待应答信号
6.起始信号(也可以在起始信号前面加上一个停止信号)
7.写入器件地址+1=读
8.等待应答信号
9.读取数据
10. 发送非应答信号
11.停止信号

代码

#define M24C02_Write   0xa0//写入器件地址+0=写
#define M24C02_Read    0xa1//写入器件地址+1=读



void EEPROM_Write(uint8_t add,uint8_t date)//问题:是不是可以连续写几个字节
{
	I2CStart();//起始信号
	I2CSendByte(M24C02_Write);//写入器件地址+0=写
	I2CWaitAck();
	I2CSendByte(add);//写入片内单元地址
	I2CWaitAck();
	I2CSendByte(date);//写入数据
	I2CWaitAck();
	I2CStop();//停止
}

uint8_t EEPROM_Read(uint8_t add)
{
	I2CStart();//起始信号
	I2CSendByte(M24C02_Write);//写入器件地址+0=写
	I2CWaitAck();
	I2CSendByte(add);//写入片内单元地址
	I2CWaitAck();
	I2CStart();//起始信号
	I2CSendByte(M24C02_Read);//写入器件地址+1=读
	I2CWaitAck();
	val_EEPROM=I2CReceiveByte();//读取数据
	I2CSendNotAck();
	I2CStop();//停止
	return val_EEPROM;
}

//调用方式
EEPROM_Write(0x00,0x05);
val_iic=EEPROM_Read(0x00);

AT24C02一次只能发送和接收一个字节。如果题目要求的是16位变量的话,要在自己在8位的基础上写一个16位的收发程序。
(这里要注意两个发送函数之间要有一个大约5ms的延时,保证一次写入结束再进行下一次。接收函数也是。不加延时的话会导致数据失真,这个在AT24C02的数据手册也能看到。)

注意事项:

1.忘记加i2c的初始化会读出来的数据都是255

你可能感兴趣的:(十三届蓝桥杯嵌入式,蓝桥杯,stm32)