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.

[参考译文] BQ27220:设置设计容量

Guru**** 2587365 points
Other Parts Discussed in Thread: BQ27220

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

https://e2e.ti.com/support/power-management-group/power-management/f/power-management-forum/1013455/bq27220-set-design-capacity

器件型号:BQ27220

我们使用 BQ27220来获取电池信息。 前提条件是根据我们使用的电池设置设计容量。

我尝试按照示例过程(6.1数据存储器参数更新示例)设置参数、

但在设置函数前后读取设计容量时失败、它们是相同的3000。

我将随附我的代码和示例程序以及数据表(TRM)。

我的问题是:

 示例轮询操作状态寄存器位2的步骤4、以确保进入完全访问模式。  

但位2在密封访问和完全访问模式下均置位。 我们无法区分

2. BQ27220处于非密封状态、因为我们不做任何额外的事情。 我们只读取电池百分比。

3.如果有错误,是否有人可以检查我的代码?

附录:

我尝试将设计容量设置为1880mAh、十六进制值为0x07 0x58。

示例过程。

我在此处的代码:


静态 uint8_t battery_design_cap_cmd[2]           ={0x3C、0x3D};
   
静态 uint8_t SEART_cmd[3]                         ={0x00、0x30、0x00};

静态 uint8_t unseale_cmd[3]                       ={0x00、0x14、0x04};
静态 uint8_t unseale_cmd2[3]                      ={0x00、0x72、0x36};
       
静态 uint8_t enter_full_access_cmd[3]            ={0x00、0xFF、0xFF};
静态 uint8_t enter_cfg_update_cmd[3]             ={0x00、0x90、0x00};
静态 uint8_t exit_cfg_update_cmd[3]              ={0x00、0x92、0x00};
   
静态 uint8_t design_cap_msb_cmd[2]               ={0x3E、0x9F};
静态 uint8_t design_cap_lsb_cmd[2]               ={0x3F、0x92};
   
静态 uint8_t wr_design_cap_MSB_cmd[2]            ={0x40、0x07};
静态 uint8_t wr_design_cap_lsb_cmd[2]            ={0x41、0x58};
   
静态 uint8_t wr_check_sum_cmd[2]                 ={0x60、};
静态 uint8_t wr_data_len_cmd[2]                  ={0x61、};


#define 位(x)             (1<<x)

