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版本,里面太多自相矛盾、错误以及解释不全的地方了,谢谢!