INA226软件IIC驱动.zip
大小:2.34KB
价格:49积分
下载量:0
评分:
5.0
上传者:qq_52280273
更新日期:2024-09-23

INA226软件IIC驱动.zip

资源文件列表(大概)

文件名
大小
INA226软件IIC驱动/ina226.c
7.67KB
INA226软件IIC驱动/ina226.h
1.97KB
INA226软件IIC驱动/
-

资源内容介绍

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; 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; I2C_Delay(); }}/** * @brief 从I2C总线设备读取8bit数据 * @param INA226结构体 * @retval 读到的数据 */uint8_t I2C_ReadByte(INA226_DataTypeDef *INA226_DataStruct){ uint8_t i; uint8_t value; 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)) { 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;}

用户评论 (0)

发表评论

captcha