#1 2020-12-22 23:00:53

luminofor
Учасник
Зареєстрований: 2020-01-28
Повідомлень: 37

Прочитать-записать данные батареи ноутбука

Продаю много батарей. И чтобы не терять лицо перед клиентами, проверяю их перед продажей. Смастерил себе зарядно-разрядную станцию на ардуине. Все как бы прекрасно, но некоторые батареи читаются не так как должны.
Собственно вопрос. Батареи у которых два контроллера - bq29330+bq8030 не правильно показывают напряжение на банках.
По даташитам информация берется из ячеек 3c, 3d, 3e, 3f.
При чтении оттуда получаю какую то ерунду.
Использую библиотеку SoftI2CMaster-master от товарища felias-fogg, кому интересно, можете взглянуть.
Честно содрал из других похожих проектов функцию чтения слова из двух байт:

int fetchWord(byte func)
{
  i2c_start(deviceAddress << 1 | I2C_WRITE);
  i2c_write(func);
  i2c_rep_start(deviceAddress << 1 | I2C_READ);
  byte b1 = i2c_read(false);
  byte b2 = i2c_read(true);
  i2c_stop();
  return (int)b1 | ((( int)b2) << 8);

Из любых других чипов читается корректно.
Есть еще один способ прочитать данные - преобразователь интерфейса i2c-USB от Silicon Lab на микросхеме CP2112.
И есть прога be2works, она платная, но есть бесплатная демка, которая корректно в автомате показывает инфу из вышеупомянутых ячеек. Но! В ней есть возможность прочитать данные вручную. И при попытке прочитать эти ячейки, получаю ту же самую ерунду.
Задал вопрос у них на форуме, но там видать слишком гордые ребята, чтобы даром делиться информацией. Даже тему мою не пропустили.
Так вот, первый вопрос. Может кто нибудь знает как правильно прочитать эти ячейки?

Попутно задам второй вопрос. Но сначала расскажу к чему он.
Чип в батареях может быть seal, unseal и full access. Очень много батарей приходят с полным доступом. Это значит, что можно менять в них некоторые параметры (количество циклов, паспортную емкость, дату выпуска и т.д.)
Некоторые чипы без проблем принимают команду записи слова:

void write_word(uint8_t reg)
{
    i2c_start((deviceAddress << 1) | I2C_WRITE);
    i2c_write(reg);
    i2c_rep_start((deviceAddress << 1) | I2C_WRITE);
    i2c_write(b1 & 0xFF);
    i2c_write(b2 & 0xFF);
    i2c_stop();
}

На чипах bq4050 это работает. Но другие не позволяют запись слова. Записать возможно только один байт, через функцию записи байта. При этом второй байт автоматически принимает значение 0x16. То есть мне допустим нужно записать в ячейку значение 0x0201. Не получается. Зато получается записать 0x02. Тогда в ячейке получим значение 0x0216
Программа be2works записывает в ячейки правильно на любых чипах.

И второй вопрос. Может кто нибудь знает как правильно записать ячейки?

Я уж думаю, если нигде не найду инфу, придется делать i2c снифер, чтобы подсмотреть как они это делают

Неактивний

#2 2021-01-11 15:57:53

luminofor
Учасник
Зареєстрований: 2020-01-28
Повідомлень: 37

Re: Прочитать-записать данные батареи ноутбука

Ха! Я нашел! Если мы читаем word из 0x3c и получаем чушь, то нужно прочесть block оттуда же. И если в этом block мы видим значение LENOVO, то значения напряжений в каждого элемента нужно читать из ManufacturerData, то есть из ячейки 0x23.
И там мы видим примерно следующее:

42 01 01 01 00 00 A7 0D D4 0D C1 0D 05 80

, где:

VCELL4: 0000 mV - 00 00
VCELL3: 3495 mV - A7 0D
VCELL2: 3540 mV - D4 0D
VCELL1: 3521 mV - C1 0D

А так как используется little-endian, то правильно буде записать так:

VCELL4: 0000 mV - 00 00
VCELL3: 3495 mV - 0D A7
VCELL2: 3540 mV - 0D D4
VCELL1: 3521 mV - 0D C1

Ююхуу!  lol

Неактивний

#3 2021-01-11 19:48:50

renoshnik
Учасник
Зареєстрований: 2017-04-03
Повідомлень: 822

Re: Прочитать-записать данные батареи ноутбука

А у меня ноут с дохлой батареей...
Думаю, как бы её перепаковать... roll

Неактивний

#4 2021-01-15 01:38:07

luminofor
Учасник
Зареєстрований: 2020-01-28
Повідомлень: 37

Re: Прочитать-записать данные батареи ноутбука

Не все так просто как кажется. Оригинальные батареи имеют несколько видов защит. Защита от перезаряда, переразряда, высокой температуры, превышения какого-то количества циклов зарядки. Если у вас оригинальная батарея, то при отключении банок она с большой долей вероятности заблокируется. Более того, если она не раборает, то уже может быть заблокирована, а для надежности пережигается управляемый предохранитель. Разблокировать контроллер можно зная пароль и умея его вводить. Каждый вендор пытается защитить свой продукт от подделки. Поэтому в различных батареях присутствуют свои секреты.
Пример:
Введи часть пароля в ячейку 77, прочти из ячейки 78 число, потом от 1000 отними это число, введи в ячейку 79, затем введи оставшийся пароль в ячейку 77.
Если у вас китайская батарея, то можно с ней экспериментировать. Чипы в большинстве своем без сюрпризов, можно отключать/подключать банки. Но соблюдайте последовательность: отключаем от плюса к минусу, подключаем от минуса к плюсу

Неактивний

#5 2021-01-15 12:33:04

renoshnik
Учасник
Зареєстрований: 2017-04-03
Повідомлень: 822

Re: Прочитать-записать данные батареи ноутбука

luminofor пише:

Не все так просто как кажется. Оригинальные батареи имеют несколько видов защит. Защита от перезаряда, переразряда, высокой температуры, превышения какого-то количества циклов зарядки. Если у вас оригинальная батарея, то при отключении банок она с большой долей вероятности заблокируется. Более того, если она не раборает, то уже может быть заблокирована, а для надежности пережигается управляемый предохранитель. Разблокировать контроллер можно зная пароль и умея его вводить. Каждый вендор пытается защитить свой продукт от подделки. Поэтому в различных батареях присутствуют свои секреты.
Пример:
Введи часть пароля в ячейку 77, прочти из ячейки 78 число, потом от 1000 отними это число, введи в ячейку 79, затем введи оставшийся пароль в ячейку 77.
Если у вас китайская батарея, то можно с ней экспериментировать. Чипы в большинстве своем без сюрпризов, можно отключать/подключать банки. Но соблюдайте последовательность: отключаем от плюса к минусу, подключаем от минуса к плюсу

Эти предупреждения я читал и раньше, поэтому и не лезу в батарею.
Лучше ноут на шнурке, чем пожар в доме ...

Неактивний

Швидке повідомлення

Введіть повідомлення і натисніть Надіслати

Підвал форуму