你(们)好。 我基于 TI BQ76940参考设计了一个 PCB。 Altium Designer 工程已附加。
您可以看到、我正在尝试使用 stm32f103 微控制器来托管该芯片。 由于我找不到任何与 MCU 和 IDE (Keil V5)兼容的库、我尝试通过 SparkFun 重写 Arduino 库。 我成功地通过 I2C 连接到芯片并读取 SYS_STAT 寄存器。 您应该知道的另一件事是、我对我的设计不是很确定、所以我不想使用真正的 LFP 电池组测试电路板、因为它们昂贵且危险! 因此、我使用了15 75欧姆的串联电阻器连接到27V 电源、我计划更改 OV 和 UV 阈值以匹配我的"电池仿真器"、然后测试电路板和程序。 我遇到的问题是 DEVICE_XREADY 情况! 无论我做什么、只要芯片启动、我就会得到0x20、并且我无法复位该位。 数据表显示 DEVICE_XREADY 是由于 电路中的瞬变过大而发生的、我 看不到任何原因导致这种情况、因此我只能想到三个方面:
1:代码未正确写入以写入寄存器(我使用了 HAL 库标准函数、我必须使用地址0x30而不是0x18来连接到芯片、我也附加了代码)我所做的是:
while (1)
{
RegisterAddress[0]= bq796x0_SYS_STAT;
接收包[0]= 0xDF;//此格式的一些随机数 xx0x-xxxx
HAL_I2C_Master_Transmit (&hi2c2、bqI2CAddress、RegisterAddress、sizeof (RegisterAddress)、MAX_I2C_TIME); //bqI2CAddress = 0x030 (="0x18")
HAL_I2C_Master_Receive (&hi2c2、bqI2CAddress、接收包、1、MAX_I2C_TIME); //MAX_I2C_TIME = 10
HAL_UART_transmit (&hart2、recevedPack、1、10);//此处当 我使用引导开关启动芯片时、我接收到0x20
if (receevedPack[0]& bq796x0_DEVICE_XREADY)//bq796x0_DEVICE_XREADY = 1 << 5
{
HAL_DELAY (1000);//等待一秒钟、然后尝试重写 SYS_STAT 寄存器
接收包[0]&&~(bq796x0_DEVICE_XREADY);//在 DEVICE_XREADY 位中写入0:xx0x-xxxx
HAL_I2C_Master_transmit (&hi2c2、bqI2CAddress、RegisterAddress、1、MAX_I2C_TIME);
HAL_I2C_Master_transmit (&hi2c2、bqI2CAddress、接收包、1、MAX_I2C_TIME);
//在这里,我尝试使用“不重复启动的写操作”模式,但我没有任何结果
//receevedPack[1]|= bq796x0_device_XREADY;
// recevedPack[1]&&~(bq796x0_device_XREADY);
//接收包[0]= bq796x0_SYS_STAT;
// HAL_I2C_Master_transmit (&hi2c2、bqI2CAddress、接收包、sizeof (接收包)、MAX_I2C_TIME);
}
HAL_DELAY (200);
}
2.串联的电阻器对电池组的仿真不够好。
3.芯片损坏了、应该换一个新芯片。 (实际上、由于 LDO 电压为3.8、这可能是可行的! 我是否可以确定它?)
如果您想了解有关如何操作或如何查找错误来源的任何提示、我们将不胜感激。
谢谢、
此致、