AT24C02.c的源代码
c
/**
******************************************************************************
* @file at24c02.c
* @brief AT24C02 EEPROM驱动程序实现
******************************************************************************
*/
#include "at24c02.h"
/**
* @brief 初始化AT24C02
* @retval 0: 成功, 1: 失败
*/
uint8_t AT24C02_Init(void)
{
return AT24C02_IsConnected();
}
/**
* @brief 检查AT24C02是否连接
* @retval 0: 成功, 1: 失败
*/
uint8_t AT24C02_IsConnected(void)
{
return HAL_I2C_IsDeviceReady(&hi2c1, AT24C02_ADDRESS, 3, 100);
}
/**
* @brief 从AT24C02读取一个字节
* @param addr: 要读取的地址(0-255)
* @retval 读取到的数据
*/
uint8_t AT24C02_ReadByte(uint16_t addr)
{
uint8_t data = 0;
// 确保地址在有效范围内
if(addr >= AT24C02_SIZE) return 0;
HAL_I2C_Mem_Read(&hi2c1, AT24C02_ADDRESS, addr, I2C_MEMADD_SIZE_8BIT, &data, 1, 100);
return data;
}
/**
* @brief 向AT24C02写入一个字节
* @param addr: 要写入的地址(0-255)
* @param data: 要写入的数据
* @retval 0: 成功, 1: 失败
*/
uint8_t AT24C02_WriteByte(uint16_t addr, uint8_t data)
{
// 确保地址在有效范围内
if(addr >= AT24C02_SIZE) return 1;
return HAL_I2C_Mem_Write(&hi2c1, AT24C02_ADDRESS, addr, I2C_MEMADD_SIZE_8BIT, &data, 1, 100);
}
/**
* @brief 从AT24C02读取多个字节
* @param addr: 要读取的起始地址(0-255)
* @param data: 存储读取数据的缓冲区
* @param len: 要读取的字节数
* @retval 0: 成功, 1: 失败
*/
uint8_t AT24C02_ReadBytes(uint16_t addr, uint8_t *data, uint16_t len)
{
// 确保地址和长度在有效范围内
if(addr >= AT24C02_SIZE || (addr + len) > AT24C02_SIZE || data == NULL) return 1;
return HAL_I2C_Mem_Read(&hi2c1, AT24C02_ADDRESS, addr, I2C_MEMADD_SIZE_8BIT, data, len, 100);
}
/**
* @brief 向AT24C02写入多个字节
* @param addr: 要写入的起始地址(0-255)
* @param data: 要写入的数据缓冲区
* @param len: 要写入的字节数
* @retval 0: 成功, 1: 失败
*/
uint8_t AT24C02_WriteBytes(uint16_t addr, uint8_t *data, uint16_t len)
{
uint16_t i;
uint16_t offset = 0;
uint16_t write_len;
uint8_t result = 0;
// 确保地址和长度在有效范围内
if(addr >= AT24C02_SIZE || (addr + len) > AT24C02_SIZE || data == NULL) return 1;
// 分页写入
while(len > 0)
{
// 计算当前页可写入的字节数
write_len = AT24C02_PAGE_SIZE - (addr % AT24C02_PAGE_SIZE);
if(write_len > len) write_len = len;
// 写入数据
result = HAL_I2C_Mem_Write(&hi2c1, AT24C02_ADDRESS, addr, I2C_MEMADD_SIZE_8BIT,
&data[offset], write_len, 100);
if(result != 0) return result;
// 等待写入完成(通常需要5ms)
HAL_Delay(5);
// 更新参数
addr += write_len;
offset += write_len;
len -= write_len;
}
return result;
}