發送的時候先初始化之后start->發送INA219地址->發送需要操作的寄存器地址->發送高8位->發送低8位->stop
讀取的時候先初始化start->發送INA219地址->發送需讀取的寄存器地址->start->發送INA219地址+0x01讀取出高8位->發送應答->讀取低8位->不應答->stop
#include "ina219.h"
void INA_REG_Write(unsigned char reg,unsigned int data);
#ifdef INA_INSIDE_IIC
void INA_IIC_Delay()
{unsigned char x;
for(x=1;x>0;x--)
{
__NOP();__NOP();__NOP();__NOP();__NOP();
}
}
void INA_IIC_INIT(void) //IIC初始化
{
GPIO_InitTypeDef GPIO_INIT;
RCC_APB2PeriphClockCmd(IIC_RCC,ENABLE);
GPIO_INIT.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_INIT.GPIO_Pin=IIC_SDA | IIC_SCL;
GPIO_INIT.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(IIC_PORT,&GPIO_INIT);
IIC_SDA_H;
IIC_SCL_H;
}
void INA_IIC_SDA_OUT(void) //SDA配置為輸出
{
GPIO_InitTypeDef GPIO_INIT;
GPIO_INIT.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_INIT.GPIO_Pin=IIC_SDA ;
GPIO_INIT.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(IIC_PORT,&GPIO_INIT);
}
void INA_IIC_SDA_IN(void) //SDA配置為輸入
{
GPIO_InitTypeDef GPIO_INIT;
GPIO_INIT.GPIO_Mode=GPIO_Mode_IPU;
GPIO_INIT.GPIO_Pin=IIC_SDA ;
GPIO_INIT.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(IIC_PORT,&GPIO_INIT);
}
void INA_IIC_Start(void) //開始信號
{
IIC_SDA_H;
IIC_SCL_H;
INA_IIC_Delay();
IIC_SDA_L;
INA_IIC_Delay();
IIC_SDA_L;
}
void INA_IIC_Stop(void ) //結束信號
{
IIC_SDA_L;
IIC_SCL_H;
INA_IIC_Delay();
IIC_SDA_H;
INA_IIC_Delay();
IIC_SCL_L;
IIC_SCL_H;
IIC_SDA_H;
}
bool INA_IIC_ACK_Read(void) //讀取應答信號
{
bool ack;
IIC_SDA_H;
INA_IIC_SDA_IN();
IIC_SCL_H;
INA_IIC_Delay();
if(IIC_SDA_READ() == SET) ack=false;
else ack=true;
IIC_SCL_L;
INA_IIC_SDA_OUT();
return ack;
}
void INA_IIC_ACK_Send(bool ack) //發送應答信號
{
IIC_SCL_L;
if(ack == true)
IIC_SDA_L;
else IIC_SDA_H;
IIC_SCL_H;
INA_IIC_Delay();
IIC_SCL_L;
}
void INA_IIC_Send_Byte(unsigned char byte) //IIC發送一位數據
{
unsigned char i;
IIC_SCL_L;
for(i=0;i<8;i++)
{
if(byte & 0x80 ) IIC_SDA_H;
else IIC_SDA_L;
IIC_SCL_H;
INA_IIC_Delay();
IIC_SCL_L;
INA_IIC_Delay();
byte<<=1;
}
INA_IIC_ACK_Read();
}
unsigned char INA_IIC_Read_Byte(void) //IIC讀取一位數據
{
unsigned char i,byte=0;
INA_IIC_SDA_IN();
for(i=0;i<8;i++)
{
IIC_SCL_H;
byte<<=1;
if(IIC_SDA_READ() == SET) byte |= 0x01;
else byte &= 0xFE;
IIC_SCL_L;
INA_IIC_Delay();
}
INA_IIC_SDA_OUT();
return byte;
}
#endif
void INA_Read_Byte_s(unsigned char reg,unsigned char *data) //讀兩位數據
{
INA_IIC_Start();
INA_IIC_Send_Byte(INA219_ADDRESS); //發送INA219地址s
INA_IIC_Send_Byte(reg);
INA_IIC_Start();
INA_IIC_Send_Byte(INA219_ADDRESS+0x01); //設置iic為讀模式
*data=INA_IIC_Read_Byte();
data++;
INA_IIC_ACK_Send(1);
*data=INA_IIC_Read_Byte();
INA_IIC_ACK_Send(0);
INA_IIC_Stop();
}
void INA_REG_Write(unsigned char reg,unsigned int data) //寫寄存器 測試成功
{
unsigned char data_temp[2];
data_temp[0]=(unsigned char )(data>>8);
data_temp[1]=(unsigned char )(data & 0xFF);
INA_IIC_Start();
INA_IIC_Send_Byte(INA219_ADDRESS); //發送INA219地址
INA_IIC_Send_Byte(reg); //發送寄存器地址
INA_IIC_Send_Byte(data_temp[0]); //發送高8位數據
data++;
INA_IIC_Send_Byte(data_temp[1]) ; //發送低8位數據
INA_IIC_Stop();
}
void INA_Init(void )
{
INA_IIC_INIT();
INA_REG_Write(INA219_REG_CONFIG,INA219_CONFIG_value);
INA_REG_Write(INA219_REG_CALIBRATION,INA_CAL);
}
unsigned int INA_GET_Voltage_MV(void) //獲取電壓(單位:mv)
{
unsigned char data_temp[2];
INA_Read_Byte_s(0x02,data_temp);
return (int)((((data_temp[0]<<8)+data_temp[1]) >> 3)*4); //右移3為去掉:bit2,CNVR,OVF三位,再乘以 4MV (官方文檔規定),得到當前總線的電壓值
}
unsigned int INA_GET_Current_MA(void) //獲取電流(單位:mA)
{
unsigned char data_temp[2];
INA_REG_Write(INA219_REG_CONFIG,INA219_CONFIG_value);
INA_Read_Byte_s(INA219_REG_CURRENT,data_temp);
return (int)((((data_temp[0]<<8)+data_temp[1]))*IAN_I_LSB); //得到寄存器的值在乘以每位對應的值(IAN_I_LSB)得到實際的電流
}
unsigned int INA_GET_Power_MW(void) //獲取當前功率(單位:mw)
{
unsigned char data_temp[2];
INA_Read_Byte_s(INA219_REG_POWER,data_temp);
return (int)(((data_temp[0]<<8)+data_temp[1])*INA_Power_LSB); //得到寄存器的值在乘以每位對應的值(INA_Power_LSB)得到實際的功率
}
|