大家好、
我正在从事基于电池的项目、并使用电量监测计 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);
}
//======================================================================== 下面是输出的屏幕截图===========================================
