STM32软件I2C读写AT24C64

AT24C64存储空间大小为64Kbit,也就是65536bit,能存放65536/8 = 8192Byte数据。

写数据

1、按字节写

发送了起始信号后,第一部分要先发送从机地址,第二部分发送访问的存储地址,第三部分发送写入的一字节数据。

从机地址按硬件上EEPROM芯片的A2 A1 A0引脚接线来定义。

存储地址可以看到由13位组成,最左三位是无意义的位,因为按照上面所说,AT24C64可以存储8192个字节的数据,实际以0为起始的话就只有8191个数据,8191换算成二进制为00011111 11111111,可以看出刚好能由13位表示EEPROM内部数据的存储地址。

cpp 复制代码
void AT24C64_W(uint8_t Address, uint8_t Data)
{
    I2C_Start();
    I2C_SendByte(AT24C02_Write);
    uint8_t ack1 = I2C_ReceiveAck();
    I2C_SendByte(Address);
    I2C_ReceiveAck();
    I2C_SendByte(Address);
    I2C_ReceiveAck();
    I2C_SendByte(Data);
    uint8_t ack2 = I2C_ReceiveAck();
    I2C_Stop();
}
2、按页写

与按字节写入相比,页写入在第一个字节写完后再写了x个数据,因为AT24C64每页32个字节,所以这里的x = 3,也就是再写3byte后结束按页写入。

需要注意的是,每写一个Byte的数据页内地址+1,红线画出来的地方表示当前页写满后会重新覆盖掉这一页前面的数据,而不会自动跳转到下一页。

cpp 复制代码
void AT24C64_W_Page(uint8_t Address, uint8_t* Data)
{
    uint8_t i;
    I2C_Start();
    I2C_SendByte(AT24C02_Write);
    uint8_t ack1 = I2C_ReceiveAck(); 
    I2C_SendByte(Address);
    I2C_ReceiveAck();
    I2C_SendByte(Address);
    I2C_ReceiveAck();
    for ( i = 0; i < 32; i++)
    {
        I2C_SendByte(Data[i]);
        I2C_ReceiveAck();
    }
    I2C_Stop();
}

读数据

1.当前地址读取数据。
2.选定地址读取数据 。
3.连续读取数据。
cpp 复制代码
void AT24C64_R(uint8_t Address, uint8_t *PBUff, uint16_t datalen)
{
    uint8_t i;
    I2C_Start();
    I2C_SendByte(AT24C02_Write);
    I2C_ReceiveAck();
    I2C_SendByte(Address);
    I2C_ReceiveAck();
    I2C_SendByte(Address);
    uint8_t ack4 = I2C_ReceiveAck();

    I2C_Start();
    I2C_SendByte(AT24C02_Read);
    uint8_t ack3 = I2C_ReceiveAck();
    for (i = 0; i < datalen-1; i++)
    {
        PBUff[i] = I2C_ReceiveByte();
        I2C_Ack();
    }
    PBUff[datalen-1] = I2C_ReceiveByte();
    I2C_NAck();
    I2C_Stop();
}

注意:写完数据建议等待5ms,等待数据写入完成

AT24CXXX容量

总容量(Byte容量) = 页数 × 页内字节单元数。

|----------|---------|-----------|------|---------|
| AT24CXXX | bit容量 | Byte容量 | 页数 | 页内字节单元数 |
| AT24C01 | 1Kbit | 128Byte | 16页 | 8Byte |
| AT24C02 | 2Kbit | 256Byte | 32页 | 8Byte |
| AT24C04 | 4Kbit | 512Byte | 32页 | 16Byte |
| AT24C08 | 8Kbit | 1024Byte | 64页 | 16Byte |
| AT24C16 | 16Kbit | 2048Byte | 128页 | 16Byte |
| AT24C32 | 32Kbit | 4096Byte | 128页 | 32Byte |
| AT24C64 | 64Kbit | 8192Byte | 256页 | 32Byte |
| AT24C128 | 128Kbit | 16384Byte | 256页 | 64Byte |
| AT24C256 | 256Kbit | 32768Byte | 512页 | 64Byte |

参考文章

相关推荐
三易串口屏4 分钟前
三易串口屏开发教程:如何使用键盘控件输入参数并发送给单片机
单片机·嵌入式硬件·串口屏·三易串口屏·键盘控件
十月的皮皮34 分钟前
STM32从零到量产开发:四路继电器工业控制模块开发实战笔记(小白视角)
c语言·笔记·stm32·stm32cubemx·hal库
2CM_Embed1 小时前
F28379D 下载后 VOFA+ 无数据、Reset 后恢复:一次 TZ 中断误触发排查记录
笔记·单片机·sci·c2000·f28379d·vofa·tz
国科安芯1 小时前
空间机电一体化:AS32S601型抗辐射MCU在卫星推进与执行机构控制中的关键技术研究
单片机·嵌入式硬件·物联网·机器人·云计算
国科安芯2 小时前
AS32S601型抗辐射MCU在分布式太空算力架构中的技术演进与应用前景
人工智能·分布式·单片机·嵌入式硬件·架构·边缘计算
纯音乐sjc2 小时前
ARM Linux 嵌入式中断全流程解析:从 GPIO 到 GIC 架构实战
单片机·嵌入式硬件
雯宝2 小时前
|____1.4外部中断/看门狗/定时器/PWM/RTC/待机唤醒/ADC/DAC/IIC/SPI/485/CAN
单片机
sramdram17 小时前
基于32位微控制器的FOC汽车水泵方案
单片机·嵌入式硬件·汽车·微控制器·32位微控制器
十月的皮皮19 小时前
stm20260720-从新手 C 到量产 STM32 工程:程序设计推导指南
c语言·开发语言·stm32·stm32cubemx·hal库
开发笔记-阿牛20 小时前
解析一款有意思的产品||CK6159A语音芯片设计的儿童专注力训练机-舒尔特玩具
stm32·单片机·嵌入式硬件·音频