当前位置: 首页 > news >正文

hal库i2c读写AT24C02

#include "i2c.h"/* USER CODE BEGIN 0 *//* USER CODE END 0 */I2C_HandleTypeDef hi2c1;/* I2C1 init function */
void MX_I2C1_Init(void)
{/* USER CODE BEGIN I2C1_Init 0 *//* USER CODE END I2C1_Init 0 *//* USER CODE BEGIN I2C1_Init 1 *//* USER CODE END I2C1_Init 1 */hi2c1.Instance = I2C1;hi2c1.Init.ClockSpeed = 400000;hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2;hi2c1.Init.OwnAddress1 = 0;hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;hi2c1.Init.OwnAddress2 = 0;hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;if (HAL_I2C_Init(&hi2c1) != HAL_OK){Error_Handler();}/* USER CODE BEGIN I2C1_Init 2 *//* USER CODE END I2C1_Init 2 */}void HAL_I2C_MspInit(I2C_HandleTypeDef* i2cHandle)
{GPIO_InitTypeDef GPIO_InitStruct = {0};if(i2cHandle->Instance==I2C1){/* USER CODE BEGIN I2C1_MspInit 0 *//* USER CODE END I2C1_MspInit 0 */__HAL_RCC_GPIOB_CLK_ENABLE();/**I2C1 GPIO ConfigurationPB6     ------> I2C1_SCLPB7     ------> I2C1_SDA*/GPIO_InitStruct.Pin = I2C1_SCL_Pin|I2C1_SDA_Pin;GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);/* I2C1 clock enable */__HAL_RCC_I2C1_CLK_ENABLE();/* USER CODE BEGIN I2C1_MspInit 1 *//* USER CODE END I2C1_MspInit 1 */}
}void HAL_I2C_MspDeInit(I2C_HandleTypeDef* i2cHandle)
{if(i2cHandle->Instance==I2C1){/* USER CODE BEGIN I2C1_MspDeInit 0 *//* USER CODE END I2C1_MspDeInit 0 *//* Peripheral clock disable */__HAL_RCC_I2C1_CLK_DISABLE();/**I2C1 GPIO ConfigurationPB6     ------> I2C1_SCLPB7     ------> I2C1_SDA*/HAL_GPIO_DeInit(I2C1_SCL_GPIO_Port, I2C1_SCL_Pin);HAL_GPIO_DeInit(I2C1_SDA_GPIO_Port, I2C1_SDA_Pin);/* USER CODE BEGIN I2C1_MspDeInit 1 *//* USER CODE END I2C1_MspDeInit 1 */}
}/* USER CODE BEGIN 1 */
ErrorCode eeprom_busy(void)
{HAL_StatusTypeDef ret;ret = HAL_I2C_IsDeviceReady(&hi2c1,SLAVER_ADDR,1000,5000);if(ret != HAL_OK)return ERR_I2C1DEVBUSY;else return ERR_OK;
}ErrorCode eeprom_pagewrite(uint16_t memaddr,uint8_t *pdata)
{	HAL_StatusTypeDef ret;if(memaddr%8 != 0)return ERR_INVALID_PARAM;ret = HAL_I2C_Mem_Write(&hi2c1,SLAVER_ADDR,memaddr,I2C_MEMADD_SIZE_8BIT,pdata,8,5000);if(ret != HAL_OK)return ERR_I2C1PAGEWRITEFAIL;elsereturn ERR_OK;
}ErrorCode eeprom_write(uint16_t memaddr,uint8_t *pdata,uint16_t len)
{HAL_StatusTypeDef ret;uint16_t pagenum,tail,pre;uint8_t *pback = pdata;if(memaddr>256 || len>256)return ERR_INVALID_PARAM;if(memaddr%8 ==0){pagenum  = len/8;tail = len%8;while(pagenum--){if(ERR_OK != eeprom_pagewrite(memaddr,pback))return ERR_I2C1WRITEFAIL;eeprom_busy();memaddr+=8;pback+=8;}if(tail){ret = HAL_I2C_Mem_Write(&hi2c1,SLAVER_ADDR,memaddr,I2C_MEMADD_SIZE_8BIT,pback,tail,5000);if(HAL_OK != ret)return ERR_I2C1WRITEFAIL;eeprom_busy();}}else{pre = 8-memaddr%8;pagenum = (len-pre)/8;if(!pagenum){ret = HAL_I2C_Mem_Write(&hi2c1,SLAVER_ADDR,memaddr,I2C_MEMADD_SIZE_8BIT,pback,pre,5000);if(HAL_OK != ret)return ERR_I2C1WRITEFAIL;eeprom_busy();memaddr+=pre;pback+=pre;if(len>pre){ret = HAL_I2C_Mem_Write(&hi2c1,SLAVER_ADDR,memaddr,I2C_MEMADD_SIZE_8BIT,pback,len-pre,5000);if(HAL_OK != ret)return ERR_I2C1WRITEFAIL;eeprom_busy();}}else{ret = HAL_I2C_Mem_Write(&hi2c1,SLAVER_ADDR,memaddr,I2C_MEMADD_SIZE_8BIT,pback,pre,5000);if(HAL_OK != ret)return ERR_I2C1WRITEFAIL;eeprom_busy();memaddr+=pre;pback+=pre;tail = (len-pre)%8;while(pagenum--){if(ERR_OK != eeprom_pagewrite(memaddr,pback))return ERR_I2C1WRITEFAIL;eeprom_busy();memaddr+=8;pback+=8;}if(tail){ret = HAL_I2C_Mem_Write(&hi2c1,SLAVER_ADDR,memaddr,I2C_MEMADD_SIZE_8BIT,pback,tail,5000);if(HAL_OK != ret)return ERR_I2C1WRITEFAIL;eeprom_busy();}}}return ERR_OK;
}ErrorCode eeprom_read(uint16_t memaddr,uint8_t *buff,uint16_t len)
{HAL_StatusTypeDef ret;if(len > 256 || memaddr > 256)return ERR_INVALID_PARAM;if(256-memaddr < len)len = 256-memaddr;ret = HAL_I2C_Mem_Read(&hi2c1,SLAVER_ADDR,memaddr,I2C_MEMADD_SIZE_8BIT,buff,len,1000);if(ret != HAL_OK)return ERR_I2C1READFAIL;elsereturn ERR_OK;
}
/* USER CODE END 1 */
http://www.jsqmd.com/news/114550/

