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.

[参考译文] BQ27441-G1:BQ27441-G1我不设置设计容量、设计能量、锥形电压和锥形率

Guru**** 2456240 points
Other Parts Discussed in Thread: BQ27441-G1

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

https://e2e.ti.com/support/power-management-group/power-management/f/power-management-forum/568263/bq27441-g1-bq27441-g1-i-am-not-setting-the-design-capacity-design-energy-taper-voltage-and-taper-rate

器件型号:BQ27441-G1

大家好、

我正在从事基于电池的项目、并使用电量监测计 IC BQ27441-G1来测量电池参数。 通过实施源代码、我可以成功读取 BQ27441-G1中设置的所有默认参数。

现在、在我们的硬件板中、我们已连接4600mAh 电池、因此我需要更改 BQ27441-G1中的设计容量寄存器。 为此、我已将该值写入设计容量寄存器。 我在这里面临着问题。 写入寄存器正在成功执行、但之后、当我要读取同一个寄存器时、我将始终仅获得默认值。

我已按照此链接中提供的相同步骤操作: www.ti.com/.../sluuap7.pdf。 我已将 I2C 时钟频率配置为400kHz。 在每个写入周期之后、我为上升提供了3秒的延迟。

您能告诉我如何在任何寄存器中写入值的过程吗?

我们非常感谢您在这种情况下提供的任何帮助。

我在下面附上了我的代码。

//================================================================================ main.c ===================================================================

#include "stm32f1xx_hal_conf.h"
#include "stm32f1xx_hal.h"
#include "Fualguage.h"
#include "board.h"


uint8_t init = 0;
extern I2C_HandleTypeDef Fualguage_I2C2descriptor;
uint8_t init = 0、state_for_charge = 0;
uint16_t design_cap = 0;
uint8_t rx1[2]={0x00};

MAIN ()

if (init = 0)

Fualguage_initialization();
INIT = 1;


while (1)

i2cReadBytes (&Fualguage_I2C2descriptor、BQ27741_I2C_address、0x3C、rx1、2);
design_cap = rx1[1]<< 8 | rx1[0];
printf ("设计容量:%d\r\n"、design_cap);

State_for_Charge = i2cReadByte (&Fualguage_I2C2descriptor、BQ27741_I2C_address、0x1C);
printf ("充电状态:%d\r\n"、state_of _charge);

HAL_DELAY (300000);


//================================================================================ Fualguage.h ========================================================================================

#ifndef __FUALGUAGE_H
#define __FUALGUAGE_H

#include "board.h"

#define BQ27741_I2C_ADDRESS 0xAA
#define TIMEOUT 10000
#define BQ72441_I2C_TIMEOUT 2000

/* I2C SPEEDCLOCK 定义为最大值:STM32F1xx*/上为400KHz
#define FUALGUAGE_I2C_SPEEDCLOCK 100000
#define FUALGUAGE_I2C_DUTYCYCLE I2C_DUTYCYCLE

/* I2C 读取需要此延迟*/
(uint16_t j = 0;j < 500;j++)的#define delay


void Fualguage_I2C_Config (void);

void Fualguage_initialization (void);

#endif

//======================================================================================== Fualguage.c ===========================================================================

#include "Fualguage.h"

#define I2C_TIMEOUT_BUSY_FLAG ((uint32_t) 10000)/*!<超时10 s */
#define true 1.
#define false 0

/* Fualguage 的缝隙外部折射*/
I2C_HandleTypeDef Fualguage_I2C2descriptor;

uint8_t data[2]={0};
uint16_t result16 = 0;
uint8_t rx[2]={0x00};

uint8_t old_chksum = 0、tmp_chksum = 0、new_chksum = 0、chksum = 0;
uint16_t old_dc = 0、old_de = 0、old_tv = 0、old_tr = 0;

void Fualguage_I2C_Config (void)

Fualguage_I2C2descriptor.instance = FUALGUAGE_BQ27441_I2C;
Fualguage_I2C2descriptor.Init.ClockSpeed = FUALGUAGE_I2C_SPEEDCLOCK;
Fualguage_I2C2descriptor.Init.DutyCycle = FUALGUAGE_I2C_DUTYCYCLE;
Fualguage_I2C2descriptor.Init.OwnAddress1 = BQ27741_I2C_ADDRESS;
Fualguage_I2C2descriptor.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
Fualguage_I2C2descriptor.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
Fualguage_I2C2descriptor.Init.OwnAddress2 = 0xFF;
Fualguage_I2C2descriptor.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
Fualguage_I2C2descriptor.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;

if (HAL_I2C_Init (&Fualguage_I2C2descriptor)!= HAL_OK)

#ifdef _enable_printf_
printf ("\n\n\r FUALGUAGE 初始化错误\n");
#endif


void Fualguage_initialization (void)