uint32_t update_battery_cfg_data (){
   
   uint32_t ret = 0;
   
   uint16_t BAT_DATA = 0;
   
   uint8_t 计数器= 0;
   uint8_t Old Chksum = 0;
   uint8_t Data_len = 0;
   uint8_t Old_dc_msb = 0;
   uint8_t Old_dc_LSB = 0;
   
   uint8_t Temp = 0;
   uint8_t New_Chksum = 0;
   
   //初始化和 I2C 地址设置。
   RET = i2c_m_SYNC_CONFIG (TWIHS0、TWIHS_CLK、SYSCLK_GET_PERIPHERAL_Hz ());
   if (ret!= TWIHS_SUCCESS){
       printf ("\r\n\tFILE:"__file__"、行:%d:\r\n"、__line__);
       回程;
   }
   i2C_m_SYNC_SET_slaveaddr (battery_sensor_address);
   
   // unse密封_cmd
   RET = i2c_m_SYNC_cmd_write (TWIHS0、0、0、unseal_cmd、3);
   if (ret!= TWIHS_SUCCESS){
       printf ("\r\n\tFILE:"__file__"、行:%d:\r\n"、__line__);
       回程;
   }
       
   RET = i2c_m_SYNC_cmd_write (TWIHS0、0、0、unseal_cmd2、3);
   if (ret!= TWIHS_SUCCESS){
       printf ("\r\n\tFILE:"__file__"、行:%d:\r\n"、__line__);
       回程;
   }
       
   //将命令数据写入传感器
   RET = i2c_m_SYNC_cmd_write (TWIHS0、0、0、enter_full_access_cmd、3);
   if (ret!= TWIHS_SUCCESS){
       printf ("\r\n\tFILE:"__file__"、行:%d:\r\n"、__line__);
       回程;
   }
   
   RET = i2c_m_SYNC_cmd_write (TWIHS0、0、0、enter_full_access_cmd、3);
   if (ret!= TWIHS_SUCCESS){
       printf ("\r\n\tFILE:"__file__"、行:%d:\r\n"、__line__);
       回程;
   }
   
   RET = i2c_m_SYNC_cmd_write (TWIHS0、0、0、enter_cfg_update_cmd、3);
   if (ret!= TWIHS_SUCCESS){
       printf ("\r\n\tFILE:"__file__"、行:%d:\r\n"、__line__);
       回程;
   }
   
   执行{
       //清除接收缓冲区
       memset (GS_uC_battery_data_Rx、0、CMD_DATA_LEN);
       //读取电池数据
       RET = i2c_m_SYNC_cmd_read (TWIHS0、0x3B、0、GS_uC_BATTERY_DATA_Rx、2);
       if (ret!= TWIHS_SUCCESS){
           printf ("\r\n\tFILE:"__file__"、行:%d:\r\n"、__line__);
           回程;
       }
           
       BAT_DATA = GS_UC_BATTERY_DATA_Rx[1]<< 8 | GS_UC_BATTERY_DATA_Rx[0];
       printf ("bat_data[0]%02x\r\n"、GS_uC_battery_data_rx[0]);
       printf ("bat_data[1]%02x\r\n"、GS_uC_battery_data_rx[1]);
       
       printf ("bat_data %04X\r\n"、bat_data);
       printf ("SEC0_bit_mask %04X\r\n"、bit (1));
       
       if (bat_data 和 bit (1)){
           中断;
       }
           
       delay_ms (200);
       COUNTER++;
   } while (counter<6);
   
   if (counter >= 6){
       printf ("counter1 %d\r\n"、计数器);
       返回110;
   }
  
   RET = i2c_m_SYNC_cmd_write (TWIHS0、0、0、design_CAP_MSB_cmd、CMD_DATA_LEN);
   if (ret!= TWIHS_SUCCESS){
       printf ("\r\n\tFILE:"__file__"、行:%d:\r\n"、__line__);
       回程;
   }

   RET = i2c_m_SYNC_cmd_write (TWIHS0、0、0、design_cap_lsb_cmd、CMD_DATA_LEN);
   if (ret!= TWIHS_SUCCESS){
       printf ("\r\n\tFILE:"__file__"、行:%d:\r\n"、__line__);
       回程;
   }
   
   //读取 Old_Chksum
   RET = i2c_m_SYNC_cmd_read (TWIHS0、0x60、0、&Old_Chksum、1);
   if (ret!= TWIHS_SUCCESS){
       printf ("\r\n\tFILE:"__file__"、行:%d:\r\n"、__line__);
       回程;
   }
   
   //读取 Old_Chksum
   RET = i2c_m_SYNC_cmd_read (TWIHS0、0x61、0、&Data_len、1);
   if (ret!= TWIHS_SUCCESS){
       printf ("\r\n\tFILE:"__file__"、行:%d:\r\n"、__line__);
       回程;
   }
   
   
   //读取 Old_Chksum
   RET = i2c_m_SYNC_cmd_read (TWIHS0、0x40、0、&Old_DC_MSB、1);
   if (ret!= TWIHS_SUCCESS){
       printf ("\r\n\tFILE:"__file__"、行:%d:\r\n"、__line__);
       回程;
   }
   
   //读取 Old_Chksum
   RET = i2c_m_SYNC_cmd_read (TWIHS0、0x41、0、&Old_DC_LSB、1);
   if (ret!= TWIHS_SUCCESS){
       //printf ("\r\n\tFILE:"__file__"、行:%d:\r\n"、__line__);
       回程;
   }
      
   RET = i2c_m_SYNC_cmd_write (TWIHS0、0、0、wr_design_cap_MSB_cmd、CMD_DATA_LEN);
   if (ret!= TWIHS_SUCCESS){
       printf ("\r\n\tFILE:"__file__"、行:%d:\r\n"、__line__);
       回程;
   }

   RET = i2c_m_SYNC_cmd_write (TWIHS0、0、0、wr_design_cap_MSB_cmd、CMD_DATA_LEN);
   if (ret!= TWIHS_SUCCESS){
       printf ("\r\n\tFILE:"__file__"、行:%d:\r\n"、__line__);
       回程;
   }
   
   温度=(255 - OLE_Chksum - OLE_DC_MSB - OLE_DC_LSB)%256;
   new_Chksum = 255 -(Temp + wr_design_cap_msb_cmd[1]+ wr_design_cap_lsb_cmd[1])%256;
   
   WR_CHECK_SUM_CMD[1]= New_Chksum;
   
   RET = i2c_m_SYNC_cmd_write (TWIHS0、0、0、wr_check_sum_cmd、CMD_DATA_LEN);
   if (ret!= TWIHS_SUCCESS){
       printf ("\r\n\tFILE:"__file__"、行:%d:\r\n"、__line__);
       回程;
   }
   
   //长度
   WR_DATA_len_cmd[1]=数据长度;
   
   RET = i2c_m_SYNC_cmd_write (TWIHS0、0、w_data_len_cmd、CMD_DATA_LEN);
   if (ret!= TWIHS_SUCCESS){
       printf ("\r\n\tFILE:"__file__"、行:%d:\r\n"、__line__);
       回程;
   }
   
   //退出
   RET = i2c_m_SYNC_cmd_write (TWIHS0、0、0、EXIT_cfg_update_cmd、3);
   if (ret!= TWIHS_SUCCESS){
       printf ("\r\n\tFILE:"__file__"、行:%d:\r\n"、__line__);
       回程;
   }
   
   计数器= 0;
   执行{
       //清除接收缓冲区
       memset (GS_uC_battery_data_Rx、0、CMD_DATA_LEN);
       //读取电池数据
       RET = i2c_m_SYNC_cmd_read (TWIHS0、0x3B、0、GS_uC_BATTERY_DATA_Rx、2);
       if (ret!= TWIHS_SUCCESS){
           printf ("\r\n\tFILE:"__file__"、行:%d:\r\n"、__line__);
           回程;
       }
       
       BAT_DATA = GS_UC_BATTERY_DATA_Rx[1]<< 8 | GS_UC_BATTERY_DATA_Rx[0];
       printf ("bat_data[0]%02x\r\n"、GS_uC_battery_data_rx[0]);
       printf ("bat_data[1]%02x\r\n"、GS_uC_battery_data_rx[1]);
       
       if (bat_data 和 bit (1)){
           中断;
       }
       
       delay_ms (200);
       COUNTER++;
   } while (counter<6);
   
   if (counter >= 6){
       printf ("counter2 %d\r\n"、计数器);
       //返回110;
   }
   
   // SEART_cmd
   RET = i2c_m_SYNC_cmd_write (TWIHS0、0、0、SEART_cmd、3);
   if (ret!= TWIHS_SUCCESS){
       printf ("\r\n\tFILE:"__file__"、行:%d:\r\n"、__line__);
       回程;
   }
   
   返回 TWIHS_SUCCESS;

最好

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

    Mingzhao Ma、您好!

    对于步骤4、您应该轮询高字节的位2 (CFGUPDATE)。 我建议您在尝试不同的设计容量值之前、尝试直接执行以下步骤来调试您的代码。 我猜您是在误计算校验和。

    最棒的

    Jessica

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

    您好,Jessica

       感谢您提醒 CFGUPDATE、我对其进行了修正。

       我假设 OperationStatus 的结果以小端字节序进行传输、

       这意味着 GS_UC_BATTERY_DATA_Rx[0]为低字节、GS_UC_BATTERY_DATA_Rx[1]为高字节。 我认为是这样。

       

       我尝试将设计容量设置为所用的示例(1200mAh)。

       第13步、我不知道为什么 Data_len 为0x24。 它是如何计算的?

       通过观察输出结果,我发现 OperationStatus()的输出不稳定,它的变化如下:

       当 GS_UC_BATTERY_DATA_Rx[1]为0xFF 时、它在等待时退出。  我认为在进入 CFGUPDATE 模式之前应该装订它。

    ++++++++++++++++

    设计容量:3000
    BAT_DATA[0] 06
    BAT_DATA[1] 00
    BAT_DATA 0006
    位(2) 0004
    BAT_DATA[0] FE
    BAT_DATA[1] 0B
    BAT_DATA 0BFE
    位(2) 0004
    BAT_DATA[0] 6B
    BAT_DATA[1] 10.
    BAT_DATA 106B
    位(2) 0004
    BAT_DATA[0] 68
    BAT_DATA[1] 42.
    BAT_DATA 4268
    位(2) 0004
    BAT_DATA[0] 68
    BAT_DATA[1] 00
    BAT_DATA 0068
    位(2) 0004
    BAT_DATA[0] FF
    BAT_DATA[1] FF
    BAT_DATA FFFF
    位(2) 0004
    BAT_DATA[0] 60.
    BAT_DATA[1] B8
    BAT_DATA[0] 0b
    BAT_DATA[1] 2A
    BAT_DATA[0] 00
    BAT_DATA[1] FF
    update_battery_cfg_data 正常
    设计容量:3000

    ++++++++++++++++

    最好

    明召