FM24CL64B-GTR是一种串行EEPROM(Electrically Erasable Programmable Read-Only Memory),也称为串行非易失性存储器。它可以通过串行接口进行读取和写入。
该型号的EEPROM具有快速的读写速度、低功耗、高可靠性和长期数据保存能力等特点。
总的来说,FM24CL64B-GTR是一种常见的串行EEPROM存储器,具有适中的容量和可靠性,适用于各种嵌入式应用场景。
可以对多个地址块区进行读写
fram.h
#ifndef __FRAM_H
#define __FRAM_H
#include "i2c.h"
#include "main.h"
#define EEPROM_I2C_ADDRESS 0xA0 // 读写的地址,在用户手册中可以找到
#define EEPROM_MAX_SIZE 8192
#define memAddress1 0x0000 // 第一块地址
#define memAddress2 0x0020 // 第二块地址(可以自己调整)
// 0x0000 到 0x0020之间有32个8位,所以第一块地址可以写32个8位数据
void EEPROM_WriteData(uint16_t memAddress, uint8_t *pData, uint16_t size);
void EEPROM_ReadData(uint16_t memAddress, uint8_t *pData, uint16_t size);
#endif
fram.c
#include "fram.h"
uint8_t Wirte_Data_1[16] = {0}; // 发送数据包1
uint8_t Wirte_Data_2[16] = {0}; // 发送数据包2
uint8_t Read_Data_1[16]; // 读取数据包1
uint8_t Read_Data_2[16]; // 读取数据包2
/*
* FRAM读函数
*
* memAddress:fram中的地址(在fram.h文件中有宏定义)
* pData:读取内容存放数组
* size:读取的字节大小
*/
void EEPROM_ReadData(uint16_t memAddress, uint8_t *pData, uint16_t size) {
uint8_t txData[2];
txData[0] = (uint8_t)((memAddress >> 8) & 0xFF); // 高字节
txData[1] = (uint8_t)(memAddress & 0xFF); // 低字节
HAL_I2C_Master_Transmit(&hi2c1, EEPROM_I2C_ADDRESS, txData, 2, HAL_MAX_DELAY);
HAL_I2C_Master_Receive(&hi2c1, EEPROM_I2C_ADDRESS, pData, size, HAL_MAX_DELAY);
}
/*
* FRAM写函数
*
* memAddress:fram中的地址(在fram.h文件中有宏定义)
* pData:写入数组
* size:读取的字节大小
*/
void EEPROM_WriteData(uint16_t memAddress, uint8_t *pData, uint16_t size) {
uint8_t txData[32]; // 缓冲区大小可根据需要调整
uint16_t chunkSize = 32; // 每次写入的数据块大小
while (size > 0) {
uint16_t currentSize = (size < chunkSize) ? size : chunkSize;
txData[0] = (uint8_t)((memAddress >> 8) & 0xFF); // 高字节
txData[1] = (uint8_t)(memAddress & 0xFF); // 低字节
for (int i = 0; i < currentSize; i++) {
txData[i + 2] = pData[i];
}
HAL_I2C_Master_Transmit(&hi2c1, EEPROM_I2C_ADDRESS, txData, currentSize + 2, HAL_MAX_DELAY);
memAddress += currentSize;
pData += currentSize;
size -= currentSize;
}
}
main函数示例
uint8_t dataRead[32];
uint8_t dataToWrite[12] = {0x00, 0x11, 0x22, 0x33,0x44,0x55,0x66,0x77,0x88,0x99};
EEPROM_WriteData(memAddress1, dataToWrite, 10); // 写入第一个数据块
uint8_t dataToWrite2[16] = {0x12, 0x34, 0x56, 0x78};
EEPROM_WriteData(memAddress2, dataToWrite2, 4); // 写入第二个数据块
EEPROM_ReadData(memAddress1, dataRead, 10); // 读取刚才写入的两个数据块
printf("地址一的数据:");
for(uint8_t i = 0;i < 10; i++)
{
printf("%02x ",dataRead[i]);
}
printf("\n");
EEPROM_ReadData(memAddress2, dataRead, 4);
printf("地址二的数据:");
for(uint8_t i = 0;i < 4; i++)
{
printf("%02x ",dataRead[i]);
}
printf("\n");
打印结果:
由于本人也是新手小白,所有有可能有不完善的地方,希望出现问题可以提出,可以和大家多多交流,相互学习。