杭州市住房与城乡建设部网站,单页式网站模板,wordpress 登录后查看,开发板是干什么用的AT24C64存储空间大小为64Kbit#xff0c;也就是65536bit#xff0c;能存放65536/8 8192Byte数据。
写数据
1、按字节写 发送了起始信号后#xff0c;第一部分要先发送从机地址#xff0c;第二部分发送访问的存储地址#xff0c;第三部分发送写入的一字节数据。 从机地址…AT24C64存储空间大小为64Kbit也就是65536bit能存放65536/8 8192Byte数据。
写数据
1、按字节写 发送了起始信号后第一部分要先发送从机地址第二部分发送访问的存储地址第三部分发送写入的一字节数据。 从机地址按硬件上EEPROM芯片的A2 A1 A0引脚接线来定义。 存储地址可以看到由13位组成最左三位是无意义的位因为按照上面所说AT24C64可以存储8192个字节的数据实际以0为起始的话就只有8191个数据8191换算成二进制为00011111 11111111可以看出刚好能由13位表示EEPROM内部数据的存储地址。 void AT24C64_W(uint16_t Address, uint8_t Data)
{I2C_Start();I2C_SendByte(AT24C64_Write);uint8_t ack1 I2C_ReceiveAck();I2C_SendByte(Address8);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红线画出来的地方表示当前页写满后会重新覆盖掉这一页前面的数据而不会自动跳转到下一页。 自己写的简易版按页写数据 void AT24C64_W_Page(uint16_t Address, uint8_t *Data)
{uint8_t i;I2C_Start();I2C_SendByte(AT24C64_Write);uint8_t ack1 I2C_ReceiveAck();I2C_SendByte(Address8);I2C_ReceiveAck();I2C_SendByte(Address);I2C_ReceiveAck();for (i 0; i 32; i){I2C_SendByte(Data[i]);I2C_ReceiveAck();}I2C_Stop();
} ai升级版按页写数据 HAL库要求传入 (7位地址 1)即 0x50 1 0xA0。底层行为HAL库会在总线上发出正确的8位地址0xA0写0xA1读。推荐实践使用 HAL_I2C_Mem_Read/Write 简化操作避免手动处理方向位。 #define AT24C64_ADDR 0x50 // I2C设备地址/*** brief 向AT24C64写入一页数据最多32字节* param page_num 页号0~255共256页* param offset 页内偏移0~31* param data 待写入数据指针* param len 数据长度不超过32-offset* return HAL_OK成功其他失败*/
HAL_StatusTypeDef AT24C64_PageWrite(uint8_t page_num, uint8_t offset, uint8_t *data, uint8_t len) {// 参数检查if (page_num 255 || offset 31 || len (32 - offset)) {return HAL_ERROR;}// 计算16位EEPROM地址高5位为页号低8位为页内地址uint16_t mem_addr (page_num 5) | offset;uint8_t addr_buffer[2] { (uint8_t)(mem_addr 8), (uint8_t)(mem_addr 0xFF) };// 组合I2C传输数据地址 数据uint8_t i2c_buffer[2 32]; // 地址2字节 数据最多32字节memcpy(i2c_buffer, addr_buffer, 2);memcpy(i2c_buffer 2, data, len);// 启动I2C传输HAL_StatusTypeDef status HAL_I2C_Master_Transmit(hi2c1, // I2C句柄需提前初始化AT24C64_ADDR 1, // 设备地址左移1位HAL库要求i2c_buffer, // 数据缓冲区2 len, // 总长度地址数据HAL_MAX_DELAY // 超时时间);// 等待写入完成AT24C64需要约5ms内部写入周期if (status HAL_OK) {HAL_Delay(5);}return status;
} uint8_t data[32] {0x01, 0x02, 0x20}; // 3字节数据HAL_StatusTypeDef status AT24C64_PageWrite(1, 3, data, 3); // 写入第1页偏移3,地址为0x35
读数据
1.当前地址读取数据。 2.选定地址读取数据 。 3.连续读取数据。 void AT24C64_R(uint16_t Address, uint8_t *PBUff, uint16_t datalen)
{uint8_t i;I2C_Start();I2C_SendByte(AT24C64_Write);I2C_ReceiveAck();I2C_SendByte(Address8);I2C_ReceiveAck();I2C_SendByte(Address);uint8_t ack4 I2C_ReceiveAck();I2C_Start();I2C_SendByte(AT24C64_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容量) 页数 × 页内字节单元数。
AT24CXXXbit容量Byte容量页数页内字节单元数AT24C01 1Kbit128Byte16页 8ByteAT24C02 2Kbit 256Byte32页 8ByteAT24C04 4Kbit 512Byte32页16ByteAT24C08 8Kbit 1024Byte64页 16ByteAT24C16 16Kbit2048Byte128页 16ByteAT24C32 32Kbit 4096Byte128页 32ByteAT24C6464Kbit8192Byte256页32ByteAT24C128 128Kbit 16384Byte256页64ByteAT24C256 256Kbit 32768Byte512页 64Byte
参考文章