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();
时序图如下

