HAL库配置IIC接口的EEPROM AT24C64
IO引脚在stm32f1xx_hal_msp.c里面。
关于HAL库中stm32f1xx_hal_msp.c文件的认知
https://www.stmcu.org.cn/module/forum/thread-620752-1-3.html
typedef uint8_t u8; typedef uint16_t u16; typedef uint32_t u32; #define AT24CXX_DEV_ADDRESS 0xA0 //写指令IIC地址 #define AT24CXX_DELAY_MS HAL_Delay int i = 0; //值得注意的是AT24C64的地址是16位的,并且内部写EPPROM空间的时间最长为5ms, //之前被这里坑了很久,差点以为I2C的库函数存在问题,所以上方的代码中尝试了多种读取参数的方式。 /* Memory Organization AT24C32/64, 32K/64K SERIAL EEPROM: The 32K/64K is internally organized as 256 pages of 32 bytes each. Ran- dom word addressing requires a 12/13 bit data word address. 32 bytes each===每个页共32个字节 */ void AT24CXX_WriteByte(u16 reg_address,u8 data) { static HAL_StatusTypeDef i; i = HAL_I2C_Mem_Write(&hi2c1,AT24CXX_DEV_ADDRESS,reg_address,I2C_MEMADD_SIZE_16BIT,&data,1,100); AT24CXX_DELAY_MS(5); //AT24C64的最长写入时间是5ms } u8 AT24CXX_ReadByte(u16 reg_address) { u8 data = 0; u8 temp[2]; temp[0] = reg_address>>8; temp[1] = reg_address; //HAL_I2C_Master_Transmit(&hi2c1,AT24CXX,temp,2,100); //HAL_I2C_Master_Receive(&hi2c1,AT24CXX,&data,1,100); HAL_I2C_Mem_Read(&hi2c1,AT24CXX_DEV_ADDRESS,reg_address,I2C_MEMADD_SIZE_16BIT,&data,2,100); return data; } /**************************************************************************** * 名 称: void AT24C02_Write(u8 WriteAddr,u8 *pBuffer,u8 WriteNum) * 功 能:从AT24C02里面的指定地址开始写入指定个数的数据 * 入口参数:WriteAddr :开始写入的地址 0~255 pBuffer :数据数组首地址 WriteNum:要写入数据的个数 * 返回参数: * 说 明: ****************************************************************************/ void AT24C64_Write(u16 WriteAddr,u8 *pBuffer,u8 WriteNum) { while(WriteNum--) { AT24CXX_WriteByte(WriteAddr,*pBuffer); WriteAddr++; pBuffer++; } } /**************************************************************************** * 名 称: void AT24C02_Read(u8 ReadAddr,u8 *pBuffer,u8 ReadNum) * 功 能:从AT24C02里面的指定地址开始读出指定个数的数据 * 入口参数:ReadAddr :开始读出的地址 0~255 pBuffer :数据数组首地址 ReadNum:要读出数据的个数 * 返回参数: * 说 明: ****************************************************************************/ void AT24C64_Read(u16 ReadAddr,u8 *pBuffer,u8 ReadNum) { while(ReadNum--) { *pBuffer++=AT24CXX_ReadByte(ReadAddr++); } } /**************************************************************************** * 名 称: u8 AT24C02_Test(void) * 功 能:测试AT24C02是否正常 * 入口参数:无 * 返回参数:返回1:检测失败 返回0:检测成功 * 说 明: ****************************************************************************/ u8 AT24C02_Test(void) { u8 Testdata; Testdata=AT24CXX_ReadByte(255); //如果开机测试,已有值无需再次写入 if(Testdata==0XAB)return 0; else { AT24CXX_WriteByte(255,0XAB); Testdata=AT24CXX_ReadByte(255); if(Testdata==0XAB)return 0; } return 1; }
调用
if(AT24C02_Test()==0) //检测通过 { HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14, GPIO_PIN_RESET); HAL_Delay(2000); }
AT24CXX_WriteByte(0x0001,0xA2); HAL_Delay(50); i = AT24CXX_ReadByte(0x0001); i = i+1; if(0xA3== i) HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14); HAL_Delay(500);
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决