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.

[参考译文] BQ76952:BQ76952接口

Guru**** 2455560 points
Other Parts Discussed in Thread: BQ76952

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/power-management-group/power-management/f/power-management-forum/1194362/bq76952-bq76952-interface

器件型号:BQ76952

尊敬的先生:

请检查以下代码,以便与 BQ 7695203通信--我们需要您提供一些说明。  

以下代码是用于具有 SPI 通信的 STM32的 TI 示例代码。

void SPI_WriteReg (uint8_t reg_addr、uint8_t * reg_data、uint8_t count)

{
// SPI 写入。 包括在 HFO 未启动或需要等待时间时重试。 请参阅 BQ76952软件开发指南查看示例
uint8_t addr;
uint8_t TX_Buffer [MAX_BUFFER_SIZE]={0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00};
unsigned int i;
无符号整型匹配;
无符号 int 重试次数= 10;

匹配= 0;
addr = 0x80 | reg_addr;//为什么它是使用0x80进行 OR 运算

for (I=0;I<计数;I++){
TX_Buffer[0]= addr;
TX_Buffer[1]= reg_data[i];

HAL_GPIO_WritePin (GPIOB、GPIO_PIN_6、GPIO_PIN_RESET); //发送两个字节后需要再次读取数据
HAL_SPI_TransmitReceive (&hspi1、TX_Buffer、rxdata、2、1);
HAL_GPIO_WritePin (GPIOB、GPIO_PIN_6、GPIO_PIN_SET);

while ((match ==0)&(retries >0)){
delayUS(500);
HAL_GPIO_WritePin (GPIOB、GPIO_PIN_6、GPIO_PIN_RESET);
HAL_SPI_TransmitReceive (&hspi1、TX_Buffer、rxdata、2、1);
HAL_GPIO_WritePin (GPIOB、GPIO_PIN_6、GPIO_PIN_SET);
if ((rxdata[0]== addr)&(rxdata[1]== reg_data[i]))
匹配= 1;
重试次数--;

匹配= 0;
addr += 1;
delayUS(500);

//读取 SPI 命令

void SPI_ReadReg (uint8_t reg_addr、uint8_t * reg_data、uint8_t count){
// SPI 读取。 包括在 HFO 未启动或需要等待时间时重试。 请参阅 BQ76952软件开发指南查看示例
uint8_t addr;
uint8_t TX_Buffer [MAX_BUFFER_SIZE]={0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00};
unsigned int i;
无符号整型匹配;
无符号 int 重试次数= 10;

匹配= 0;
addr = reg_addr;

for (I=0;I<计数;I++){
TX_Buffer[0]= addr;
TX_Buffer[1]= 0xFF;

HAL_GPIO_WritePin (GPIOB、GPIO_PIN_6、GPIO_PIN_RESET);
HAL_SPI_TransmitReceive (&hspi1、TX_Buffer、rxdata、2、1);
HAL_GPIO_WritePin (GPIOB、GPIO_PIN_6、GPIO_PIN_SET);

while ((match ==0)&(retries >0)){
delayUS(500);
HAL_GPIO_WritePin (GPIOB、GPIO_PIN_6、GPIO_PIN_RESET);
HAL_SPI_TransmitReceive (&hspi1、TX_Buffer、rxdata、2、1);
HAL_GPIO_WritePin (GPIOB、GPIO_PIN_6、GPIO_PIN_SET);
if (rxdata[0]== addr){
匹配= 1;
reg_data[i]= rxdata[1];

重试次数--;

匹配= 0;
addr += 1;
delayUS(500);

谨致问候。。。

R·K·古普塔

OGOEnergy India Private Limited

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Ramesh、

    您是否通读了 BQ769x2软件开发指南中的 SPI 示例?  https://www.ti.com/lit/pdf/sluaa11 

    0x80 OR 语句用于设置写操作的 R/W 位。 写入后无需再次读取数据、但这是确认器件已接收到数据的方法。 该器件上的 SPI 有点棘手、因此我通常建议使用 I2C、除非对 SPI 有强烈要求。

    此致、

    马特

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Matt、

    感谢您的答复、

    修改上述代码后、BQ7695203正在响应...但当我要读取时 AlarmRegStatus 0x62  我无法读取完整扫描位的位状态。   

    SPI Comm 有任何问题、Renesas 和 ADI 的所有其他 BFE、我们将使用隔离式 SPI Comm.x

    请建议-我们处于开发阶段,可以将 SPI 更改为 I2C。

    void SPI_WriteReg (uint8_t reg_addr、uint8_t * reg_data、uint8_t count)

    {
    // SPI 写入。 包括在 HFO 未启动或需要等待时间时重试。 请参阅 BQ76952软件开发指南查看示例
    uint8_t addr;
    uint8_t TX_Buffer [MAX_BUFFER_SIZE]={0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00};
    unsigned int i;
    无符号整型匹配;
    无符号 int 重试次数= 10;

    匹配= 0;
    addr = 0x80 | reg_addr;//为什么它是使用0x80进行 OR 运算

    for (I=0;I<计数;I++){
    TX_Buffer[0]= addr;
    TX_Buffer[1]= REG_DATA[i];
    TX_BUFFER[2]= CRC8 (TX_Buffer、2);// 计算每2个字节的 CRC  


    HAL_GPIO_WritePin (GPIOB、GPIO_PIN_6、GPIO_PIN_RESET); //发送两个字节后需要再次读取数据
    HAL_SPI_TransmitReceive (&hspi1、TX_Buffer、rxdata、3、1);/ /修改 数据长度  
    HAL_GPIO_WritePin (GPIOB、GPIO_PIN_6、GPIO_PIN_SET);

    while ((match ==0)&(retries >0)){
    delayUS(500);
    HAL_GPIO_WritePin (GPIOB、GPIO_PIN_6、GPIO_PIN_RESET);
    HAL_SPI_TransmitReceive (&hspi1、TX_Buffer、rxdata、3、1); //修改 数据长度
    HAL_GPIO_WritePin (GPIOB、GPIO_PIN_6、GPIO_PIN_SET);
    if ((rxdata[0]== addr)&(rxdata[1]== reg_data[i]))
    匹配= 1;
    重试次数--;

    匹配= 0;
    addr += 1;
    delayUS(500);

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Ramesh、

    许多其他用户已使用 SPI 将产品投入生产、因此使用 SPI 不会出现问题。 如果您不太喜欢 SPI、我建议您使用 I2C、因为 SPI 对于此器件来说有点棘手。

    使用 I2C、您可以执行块读取和写入、因此可以方便地读取一个事务中的所有电池电压。 借助 I2C、直接命令使用时钟扩展、因此只要微控制器支持时钟扩展、使用直接命令时就无需如此小心等待时间。 主要优点是实现和调试代码变得更加直接。

    我不确定我是否理解 SPI 读取函数发生变化的原因。

    此致、

    马特

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Matt、

    可 使用 CRC 将 SPI -BQ7659203器件更改为 I2C 模式、

    如果是、对于相同的情况、需要遵循什么步骤- SPI 至 i2c  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Matt、

    请查看 DATASTATUS5寄存器详细信息的数据表详细信息

    相同的事情  

    (2)设备内部温度上升到55度,是否正常?

    (3)我正在使用外部电源5.0V (最大5.3V)以及何时需要更新  

    //'RE 12 Config'-尝试禁用 REG1/REG2  
    BQ769x2_SetRegister (REG12Config、0x00、1);

    然后器件未响应-表示我没有在警报状态寄存器中获得完整的扫描位设置状态。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Ramesh、

    在运行过程中、器件内部温度可能会升高。 例如、这在电池平衡期间很常见。 电池平衡应用报告在内部平衡一节中展示了有关如何计算由于平衡电流而导致的预期温度上升的示例。  https://www.ti.com/lit/pdf/sluaa81 

    当您将 REG1设置为0V (如 REG12 Config 寄存器设置中所示)时、可能设置为使用 REG1电压的其他功能将受到影响。 例如、如果将警报引脚配置为使用 REG1电压电平、则它将能够变为高电平。 您还需要处于 CONFIG_UPDATE 模式才能修改任何器件设置。

    我随附了一份文档、其中介绍了如何将 BQ7695203器件更改为 I2C。

    e2e.ti.com/.../bq76952_5F00_ReconfigureSettings.pdf

    此致、

    马特

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Matt、

    再次感谢、

    我已使用 SPI 总线成功与 BQ 芯片进行通信、不会在 I2C 总线上进行轮班。

    您能再次解释一下为什么我在禁用 REG1寄存器时遇到像电池转换不起作用这样的问题。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    为什么 DAStaus5的平均电池温度位于2个位置。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    是的、DAStatus 有两个平均电芯温度实例。 它们是相同的、您可以忽略第二个。

    对于 BQ7695203、SPI_MISO 引脚配置为根据 REG1电压驱动其逻辑高电平。 如果将 REG1设置为0V、SPI_MISO 引脚上将没有电压。 因此在这种情况下无法禁用 REG1。

    此致、

    马特

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    需要在 regin 引脚上启用 reg1和 reg2、并具有外部输入。

    如果我不更新该寄存器并保持默认值 reg12、则表示工作正常。

    请建议我、要求在配置模式下的 BQ 初始化期间更新该寄存器、或者不

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您只需更新要更改为与默认值不同的寄存器。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Matt、

    除了以下修改外、我想在充电/放电过程中使用 CB 寄存器的默认设置手动控制电芯平衡

    //设置电芯平衡配置- 0x9335 = 0x03 -在 RELAX 或 CHARGE 模式下自动平衡
    //另请参见 TI.com 上的"使用 BQ769x2电池监控器实现电池平衡"文档
    U_CB_Config_reg.value_b.CB_CHG=1;
    U_CB_Config_reg.value_b.CB_RLX=1;
    BQ769x2_SetRegister (平衡配置、u_CB_Config_reg.value、1);
    //设置电池平衡间隔//0X9339=30秒
    BQ769x2_SetRegister (CellBalanceInterval、1、1);
    //设置电池平衡最大电芯数//0X933A=1
    BQ769x2_SetRegister (CellBalanceMaxCells、1、1);
    //设置充电期间电池平衡最小电芯电压//0X933B=3600mV
    BQ769x2_SetRegister (CellBalanceMinCellVCharge、2500、2);
    //设置充电期间电池平衡最小增量电芯电压//0X93D=40mV
    BQ769x2_SetRegister (CellBalanceMinDeltaCharge、40、1);
    //设置充电期间电池平衡最小差值停止电压//0X933e=20mV
    BQ769x2_SetRegister (CellBalanceStopDeltaCharge、20、1);

    //设置张弛电池电压
    BQ769x2_SetRegister (CellBalanceMinCellVRelax、3500、1);

    在清除  CB_CHG 和  CB_RLX 并使用 命令子命令(CB_ACTIVE_CELLS、0x01、W)写入寄存器后;

    电池1上未反映任何内容

    还建议如何   在 BMS 中使用 AccumCharg -子命令(DASTATUS6、0x00、R) 来计算充电/放电 AH。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Ramesh、

    BQ76952仅支持充电期间或静止状态下的电芯平衡。  

    在清除  CB_CHG 和  CB_RLX 并使用 命令子命令(CB_ACTIVE_CELLS、0x01、W)写入寄存器后,[/引号]

    您可以尝试从  CB_ACTIVE_CELLS ()读回吗? 这将决定主动平衡哪个电池。

    还建议如何使用 AccumCharg -  我的 BMS 中的子命令(DASTATUS6、0x00、R) 计算充电/放电 AH。


    这个 常见问题超过 如何解释 DASTATUS6()寄存器中的数据。

    此致、
    何塞·库索

    [/quote]