Other Parts Discussed in Thread: BQ27426, , BQSTUDIO
您好,之前搭建demo时使用了bq27426开发板但是后来没货了,改用了这款bq27220,现在在修改电池设计容量方面遇到了问题
以下是代码
uint8_t wdata[2] = {0x00, 0x00};
uint8_t rdata[2] = {0x00, 0x00};
// reset
wdata[0] = 0x41; wdata[1] = 0x00;
bq27426_write_register(0x00, wdata, 2);
HAL_Delay(4000);
// unseal
wdata[0] = 0x14; wdata[1] = 0x04;
bq27426_write_register(0x00, wdata, 2);
HAL_Delay(1);
wdata[0] = 0x72; wdata[1] = 0x36;
bq27426_write_register(0x00, wdata, 2);
// full acess
wdata[0] = 0xff; wdata[1] = 0xff;
bq27426_write_register(0x00, wdata, 2);
HAL_Delay(1);
bq27426_write_register(0x00, wdata, 2);
HAL_Delay(1);
// enter cfg update mode
wdata[0] = 0x90; wdata[1] = 0x00;
bq27426_write_register(0x00, wdata, 2);
uint8_t data = 0;
do {
bq27426_read_register(0x3b, &data, 1);
} while ((data & 0x04) == 0);
// get access to design capacity
wdata[0] = 0x9f; wdata[1] = 0x92;
bq27426_write_register(0x3e, wdata, 2);
HAL_Delay(1);
// read design capacity
uint8_t old_design_capacity[2] = {0};
bq27426_read_register(0x3c, old_design_capacity, 2);
uint8_t old_sum = 0;
bq27426_read_register(0x60, &old_sum, 1);
uint8_t old_len = 0;
bq27426_read_register(0x61, &old_len, 1);
uint32_t bat_cap = 1200; // mah
// write new design capacity
uint8_t new_design_capacity[2] = {0};
new_design_capacity[0] = (bat_cap >> 8) & 0xff;
new_design_capacity[1] = bat_cap & 0xff;
bq27426_write_register(0x40, new_design_capacity, 2);
HAL_Delay(1);
// calculate checksum
uint8_t temp = mod(255 - old_sum
- old_design_capacity[0]
- old_design_capacity[1], 256);
uint8_t new_sum = 255 - mod(temp + new_design_capacity[0]
+ new_design_capacity[1], 256);
// write data length and new sum
uint8_t cs[2] = {new_sum, 0x24};
bq27426_write_register(0x60, cs, 2);
HAL_Delay(1);
//exit cfg update
wdata[0] = 0x92; wdata[1] = 0x00;
bq27426_write_register(0x00, wdata, 2);
do {
bq27426_read_register(0x3b, &data, 1);
} while ((data & 0x04) != 0);
bq27426_sealed();
HAL_Delay(1);
//read design capacity
bq27426_read_register(0x3c, rdata, 2); // doesn't change to 1200有以下几点疑问:
1. reset需要等待多久?这边测试是4秒,但是在文档是找不到关于这个的说明
2. 0x3e和0x3f是什么地址?
3. ManufacturerAccessControl() 和 ManufacturerAccess()分别是什么?就是0x3e和0x3f吗?因为我发现写0x0001(device_number)到0x00(Control),从0x3e读4个字节,前两个是0x0001即subcommand,两个则是device_number(MACData 0x40 0x41)
4. 为什么修改design capacity需要写入0x929f到0x3e,这和读0x3c有什么不同吗?为什么写完0x3e后从MACData读到的design capacity和读0x3c得到的design capacity他们的字节顺序是相反的?读MACData是0xb80b,而读0x3c则是正常的0x0bb8(默认值dec=3000)?
5. 为什么写0x929f到0x3e后,写新值design capacity(hex: 0x04b0, dec: 1200)到MACData也是高字节在前(0x40 0x04)低字节在后(0x41 0xb0)?是文档有误还是确实是这样设计的?
6. checksum是如何计算的?65页example的说法是计算BlockData(MACData和BlockData是同一个吗)所有32个字节的和的模?然后用255减去它?而根据25页MACDataSum()的描述还要加上ManufacturerAccessControl(),哪个说法是正确的?
7. MACDataLen()如何计算?25页描述说应该是MACData()在MACDataSum()里面的个数,为什么reset后默认MACDataLen=0x24(dec: 36),MACData()不是最多32个字节吗?
关于代码里unseal及进入cfg update,分别通过检查operation status的sec[1:0]和CFGUPDATE确认了,这部分应该没有问题,但是一直写不进去的原因我猜测可能就是checksum算不对,能帮忙给个正确的计算方式吗?以及最新的手册。SLUUBD4这个手册是2016年更新的,还是Initial Release版本,里面太多自相矛盾、错误以及解释不全的地方了,谢谢!