## I2C 战舰 F103ZET6 24C02 的 SCL 和 SDA 分别连在 STM32F1 的 PB6 和 PB7 上, 对应IIC1 考虑更16bit的 EEPROM, 时钟模块等 可以考虑 LL库配置, Project 管理里面可以选择 HAL LL库 ### 配置 I2C1 PB6 和 PB7 不需要重映射 400000 快速 开启中断 配置生成代码后 , ### 库函数 库函数 参考 stm32f1xx_hal_i2c.h 包含 polling IT DMA 三种模式,以及事件处理 LL_I2C_Enable(I2C2); LL_I2C_EnableIT_EVT(I2C2); status = HAL_I2C_Master_Transmit(&hi2c1,32,i2c_master_buff,6,1000); status = HAL_I2C_Master_Receive(&hi2c1,32,rx_buff,10,1000); 返回状态码为1 ### 结构体如何写入 EEPROM ### 代码 对AT24CXX 不同型号的封装 ```C #ifndef __HAL_AT24CXX_H__ #define __HAL_AT24CXX_H__ #include "stm32f1xx_hal.h" #define AT24C01 127 #define AT24C02 255 #define AT24C04 511 #define AT24C08 1023 #define AT24C16 2047 #define AT24C32 4095 #define AT24C64 8191 #define AT24C128 16383 #define AT24C256 32767 //我使用的是AT24C02 #define EE_TYPE AT24C02 void AT24CXX_Init(void); void AT24CXX_Write(uint16_t WriteAddr,uint8_t *pBuffer,uint16_t NumToWrite); void AT24CXX_Read(uint16_t ReadAddr,uint8_t *pBuffer,uint16_t NumToRead); uint8_t AT24CXX_Check(void); #endif ``` ```C #include "HAL_AT24CXX.h" extern I2C_HandleTypeDef hi2c1; #define AT24CXX_HANDLE (&hi2c1) //IIC接口 #define AT24C_DEV_ADDR (0XA0) //设备地址 void AT24CXX_Init(void) { //IIC_Init();//IIC初始化 AT24CXX_Check(); } /***************************************** 函数名:void AT24CXX_Write(uint16_t WriteAddr,uint8_t *pBuffer,uint16_t NumToWrite) 参数:WriteAddr :要写入数据的地址 pBuffer:要写入的数据的首地址 NumToWrite:要写入数据的长度 功能描述:从指定地址开始写入多个字节数据 返回值:无 *****************************************/ void AT24CXX_Write(uint16_t WriteAddr,uint8_t *pBuffer,uint16_t NumToWrite) { if(EE_TYPE < AT24C16) HAL_I2C_Mem_Write(AT24CXX_HANDLE,AT24C_DEV_ADDR,WriteAddr,I2C_MEMADD_SIZE_8BIT,pBuffer,NumToWrite,HAL_MAX_DELAY); else HAL_I2C_Mem_Write(AT24CXX_HANDLE,AT24C_DEV_ADDR,WriteAddr,I2C_MEMADD_SIZE_16BIT,pBuffer,NumToWrite,HAL_MAX_DELAY); } /***************************************** 函数名:AT24CXX_Read(uint16_t ReadAddr,uint8_t *pBuffer,uint16_t NumToRead) 参数: ReadAddr:要读取数据的地址 pBuffer:回填数据首地址 NumToRead:数据长度 功能描述:从指定地址开始读取多个个字节数据 返回值:无 *****************************************/ void AT24CXX_Read(uint16_t ReadAddr,uint8_t *pBuffer,uint16_t NumToRead) { if(EE_TYPE < AT24C16) HAL_I2C_Mem_Read(AT24CXX_HANDLE,AT24C_DEV_ADDR,ReadAddr,I2C_MEMADD_SIZE_8BIT,pBuffer,NumToRead,HAL_MAX_DELAY); else HAL_I2C_Mem_Write(AT24CXX_HANDLE,AT24C_DEV_ADDR,ReadAddr,I2C_MEMADD_SIZE_16BIT,pBuffer,NumToRead,HAL_MAX_DELAY); } /***************************************** 函数名:uint8_t AT24CXX_Check(void) 参数:无 功能描述:检查AT24CXX是否正常,这里用了24XX的最后一个地址(255)来存储标志字.如果用其他24C系列,这个地址要修改 返回值:检测成功返回0 失败返回1 *****************************************/ uint8_t AT24CXX_Check(void) { uint8_t temp; uint8_t data = 0XAB; AT24CXX_Read(EE_TYPE,&temp,1);//避免每次开机都写AT24CXX if(temp != 0XAB) return 1; else//排除第一次初始化的情况 { AT24CXX_Write(EE_TYPE,&data,1); AT24CXX_Read(EE_TYPE,&temp,1);; if(temp != 0XAB) return 1; } return 0; } ```