首页 星云 工具 资源 星选 资讯 热门工具
:

PDF转图片 完全免费 小红书视频下载 无水印 抖音视频下载 无水印 数字星空

INA226软件IIC驱动.zip

硬件开发 2.34KB 40 需要积分: 1
立即下载

资源介绍:

INA226软件IIC驱动.zip
#include "ina226.h" /** * @brief IIC延时 * @param 无 * @retval 无 */ void I2C_Delay(void) { volatile uint8_t i = 20; while (i--) { ; } } /** * @brief IIC总线启动 * @param INA226结构体 * @retval 无 */ void I2C_Start(INA226_DataTypeDef *INA226_DataStruct) { HAL_GPIO_WritePin(INA226_DataStruct->Gpio, INA226_DataStruct->Gpio_Sda_Pin, GPIO_PIN_SET); HAL_GPIO_WritePin(INA226_DataStruct->Gpio, INA226_DataStruct->Gpio_Scl_Pin, GPIO_PIN_SET); I2C_Delay(); HAL_GPIO_WritePin(INA226_DataStruct->Gpio, INA226_DataStruct->Gpio_Sda_Pin, GPIO_PIN_RESET); I2C_Delay(); HAL_GPIO_WritePin(INA226_DataStruct->Gpio, INA226_DataStruct->Gpio_Scl_Pin, GPIO_PIN_RESET); I2C_Delay(); } /** * @brief IIC总线停止 * @param INA226结构体 * @retval 无 */ void I2C_Stop(INA226_DataTypeDef *INA226_DataStruct) { HAL_GPIO_WritePin(INA226_DataStruct->Gpio, INA226_DataStruct->Gpio_Sda_Pin, GPIO_PIN_RESET); HAL_GPIO_WritePin(INA226_DataStruct->Gpio, INA226_DataStruct->Gpio_Scl_Pin, GPIO_PIN_SET); I2C_Delay(); HAL_GPIO_WritePin(INA226_DataStruct->Gpio, INA226_DataStruct->Gpio_Sda_Pin, GPIO_PIN_SET); } /** * @brief 向I2C总线设备发送8bit数据 * @param INA226结构体 * @param 发送的数据 * @retval 无 */ void I2C_SendByte(INA226_DataTypeDef *INA226_DataStruct, uint8_t Byte) { uint8_t i; /* 先发送字节的高位bit7 */ for (i = 0; i < 8; i++) { if (Byte & 0x80) { HAL_GPIO_WritePin(INA226_DataStruct->Gpio, INA226_DataStruct->Gpio_Sda_Pin, GPIO_PIN_SET); } else { HAL_GPIO_WritePin(INA226_DataStruct->Gpio, INA226_DataStruct->Gpio_Sda_Pin, GPIO_PIN_RESET); } I2C_Delay(); HAL_GPIO_WritePin(INA226_DataStruct->Gpio, INA226_DataStruct->Gpio_Scl_Pin, GPIO_PIN_SET); I2C_Delay(); HAL_GPIO_WritePin(INA226_DataStruct->Gpio, INA226_DataStruct->Gpio_Scl_Pin, GPIO_PIN_RESET); if (i == 7) { HAL_GPIO_WritePin(INA226_DataStruct->Gpio, INA226_DataStruct->Gpio_Sda_Pin, GPIO_PIN_SET); } Byte <<= 1; /* 左移一个bit */ I2C_Delay(); } } /** * @brief 从I2C总线设备读取8bit数据 * @param INA226结构体 * @retval 读到的数据 */ uint8_t I2C_ReadByte(INA226_DataTypeDef *INA226_DataStruct) { uint8_t i; uint8_t value; /* 读到第1个bit为数据的bit7 */ value = 0; for (i = 0; i < 8; i++) { value <<= 1; HAL_GPIO_WritePin(INA226_DataStruct->Gpio, INA226_DataStruct->Gpio_Scl_Pin, GPIO_PIN_SET); I2C_Delay(); if (HAL_GPIO_ReadPin(INA226_DataStruct->Gpio, INA226_DataStruct->Gpio_Sda_Pin)) { value++; } HAL_GPIO_WritePin(INA226_DataStruct->Gpio, INA226_DataStruct->Gpio_Scl_Pin, GPIO_PIN_RESET); I2C_Delay(); } return value; } /** * @brief 产生一个时钟并读取器件的ACK应答信号 * @param INA226结构体 * @retval 返回0表示正确应答,1表示无器件响应 */ uint8_t I2C_WaitAck(INA226_DataTypeDef *INA226_DataStruct) { uint8_t volatile re; HAL_GPIO_WritePin(INA226_DataStruct->Gpio, INA226_DataStruct->Gpio_Sda_Pin, GPIO_PIN_SET); I2C_Delay(); HAL_GPIO_WritePin(INA226_DataStruct->Gpio, INA226_DataStruct->Gpio_Scl_Pin, GPIO_PIN_SET); I2C_Delay(); if (HAL_GPIO_ReadPin(INA226_DataStruct->Gpio, INA226_DataStruct->Gpio_Sda_Pin)) /* CPU读取SDA口线状态 */ { re = 1; } else { re = 0; } HAL_GPIO_WritePin(INA226_DataStruct->Gpio, INA226_DataStruct->Gpio_Scl_Pin, GPIO_PIN_RESET); I2C_Delay(); return re; } /** * @brief 产生一个ACK信号 * @param INA226结构体 * @retval 无 */ void I2C_Ack(INA226_DataTypeDef *INA226_DataStruct) { HAL_GPIO_WritePin(INA226_DataStruct->Gpio, INA226_DataStruct->Gpio_Sda_Pin, GPIO_PIN_RESET); I2C_Delay(); HAL_GPIO_WritePin(INA226_DataStruct->Gpio, INA226_DataStruct->Gpio_Scl_Pin, GPIO_PIN_SET); I2C_Delay(); HAL_GPIO_WritePin(INA226_DataStruct->Gpio, INA226_DataStruct->Gpio_Scl_Pin, GPIO_PIN_RESET); I2C_Delay(); HAL_GPIO_WritePin(INA226_DataStruct->Gpio, INA226_DataStruct->Gpio_Sda_Pin, GPIO_PIN_SET); } /** * @brief 产生一个NACK信号 * @param INA226结构体 * @retval 无 */ void I2C_NAck(INA226_DataTypeDef *INA226_DataStruct) { HAL_GPIO_WritePin(INA226_DataStruct->Gpio, INA226_DataStruct->Gpio_Sda_Pin, GPIO_PIN_SET); I2C_Delay(); HAL_GPIO_WritePin(INA226_DataStruct->Gpio, INA226_DataStruct->Gpio_Scl_Pin, GPIO_PIN_SET); I2C_Delay(); HAL_GPIO_WritePin(INA226_DataStruct->Gpio, INA226_DataStruct->Gpio_Scl_Pin, GPIO_PIN_RESET); I2C_Delay(); } /** * @brief 向INA226 发送数据 * @param INA226结构体 * @param 设备内寄存器地址 * @param 要发送的数据 * @retval 无 */ void INA226_SendData(INA226_DataTypeDef *INA226_DataStruct, uint8_t reg_addr, uint16_t data) { uint8_t temp = 0; I2C_Start(INA226_DataStruct); I2C_SendByte(INA226_DataStruct, INA226_DataStruct->Addr); I2C_WaitAck(INA226_DataStruct); I2C_SendByte(INA226_DataStruct, reg_addr); I2C_WaitAck(INA226_DataStruct); temp = (uint8_t)(data >> 8); I2C_SendByte(INA226_DataStruct, temp); I2C_WaitAck(INA226_DataStruct); temp = (uint8_t)(data & 0x00FF); I2C_SendByte(INA226_DataStruct, temp); I2C_WaitAck(INA226_DataStruct); I2C_Stop(INA226_DataStruct); } /** * @brief 从INA226读取数据 * @param INA226结构体 * @retval 无 */ uint16_t INA226_ReadData(INA226_DataTypeDef *INA226_DataStruct) { uint16_t temp = 0; I2C_Start(INA226_DataStruct); I2C_SendByte(INA226_DataStruct, INA226_DataStruct->Addr + 1); I2C_WaitAck(INA226_DataStruct); temp = I2C_ReadByte(INA226_DataStruct); I2C_Ack(INA226_DataStruct); // 发送ACK temp <<= 8; temp |= I2C_ReadByte(INA226_DataStruct); I2C_NAck(INA226_DataStruct); // 发送nACK I2C_Stop(INA226_DataStruct); return temp; } /** * @brief INA226初始化 * @param INA226结构体 * @retval 无 */ void INA226_Init(INA226_DataTypeDef *INA226_DataStruct) { INA226_SendData(INA226_DataStruct, INA226_CONFIG, 0x4127); // 1次平均 1.1ms 连续检测 INA226_SendData(INA226_DataStruct, INA226_CALIB, 0x0800); } /** * @brief 读取 ina226 内部数据 * @param INA226结构体 * @param 寄存器地址 * @retval 无 */ void INA226_SetRegPointer(INA226_DataTypeDef *INA226_DataStruct, uint8_t reg_addr) { I2C_Start(INA226_DataStruct); I2C_SendByte(INA226_DataStruct, INA226_DataStruct->Addr); I2C_WaitAck(INA226_DataStruct); I2C_SendByte(INA226_DataStruct, reg_addr); I2C_WaitAck(INA226_DataStruct); I2C_Stop(INA226_DataStruct); } /** * @brief 读取ina226采样电流 * @param INA226结构体 * @retval 无 */ uint16_t INA226_GetShunt_Current(INA226_DataTypeDef *INA226_DataStruct) { uint16_t temp = 0; INA226_SetRegPointer(INA226_DataStruct, INA226_CURRENT); temp = INA226_ReadData(INA226_DataStruct); if (temp & 0x8000) temp = ~(temp - 1); return temp; } /** * @brief 读取ina226总线电压 * @param INA226结构体 * @retval 无 */ uint16_t INA226_GetVoltage(INA226_DataTypeDef *INA226_DataStruct) { uint32_t temp = 0; INA226_SetRegPointer(INA226_DataStruct, INA226_BUSV); temp = INA226_ReadData(INA226_DataStruct); return (uint16_t)temp; } /** * @brief 读取ina226功率 * @param INA226结构体 * @retval 无 */ uint16_t INA226_GetPower(INA226_DataTypeDef *INA226_DataStruct) { int16_t temp = 0; INA226_SetRegPointer(INA226_DataStruct, INA226_POWER); temp = INA226_ReadData(INA226_DataStruct); return (uint16_t)temp; }

