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;
}
guanglong zhu:
你好,我也遇到同样的问题,能留下联系方式吗?我想请教您一下,非常感谢!
guanglong zhu:
请教一下,Cal_PE这个函数怎么实现的?谢谢!
user4849938:
建议楼主还是弄个EV2400吧!后面还要对BQ78350-R1的一堆寄存器设置,关键是还要对电池组进行矫正和不同温度、电流放电学习,没有这个EV2400根本就做不到精确!很多事情做不了。
guanglong zhu:
回复 guanglong zhu:
你好,问题解决了吗?我也遇到这样的问题,能留下联系方式吗?