STM32G070CBTx使用LL库原生I2C读取FM24C04D
一直找不到效率较高的写法,所以花了一些时间自己写。
模仿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相关推荐
- linux串口读取mpu9250数据,模拟 I2C 读取 MPU9250 数据的测试笔记
硬件:STM32F103ZET6 + GY9250 软件:Keil MDK(v5.27)+ STM32CUBEMX(v5.2.1) 这里我在使用STM32CUBEMX最新版本(v5.5.0)生成Kei ...
- STM32单片机硬件I2C读取AHT10温湿度传感器数据
STM32使用硬件IIC读取AHT10温湿度传感器的数据并显示在0.96寸OLED屏上. 我用的单片机是STM32F103C8T6,程序用的是ST标准库写的. STM32使用硬件I2C读取SHTC3温 ...
- STM32L1系列I2C读取mpu9250数据
问题描述:I2C可以读取加速度和陀螺仪的6轴数据,不能读取到磁力计ID和数据,读取到磁力计ID为0x00或者0xFF. I2C读取9250按理应该挺简单.但是困扰了我三天,今天终于解决了.谷歌和百度有 ...
- STM32CubeMX配置I2C读取DS3231
使用HAL库操作DS3231 因为DSP2这个项目需要计时间功能所以封装了一下这个芯片的程序 硬件设计 我将它接到了I2C1对应的IO口是(SCL > PB6 | SDA > PB7) 程 ...
- vb6编写dll读取dat文件_【STM32Cube_15】使用硬件I2C读取温湿度传感器数据(SHT30)...
寻求更好的阅读体验,请移步Mculover666的个人博客: [STM32Cube_15]使用硬件I2C读取温湿度传感器数据(SHT30)www.mculover666.cn 本篇详细的记录了如何使 ...
- 【51单片机快速入门指南】4.4:I2C 读取HMC5883L / QMC5883L 磁力计
目录 硬知识 简介 操作模式 HMC5883L 连续测量模式 单次测量模式 闲置模式 QMC5883L 连续测量模式 待命模式 主要差异 寄存器 寄存器列表 HMC5883L QMC5883L 配置寄 ...
- arduino i2c 如何写16位寄存器_基于STM32使用I2C读取传感器数据
撑腰会儿:I2C通信协议介绍zhuanlan.zhihu.com 上文介绍了I2C协议的基本结构,今天,使用STM32和LM75A温度传感器来实现I2C读取信息. 首先,为了使用I2C读取传感器测量 ...
- ATECC508A芯片开发笔记(十一):NXP 平台移植ATECCx08 CryptoAuthLib库(I2C)
目录 ATECC508A芯片开发笔记(十一):NXP 平台移植x08库(I2C) 一.CryptoAuthLib 二.Nxp RT10xx平台上移植CryptoAuthLib 2.1.在官网下载最新的 ...
- 原生java读取properties与spring中@value、@ConfigurationProperties读取配置文件
原生java读取properties与spring中@value.@ConfigurationProperties读取配置文件 1.properties类 Properties 继承于 Hashtab ...
最新文章
- PHP TP5框架 安装运行 Warning: require(E:\phpstudy_pro\WWW\TP5\tp5\public/../thinkphp/base.php): failed to
- static关键字了解解析
- zerodivisionerror什么意思python-【转】为什么 Python 中的 True 等于 1
- python进度条 pyqt_python如何通过pyqt5实现进度条
- php的通用变量,认识并使用PHP的全局变量
- 分布式和集群的概念和区别
- 专业学习频道,欢迎关注数锐学堂
- 腾讯PCG推荐系统应用实践
- 心理平衡其实就这么简单
- jQuery实现下拉菜单[代码+详细讲解+效果图]
- 家用游戏机主机的发展历史
- 在Word文档中插入Excel表格时出现:“用于创建此对象的程序是Excel。您的计算机尚未安装此程序。”试试这个方法
- python 安装 pyinstaller 报错Preparing wheel metadata ... error
- 好心情:这4种营养素能增强抗抑郁药的疗效!不知道的人亏大了
- 爬瓜子二手车(json接口)
- kafka系列之Coordinator(14)
- 为什么需要云计算机,为什么需要云计算
- c语言控制继电器开合程序,求STC89c52单片机用倒计时控制继电器开、合的C语言程序,晶振12.000...
- 知网研学批量添加IEEE英文题注(同一作者),知网研学添加英文题注
- Excel 绘制简单散点图