资源文件列表:

INA226软件IIC驱动.zip 大约有3个文件
  1. INA226软件IIC驱动/ina226.c 7.67KB
  2. INA226软件IIC驱动/ina226.h 1.97KB
  3. INA226软件IIC驱动/
0评论
提交 加载更多评论
其他资源 k8s文档解压即可使用
k8s文档
k8s文档解压即可使用 k8s文档解压即可使用 k8s文档解压即可使用
LArea的js与css
H5地区三级联动相关js与css
Bloodshed_Dev_C_5.11.0.0.zip
Bloodshed_Dev_C_5.11.0.0.zip
自己测试网页用的哈哈1
自己测试网页用的哈哈1
自己测试网页用的哈哈1 自己测试网页用的哈哈1
2222021李鑫宇.zip
2222021李鑫宇.zip
2222021李鑫宇.zip 2222021李鑫宇.zip 2222021李鑫宇.zip
vc2022重新编的 cc65 编译器
cc65 可用于apple ii/e,任天堂红白机,6502,65c02,65186,65c186单片机。版本CC65 2.9.2
C# 将窗体嵌套进 TabControl 控件中
C# 将窗体嵌套进 TabControl 控件中
JMF608 开卡工具MP 版本V2.0
固态硬盘开卡工具 亲测有效