目前使用C8051F340控制INA226作為電壓電流偵測器,可正常讀取Bus Voltage register 02h,但是讀取Shunt register 01h、current register 04h、power register 03h的讀值皆為0。請問造成01h/03h/04h讀值為0的原因為何?
使用偵測電路架構為High side shunt型式。
Shunt resistor阻值設定為2m ohm。
schematic.pdf
暫存器設定值參考下表進行設定:
Register setting.pdf
以下程式碼為實際應用:
void main()
{
Word RD_Word_Data = 0;
//float RD_Word_Data1;
Long A = 0;
//Word A = 0;
Byte cnt = 0;
Byte j = 0;
PCA0MD &= ~0x40; // clear watch dog
PCA0MD = 0x00;
Oscillator_Init(); // OSC=48MHZ
P1MDOUT = 0x7F;
XBR1 = 0x40;
//read bus voltage
I2C_WR_Byte_Data(0x82,0x03,0x00,0x41,0x27); <=設定configuration register
I2C_WR_Byte_Data(0x82,0x03,0x05,0x0A,0x00); <=設定calibration register
I2C_WR_Byte_Data(0x82,0x01,0x02,0x00,0x00); <=設定Register Pointer
RD_Word_Data = I2C_RD_Word_Data(0x83); <=設定讀取位址
//read shunt voltage
I2C_WR_Byte_Data(0x82,0x03,0x00,0x41,0x27);
I2C_WR_Byte_Data(0x82,0x03,0x05,0x0A,0x00);
I2C_WR_Byte_Data(0x82,0x01,0x01,0x00,0x00);
RD_Word_Data = I2C_RD_Word_Data(0x83);
// read current
I2C_WR_Byte_Data(0x82,0x03,0x00,0x41,0x27);
I2C_WR_Byte_Data(0x82,0x03,0x05,0x0A,0x00);
I2C_WR_Byte_Data(0x82,0x01,0x04,0x00,0x00);
RD_Word_Data = I2C_RD_Word_Data(0x83);
// read power
I2C_WR_Byte_Data(0x82,0x03,0x00,0x41,0x27);
I2C_WR_Byte_Data(0x82,0x03,0x05,0x0A,0x00);
I2C_WR_Byte_Data(0x82,0x01,0x03,0x00,0x00);
RD_Word_Data = I2C_RD_Word_Data(0x83);
}
void I2C_WR_Byte_Data(Byte Address, Byte Para_Count, Byte Para1, Byte Para2, Byte Para3)
{
Byte i = 0;
I2C_Start();
Write_Byte(Address);
for (i=0; i<Para_Count; i++)
{
switch (i)
{
case 0:
Write_Byte(Para1);
break;
case 1:
Write_Byte(Para2);
break;
case 2:
Write_Byte(Para3);
break;
default:
Write_Byte(Para1);
}
delay_us(15);
}
I2C_Stop();
}
Word I2C_RD_Word_Data(Byte Address)
{
Byte i = 0;
Word RD_Data = 0;
I2C_Start();
Write_Byte(Address);
delay_us(15);
RD_Data = (RD_Data | Read_Byte(0));
delay_us(15);
RD_Data = ((RD_Data << 8) | Read_Byte(0));
delay_us(15);
I2C_Stop();
return RD_Data;
}
void I2C_Start()
{
I2C_CLK = 1;
I2C_DATA = 1;
I2C_DATA = 0;
delay_us(1);
I2C_CLK = 0;
}
void I2C_Stop()
{
I2C_CLK = 0;
delay_us(1);
I2C_DATA = 0;
delay_us(1);
I2C_CLK = 1;
delay_us(1);
I2C_DATA = 1;
}
void Write_Byte(Byte Data)
{
Byte i = 9;
Byte Original_Data = 0;
bit ack;
Original_Data = Data;
Repeat:
Data = Original_Data;
while(–i)
{
// load data
I2C_DATA = (Data & 0x80)? 1 : 0;
delay_us(1);
// send data
I2C_CLK = 1;
delay_us(1);
Data <<= 1; // Data = Data << 1;
I2C_CLK = 0;
}
// get acknowledgement
delay_us(1);
I2C_DATA = 1;
delay_us(1);
I2C_CLK = 1;
delay_us(1);
ack = I2C_DATA;
I2C_CLK = 0;
if (ack) goto Repeat; // ack: active low; If INA226 is no ack, repeat again
}
Byte Read_Byte(bit ack)
{
char i = 9;
Byte Data = 0;
// read data
while(–i)
{
Data <<= 1; //Data = Data << 1;
delay_us(1);
I2C_CLK = 1;
delay_us(1);
Data |= I2C_DATA; // Data = Data | I2Cdata
delay_us(1);
I2C_CLK = 0;
}
// send ack
delay_us(1);
I2C_DATA = ack;
delay_us(1);
I2C_CLK = 1;
delay_us(1);
I2C_CLK = 0;
// return data
return Data;
}
Amy Luo:
您好,
请您做以下检查:
1、检测回路是否为完整回路,即是否有电流流过SR。
2、被检测回路是否和INA226共地,在您给出的电路图中没有表示出来。
3、I2C通信建议用示波器查看波形,查看波形是否存在干扰或时序是否正确。