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.

STM32 与bq78350通过SMBus通信异常求助

Other Parts Discussed in Thread: BQ78350, BQSTUDIO, EV2400, BQ27XXXSW-LINUX

STM32 MCU与SMBus通信,有如下问题求助:

1)MCU发送了0x16地址之后,能够发现有两个ACK。

2)接着MCU发送Command "0x44 0x35 0x00"之后一直都没有收到ACK。

具体参见附件图片。(因只示波器只有一条线,只能提供数据线的波形)。请帮忙看下是什么原因导致78350一直没有回复ACK。

  • 先要确认一下BQ78350是否正常工作。可以用EV2400和bqStudio跟它通讯,看能不能正常通讯。

  • 多谢回复。 

    我们检测了78350输入的电压,是满足高于3.2V的。发送第一个0x16命令能看到响应。

    如果没有使用EV2400和bqStudio如何判断78350的工作状态?

  • 因为你读的0x44是一个特殊的command(ManufacturerBlockAccess())。你可以试一下读0x09 Voltage()。

  • 我们尝试过多个命令了,包括09这个,情况一样。master端发送了字节之后没有收到ack,是否和78350端的stretch有关系?

  • 下面是单节电量计的I2C读取方式,BQ78350的SMBus也是类似的,可以参考一下。

  • 发送命令后要注意延时。第一次地址位立即接受应答。后面命令位延时80us再延时。接受数据每一组间隔50us。有EV2400就可以用示波器抓时序来看

    给你个程序参考

    /**********************************
    读取剩余电量
    **********************************/

    unsigned char RelativeState[3]={0x16,0x0D,0x17};
    unsigned char CRC_Buff[5];


    void RelativeStateOfCharge(void)
    {
    unsigned char CRC_Val;
    SMbus_Start();//开始
    SMBUS_Send_Byte(RelativeState[0]);
    SMBUS_Wait_Ack();
    SMBUS_Send_Byte(RelativeState[1]);
    SMBD_Init(1);
    SMBC=0;
    SMBD=1;
    Delay80us();
    SMBUS_Wait_Ack();

    SMbus_Start();//开始
    SMBUS_Send_Byte(RelativeState[2]);
    SMBUS_Wait_Ack();
    SMBD_Init(1);
    SMBC=0;
    SMBD=1;
    Delay45us();



    Read_Data[0]=SMBUS_Read_Byte();//接受低位数据
    SMBUS_Ack(); //发送ACK
    SMBD_Init(1);
    SMBC=0;
    SMBD=1;
    Delay50us();


    Read_Data[1]=SMBUS_Read_Byte();//接受高位数据
    SMBUS_Ack(); //发送ACK
    SMBD_Init(1);
    SMBC=0;
    SMBD=1;
    Delay50us();


    Read_Data[2]=SMBUS_Read_Byte();//接受CRC
    SMBUS_Ack();
    SMBD_Init(1);
    SMBC=0;
    SMBD=0;
    Delay50us();
    SMbus_Stop();//停止


    CRC_Buff[0]=RelativeState[0];
    CRC_Buff[1]=RelativeState[1];
    CRC_Buff[2]=RelativeState[2];
    CRC_Buff[3]=Read_Data[0];
    CRC_Buff[4]=Read_Data[1];
    CRC_Val=CRC8(CRC_Buff,5);//CRC校验
    if(CRC_Val==Read_Data[2])//校验成功
    {
    CRC_OK=1;
    }
    else
    {

    }//校验失败舍弃数据
    }

  • 非常感谢再次回复。

    今天通过EV2300对接调测78350,正常。

    切换到STM32F407之后问题依然是发帖携带图片的情况。不知道为何在发送0x16之后会出现两个ACK。不知道之前是否有人出现过类似问题。

  • 你看看这个页面里的链接有没有帮助吧

    http://www.ti.com/tool/bq27xxxsw-linux