一直找不到效率较高的写法,所以花了一些时间自己写。
模仿HAL库的写法,代码如下:

/**
* @brief  hal_i2c_mem_write i2c memory写
* @param  I2Cx I2C Instance.
* @param  SlaveAddr 从机地址
* @param  reg_addr memory地址
* @param  pData 数据指针
* @retval ERROR 错误
* @retval SUCCESS 成功
*/
ErrorStatus hal_i2c_mem_write(I2C_TypeDef* I2Cx, uint8_t SlaveAddr, uint8_t reg_addr, uint8_t *pData, uint16_t len)
{uint8_t size;if ((pData == NULL) || (len == 0U)){return ERROR;}while(LL_I2C_IsActiveFlag_BUSY(I2Cx) == SET);LL_I2C_HandleTransfer(I2Cx, SlaveAddr, LL_I2C_ADDRSLAVE_7BIT, 1, LL_I2C_MODE_RELOAD, LL_I2C_GENERATE_START_WRITE);while(LL_I2C_IsActiveFlag_TXIS(I2Cx) == RESET);LL_I2C_TransmitData8(I2Cx, reg_addr);/**< reg_addr目前只支持单字节地址 */while(LL_I2C_IsActiveFlag_TCR(I2Cx) == RESET);if(len > 0xFF){size = 0xFF;LL_I2C_HandleTransfer(I2Cx, SlaveAddr, LL_I2C_ADDRSLAVE_7BIT, size, LL_I2C_MODE_RELOAD, LL_I2C_GENERATE_NOSTARTSTOP); }else{size = len;LL_I2C_HandleTransfer(I2Cx, SlaveAddr, LL_I2C_ADDRSLAVE_7BIT, size, LL_I2C_MODE_AUTOEND, LL_I2C_GENERATE_NOSTARTSTOP);}  while(len){while(LL_I2C_IsActiveFlag_TXIS(I2Cx) == RESET){}LL_I2C_TransmitData8(I2Cx, *pData);pData++;size--;len--;if(len != 0 && size == 0){while(LL_I2C_IsActiveFlag_TCR(I2Cx) == RESET);if(len > 0xFF){size = 0xFF;LL_I2C_HandleTransfer(I2Cx, SlaveAddr, LL_I2C_ADDRSLAVE_7BIT, size, LL_I2C_MODE_RELOAD, LL_I2C_GENERATE_NOSTARTSTOP);}else{size = len;LL_I2C_HandleTransfer(I2Cx, SlaveAddr, LL_I2C_ADDRSLAVE_7BIT, size, LL_I2C_MODE_AUTOEND, LL_I2C_GENERATE_NOSTARTSTOP);}   }}while(LL_I2C_IsActiveFlag_STOP(I2Cx) == RESET);LL_I2C_ClearFlag_STOP(I2Cx);return SUCCESS;
}/**
* @brief  hal_i2c_mem_read i2c memory读
* @param  I2Cx I2C Instance.
* @param  SlaveAddr 从机地址
* @param  reg_addr memory地址
* @param  pData 数据指针
* @param  len 数据长度
* @retval ERROR 错误
* @retval SUCCESS 成功
*/
ErrorStatus hal_i2c_mem_read(I2C_TypeDef* I2Cx, uint8_t SlaveAddr, uint8_t reg_addr, uint8_t *pData,uint16_t len)
{uint8_t size;if ((pData == NULL) || (len == 0U)){return ERROR;}while(LL_I2C_IsActiveFlag_BUSY(I2Cx) == SET);LL_I2C_HandleTransfer(I2Cx, SlaveAddr, LL_I2C_ADDRSLAVE_7BIT, 1, LL_I2C_MODE_SOFTEND, LL_I2C_GENERATE_START_WRITE);while(LL_I2C_IsActiveFlag_TXIS(I2Cx) == RESET);LL_I2C_TransmitData8(I2Cx, reg_addr);/**< reg_addr目前只支持单字节地址 */while(LL_I2C_IsActiveFlag_TC(I2Cx) == RESET);if(len > 0xFF){size = 0xFF;LL_I2C_HandleTransfer(I2Cx, SlaveAddr, LL_I2C_ADDRSLAVE_7BIT, size, LL_I2C_MODE_RELOAD, LL_I2C_GENERATE_START_READ);}else{size = len;LL_I2C_HandleTransfer(I2Cx, SlaveAddr, LL_I2C_ADDRSLAVE_7BIT, size, LL_I2C_MODE_AUTOEND, LL_I2C_GENERATE_START_READ);} while(len){while(LL_I2C_IsActiveFlag_RXNE(I2Cx) == RESET);*pData = LL_I2C_ReceiveData8(I2Cx);pData++;size--;len--;if(len != 0 && size == 0){while(LL_I2C_IsActiveFlag_TCR(I2Cx) == RESET);if(len > 0xFF){size = 0xFF;LL_I2C_HandleTransfer(I2Cx, SlaveAddr, LL_I2C_ADDRSLAVE_7BIT, size, LL_I2C_MODE_RELOAD, LL_I2C_GENERATE_NOSTARTSTOP);}else{size = len;LL_I2C_HandleTransfer(I2Cx, SlaveAddr, LL_I2C_ADDRSLAVE_7BIT, size, LL_I2C_MODE_AUTOEND, LL_I2C_GENERATE_NOSTARTSTOP);}   }}while(LL_I2C_IsActiveFlag_STOP(I2Cx) == RESET);LL_I2C_ClearFlag_STOP(I2Cx);return SUCCESS;
}

