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();
时序图如下
Star Xu:
第一个波形看起来像对应于数据手册图9 www.ti.com/…/communications-subsystem-slusbk22004
第二波形是从先前设置的地址(基本上是图11的第二部分)读取的,因为它以START而不是RESTART开头。 似乎BQ被告知读取(0x11),发送值0x05,并且主机未ACK。但似乎读取到主机正在发送0x11和0x05。
它是开漏总线,BQ需要发送高电平或“ 1”,使主机可见总线上的写入。