TI中文支持网
TI专业的中文技术问题搜集分享网站

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

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”,使主机可见总线上的写入。

赞(0)
未经允许不得转载:TI中文支持网 » BQ76940能对寻址信号响应,写寄存器地址被BQ拉低SDA改变地址,对寄存器信号响应不了
分享到: 更多 (0)