STM32G070CBTx使用LL库原生I2C读取FM24C04D相关推荐

  1. linux串口读取mpu9250数据,模拟 I2C 读取 MPU9250 数据的测试笔记

    硬件:STM32F103ZET6 + GY9250 软件:Keil MDK(v5.27)+ STM32CUBEMX(v5.2.1) 这里我在使用STM32CUBEMX最新版本(v5.5.0)生成Kei ...

  2. STM32单片机硬件I2C读取AHT10温湿度传感器数据

    STM32使用硬件IIC读取AHT10温湿度传感器的数据并显示在0.96寸OLED屏上. 我用的单片机是STM32F103C8T6,程序用的是ST标准库写的. STM32使用硬件I2C读取SHTC3温 ...

  3. STM32L1系列I2C读取mpu9250数据

    问题描述:I2C可以读取加速度和陀螺仪的6轴数据,不能读取到磁力计ID和数据,读取到磁力计ID为0x00或者0xFF. I2C读取9250按理应该挺简单.但是困扰了我三天,今天终于解决了.谷歌和百度有 ...

  4. STM32CubeMX配置I2C读取DS3231

    使用HAL库操作DS3231 因为DSP2这个项目需要计时间功能所以封装了一下这个芯片的程序 硬件设计 我将它接到了I2C1对应的IO口是(SCL > PB6 | SDA > PB7) 程 ...

  5. vb6编写dll读取dat文件_【STM32Cube_15】使用硬件I2C读取温湿度传感器数据(SHT30)...

    寻求更好的阅读体验,请移步Mculover666的个人博客: [STM32Cube_15]使用硬件I2C读取温湿度传感器数据(SHT30)​www.mculover666.cn 本篇详细的记录了如何使 ...

  6. 【51单片机快速入门指南】4.4:I2C 读取HMC5883L / QMC5883L 磁力计

    目录 硬知识 简介 操作模式 HMC5883L 连续测量模式 单次测量模式 闲置模式 QMC5883L 连续测量模式 待命模式 主要差异 寄存器 寄存器列表 HMC5883L QMC5883L 配置寄 ...

  7. arduino i2c 如何写16位寄存器_基于STM32使用I2C读取传感器数据

    撑腰会儿:I2C通信协议介绍​zhuanlan.zhihu.com 上文介绍了I2C协议的基本结构,今天,使用STM32和LM75A温度传感器来实现I2C读取信息. 首先,为了使用I2C读取传感器测量 ...

  8. ATECC508A芯片开发笔记(十一):NXP 平台移植ATECCx08 CryptoAuthLib库(I2C)

    目录 ATECC508A芯片开发笔记(十一):NXP 平台移植x08库(I2C) 一.CryptoAuthLib 二.Nxp RT10xx平台上移植CryptoAuthLib 2.1.在官网下载最新的 ...

  9. 原生java读取properties与spring中@value、@ConfigurationProperties读取配置文件

    原生java读取properties与spring中@value.@ConfigurationProperties读取配置文件 1.properties类 Properties 继承于 Hashtab ...

最新文章

  1. PHP TP5框架 安装运行 Warning: require(E:\phpstudy_pro\WWW\TP5\tp5\public/../thinkphp/base.php): failed to
  2. static关键字了解解析
  3. zerodivisionerror什么意思python-【转】为什么 Python 中的 True 等于 1
  4. python进度条 pyqt_python如何通过pyqt5实现进度条
  5. php的通用变量,认识并使用PHP的全局变量
  6. 分布式和集群的概念和区别
  7. 专业学习频道,欢迎关注数锐学堂
  8. 腾讯PCG推荐系统应用实践
  9. 心理平衡其实就这么简单
  10. jQuery实现下拉菜单[代码+详细讲解+效果图]
  11. 家用游戏机主机的发展历史
  12. 在Word文档中插入Excel表格时出现:“用于创建此对象的程序是Excel。您的计算机尚未安装此程序。”试试这个方法
  13. python 安装 pyinstaller 报错Preparing wheel metadata ... error
  14. 好心情:这4种营养素能增强抗抑郁药的疗效!不知道的人亏大了
  15. 爬瓜子二手车(json接口)
  16. kafka系列之Coordinator(14)
  17. 为什么需要云计算机,为什么需要云计算
  18. c语言控制继电器开合程序,求STC89c52单片机用倒计时控制继电器开、合的C语言程序,晶振12.000...
  19. 知网研学批量添加IEEE英文题注(同一作者),知网研学添加英文题注
  20. Excel 绘制简单散点图

热门文章

  1. OpenWRT使用Wifidog实现强制认证的WIFI热点
  2. ntp linux 是什么意思,【NTP】Linux NTP
  3. 化学绘图软件是怎么快速调用帮助文档的
  4. 仓库是时候实施物联网了吗
  5. qq因计算机丢失打不开,QQ面板链接打不开或失效怎么办?
  6. 【MySQL数据库开发之一】Mac下配置安装数据库-MySQL
  7. 十大盗版软件你用了几个?
  8. vue 省市区三级联动 antd 级联组件 Cascader
  9. go-fastdfs
  10. 计算机的优缺点英语作文100词,英语作文 电脑的优点和缺点_900字_英语作文