Модули управления силовой установкой (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 реализована криво, а вывод полного ответа позволяет делать обработку вручную.
ATH13. По умолчанию IFR (In Frame Response) протокола J1850 управляет сам ELM327 по заголовку, но для надежности лучше IFR принудительно отключить:
ATIFR03. Выставить заголовок запроса. 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, но на практике это мало помогает. В общем, это уже другая история.