Part Number:INA233
I m developing an application where i need to read ina233 bus voltage , current etc with an isolator ISO1541 in between MCU and INA233. So i2c communication happens between mcu----1SO1541----INA233.
For testing purpose i am trying to read the MFID (Manufacturer id from reg address 0x88) . But I am not able to read the complete 2 byte data, I just receive the (2,255) from the IC.i.e second byte read is always high.
Sharing the code with functions :
data = read_ina(0x88); // for reading the data from the reg address 0x88.
unsigned char read_ina(unsigned char address)
{
unsigned int temp=0,temp2=0;
unsigned char add_lo = 0,add_hi = 0;
unsigned char reg_address = 0;
reg_address = address;
start1(); delay_us(300);
write_byte_ina233(0x88); //delay_us(300); //slave address + write bit
write_byte_address_ina233(reg_address); //delay_us(300); // register address
stop1(); delay_us(300);
start1(); delay_us(300);
write_byte_ina233(0x89); trisb.f3 = 1;delay_us(300); //slave address + read bit
ina_data_lsb = read_byte_ina233_ack(); //delay_us(300);
ina_data_msb = read_byte_ina233_nack(); //delay_us(300);
stop1(); delay_us(300);
return(ina_data_msb);
}
Other functions are as follows :
void start1(void)
{
trisb.f3 = 0;delay_us(300);
sda_iso1541 = 1 ; delay_us(300);
scl_iso1541 = 1; delay_us(300);
sda_iso1541 = 0 ; delay_us(300);
scl_iso1541 = 0; delay_us(300);
}
void stop1(void)
{
trisb.f3 = 0;delay_us(300);
sda_iso1541 = 0 ; delay_us(300);
scl_iso1541 = 1; delay_us(300);
sda_iso1541 = 1 ; delay_us(300);
}
void write_byte_ina233(unsigned char val)
{
unsigned char x=0;
trisb.f3 = 0;delay_us(500);
for(x=0;x<=7;x++)
{
if(val & 0x80)
{sda_iso1541 =1;}
else
{sda_iso1541 =0;}
delay_us(500);
scl_iso1541 =1;
delay_us(500);
scl_iso1541 =0;
delay_us(500);
val = val << 1;
}
trisb.f3 = 1;delay_us(500);
scl_iso1541 =1;
delay_us(500);
scl_iso1541 =0;
delay_us(500);
//trisb.f3 = 1;delay_us(300);
}
void write_byte_address_ina233(unsigned char val)
{
unsigned char x=0;
trisb.f3 = 0;delay_us(500);
for(x=0;x<=7;x++)
{
if(val & 0x80)
{sda_iso1541 =1;}
else
{sda_iso1541 =0;}
delay_us(500);
scl_iso1541 =1;
delay_us(500);
scl_iso1541 =0;
delay_us(500);
val = val << 1;
}
trisb.f3 = 1;delay_us(500);
scl_iso1541 =1;
delay_us(500);
scl_iso1541 =0;
delay_us(500);
//trisb.f3 = 1;delay_us(300);
}
unsigned char read_byte_ina233_ack(void)
{
unsigned char x=0,val=0;
//trisb.f3 = 1;
delay_us(300);
for(x=0;x<=7;x++)
{
val = val << 1 ;
delay_us(500);
val = val | sda_iso1541;
delay_us(500);
scl_iso1541 =1;
delay_us(500);
scl_iso1541 =0;
delay_us(500);
}
delay_us(500);
scl_iso1541 =1;
delay_us(500);
scl_iso1541 =0;
delay_us(500);
return(val);
}
unsigned char read_byte_ina233_nack(void)
{
unsigned char x=0,val=0;
//trisb.f3 = 1;
//delay_us(300);
for(x=0;x<=7;x++)
{
val = val << 1 ;
delay_us(500);
val = val | sda_iso1541;
delay_us(500);
scl_iso1541 = 1;
delay_us(500);
scl_iso1541 = 0;
delay_us(500);
}
//trisb.f3 =0;delay_us(100);
return(val);
}
Kindly let me know for some issue with the code .
Or please send me sample code for reading some register value.