Skip to content

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;
}