微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 硬件电路设计 > TI电源管理交流 > 关于单片机读取BQ78350的问题

关于单片机读取BQ78350的问题

时间:10-02 整理:3721RD 点击:

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;
}

你好,我也遇到同样的问题,能留下联系方式吗?我想请教您一下,非常感谢!

请教一下,Cal_PE这个函数怎么实现的?谢谢! 

建议楼主还是弄个EV2400吧!后面还要对BQ78350-R1的一堆寄存器设置,关键是还要对电池组进行矫正和不同温度、电流放电学习,没有这个EV2400根本就做不到精确!很多事情做不了。

你好,问题解决了吗?我也遇到这样的问题,能留下联系方式吗?

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top