主题中讨论的其他部件:ISO1541、 INA226
我正在开发一个需要使用 位于 MCU 和 INA233之间的隔离器 ISO1541读取 ina233总线电压、电流等的应用。 因此、I2C 通信发生在 MCU--1SO1541 --INA233之间。
为了进行测试,我 尝试读取 MFID (制造商 ID 来自寄存器地址0x88)。 但我无法读取完整的2字节数据、我只从 IC.I 接收(2、255)数据、即读取的第二个字节始终为高电平。
与函数共享代码:
数据= Read_ina (0x88); //从寄存器地址0x88读取数据。
unsigned char read_ina (unsigned char 地址)
{
unsigned int temp=0、temp2=0;
unsigned char add_lo = 0、add_hi = 0;
unsigned char reg_address = 0;
REG_ADDRESS =地址;
Start1();delay_us (300);
write_byte_ina233 (0x88); //delay_us (300); //从地址+写入位
write_byte_address_ina233 (reg_address); //delay_us (300); //寄存器地址
stop1();delay_us (300);
Start1();delay_us (300);
write_byte_ina233 (0x89);trisb.f3 = 1;delay_us (300); //从地址+读取位
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);
}
其他功能如下:
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 (无符号字符 val)
{
unsigned char x=0;
trisb.f3 = 0;delay_us (500);
对于(x=0;x<=7;x++)
{
if (val & 0x80)
{sda_iso1541 = 1;}
其他
{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 (无符号字符 val)
{
unsigned char x=0;
trisb.f3 = 0;delay_us (500);
对于(x=0;x<=7;x++)
{
if (val & 0x80)
{sda_iso1541 = 1;}
其他
{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);
对于(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);
对于(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);
}
请告诉我代码的一些问题。
或者、请向我发送示例代码以读取一些寄存器值。
