Общение с батареями от ноутбука.
- Войдите на сайт для отправки комментариев
Пт, 12/02/2021 - 11:35
Наваял на досуге несколько скетчей для общения с батареей ноутбука. Подключать как I2C устройство - SDA SCL GND. Проверял на bq20z955 с дефолтными паролями. Если у Вас другой контроллер - сверяйтесь с данными из даташита.
!!! ВНИМАНИЕ. Всё что Вы делаете - Вы делаете на свой страх и риск !!! Операции 6, 7 и 8 пишут данные в батарею и могут окирпичить её !
Один из скетчей:
/* * SmartBattery.ino (https://github.com/dsa-a/Arduino-Smart-Battery) * Copyright (C) 2021, Andrei Egorov * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ #include <Wire.h> //!!! The WIRE library must be edited to increase the buffer to 34 (0x22) bytes !!! //#define debug #define addr 0x0B #define new_capacity 4400 #define unseal_key_1 0x0414 #define unseal_key_2 0x3672 #define full_access_key_1 0xFFFF #define full_access_key_2 0xFFFF #define pf_clear_key_1 0x2673 #define pf_clear_key_2 0x1712 #define year (__DATE__[7]-'0')*1000+(__DATE__[8]-'0')*100+(__DATE__[9]-'0')*10+(__DATE__[10]-'0') #define month (__DATE__[0] == 'J' && __DATE__[1] == 'a') ? 1 : \ (__DATE__[0] == 'F') ? 2 : \ (__DATE__[0] == 'M' && __DATE__[2] == 'r') ? 3 : \ (__DATE__[0] == 'A' && __DATE__[1] == 'p') ? 4 : \ (__DATE__[0] == 'M' && __DATE__[2] == 'y') ? 5 : \ (__DATE__[0] == 'J' && __DATE__[2] == 'n') ? 6 : \ (__DATE__[0] == 'J' && __DATE__[2] == 'l') ? 7 : \ (__DATE__[0] == 'A' && __DATE__[1] == 'u') ? 8 : \ (__DATE__[0] == 'S') ? 9 : \ (__DATE__[0] == 'O') ? 10 : \ (__DATE__[0] == 'N') ? 11 : \ (__DATE__[0] == 'D') ? 12 : 0 #define day (((__DATE__[4] >= '0') ? (__DATE__[4]) : '0')-'0')*10+(__DATE__[5]-'0') byte buff[34]; #if defined (debug) byte sp; byte PEC(byte p, byte b) { b^=p; for (byte i=0; i<8; i++ ) { byte t=b&0x80; b<<=1; if (t!=0) b^=0x07; } return b; } #endif void CheckWireStatus(byte wire_status) { if (wire_status!=0) { Serial.print(F("Wire error - ")); Serial.println(wire_status); while (true) ; } } void SMBCommand(byte comm) { Wire.beginTransmission(addr); Wire.write(comm); CheckWireStatus(Wire.endTransmission(false)); } void Read(byte n) { Wire.requestFrom(addr,n+1); #if defined (debug) byte p=PEC(sp, (addr<<1)+1); #endif byte b=Wire.available(); for (byte i=0; i<b; i++) { buff[i]=Wire.read(); #if defined (debug) if (i<(b-1)) p=PEC(p, buff[i]); printHEX(buff[i]); Serial.print(","); #endif } #if defined (debug) printHEX(p); Serial.println(); #endif } void ReadSMB(byte comm) { SMBCommand(comm); #if defined (debug) sp=PEC(PEC(0, addr<<1), comm); #endif Read(2); } void ReadSMB(word comm) { Wire.beginTransmission(addr); Wire.write(00); Wire.write(lowByte(comm)); Wire.write(highByte(comm)); CheckWireStatus(Wire.endTransmission()); ReadSMB(byte(0x00)); } void ReadBlockSMB(byte comm) { SMBCommand(comm); Wire.requestFrom(addr,1); byte b=Wire.read(); SMBCommand(comm); #if defined (debug) sp=PEC(PEC(0, addr<<1), comm); #endif Read(b+1); } void WriteSMBWord(byte comm, word data) { Wire.beginTransmission(addr); Wire.write(comm); Wire.write(lowByte(data)); Wire.write(highByte(data)); CheckWireStatus(Wire.endTransmission()); } void ReadSMBSubclass(byte id, byte page) { WriteSMBWord(0x77, word(id)); delay(100); ReadBlockSMB(page); } void WriteSMBSubclass(byte id, byte page) { WriteSMBWord(0x77, word(id)); delay(100); Wire.beginTransmission(addr); Wire.write(page); for (byte i=0;i<=buff[0];i++) Wire.write(buff[i]); CheckWireStatus(Wire.endTransmission()); delay(100); } void printHEX(byte b) { if (b<16) Serial.print("0"); Serial.print(b,HEX); } void printBlock() { for (byte i=1; i<=buff[0]; i++) Serial.print(char(buff[i])); Serial.println(); } void Read123() { ReadSMB(word(0x0001)); Serial.print(F("Device Type: ")); printHEX(buff[1]); printHEX(buff[0]); Serial.println(" Hex"); ReadSMB(word(0x0002)); Serial.print(F("Firmware Version: ")); printHEX(buff[1]); printHEX(buff[0]); Serial.println(" Hex"); ReadSMB(word(0x0003)); Serial.print(F("Hardware Version: ")); printHEX(buff[1]); printHEX(buff[0]); Serial.println(" Hex"); } void info() { ReadSMB(byte(0x18)); Serial.print(F("DesignCapacity: ")); Serial.print(buff[1]*256+buff[0]); Serial.println(" mAh"); ReadSMB(byte(0x10)); Serial.print(F("FullChargeCapacity: ")); Serial.print(buff[1]*256+buff[0]); Serial.println(" mAh"); ReadSMB(byte(0x17)); Serial.print(F("CycleCount: ")); Serial.println(buff[1]*256+buff[0]); ReadSMB(byte(0x1B)); Serial.print(F("Date: ")); Serial.print(1980+(buff[1]>>1)); Serial.print("."); Serial.print(((buff[1]&0b00000001)<<3)+(buff[0]>>5));Serial.print("."); Serial.println(buff[0]&0b00011111); ReadSMB(byte(0x19)); Serial.print(F("DesignVoltage: ")); Serial.print(buff[1]*256+buff[0]); Serial.println(" mV"); ReadBlockSMB(0x20); Serial.print(F("ManufName: ")); printBlock(); ReadBlockSMB(0x21); Serial.print(F("DeviceName: ")); printBlock(); ReadSMB(byte(0x1C)); Serial.print(F("SerialNumber: ")); printHEX(buff[1]); printHEX(buff[0]); Serial.println(" Hex"); ReadSMB(byte(0x14)); Serial.print(F("ChargingCurrent: ")); Serial.print(buff[1]*256+buff[0]); Serial.println(" mA"); ReadSMB(byte(0x15)); Serial.print(F("ChargingVoltage: ")); Serial.print(buff[1]*256+buff[0]); Serial.println(" mV"); ReadBlockSMB(0x22); Serial.print(F("DeviceChemistry: ")); printBlock(); ReadSMB(byte(0x08)); Serial.print(F("Temperature: ")); Serial.print(float(buff[1]*256+buff[0])/10-273); Serial.println(" C"); ReadSMB(byte(0x09)); Serial.print(F("Voltage: ")); Serial.print(buff[1]*256+buff[0]); Serial.println(" mV"); ReadSMB(byte(0x0A)); Serial.print(F("Current: ")); Serial.print(int(buff[1]*256+buff[0])); Serial.println(" mA"); ReadSMB(byte(0x0D)); Serial.print(F("RelativeSOC: ")); Serial.print(buff[0]); Serial.println(" %"); ReadSMB(byte(0x0E)); Serial.print(F("AbsoluteSOC: ")); Serial.print(buff[0]); Serial.println(" %"); ReadSMB(byte(0x0F)); Serial.print(F("RemainingCapacity: ")); Serial.print(buff[1]*256+buff[0]); Serial.println(" mAh"); ReadSMB(byte(0x3C)); Serial.print(F("VCELL4: ")); Serial.print(buff[1]*256+buff[0]); Serial.println(" mV"); ReadSMB(byte(0x3D)); Serial.print(F("VCELL3: ")); Serial.print(buff[1]*256+buff[0]); Serial.println(" mV"); ReadSMB(byte(0x3E)); Serial.print(F("VCELL2: ")); Serial.print(buff[1]*256+buff[0]); Serial.println(" mV"); ReadSMB(byte(0x3F)); Serial.print(F("VCELL1: ")); Serial.print(buff[1]*256+buff[0]); Serial.println(" mV"); ReadSMB(byte(0x1A)); Serial.print(F("SpecificationInfo: ")); printHEX(buff[1]); printHEX(buff[0]); Serial.println(" Hex"); ReadSMB(byte(0x16)); Serial.print(F("Battery Status: ")); printHEX(buff[1]); printHEX(buff[0]); Serial.println(" Hex"); if (buff[1]&0b10000000) Serial.print("OCA|"); if (buff[1]&0b01000000) Serial.print("TCA|"); if (buff[1]&0b00010000) Serial.print("OTA|"); if (buff[1]&0b00001000) Serial.print("TDA|"); if (buff[1]&0b00000010) Serial.print("RCA|"); if (buff[1]&0b00000001) Serial.print("RTA|"); if (buff[0]&0b10000000) Serial.print("INIT|"); if (buff[0]&0b01000000) Serial.print("DSG|"); if (buff[0]&0b00100000) Serial.print("FC|"); if (buff[0]&0b00010000) Serial.print("FD|"); if (buff[0]&0b00001000) Serial.print("EC3|"); if (buff[0]&0b00000100) Serial.print("EC2|"); if (buff[0]&0b00000010) Serial.print("EC1|"); if (buff[0]&0b00000001) Serial.print("EC0|"); Serial.println(); ReadSMB(word(0x0054)); Serial.print(F("Operation Status: ")); printHEX(buff[1]); printHEX(buff[0]); Serial.println(" Hex"); if (buff[1]&0b10000000) Serial.print("PRES|"); if (buff[1]&0b01000000) Serial.print("FAS|"); if (buff[1]&0b00100000) Serial.print("SS|"); if (buff[1]&0b00010000) Serial.print("CSV|"); if (buff[1]&0b00000100) Serial.print("LDMD|"); if (buff[0]&0b10000000) Serial.print("WAKE|"); if (buff[0]&0b01000000) Serial.print("DSG|"); if (buff[0]&0b00100000) Serial.print("XDSG|"); if (buff[0]&0b00010000) Serial.print("XDSGI|"); if (buff[0]&0b00000100) Serial.print("R_DIS|"); if (buff[0]&0b00000010) Serial.print("VOK|"); if (buff[0]&0b00000001) Serial.print("QEN|"); Serial.println(); if (buff[1]&0b00100000) { Serial.println(F("Sealed")); Read123(); } else { Serial.println(F("Unsealed")); ReadSMB(byte(0x0C)); Serial.print(F("MaxError: ")); Serial.print(buff[0]); Serial.println(" %"); ReadSMB(word(0x0051)); Serial.print(F("SafetyStatus: ")); if ((buff[1]==0)&&(buff[0]==0)) { Serial.println("OK"); } else { printHEX(buff[1]); printHEX(buff[0]); Serial.println(" Hex"); if (buff[1]&0b10000000) Serial.print("OTD|"); if (buff[1]&0b01000000) Serial.print("OTC|"); if (buff[1]&0b00100000) Serial.print("OCD|"); if (buff[1]&0b00010000) Serial.print("OCC|"); if (buff[1]&0b00001000) Serial.print("OCD2|"); if (buff[1]&0b00000100) Serial.print("OCC2|"); if (buff[1]&0b00000010) Serial.print("PUV|"); if (buff[1]&0b00000001) Serial.print("POV|"); if (buff[0]&0b10000000) Serial.print("CUV|"); if (buff[0]&0b01000000) Serial.print("COV|"); if (buff[0]&0b00100000) Serial.print("PF|"); if (buff[0]&0b00010000) Serial.print("HWDG|"); if (buff[0]&0b00001000) Serial.print("WDF|"); if (buff[0]&0b00000100) Serial.print("AOCD|"); if (buff[0]&0b00000010) Serial.print("SCC|"); if (buff[0]&0b00000001) Serial.print("SCD|"); Serial.println(); }; ReadSMB(word(0x0053)); Serial.print(F("PFStatus: ")); if ((buff[1]==0)&&(buff[0]==0)) { Serial.println("OK"); } else { printHEX(buff[1]); printHEX(buff[0]); Serial.println(" Hex"); if (buff[1]&0b10000000) Serial.print("FBF|"); if (buff[1]&0b00010000) Serial.print("SOPT|"); if (buff[1]&0b00001000) Serial.print("SOCD|"); if (buff[1]&0b00000100) Serial.print("SOCC|"); if (buff[1]&0b00000010) Serial.print("AFE_P|"); if (buff[1]&0b00000001) Serial.print("AFE_C|"); if (buff[0]&0b10000000) Serial.print("DFF|"); if (buff[0]&0b01000000) Serial.print("DFETF|"); if (buff[0]&0b00100000) Serial.print("CFETF|"); if (buff[0]&0b00010000) Serial.print("CIM|"); if (buff[0]&0b00001000) Serial.print("SOTD|"); if (buff[0]&0b00000100) Serial.print("SOTC|"); if (buff[0]&0b00000010) Serial.print("SOV|"); if (buff[0]&0b00000001) Serial.print("PFIN|"); Serial.println(); }; ReadSMB(word(0x0055)); Serial.print(F("Charging Status: ")); if ((buff[1]==0)&&(buff[0]==0)) { Serial.println("OK"); } else { printHEX(buff[1]); printHEX(buff[0]); Serial.println(" Hex"); if (buff[1]&0b10000000) Serial.print("XCHG|"); if (buff[1]&0b01000000) Serial.print("CHGSUSP|"); if (buff[1]&0b00100000) Serial.print("PCHG|"); if (buff[1]&0b00010000) Serial.print("MCHG|"); if (buff[1]&0b00001000) Serial.print("TCHG1|"); if (buff[1]&0b00000100) Serial.print("TCHG2|"); if (buff[1]&0b00000010) Serial.print("FCHG|"); if (buff[1]&0b00000001) Serial.print("PULSE|"); if (buff[0]&0b10000000) Serial.print("PLSOFF|"); if (buff[0]&0b01000000) Serial.print("CB|"); if (buff[0]&0b00100000) Serial.print("PCMTO|"); if (buff[0]&0b00010000) Serial.print("FCMTO|"); if (buff[0]&0b00001000) Serial.print("OCHGV|"); if (buff[0]&0b00000100) Serial.print("OCHGI|"); if (buff[0]&0b00000010) Serial.print("OC|"); if (buff[0]&0b00000001) Serial.print("XCHGLV|"); Serial.println(); }; ReadSMB(byte(0x46)); Serial.print(F("FETControl: ")); if (buff[0]==0) { Serial.println("OK"); } else { printHEX(buff[0]); Serial.println(" Hex"); if (buff[0]&0b00010000) Serial.print("OD|"); if (buff[0]&0b00001000) Serial.print("ZVCHG|"); if (buff[0]&0b00000100) Serial.print("CHG|"); if (buff[0]&0b00000010) Serial.print("DSG|"); Serial.println(); }; ReadSMBSubclass(82,0x78); Serial.print(F("Update Status: ")); Serial.println(buff[13]); Serial.print(F("Qmax Cell0: ")); Serial.println(buff[1]*256+buff[2]); Serial.print(F("Qmax Cell1: ")); Serial.println(buff[3]*256+buff[4]); Serial.print(F("Qmax Cell2: ")); Serial.println(buff[5]*256+buff[6]); Serial.print(F("Qmax Cell3: ")); Serial.println(buff[7]*256+buff[8]); Serial.print(F("Qmax Pack : ")); Serial.println(buff[9]*256+buff[10]); for (byte i=88; i<=91; i++) { ReadSMBSubclass(i,0x78); Serial.print("Cell"); Serial.print(i-88); Serial.print(" R_a flag: "); printHEX(buff[1]); printHEX(buff[2]); Serial.println(); } Read123(); ReadSMB(word(0x0006)); Serial.print(F("Manufacturer Status: ")); printHEX(buff[1]); printHEX(buff[0]); Serial.println(" Hex"); if (buff[1]&0b10000000) Serial.print("FET1|"); if (buff[1]&0b01000000) Serial.print("FET0|"); if (buff[1]&0b00100000) Serial.print("PF1|"); if (buff[1]&0b00010000) Serial.print("PF0|"); if (buff[1]&0b00001000) Serial.print("STATE3|"); if (buff[1]&0b00000100) Serial.print("STATE2|"); if (buff[1]&0b00000010) Serial.print("STATE1|"); if (buff[1]&0b00000001) Serial.print("STATE0|"); Serial.println(); ReadSMB(word(0x0008)); Serial.print(F("Chemistry ID: ")); printHEX(buff[1]); printHEX(buff[0]); Serial.println(" Hex"); delay(100); ReadSMB(byte(0x03)); Serial.print(F("BatteryMode: ")); printHEX(buff[1]); printHEX(buff[0]); Serial.println(" Hex"); if (buff[1]&0b10000000) Serial.print("CapM|"); if (buff[1]&0b01000000) Serial.print("ChgM|"); if (buff[1]&0b00100000) Serial.print("AM|"); if (buff[1]&0b00000010) Serial.print("PB|"); if (buff[1]&0b00000001) Serial.print("CC|"); if (buff[0]&0b10000000) Serial.print("CF|"); if (buff[0]&0b00000010) Serial.print("PBS|"); if (buff[0]&0b00000001) Serial.print("ICC|"); Serial.println(); }; } void setup() { Wire.begin(); Serial.begin(9600); Serial.println(F("Arduino Smart Battery")); Serial.println(F("Several utilities for working with TI bq20z... IC")); Serial.println(F("Press Enter...")); while (Serial.available()==0); Serial.print(F("Checking communication with the device at address 0x")); printHEX(addr); Serial.println("..."); byte st; do { Wire.beginTransmission(addr); st=Wire.endTransmission(); if (st!=0) Serial.println(F("The device is not responding.")); delay(1000); } while (st!=0); Serial.println(F("The device was found !!!")); } void loop() { delay(1); if (Serial.available()==0) { Serial.println(F("--------------------")); Serial.println(F("Select operation:")); Serial.println(F("1. Read pack info.")); Serial.println(F("2. Pack Reset.")); Serial.println(F("3. Unsealing a pack.")); Serial.println(F("4. Move pack to Full Access mode.")); Serial.println(F("5. Clearing a Permanent Failure.")); Serial.println(F("6. Clearing CycleCount.")); Serial.println(F("7. Setting current date.")); Serial.println(F("8. Writing DesignCapacity, QMAX, Update status, Ra_table.")); Serial.println(F("9. Begin the Impedance Track algorithm.")); while (Serial.available()==0); switch (Serial.read()) { case 0x31: Serial.println(F("Pack Info...")); info(); break; case 0x32: WriteSMBWord(0x00,0x0041); Serial.println(F("Reseting...")); delay(1000); break; case 0x33: WriteSMBWord(0x00,unseal_key_1); WriteSMBWord(0x00,unseal_key_2); Serial.println(F("Unsealing...")); break; case 0x34: WriteSMBWord(0x00,full_access_key_1); WriteSMBWord(0x00,full_access_key_2); Serial.println(F("Move to Full Access mode...")); break; case 0x35: WriteSMBWord(0x00,pf_clear_key_1); WriteSMBWord(0x00,pf_clear_key_2); Serial.println(F("Clearing a Permanent Failure...")); break; case 0x36: WriteSMBWord(0x17,0x0000); Serial.println(F("Clearing CycleCount...")); break; case 0x37: WriteSMBWord(0x1B,(year-1980)*512+int(month)*32+day); Serial.println(F("Setting current date...")); break; case 0x38: Serial.println(F("Writing DesignCapacity, QMAX, Update status, Ra_table...")); WriteSMBWord(0x18,new_capacity); delay(100); ReadSMBSubclass(82,0x78); buff[1]=highByte(new_capacity); buff[2]=lowByte(new_capacity); buff[3]=highByte(new_capacity); buff[4]=lowByte(new_capacity); buff[5]=highByte(new_capacity); buff[6]=lowByte(new_capacity); buff[7]=highByte(new_capacity); buff[8]=lowByte(new_capacity); buff[9]=highByte(new_capacity); buff[10]=lowByte(new_capacity); buff[13]=0x00; WriteSMBSubclass(82,0x78); for (byte i=88; i<=95; i++) { buff[0]=0x20; buff[1]=0xFF; buff[2]=(i<92) ? 0x55 : 0xFF; buff[3]=0x00; buff[4]=0xA0; buff[5]=0x00; buff[6]=0xA6; buff[7]=0x00; buff[8]=0x99; buff[9]=0x00; buff[10]=0x97; buff[11]=0x00; buff[12]=0x91; buff[13]=0x00; buff[14]=0x98; buff[15]=0x00; buff[16]=0xB0; buff[17]=0x00; buff[18]=0xCC; buff[19]=0x00; buff[20]=0xDE; buff[21]=0x00; buff[22]=0xFE; buff[23]=0x01; buff[24]=0x3B; buff[25]=0x01; buff[26]=0xB5; buff[27]=0x02; buff[28]=0x8B; buff[29]=0x03; buff[30]=0xE9; buff[31]=0x05; buff[32]=0xB2; WriteSMBSubclass(i,0x78); } break; case 0x39: WriteSMBWord(0x00,0x0021); Serial.println(F("Begin the Impedance Track algorithm...")); break; } } else Serial.read(); }
Другие скетчи смотрите на github ...
а описание или хотя бы ссылки привести, почитать...
ua6em Что конкретно описать ? На гребенке АКБ обычно выведены + GND SDA SCL. Распиновка разная - надо изучать схему.
Стандартные данные Smart Battery стандартизированы и с вероятностью 95% будут считаны.
Пример.
АКБ имеют свойство терять ёмкость. Замена банок часто не спасает - контроллер блокируется. Этим скетчем можно разблокировать контроллер, стереть ошибки и прописать емкость нового пакета банок и вернуть АКБ к жизни. Это как черновик, ибо контроллеров много и паролей к ним еще больше ...
Для самсунговских батарей падёт?
DetSimen Главное понять какой там контроллер. Обычно без разборки это не известно ... Стандартную информацию должен по любому отдать, ноутбук же именно её считывает.
Тоись, если батарея неразборная, то тока ломать и плющить.
Для начала нужно узнать распиновку, подключиться и прочитать информацию.
Тоись, если батарея неразборная, то тока ломать и плющить.
Если банки менять то всё равно ломать прийдётся.
у меня коллега тут хвастался, ковырял батарею, несколько банок 18650 были 0В. Дак он выяснил, что внутри аккумулятора создалось давление, а там механизм при давлении газа размыкающий цепь. Потом типа воткнул иглу, сделал пшик и аккумулятор ожил. Сомнительный "ремонт", конечно, но как супер временное решение пойдет. главное не взарваца
Так же баловался, правда на открытом воздухе... если газ пошел а батарею не замыкали иль нагрузку бешеную не давали то элементу пипец пришел однозначно...
Доброго дня!
так это же СУПЕР!!! проект. Жду не дождусь работоспособного универсального экземпляра.
Можно ли напрямую связаться с автором? Есть ряд вопросов
Ghost_d Универсальный это сложно - чипов развелось как грязи и каждый со своими заморочками ...
Что вас интересует ?
Интересно, а если дефолтный пароль не подойдет? Можно перебором его подобрать?
Можно конечно же, но это может занять не один год...
Battery Status: 48D0 Hex
В следующей строке как раз расшифровка... Если размер буфера в библиотеке Wire исправили, то пробуйте: 1,2,3,4,5,6,7,8 1,2,3,4,9
Спасибо, так и сделал.
Но напряжение на гребенке аккума так и не появилось. Хотя количество циклов, дата и PFStatus обновились. Предохранитель живой.
Может контроллер как-то пнуть нужно после перепрошивки?
На отключенном от ноутбука АКБ нет питания на гребенке ! Надо либо подключать к ноуту, либо "заземлить" SYSPRES.
P.S. MaxError: 119 % - надо еще раз повторить все команды. Если больше 100%, то нормально не откалибруется скорее всего...
VCELL4: 0 mV
Это акб на три ячейки, а контроллер умеет и четыре.
Вроде разобрался с алгоритмом обхода пароля для чипов bq20z... (на моих платах алгоритм работает, но они обе на bq20z8955, а хочется проверить и на других)
Если кто пробовал мои скетчи на чипах bq20z... и не смог снять блокировку стандартными паролями - напишите !
Чип bq20z955, операции с 1 по 5 проходят успешно, на остальных "wire error". С чем может быть связано?
danx43 Покажите что пишет п. 1 ... после 1,2,3,4,5.
Попробуйте еще делать небольшие (сек. 30) паузы между операциями ...
wire error - это не верное завершение обмена i2c
Sealed - У Вас ключи не дефолтные !
Можем испытать "раскуренный" алгоритм, если Вы готовы.
Да, я готов
Как увидите ключи - перепишите их в первый скетч и пользуйтесь уже им.
выдал ключи
Что то не так ... Wire error быть не должно
Попробуйте после запуска этого бинарника запустить первоначальный скетч и считать информацию не выполняя операцию № 2.
Всё без изменений. Скажите а может ли повлиять тот факт, что на батарею из-за пробитого мосфета было подано 19 вольт и сгорел управляемый предохранитель, который я востановил?
Вот это уже не понятно как -
ой, не обратил внимание на это, проверю
Предохранитель пережигается контроллером при возникновении критических ситуация для защиты от возгорания лития. Успел ли сам контроллер пострадать - не ясно.
Здравствуйте, имеется батарея Acer AS10D75, контроллер bq20z955, залочен контроллер, стандартные пароли не подходят, смогу ли я разлочить контроллер с помощью скетчей.
Параметры батареи читаются с помощью Be2works.
Здравствуйте, имеется батарея Acer AS10D75, контроллер bq20z955, залочен контроллер, стандартные пароли не подходят, смогу ли я разлочить контроллер с помощью скетчей.
Есть скетч, который должен помочь.
Дай пожалуйста.
Yura27 На коте ответил...
Добрый день!
Уточните, пожалуйста, какова вероятность, что Ваш скетч с BQ8030 будет работать?
P.S. Хотел свериться с даташитом, но не могу найти его на данный контроллер.
Проверил:
Pack Info...
DesignCapacity: 4218 mAh
FullChargeCapacity: 3631 mAh
CycleCount: 207
Date: 2010.11.22
DesignVoltage: 11100 mV
Wire error - 3
Emulty Это совсем другой контроллер.
Komandir, пытаюсь с помощью Вашей программы сбросить контроллер на BQ30Z55, но возникли проблемы со связью (Wire error - 3). На коте отправил Вам более развернутое сообщение. Не могли бы помочь побороть эту ошибку?
sfs Этот скетч только для bq20z... чипов.
А там существенная разница в протоколах/командах/адресах? Подскажите тогда, пожалуйста, откуда Вы брали инфу для bq20, может подправлю для 30
У меня нет плат с bq30z... по этому я не разбирался. Отличия 100% есть и то что код от bq20z... не работает тому показатель.
Описание брал на сайте TI - https://www.ti.com/sitesearch/docs/universalsearch.tsp?langPref=en-US&searchTerm=bq20z95&nr=513#q=bq20z95&t=everything&linkId=1
Да, Вы правы. 54 регистр в bq30 имеет совсем другую структуру. Плюс в том, что есть полное описание этого контроллера. Минус - мои скудные познания, тщетные попытки разобраться в Вашей программе и как-то прочитать Operation Status не привели к положительным результатам. Попробовал вместо ReadSMB (word) использовать ReadBlockSMB - опять Wire error - 3. Прочитать хотя бы один байт через ReadSMB (byte) - то же самое.. В общем тупик.
sfs Судя по описанию читать надо как блок и результат будет лежать в buff[1]...buff[4], в buff[0] длина блока - по идее должно быть 4...
Ну так и делал:
ReadBlockSMB(0x0054); Serial.print(F("Operation Status: ")); printHEX(buff[3]); printHEX(buff[2]); printHEX(buff[1]); printHEX(buff[0]); Serial.println(" Hex");
Результат все тот же:
А если просто ReadBlockSMB(0x54) ?
Можно ещё раскомментировать отладку в самом начале ... может так станет видно что там к чему ...
А если просто ReadBlockSMB(0x54) ?
Без разницы
Можно ещё раскомментировать отладку в самом начале ... может так станет видно что там к чему ...
Да вроде не особо понятно:
Кусок кода исправленный покажите ...