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:读取校验和和访问存储器配置参数时出现问题

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

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

https://e2e.ti.com/support/power-management-group/power-management/f/power-management-forum/678295/bq27441-g1-problem-reading-checksum-and-accessing-memory-config-parameters

器件型号:BQ27441-G1

大家好! 我是这个论坛的新手。 在我的工作中、我最近设计了一个 PCB、其中包含由 ARM Cortex M4 MCU (STM32L431)管理的 BQ27441-G1电量监测计。

一切工作正常(我可以进入非密封模式、我可以读取电池电压、电流、功率、监测计温度等)。 当我尝试编辑存储器设计参数时、会出现问题。 我使用的是3000 mAh 电池、我尝试更改该参数。 我可以使用 BQ27441-G1对存储器写入进行确认(在 I2C 总线监听器上进行测试)来执行快速入门流程图中的所有操作。 此外、当我尝试写入新校验和时、监测计确认。

我想有2个问题。 首先、当我尝试读取旧校验和时、监测计始终在总线上写入"0xFF"、我认为这不是默认校验和。 第二个问题是、完成配置流程图中的所有步骤、然后我尝试使用正确的命令读取设计容量、并获取默认容量。 我无法知道我的错误在哪里。

下面是我使用的代码。 谢谢!

void ChangeDesignCapacity(uint16_t capacity)
{
uint8_t old_msb、old_LSB、old_CSUM、new_MSB、new_LSB、 data[2]、new_CSUM;
uint16_t flags、old_descap、capacity_mod;
capacity_mod =((Capacity >> 8)& 0x00FF)+((Capacity & 0x00FF)<< 8);
new_MSB =(Capacity >> 8)& 0x00FF;
new_LSB = Capacity & 0x00FF;
old_descap = DesignCapacity ();
old_msb = old_descap & 0x00FF;old_cap
= 0x241&cb;old_c241&nhi_cb = old_c24&cb (old_cb = 0x24&cb)

;old_c24_cb = 0x24&r_cb = old_cb = 0x24&r_cb (old_cb); Set_CFGUPDATE、NULL、0);
flags = Flags();
while (!(flags & 0x0010)
){
HAL_delay (200);
flags = Flags();
}
BlockDataControl();
DataBlockClass (0x52);
DataBlock (0x00);
OLD_CSUM = BlockDataChecksum (lectura、NULL);
BlockData (10、ESCRITURA、capacity_mod、 2);
new_CSUM = CSUMGen (old_MSB、old_LSB、old_CSUM、new_LSB、 new_msb);
BlockDataChecksum (ESCRITURA、new_CSUM);
I2C_Write_SubCmd (&hi2c2、BQ27441_ADD、 control_L、SOFT_RESET、NULL、0);
标志=标志();
while (flags & 0x0010)
{
HAL_delay (200);
flags = Flags();
}
I2C_Write_SubCmd (&hi2c2、BQ27441_ADD、CONTRAL_L、 密封、空















、0);}uint8_t CSUMGen (uint8_t old_msb、uint8_t old_LSB、uint8_t old_CSUM、uint8_t new_MSB、uint8_t new_LSB){uint8_t new_CSUM、new_CSUM;uint2+ void = 2+(nuint2+ i);nuint2+(nu_ms2+ i = nold);(nvoid 2+ i = nuint2+ i = nuint2+(nu_ms2+);nu_t void 2+(nu_2+ i);nuint2+ t invoid 2 (nu_2+ i)
HAL_DELAY (1);
}
uint16_t

DesignCapacity(void)
{
HAL_DELAY (1);
返回 I2C_READ (&hi2c2、BQ27441_ADD、DESAC_L、2);
}

void DataBlockClass (uint16_t class_ID)
{
HAL_delay (1);
I2C_Write (&hi2c2、BQ27441_ADD、DATACLASS、class_ID、 1);
}

void DataBlock (uint8_t offset_bin)
{
HAL_delay (1);
I2C_Write (&hi2c2、BQ27441_ADD、DATABLOCK、OFFSET_BIN、 1);
}

uint16_t BlockData (uint8_t offset、uint8_t mode、uint16_t data、uint8_t size)
{
uint16_t Dato;
HAL_delay (1);
if (mode=0)
{
I2C_Write (&hi2c2、BQ27441_ADD、HAL_DELAY)、if (LODATA_OFFSET)+ DCK0) 数据、大小);
返回0;
}
否则{
Dato = I2C_Read (&hi2c2、BQ27441_ADD、(BLOCKDATA_0 +偏移量)、size);
返回 Dato;
}
}

