Search in the blog:

2022-11-13

PCI (J1850 VPW): чтение номера модуля

Вопреки некоторым утверждениям, читать крайслеровскую шину PCI (которая J1850 VPW) можно ELM327, в том числе и китайскими клонами. Например, на моем Jeep Cherokee KJ 2007 года отвечают шесть модулей, к которым удалось присоединиться подобным образом.

Но важно не просто соединиться, но и прочитать (декодировать) ошибки и данные. С этим сложнее, но сильно помогает DRBDBReader (исходники на GitHub, язык C#). Он позволяет получить расшифровку данных, описанных в database.mem - базе для старого крайслеровского сканера DRB-III. Если хотите поработать с DRBDBReader, то рекомендую начать с описания: DRB-III database reader. Там же есть ссылка на архив с бинарником для Windows и самой базой. Но учтите, что в базе описаны не все PCI-модули (DRBDBReader называет их J1850).

Попробую взглянуть на это системно. А начну с чтения номера модуля. По правилам хорошего тона первым делом нужно читать именно его, чтобы не заставлять пользователя выбирать нужную расшифровку данных руками.

Главный режим (mode) для чтения PCI - это 0x22. В большинстве случаев он выполняется с тремя байтами-параметрами, последний из которых 0x00.

Для чтения информации о модуле, первый байт параметров должен быть 0x20. Сам запрос  в полной записи выглядит следующим образом:

24 addr 22 20 param 00 xx, где addr - это адрес модуля, а xx - это контрольная сумма.

В зависимости от модуля нужно сделать запросы с param от 0x00 до 0x02 (включительно) или до 0x05 (включительно). Некоторые модули могут не сообщать свой номер, а выдавать ошибку в ответ (mode 0x7F). Именно поэтому, кстати, в примере соединения PCI я использовал запрос 24 addr 22 20 00 00 xx - предполагается, что любой модуль должен на него отреагировать (положительным или отрицательным ответом).

К практике. На моём Cherokee есть такие варианты декодирования номеров модулей:

1. Вариант с param от 0x00 до 0x02 (включительно)

Реальные данные (запрос => ответ):

24 40 22 20 00 00 xx => 26 40 62 | 05 02 00 | 20
24 40 22 20 01 00 xx => 26 40 62 | 60 37 00 | 59
24 40 22 20 02 00 xx => 26 40 62 | 41 48 00 | 6E

24 58 22 20 00 00 xx => 26 58 62 | 04 89 00 | 71
24 58 22 20 01 00 xx => 26 58 62 | 60 05 00 | 99
24 58 22 20 02 00 xx => 26 58 62 | 41 41 00 | E1

24 C0 22 20 00 00 xx => 26 C0 62 | 05 02 00 | 03
24 C0 22 20 01 00 xx => 26 C0 62 | 61 18 00 | 23
24 C0 22 20 02 00 xx => 26 C0 62 | 41 42 00 | 8F

По три запроса на каждый модуль, в одном ответе три байта, из них содержательных только два. Первые два ответа задают численную часть номера (числа берутся в шестнадцатеричной записи). Третий ответ задаёт буквенную часть номера (буквы в кодировке ASCII).

Первая тройка реальных данных выше - это модуль с адресом 0x40, т.е. BCM (кузовная электроника). Номер модуля 05026037AH.

Вторая тройка реальных данных выше - это модуль с адресом 0x58, т.е. SRS (система пассивной безопасности). Номер модуля 04896005AA.

Третья тройка реальных данных выше - это модуль с адресом 0xC0, т.е. SKIM (иммобилайзер). Номер модуля 05026118AB.


2. Вариант с param от 0x00 до 0x05 (включительно)

Реальные данные:

24 60 22 20 00 00 xx => 26 60 62 | 05 00 00 | 79
24 60 22 20 01 00 xx => 26 60 62 | 17 00 00 | 62
24 60 22 20 02 00 xx => 26 60 62 | 29 00 00 | 43
24 60 22 20 03 00 xx => 26 60 62 | 05 00 00 | 79
24 60 22 20 04 00 xx => 26 60 62 | 41 00 00 | 1F
24 60 22 20 05 00 xx => 26 60 62 | 42 00 00 | 93

Отличается от предыдущего варианта тем, что из трёх байтов ответа содержальный только один байт. В остальном принцип формирования номера аналогичный.

В этом примере это модуль с адресом 0x60, т.е. EMC (панель приборов). Номер модуля 05172905AB


3. Другой вариант с param от 0x00 до 0x05 (включительно)

Реальные данные:

24 68 22 20 00 00 xx => 26 68 62 | 56 00 00 | FA
24 68 22 20 01 00 xx => 26 68 62 | 01 00 00 | 08
24 68 22 20 02 00 xx => 26 68 62 | 05 00 00 | 0E
24 68 22 20 03 00 xx => 26 68 62 | 27 00 00 | 3D
24 68 22 20 04 00 xx => 26 68 62 | 01 00 00 | 08
24 68 22 20 05 00 xx => 26 68 62 | 05 00 00 | 0E

Похож на предыдущий вариант, но две буквы в конце кодируются не по ASCII, а просто по порядку: 01 - A, 02 - B и т.д.

В этом примере это модуль с адресом 0x68, т.е. EVIC (верхняя консоль). Номер модуля 56010527AE


Легко проверить, что все эти номера модулей соответствуют реальности.

А вот шестой модуль с адресом 0xC3 (охранная сигнализация) не умеет сообщать свой номер, в ответ на запрос с param от 0x00 до 0x03 возвращает ошибку с mode 0x7F. Но отвечает.

0 comments:

Post a Comment

Blog Archive