This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

BQ76940能对寻址信号响应,写寄存器地址被BQ拉低SDA改变地址,对寄存器信号响应不了

Other Parts Discussed in Thread: BQ76940

BQ76940 IIC 读写函数,是用IO口模拟的

GeneralReturnType BqIf_SetDeviceByte(uByte addr,uByte data)
{
uByte i = 0;
uByte wr_crc;
uByte calc_crc_data[3];

__DI();//关中断

calc_crc_data[0] = BQ76940_WR;
calc_crc_data[1] = addr;
calc_crc_data[2] = data;

wr_crc = crc8_check(calc_crc_data, 3)//计算CRC

// write 3 times until write ok
for(i = 0; i < 3; i++)
{
BqIf_IICStart();//
BqIf_WriteByte(BQ76940_WR); 
if(BQIF_ERR_OK != BqIf_IICAckDevice())
{
BqIf_IICStop();
continue;
}
BqIf_WriteByte(addr);
if(BQIF_ERR_OK != BqIf_IICAckDevice())
{
BqIf_IICStop();
continue;
}
BqIf_WriteByte(data);
if(BQIF_ERR_OK != BqIf_IICAckDevice())
{
BqIf_IICStop();
continue;
}
BqIf_WriteByte(wr_crc);
if(BQIF_ERR_OK != BqIf_IICAckDevice())
{
BqIf_IICStop();
continue;
}
BqIf_IICStop();
break;
}
__EI();
if(i >= 3)
{
return BQIF_ERR_WR;
}
return BQIF_ERR_OK;

}

写寄存器0x05,数据为0x00时序如下图,全程有ACK应答,时序没有问题

然后是读,读的时候,读指令有ACK反馈,但是我本来是要读0x05地址的,被BQ拉低SDA改变,而且无ACK应答,按理来说,我写都对了,读的话,时序不应该有错,如下图及代码,代码是简单测试代码,只发送读指令及寄存器地址

__DI();
BqIf_IICStart();
BqIf_WriteByte(0x11);

if(BQIF_ERR_OK != BqIf_IICAckDevice())
{

}

BqIf_WriteByte(0x05);


if(BQIF_ERR_OK != BqIf_IICAckDevice())
{
BqIf_IICStop();
}
else
{
BqIf_IICStop();
}


__EI();

时序图如下