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.

关于单片机读取BQ78350的问题

Other Parts Discussed in Thread: BQ78350-R1, BQ76930, BQ78350, EV2400

BMS采用的是BQ78350-R1+BQ76930的方案,用单片机的IO模拟SMbus总线读取电池数据。目前SBS的数据读取没有问题,但是要设置电池的参数,比如电池个数、电池容量等等,需要设置DF的参数。我这边参考一篇帖子写的Block 读取代码如下,读取数据一直都不成功,麻烦帮我看下有什么问题,谢谢:

/*Read Block Format e.g.
Frame1:Start + Device Address :0x16 + ManufactoryBlockAccess : 0x44 + Data Length: 0x02 +DataFlash Address:0x00 , 0x40 + Checksum: 0xAB + End
Frame2:Start + Device Address: 0x16 + ManufactoryBlockAccess:0x44 + Re-Start + Device Address:0x17 + Data Length:0x22(DataFlash Address 2bytes+32bytes data) + 34bytes Data + Checksum:0x85 + End
...
Send Frame2 Again To Get The Next 32 Bytes Data
*/
uint8_t BQ78350_ReadBlock(uint16_t Addr, uint8_t *Rx, uint8_t Len)
{
    uint16_t Timeout_Cnt=0;
    uint8_t i,Nbytes;
    uint8_t TxData[6];
    uint8_t PEC;

    TxData[0] = BQ78350_ADD_WR;
    TxData[1] = 0x44;
    TxData[2] = 0x02;
    TxData[3] = Addr%256;
    TxData[4] = Addr/256;
    TxData[5] = Cal_PEC(TxData, 5);

    SMB_ON();

    I2C_Start();
    for(i=0; i<6; i++)
    {
        I2C_Write_Byte(TxData[i]);
        Timeout_Cnt=0;
        do
        {
            Timeout_Cnt++;
            if(Timeout_Cnt>Time_OUT)
               return BQ78350_ACK_FAIL;
        }
        while(I2C_Check_Ack());
    }
    I2C_Stop();
    Delay(10);

    I2C_Start();
    I2C_Write_Byte(BQ78350_ADD_WR);
    Timeout_Cnt=0;
    do
    {
        Timeout_Cnt++;
        if(Timeout_Cnt>Time_OUT)
        return BQ78350_ACK_FAIL;
    }
    while(I2C_Check_Ack());

    I2C_Write_Byte(0x44);
    Timeout_Cnt=0;
    do
    {
        Timeout_Cnt++;
        if(Timeout_Cnt>Time_OUT)
        return BQ78350_ACK_FAIL;
    }
    while(I2C_Check_Ack());

    I2C_Start();
    I2C_Write_Byte(BQ78350_ADD_RD);
    Timeout_Cnt=0;
    do
    {
        Timeout_Cnt++;
        if(Timeout_Cnt>Time_OUT)
            return BQ78350_ACK_FAIL;
    }
    while(I2C_Check_Ack());

    I2C_Read_Byte(&Nbytes);
    I2C_Send_Ack();

    for(i=0; i<Len+2; i++)//DataFlash Address 2Byte
    {
        I2C_Read_Byte(&Rx[i]);
        I2C_Send_Ack(); 
    }
    I2C_Read_Byte(&PEC);//CRC
    I2C_Send_Nack();
    I2C_Stop();

    return BQ78350_COM_OK;
}