INA226软件IIC驱动.zip
立即下载
资源介绍:
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;
}