相关文章:

  • 【Open-AutoGLM循环任务核心机密】:20年专家亲授高效自动化配置秘诀
  • 跨境电商新玩法:用Linly-Talker制作多语言产品介绍视频
  • 2025年目前正规的装修设计公司多少钱,软装设计/房屋装修/室内装修/别墅设计/大平层设计/室内设计/室内空间设计装修设计公司多少钱 - 品牌推荐师
  • 批量任务效率低?Open-AutoGLM并行处理优化方案来了,90%的人都忽略了这一点
  • 基于 Django 框架开发的智慧农业管理系统
  • 基于Android的陪诊护理系统APP
  • 基于YOLOv12的工地运输车识别检测系统(YOLOv12深度学习+YOLO数据集+UI界面+登录注册界面+Python项目源码+模型)
  • 【从入门到精通Open-AutoGLM】:3步构建零宕机进程管理体系
  • 基于 Python 开发的融合强化学习(RL)与大模型的船舶避碰系统
  • 揭秘Open-AutoGLM任务中断难题:3步实现无缝恢复与容错设计
  • 基于Python的个人云盘管理系统设计与实现
  • 深入解析:[Linux]学习笔记系列 -- [kernel]pid
  • 消防电缆生产厂家推荐2025年(12月)必看!耐火、防火、阻燃、阻燃B1级、矿物质防火电缆生产厂家推荐 - 品牌2026
  • Linly-Talker语音情绪识别功能上线,交互更拟人化
  • Open-AutoGLM高负载元凶曝光:90%团队忽略的底层资源泄漏问题(附检测工具链)
  • 基于YOLOv12的猫狗品种识别检测系统(YOLOv12深度学习+YOLO数据集+UI界面+登录注册界面+Python项目源码+模型)
  • 【限时揭秘】Open-AutoGLM异步任务处理的3个隐藏特性,第2个极少人知道
  • 交叉编译总结
  • 5大常见循环配置陷阱,99%新手都踩过的Open-AutoGLM雷区
  • 设备容器内存配额不足致OOM 后来才知道动态调整限制
  • Open-AutoGLM后台运行避坑指南(90%新手都会忽略的3个致命错误)
  • 2025年靠谱的合页排铰厂家推荐:看哪家技术实力强? - mypinpai
  • 别再手动清队列了!Open-AutoGLM智能调度的7个自动化实践
  • 基于Android的研学旅行APP设计
  • DAY 40
  • 2025年合肥口碑不错的装修设计品牌企业推荐,诚信的装修设计公司/企业全解析 - 工业推荐榜
  • 基于 Python 的股票数据可视化是金融数据分析领域的重要应用
  • Open-AutoGLM开机自启实战:systemd服务配置的8个核心要点
  • 2025合肥装修设计公司TOP5权威推荐:装修设计找哪家? - myqiye
  • 2025年比较好的卫浴缓冲隐藏轨/定制缓冲隐藏轨品牌厂家排行榜 - 品牌宣传支持者