/* * AT24C16.c * * Created on: Sep 26, 2024 * Author: 10425 */ #include "user.h" /** * @brief 写入一个字节到 AT24C16 * @param mem_address EEPROM 的目标地址 * @param data 要写入的数据 * @return HAL 状态 */ HAL_StatusTypeDef AT24C16_WriteByte(uint16_t mem_address, uint8_t data) { return HAL_I2C_Mem_Write(&I2C_HANDLE, AT24C16_ADDR << 1, mem_address, I2C_MEMADD_SIZE_16BIT, &data, 1, AT24C16_TIMEOUT); } /** * @brief 从 AT24C16 读取一个字节 * @param mem_address EEPROM 的目标地址 * @param data 用于存放读取数据的指针 * @return HAL 状态 */ HAL_StatusTypeDef AT24C16_ReadByte(uint16_t mem_address, uint8_t *data) { return HAL_I2C_Mem_Read(&I2C_HANDLE, AT24C16_ADDR << 1, mem_address, I2C_MEMADD_SIZE_16BIT, data, 1, AT24C16_TIMEOUT); } /** * @brief 从 AT24C16 写入多个字节 * @param mem_address EEPROM 的目标地址 * @param data 要写入的数据指针 * @param size 要写入的字节数 * @return HAL 状态 */ HAL_StatusTypeDef AT24C16_WriteBytes(uint16_t mem_address, uint8_t *data, uint16_t size) { HAL_StatusTypeDef status; uint16_t bytes_written = 0; uint16_t current_page_size; // 写入多个字节,考虑跨页问题 while (bytes_written < size) { // 计算当前页的剩余字节数,确保不会超出页面边界 current_page_size = AT24C16_PAGE_SIZE - (mem_address % AT24C16_PAGE_SIZE); // 如果当前数据剩余量小于当前页大小,则写入剩余数据量 if (size - bytes_written < current_page_size) current_page_size = size - bytes_written; // 向当前页写入数据 status = HAL_I2C_Mem_Write(&I2C_HANDLE, AT24C16_ADDR<<1, mem_address, I2C_MEMADD_SIZE_8BIT, data + bytes_written, current_page_size, AT24C16_TIMEOUT); if (status != HAL_OK) return status; // 如果写入失败,立即返回错误 // 更新地址和已写入的字节数 mem_address += current_page_size; bytes_written += current_page_size; // EEPROM 写入需要等待写周期,确保数据已写入 HAL_Delay(5); // 根据 AT24C16 数据手册,写入周期一般为 5ms } return HAL_OK; } /** * @brief 从 AT24C16 读取多个字节 * @param mem_address EEPROM 的目标地址 * @param data 用于存放读取数据的指针 * @param size 要读取的字节数 * @return HAL 状态 */ HAL_StatusTypeDef AT24C16_ReadBytes(uint16_t mem_address, uint8_t *data, uint16_t size) { return HAL_I2C_Mem_Read(&I2C_HANDLE, AT24C16_ADDR << 1, mem_address, I2C_MEMADD_SIZE_8BIT, data, size, HAL_MAX_DELAY); } /** * @brief 初始化 AT24C16 驱动 * @return HAL 状态 */ HAL_StatusTypeDef AT24C16_Init(void) { // 此函数可以包含特定的初始化代码,通常包括对 I²C 的配置和校验 if (HAL_I2C_IsDeviceReady(&I2C_HANDLE, AT24C16_ADDR << 1, 3,AT24C16_TIMEOUT) != HAL_OK) { return HAL_ERROR; // 如果设备未准备好则返回错误 } return HAL_OK; }