我们使用 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;
}
最好