|
//IIC+中断 //记住不光要开IT中断,还要把I2C global中断打开 include "sht30.h"// IT状态标志(仅用于批量读取) volatile uint8_t ina226_IT_rx_done = 0; // 接收完成标志 volatile uint8_t ina226_IT_rx_error = 0; // 接收错误标志 uint8_t ina226_IT_read_buf[4] = {0}; // 批量读取缓存(6字节:3个16位寄存器) float Power, Current, BusVoltage; uint16_t num_of_Current = 0; uint8_t sht30_rx_err = 0; HAL_StatusTypeDef INA226_Read_ALL_IT(uint8_t Dev_addr) { // 检查上一次IT是否还在进行 if (HAL_I2C_GetState(&INA226_IIC) == HAL_I2C_STATE_BUSY_RX) { return HAL_BUSY; } // 重置IT状态和缓存 ina226_IT_rx_done = 0; ina226_IT_rx_error = 0; for (uint8_t i = 0; i < 4; i++) { ina226_IT_read_buf[i] = 0; } // 启动IT批量读取:从0x02寄存器开始,连续读取6字节(0x02/0x03/0x04各2字节) // 核心:利用INA226寄存器地址自动递增特性,一次读取3个寄存器 HAL_StatusTypeDef ret = HAL_I2C_Mem_Read_IT( &INA226_IIC, Dev_addr<<1, // 设备地址(Mem_Read自动处理读位,无需|0x01) INA226_REG_POWER, // 起始寄存器地址(0x02) I2C_MEMADD_SIZE_8BIT, // 寄存器地址8位 ina226_IT_read_buf, // IT接收缓存(6字节) 4 // 读取长度:3个寄存器×2字节=6字节 ); if (ret != HAL_OK) { return ret; // IT启动失败 } return HAL_OK; } /**
/** @brief I2C IT错误回调(仅处理INA226) / void HAL_I2C_ErrorCallback(I2C_HandleTypeDef *hi2c) { if (hi2c->Instance == INA226_IIC.Instance) { if(num_of_Current != 0) { ina226_IT_rx_done = 1; // 标记传输结束 ina226_IT_rx_error = 1; // 标记错误 INA226_Read_ALL_IT(addr_1); } else { sht30_rx_err = 1; SHT30_Read_ALL_IT(SHT30_ADDR_1); } } }
|
STM32H747XG下载一次仿真器就检测不到,运行不能正常
STM8L的bootload中断向量表重映射
在学习stm32,有哪些视频教程呢?想系统研究研究
STM32G474VET6如何配置HRTIM的中心对齐模式
请问怎么使用stm32+spi实现bissc通信?有大佬弄过吗?
请问设备剧烈运动后静置数据无法归零,必须重启设备才能归零,是什么原因呢,如何处理,谢谢各位有偿咨询各位
stm32电源部分
stm32g431rbt怎么显示汉字
ST MotorControl Workbench 生成代码过程中报错Java的非法反射警告
HAL_TIM_IC_Start_DMA的回调函数是HAL_TIM_IC_CaptureCpltCallback吗?为什么进不去?
微信公众号
手机版
学到了