В блоге:

2019-02-07

Доступ к шине PCI (J1850 VPW) через ELM327: модули моего Jeep Cherokee KJ

Модули управления силовой установкой (PCM) и ABS/ESP моего Jeep Cherokee KJ (2007 модельного года) доступны через CAN-шину. До PCM можно и через стандартный OBD2 добраться, а к ABS/ESP умеет обращаться, например, эмулятор CASCADE. Работа через CAN - это особенность именно 2007 модельного года.

Остальные модули, насколько мне было известно, доступны через шину PCI. Это не та компьютерная шина (Peripheral Component Interconnect), а всего лишь крайслеровское название (Programmable Communications Interface) шины J1850 VPW, которая подключена ко второму контакту стандартного разъема OBD2.

Концептуально эта шина нечто среднее между K-Line и CAN. С одной стороны, она весьма медленная (10400 бит/с - как и K-Line обычно), а с другой стороны, она позволяет одновременно работать нескольким модулям.


Сперва теория. Диагностический запрос по шине PCI делается с двухбайтным заголовком для физической адресации (SAE J2178).

Первый байт запроса 0x24, затем идет байт с адресом модуля, далее режим (mode) запроса с аргументами и в конце контрольная сумма.

Первый байт ответа 0x26, затем идет байт с адресом модуля (тот же, что и в запросе), далее режим (mode) ответа, данные и контрольная сумма.

При неправильных данных запроса (неправильное число байтов аргументов, например) ответ может и не приходить.

Режим ответа определяется обычным образом: режим запроса + 0x40 (при положительных ответах) и 0x7F (при отрицательных ответах).


Теперь к практике. Из адаптеров, для которых заявлена работа с J1850 VPW, у меня есть только ELM327 разных видов. К ним я относился достаточно скептически, но оказалось, что все не так плохо.

Хорошие новости:

1. Выяснилось, что китайские клоны v1.5 (кроме кривых экземпляров) умеют работать с этой шиной (вопреки утверждениям об обратном).

2. Система команд ELM327 хоть и несколько кривовата, но все же можно делать диагностические запросы к модулям на PCI.


Идея довольно простая.

1. Переключить ELM327 на протокол номер 2 (J1850 VPW 10.4 кбит/с).

ATTP2 (можно ATSP2, но ATTP не делает лишних ненужных действий)


2. Включить заголовки ответа, поскольку обработка ответов этого протокола в ELM327 реализована криво, а вывод полного ответа позволяет делать обработку вручную.

ATH1


3. По умолчанию IFR (In Frame Response) протокола J1850 управляет сам ELM327 по заголовку, но для надежности лучше IFR принудительно отключить:

ATIFR0


3. Выставить заголовок запроса. ELM327 командой ATSH не умеет выставлять двухбайтные заголовки, поэтому придется выставлять три байта, добавляя к заголовку сразу режим (mode) запроса:

ATSH24xxyy, где xx - это адрес нужного модуля, yy - режим запроса.


4. Поскольку шина мультиплексная, то фильтруем нужные ответы (по второму байту).

ATRAxx или ATSRxx, где xx - адрес нужного модуля (такой же, что и в запросе). Команды ATRA и ATSR работают идентично, выбор дело вкуса.


5. И можно отправлять запрос, но без режима (mode).

Например, большая часть модулей отвечает на запрос, который в полной записи выглядит так:

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

Режим здесь 0x22 с параметрами 0x20 0x00 0x00.

Значит после вышеописанной подготовки достаточно отправить запрос (остальное выставит ELM327):

20 00 00


В качестве примера запрос к модулю с адресом 40 - это BCM (кузовная электроника) моего Cherokee:




Модуль успешно принимает запрос и отправляет ответ, который видно в полной форме:

26 40 62 05 02 00 20

0x26 - это, как полагается заголовок ответа. 0x40 - это тот же адрес.
0x62 - это режим ответа (0x22 + 0x40)
0x05 0x02 0x00 - данные ответа
0x20 - контрольная сумма.

Здесь хочу обратить внимание, что фильтрация ответов ELM327 не совсем полноценная, поэтому нужно смотреть только ответы с первым байтом 0x26 (второй байт будет адресом, выставленным ATRA/ATSR).

Как уже говорил, на некоторые неправильные запросы ответа вообще нет (NO DATA). На некоторые приходит полноценный ответ с режимом 0x7F:




В данном случае делается запрос с режимом 0x21, а в ответ режим 0x7F с кодом ошибки 0x11.


В моем Cherokee KJ я нашел следующие диагностические адреса, по которым можно отправлять запросы по этой схеме:

0x40: модуль BCM (кузовная электроника)
0x58: модуль SRS (система пассивной безопасности)
0x60: модуль EMC (панель приборов)
0x68: модуль EVIC (верхняя консоль)
0xC0: модуль SKIM (иммобилайзер)
0xC3: неизвестный "Security" модуль, возможно штатная сигнализация

(еще я знаю 0x00, 0x10 и 0x18 - это адреса PCM, ECM и TCM, но у меня единый PCM на шине CAN, поэтому по PCI эти адреса не отвечают).


Все это хорошо, но это в лучшем случае только половина дела. Нужно еще знать, что именно отправлять. Теоретически запросы должны быть близки к SAE J2190, но на практике это мало помогает. В общем, это уже другая история.



Еще по этой теме:
Изображения из альбомов:

0 comments:

Post a Comment

Blog Archive