/*在此初始化中,我配置
设计容量= 4600mAh、设计能量= 17020 (设计容量* 3.7)、
锥形电流= 115mA、
端子电压= 3200mV、锥率= 400 (设计容量/(0.1 *锥形电流))
HAL_DELAY (300000)此函数提供3秒的延迟*

//1.
DATA[0]= 0x00;
数据[1]= 0x80;
i2cWriteBytes (&Fualguage_I2C2descriptor、BQ27741_I2C_address、(uint8_t) 0、data、2);
i2cWriteBytes (&Fualguage_I2C2descriptor、BQ27741_I2C_address、(uint8_t) 0、data、2);
HAL_DELAY (300000);

//2.
DATA[0]= 0x13;
数据[1]= 0x00;
i2cWriteBytes (&Fualguage_I2C2descriptor、BQ27741_I2C_address、(uint8_t) 0、data、2);
HAL_DELAY (300000);

//3.
操作

i2cReadBytes (&Fualguage_I2C2descriptor、BQ27741_I2C_address、0x06、Rx、2);
result16 =(rx[1]<< 8)| rx[0];
} while (!(result16 & 0x0010));

//4.
i2cWriteByte (&Fualguage_I2C2descriptor、BQ27741_I2C_address、0x61、0x00);
HAL_DELAY (300000);

//5.
i2cWriteByte (&Fualguage_I2C2descriptor、BQ27741_I2C_address、0x3E、0x52);
HAL_DELAY (300000);

//6.
i2cWriteByte (&Fualguage_I2C2descriptor、BQ27741_I2C_address、0x3F、0x00);
HAL_DELAY (300000);


操作

//7.
old_chksum = i2cReadByte (&Fualguage_I2C2descriptor、BQ27741_I2C_address、0x60);

//8.
tmp_chksum = 0xFF - old_chksum;

//9.
i2cReadBytes (&Fualguage_I2C2descriptor、BQ27741_I2C_address、0x4A、Rx、2);
OLD_dc =(rx[1]<< 8)| rx[0];

//10.
i2cReadBytes (&Fualguage_I2C2descriptor、BQ27741_I2C_address、0x4C、Rx、2);
OLD_DE =(Rx[1]<< 8)| Rx[0];

//11.
i2cReadBytes (&Fualguage_I2C2descriptor、BQ27741_I2C_address、0x50、Rx、2);
OLD_tv =(Rx[1]<< 8)| Rx[0];

//12.
i2cReadBytes (&Fualguage_I2C2descriptor、BQ27741_I2C_address、0x5B、Rx、2);
OLD_tr =(Rx[1]<< 8)| Rx[0];

//13.
tmp_chksum = tmp_chksum - old_dc - old_de - old_tv - old_tr;

//14.
DATA[1]= 0x11;DC/DC 的//MSB
DATA[0]= 0xf8;//LSB 0f DC
i2cWriteBytes (&Fualguage_I2C2descriptor、BQ27741_I2C_address、0x4A、data、2);
HAL_DELAY (300000);

//15.
DATA[1]= 0x42;DE 的//MSB
DATA[0]= 0x7C;//LSB 0f DE
i2cWriteBytes (&Fualguage_I2C2descriptor、BQ27741_I2C_address、0x4C、data、2);
HAL_DELAY (300000);

//16.
DATA[1]= 0x0C;电视的//MSB
DATA[0]= 0x80;//LSB 0f TV
i2cWriteBytes (&Fualguage_I2C2descriptor、BQ27741_I2C_address、0x50、data、2);
HAL_DELAY (300000);

//17.
DATA[1]= 0x01;TR 的//MSB
DATA[0]= 0x90;//LSB 0f TR
i2cWriteBytes (&Fualguage_I2C2descriptor、BQ27741_I2C_address、0x5B、data、2);
HAL_DELAY (300000);

//18
tmp_chksum = tmp_chksum +(uint16_t) 4600 +(uint16_t) 17020 +(uint16_t) 3200 +(uint16_t) 400;

/19.
new_chksum = 0xFF - tmp_chksum;

//20.
i2cWriteByte (&Fualguage_I2C2descriptor、BQ27741_I2C_address、0x60、new_chksum);
HAL_DELAY (300000);

/21.
i2cWriteByte (&Fualguage_I2C2descriptor、BQ27741_I2C_address、0x3E、0x52);
HAL_DELAY (300000);

/22.
i2cWriteByte (&Fualguage_I2C2descriptor、BQ27741_I2C_address、0x3F、0x00);
HAL_DELAY (300000);

/23.
chksum = i2cReadByte (&Fualguage_I2C2descriptor、BQ27741_I2C_address、0x60);

printf ("chksum:%d new_chksum:%d\n\r"、chksum、new_chksum);

}while (chksum!= new_chksum);

/24.
数据[0]= 0x42;
数据[1]= 0x00;
i2cWriteBytes (&Fualguage_I2C2descriptor、BQ27741_I2C_address、0x00、data、2);
HAL_DELAY (300000);

/25.
操作

i2cReadBytes (&Fualguage_I2C2descriptor、BQ27741_I2C_address、0x06、Rx、2);
result16 =(rx[1]<< 8)| rx[0];
}while (result16 & 0x0010);

/26.
数据[0]= 0x20;
数据[1]= 0x00;
i2cWriteBytes (&Fualguage_I2C2descriptor、BQ27741_I2C_address、0x00、data、2);
HAL_DELAY (300000);

//======================================================================== 下面是输出的屏幕截图===========================================

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

    bq27441-G1的状态是什么? 是密封的吗? 未密封? 工厂访问?

    我猜测器件是密封的、这就是您无法写入配置寄存器值的原因。

    如果您在下面链接的文档中查看图1的左上角、您需要首先解开量表、以便能够更改内存中的大多数值:
    www.ti.com/.../sluuap7.pdf