uint16_t BlockDataChecksum (uint8_t 模式、uint8_t 校验)
{
uint16_t Dato;
HAL_delay (1);
if (mode=0)
{
I2C_Write (&hi2c2、BQ27441_ADD、BLOCKDATACHECK、 Check、1);
返回0;
}
否则{
Dato = I2C_Read (&hi2c2、BQ27441_ADD、BLOCKDATACHECK、1);
返回 Dato;
}
}

void BlockDataControl (void)
{
HAL_delay (1);
I2C_Write (&hi2c2、BQ27441_ADD、BLOCKDATACTRL、0x00、 1);
|}

uint16_t I2C_READ_SubCmd (I2C_HandleTypeDef * i2c、uint8_t ADDR、uint8_t cmd、uint16_t subcmd、uint8_t size)
{
uint8_t i、data[size]、subcmd_L、subint8_h、uint2c_r subcmd、i2c





和 i2c subinstance = 0xctry=>i2>I2>CR2c (i2>i2c_instance + subtrybytes)| i2<subtry=>i2<0xcr + subtry2>i2>i2>cr2<subtran_cr2;<subtrybytes=>i2>i2>i2c <subtran_cr;subtran_cr = 0xcr = 0xcr <subtran_cr = 0xcr <subtran2;<sub
while (!(i2c->instance->ISR &(I2C_ISR_TXE | I2C_ISR_TXIS));
i2c->TXDR = cmd;
while (!(i2c->instance->cmd &(I2C_ISR_TXE | I2C_ISR_TXIS)));
i2c->ISR-> instance->TXDR=>I2c (i2c
和 i2c


(i2C_ISR_TR_Instance->TXDR->I2c);i2c (i2c = I2c);i2c (i2c = I2c = I2c = I2c = I2c = I2c = I2c = I2c = I2c);iCr = I2c = I2c = I2c = I2c = I2c = Ic = Ic

i2c->instance->CR2 |= I2C_CR2_nbytes &(大小<< I2C_CR2_nbytes_Pos);
i2c->Instance->CR2 |= I2C_CR2_Sadd 和 ADDR;
i2c->instance->CR2 |= I2C_CRD_WRn;
i2c->Instance->CR2
;i2C_CR0=<= SIZE;i2C_CR0|= I CR2C_CR0|= I CR0=<= CR2C_CR0|= CR2c_START i++){
while (!(i2c->instance->ISR 和 I2C_ISR_RXNE);
if (i =size-1) i2c->instance->CR2 |=(I2C_CR2_NACK | I2C_CR2_STOP);
data[i]= i2c->instance->RXDR;
}
返回大小>1? ((data[1]<<8)| data[0]):data[0];
}

void I2C_Write_SubCmd (I2C_HandleTypeDef * i2c、uint8_t ADDR、uint8_t cmd、uint16_t subcmd、uint16_t data、 uint8_t size)
{
uint8_t i、data_desc[size+1]、subcmd_L、subcmd_H;
subcmd_L = subcmd & 0x00FF;
subcmd_H =(subcmd >> 8)和0x00FF;
data_desc[0]= data & 0x2c+


instance
<>I2c = 0xctry2>CR2>+ b;i2c <>iDC2<=>i2>iDC2<=>+ 2 (iDC2)<=<+ 2 + 1)<<+ 2 + 2 + 2 + 2 + 1 + 2 + 1 + 2 + 2 + 2 + 1 + 2 + 2 + 2 + 2 + iDCrbytes <+ 2 + 2 + 2 + iDCr2 + 2 + 2 + 2 + 2 + 2 + 2 + iDCr2 + 2 + 2 + iDCr2 + 2 + 2 + 2 + 2 + 2 + iDC2

while (!(i2c->instance->ISR &(I2C_ISR_TXE | I2C_ISR_TXIS));
i2c->TXDR = cmd;
while (!(i2c->instance->cmd &(I2C_ISR_TXE | I2C_ISR_TXIS)));i2c_ISR-
>ISR->ISR-(i2c








和 i2c
= i2c = I = I = i2c = I = I = I = I = I = I = I = I = I = I = I = I = I = I = I = I = I = I = I = I = I = I = I = I = I = I = I = I = I2C = I = I = I = I = I = I2C = I = I = I = I2C = I = I = I = I2C = I2C = I = I = I = I = I = I2C = I = I = I2C = I = I = I = I = I = I = I2C = I = I = I2C = I2C = I2C = I2C = I = I = I = I = I =


}uint16_t

I2C_Read (I2C_HandleTypeDef * i2c、uint8_t ADDR、uint8_t cmd、uint8_t size)
{
uint8_t I、data[大小];i2C->instance->CR2
和 i2C->TRI
、i2C_Instance->I2c (i2C_Instance->I2c






);i2C->I2C_CR2c (i2C->I2C_Instance->I2C->I2C->I2c);iCSR_Instance->I2>I2c (i2C->I2C->I2C->I2C->I2c (iCr);i2C_Inste2c (iCSR_Inste2>I2>I2>I2>I2>I2C->I2c_Inste2c (i_Cr);iCr 和 I2c (iCr) iCr (iCr 和 iCr) iCr (iCr 和 iCr)
i2c->instance->CR2 |= I2C_CR2_nbytes &(大小<< I2C_CR2_nbytes_Pos);
i2c->Instance->CR2 |= I2C_CR2_Sadd 和 ADDR;
i2c->instance->CR2 |= I2C_CRD_WRn;
i2c->Instance->CR2
;i2C_CR0=<= SIZE;i2C_CR0|= I CR2C_CR0|= I CR0=<= CR2C_CR0|= CR2c_START i++){
if (size!= 1 && i =size-1) i2c->instance->CR2 |=(I2C_CR2_NACK | I2C_CR2_STOP);
while (!(i2c->instance->ISR & I2C_ISR_RXNE);
if (size = 1) i2C->instance |i2C_RXCR2c=>I CR2c=>I CR2c=>I CR2c=>I CR2c=2)


;if (i2c_instance | I CR2c_RXNE=>I CR2c =>I CR2c=2) ((data[1]<<8)| data[0]):data[0];
}

void I2C_Write (I2C_HandleTypeDef * i2c、uint8_t ADDR、uint8_t cmd、uint16_t data、uint8_t size)
{
uint8_t i、data_desc[size]、i2>0x00002>+




I、i2<=0>I2>I2<_instance;i2>I2<=0x0000_c=>I2>I2>I、I2>I2<_c+<=<=<=0x0000_instance;i20=>I2>I2>I2>I2>I2<=<_c+<<=<<<<<<<<<<<<<_c<=>I2>I2>I2>I2>I2>I2>I2>I2<<
i2c->instance->CR2 |= I2C_CR2_Sadd 和 ADDR;
i2c->instance->CR2 |= I2C_CR2_start;
while (!(i2c->instance->ISR &(I2C_XE_TXE | I2C_ISR_TXIS));
i2c->ISR=I 2c







(i2c_Instance->I2c);i2c i2c (i2c i2c i2c_isr)
(i2c i2c i2c i_isr);i2c i2c i_isr (i2c i2c i_isr) i = I = I = I = I = I = I = I2c = I = I = I = I = I = I = I = I = I = I = I = I = I = I = I = I = I = I = I = I = I = I = I = I =

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

    请查看此应用手册、了解如何实现此操作的示例:

    www.ti.com/.../slua801.pdf

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你好,Dominik! 感谢您的回答。 为了制作该代码、我已经阅读了快速入门指南、技术参考手册和您告诉我的应用手册。 我的问题是不同的、我最终自行解决了。 我已将 I2C 总线配置为400kHz 速度、以及 BQ27441数据表建议的上升和下降时间。 当我将总线速度降低至100kHz 时、监测计改变了我需要的存储器参数。 代码运行良好。
    感谢大家!