Реверс-инжиниринг CAN-шины Lada Granta

Цель: Убрать Е-Газ, и вернуться на старый «добрый, надежный, брутальный» механический дроссель, и при этом не переделывать всю проводу, и не вешать второй ЭБУ с кучей хлама. Скорость шины 500 kbps посылки 11 байт.

Комбинация приборов

Шлет сообщения с CAN.ID = 0x2DE (периодичность 10 мс), и 0x280 (периодичность 100мс). В обоих случаях rtr = 0, 8 байт.

Пример посылок при включении зажигания:

[23:19:52:893] R 0x2DE 0 8 0x40 0x00 0x00 0x00 0x00 0x00 0x10 0x00
[23:19:52:903] R 0x2DE 0 8 0x40 0x00 0x00 0x00 0x00 0x00 0x20 0x00
[23:19:52:914] R 0x2DE 0 8 0x40 0x00 0x00 0x00 0x00 0x00 0x30 0x00
[23:19:52:923] R 0x2DE 0 8 0x40 0x00 0x00 0x00 0x00 0x00 0x40 0x00

Сообщения вылетают также и без зажигания, если что-то происходит:

вкл/выкл дальний свет
[18:26:23:337] R 0x481 0 8 0xB8 0x00 0x00 0x01 0x00 0x00 0x00 0x00
[18:26:23:349] R 0x2DE 0 8 0x40 0x00 0x01 0x00 0x00 0x00 0x50 0x00
[18:26:23:437] R 0x481 0 8 0xB8 0x00 0x00 0x01 0x00 0x00 0x00 0x00
[18:26:23:447] R 0x2DE 0 8 0x40 0x00 0x01 0x00 0x00 0x00 0x60 0x00
[18:26:23:537] R 0x481 0 8 0xA8 0x00 0x00 0x00 0x00 0x00 0x00 0x00
[18:26:23:548] R 0x2DE 0 8 0x40 0x00 0x01 0x00 0x00 0x00 0x70 0x00

аварийка вкл/выкл
[18:27:13:838] R 0x481 0 8 0xA8 0x00 0x03 0x00 0x00 0x00 0x00 0x00
[18:27:13:849] R 0x2DE 0 8 0x40 0x00 0x01 0x00 0x00 0x00 0x80 0x00
[18:27:14:138] R 0x481 0 8 0xA8 0x00 0x00 0x00 0x00 0x00 0x00 0x00
[18:27:14:149] R 0x2DE 0 8 0x40 0x00 0x01 0x00 0x00 0x00 0x90 0x00

дверь водителя закрыта
[18:28:09:140] R 0x481 0 8 0x28 0x00 0x00 0x00 0x00 0x00 0x00 0x00
[18:28:09:152] R 0x2DE 0 8 0x40 0x00 0x01 0x00 0x00 0x00 0xA0 0x00

дверь водителя открыта
[18:28:51:141] R 0x481 0 8 0xA8 0x00 0x00 0x00 0x00 0x00 0x00 0x00
[18:28:51:241] R 0x481 0 8 0xA8 0x00 0x00 0x00 0x00 0x00 0x00 0x00
[18:28:51:251] R 0x2DE 0 8 0x40 0x00 0x01 0x00 0x00 0x00 0xB0 0x00

С ID 0x481 очевидно шлет ЦБКЭ. На столе таких сообщений нет. При включенном зажигании 0x481 летят через каждые 100 мс.

Сообщения полезны для CAN сигнализации.

CAN ID=0x280 — очевидно встроенный иммобилизатор.

[23:19:52:993] R 0x280 0 8 0x11 0x02 0xFF 0x00 0xFD 0xC6 0x00 0x00
[23:19:53:094] R 0x280 0 8 0x21 0x00 0xFF 0x00 0xFD 0xC6 0x00 0x00
[23:19:53:196] R 0x280 0 8 0x31 0x00 0xFF 0x00 0xFD 0xC6 0x00 0x00
[23:19:53:295] R 0x280 0 8 0x41 0xFF 0xFF 0x00 0xFD 0xC6 0x00 0x00
[23:19:53:396] R 0x280 0 8 0x51 0xFF 0xFF 0x00 0xFD 0xC6 0x00 0x00
[23:19:53:499] R 0x280 0 8 0x61 0xFF 0xFF 0x00 0xFD 0xC6 0x00 0x00

А что же она принимает?

CAN ID=0x1F9 -Данные о скорости и работе круиза. Без ЭБУ таких ID в CAN шине нет. Периодичность посылки 10 мс.
Первый байт данных кодирует показания спидометра. Если старший бит будет 1 то показаний не будет, скорость 0 (например 0x80). Также здесь есть информация о работе круиза (по крайней мере это предусмотрено). Пример:

[18:30:30:963] R 0x1F9 0 8  0xE5 0x70 0x00 0x00 0x00 0x00 0x00 0x00
[18:30:30:981] R 0x1F9 0 8  0x05 0x70 0x00 0x00 0x00 0x00 0x00 0x00
[18:30:31:016] R 0x1F9 0 8  0x35 0x70 0x00 0x00 0x00 0x00 0x00 0x00
[18:30:31:025] R 0x1F9 0 8  0x45 0x70 0x00 0x00 0x00 0x00 0x00 0x00
[18:30:31:034] R 0x1F9 0 8  0x55 0x70 0x00 0x00 0x00 0x00 0x00 0x00
[18:30:31:044] R 0x1F9 0 8  0x65 0x70 0x00 0x00 0x00 0x00 0x00 0x00
[18:30:31:053] R 0x1F9 0 8  0x75 0x70 0x00 0x00 0x00 0x00 0x00 0x00
[18:30:31:063] R 0x1F9 0 8  0x85 0x70 0x00 0x00 0x00 0x00 0x00 0x00
[18:30:31:081] R 0x1F9 0 8  0xA5 0x70 0x00 0x00 0x00 0x00 0x00 0x00
[18:30:31:115] R 0x1F9 0 8  0xD5 0x70 0x00 0x00 0x00 0x00 0x00 0x00
[18:30:31:125] R 0x1F9 0 8  0xE5 0x70 0x00 0x00 0x00 0x00 0x00 0x00
[18:30:31:134] R 0x1F9 0 8  0xF5 0x70 0x00 0x00 0x00 0x00 0x00 0x00
[18:30:31:143] R 0x1F9 0 8  0x05 0x70 0x00 0x00 0x00 0x00 0x00 0x00
[18:30:31:152] R 0x1F9 0 8  0x15 0x70 0x00 0x00 0x00 0x00 0x00 0x00
[18:30:31:161] R 0x1F9 0 8  0x25 0x70 0x00 0x00 0x00 0x00 0x00 0x00
[18:30:31:206] R 0x1F9 0 8  0x65 0x70 0x00 0x00 0x00 0x00 0x00 0x00
[18:30:31:214] R 0x1F9 0 8  0x75 0x70 0x00 0x00 0x00 0x00 0x00 0x00
[18:30:31:225] R 0x1F9 0 8  0x85 0x70 0x00 0x00 0x00 0x00 0x00 0x00
[18:30:31:233] R 0x1F9 0 8  0x85 0x70 0x00 0x00 0x00 0x00 0x00 0x00
[18:30:31:242] R 0x1F9 0 8  0x85 0x70 0x00 0x00 0x00 0x00 0x00 0x00
[18:30:31:251] R 0x1F9 0 8  0x85 0x70 0x00 0x00 0x00 0x00 0x00 0x00
[18:30:31:260] R 0x1F9 0 8  0x85 0x70 0x00 0x00 0x00 0x00 0x00 0x00
[18:30:31:297] R 0x1F9 0 8  0x85 0x70 0x00 0x00 0x00 0x00 0x00 0x00
[18:30:31:305] R 0x1F9 0 8  0x85 0x70 0x00 0x00 0x00 0x00 0x00 0x00
[18:30:31:315] R 0x1F9 0 8  0x85 0x70 0x00 0x00 0x00 0x00 0x00 0x00
[18:30:31:324] R 0x1F9 0 8  0x85 0x70 0x00 0x00 0x00 0x00 0x00 0x00
[18:30:31:333] R 0x1F9 0 8  0x85 0x70 0x00 0x00 0x00 0x00 0x00 0x00
[18:30:31:343] R 0x1F9 0 8  0x85 0x70 0x00 0x00 0x00 0x00 0x00 0x00
[18:30:31:352] R 0x1F9 0 8  0x85 0x70 0x00 0x00 0x00 0x00 0x00 0x00
[18:30:31:360] R 0x1F9 0 8  0x85 0x70 0x00 0x00 0x00 0x00 0x00 0x00
[18:30:31:396] R 0x1F9 0 8  0x85 0x70 0x00 0x00 0x00 0x00 0x00 0x00

Машина не двигается. Тут видны тестовые значения (типа чек), а потом  0x85 — нет скорости, т.к. старший бит 1. Если есть скорость, будет крутится и пробег.

CAN ID=0x551 — отвечает за сигнализацию неисправностей двигателя и его температуру. Периодичность рассылки 100 мс.

data[0] — Всегда 0x00, реакции нет.
data[1] — Вероятно температура. Если сделать FF панель выдаст лампочку перегрева.
data[2] — Меняется, но ничего не дает. Вероятно младшие биты температуры.
data[3] — авария заряда АКБ если первый бит = 0, другие значения нет реакции.
data[4] — Бит 0: моргать Check Engine, Бит 1: потушитьCheck Engine,Бит 2: авария давления масла, Бит 3: авария температуры, др
data[5] — COUNTER
data[6] — реакции нет, но меняется
data[7] -реакции нет, но меняется

[18:30:16:071] R 0x551 0 8  0x00 0x4D 0x00 0x02 0x87 0x60 0x00 0x00
[18:30:16:272] R 0x551 0 8  0x00 0x4D 0x00 0x02 0x85 0x80 0x00 0x00
[18:30:17:071] R 0x551 0 8  0x00 0x4D 0x00 0x02 0x85 0x00 0x00 0x00
[18:30:17:172] R 0x551 0 8  0x00 0x4D 0x00 0x02 0x85 0x10 0x00 0x00
[18:30:17:272] R 0x551 0 8  0x00 0x4D 0x00 0x02 0x85 0x20 0x00 0x00
[18:30:17:371] R 0x551 0 8  0x00 0x4D 0x00 0x02 0x85 0x30 0x00 0x00
[18:30:17:572] R 0x551 0 8  0x00 0x4D 0x00 0x82 0x85 0x50 0x00 0x00
[18:30:18:671] R 0x551 0 8  0x00 0x4D 0x00 0xFA 0x85 0x00 0x00 0x00
[18:30:22:171] R 0x551 0 8  0x00 0x4D 0x00 0xFA 0x85 0x30 0x00 0x00
[18:30:23:271] R 0x551 0 8  0x00 0x4D 0x00 0x00 0x84 0xE0 0x00 0x00
[18:30:23:371] R 0x551 0 8  0x00 0x4D 0x00 0x00 0x84 0xF0 0x00 0x00
[18:30:23:471] R 0x551 0 8  0x00 0x4D 0x00 0x00 0x84 0x00 0x00 0x00
[18:30:23:572] R 0x551 0 8  0x00 0x4D 0x00 0x00 0x84 0x10 0x00 0x00
[18:30:27:272] R 0x551 0 8  0x00 0x4D 0x00 0x00 0x84 0x60 0x00 0x00
[18:30:27:372] R 0x551 0 8  0x00 0x4D 0x00 0x00 0x84 0x70 0x00 0x00
[18:30:27:471] R 0x551 0 8  0x00 0x4D 0x00 0x78 0x84 0x80 0x00 0x00
[18:30:27:571] R 0x551 0 8  0x00 0x4D 0x00 0x00 0x84 0x90 0x00 0x00
[18:30:27:671] R 0x551 0 8  0x00 0x4D 0x00 0x00 0x84 0xA0 0x00 0x00
[18:30:30:671] R 0x551 0 8  0x00 0x4D 0x00 0x78 0x84 0x80 0x00 0x00
[18:30:30:772] R 0x551 0 8  0x00 0x4D 0x00 0x00 0x84 0x90 0x00 0x00
[18:30:30:872] R 0x551 0 8  0x00 0x4D 0x00 0x00 0x84 0xA0 0x00 0x00
[18:30:30:972] R 0x551 0 8  0x00 0x4D 0x00 0x78 0x84 0xB0 0x00 0x00
[18:30:31:071] R 0x551 0 8  0x00 0x4D 0x00 0x00 0x84 0xC0 0x00 0x00

551 0 8  00 4B 0D 03 D0 A0 03 03
551 0 8  00 4B 0E 7B D0 B0 02 CB
551 0 8  00 4B 0E 03 D0 C0 02 AA
551 0 8  00 4B 0F 03 D0 D0 02 A5
551 0 8  00 4B 2A 83 D0 E0 03 3B
551 0 8  00 4B 2F 83 D0 30 03 1A
551 0 8  00 4B 30 83 D0 40 03 08
551 0 8  00 4B 31 83 D0 50 03 24
551 0 8  00 4B 31 83 D0 60 03 1A
551 0 8  00 4B 32 83 D0 70 03 16
551 0 8  00 4B 68 FB D0 30 02 B3
551 0 8  00 4B 69 83 D0 40 02 7B
551 0 8  00 4B 69 83 D0 50 02 6D
551 0 8  00 4B 6A 83 D0 60 02 69
551 0 8  00 4B 6A 83 D0 70 02 5B
551 0 8  00 4B 90 79 D0 A0 09 96
551 0 8  00 4B 90 79 D0 B0 05 EF
551 0 8  00 4B 91 79 D0 C0 03 8A
551 0 8  00 4B 91 01 80 D0 00 00
551 0 8  00 4B 91 01 80 E0 00 00
551 0 8  00 4B 91 00 84 C0 00 00
551 0 8  00 4B 91 00 84 D0 00 00
551 0 8  00 4B 91 00 84 E0 00 00

 

CAN ID=0x180 — обороты двигателя. Период 100 мс. Шлет ЭБУ двигателя.
Первый байт определяет показания тахометра. Второй байт не должен быть FF иначе, ничего не покажет. Другие байты ничего не дают. Пример:

[18:30:28:667] R 0x180 0 8  0x00 0x00 0x3F 0x90 0x00 0x00 0x07 0x00
[18:30:28:768] R 0x180 0 8  0x00 0x00 0x3F 0x90 0x00 0x00 0x07 0x00
[18:30:28:868] R 0x180 0 8  0x00 0x00 0x3F 0x90 0x00 0x00 0x07 0x00
При работе двигателя:

180 0 8  00 00 3F 50 00 00 07 00
180 0 8  00 00 3F 50 00 00 07 00
180 0 8  00 00 3F 60 00 00 07 00
180 0 8  00 00 3F 60 00 00 07 00
180 0 8  01 B8 3D 10 00 00 07 00
180 0 8  08 08 3B 10 00 00 07 00
180 0 8  08 08 3B 10 00 00 07 00
180 0 8  08 58 39 00 00 00 07 00
180 0 8  15 10 37 90 00 00 07 00
180 0 8  29 58 36 10 00 00 07 00
180 0 8  2A 78 33 90 00 00 07 00
180 0 8  28 38 32 70 00 00 07 00
180 0 8  26 68 30 D0 00 00 07 00
180 0 8  25 E8 30 B0 00 00 07 00
180 0 8  25 80 30 C0 00 00 07 00
180 0 8  24 88 31 90 00 00 07 00
180 0 8  25 90 31 F0 00 00 07 00
180 0 8  26 58 31 C0 00 00 07 00
180 0 8  25 F0 31 B0 00 00 07 00
180 0 8  25 D0 30 A0 00 00 07 00
180 0 8  23 10 30 F0 00 00 07 00
180 0 8  21 40 31 30 00 00 07 00

двигатель остановлен

180 0 8  00 00 3F 60 00 00 07 00
180 0 8  00 00 3F 60 00 00 07 00
180 0 8  00 00 3F 60 00 00 07 00
180 0 8  00 00 3F 60 00 00 07 00
180 0 8  00 00 3F 60 00 00 07 00
180 0 8  00 00 3F 60 00 00 07 00
180 0 8  00 00 3F 60 00 00 07 00
180 0 8  00 00 3F 60 00 00 07 00
180 0 8  00 00 3F 60 00 00 07 00
180 0 8  00 00 3F 60 00 00 07 00
180 0 8  00 00 3F 60 00 00 07 00
180 0 8  00 00 3F 60 00 00 07 00
180 0 8  00 00 3F 60 00 00 07 00

CAN ID=0x498 — всего 1 байт. Периодичность 100 или 200 мс (толком не понял). Гасит знак аварии подушки безопасности и ремня (реакция только на 2 бита). Шлет блок подушек безопасности. Пример:

[18:30:15:341] R 0x498 0 1  0x50
[18:30:15:541] R 0x498 0 1  0x50
[18:30:21:334] R 0x498 0 1  0x40
[18:30:21:734] R 0x498 0 1  0x40

CAN ID=0x354 — управляет аварией ABS и неисправность тормозной системы. Шлет ABS. Пример:

[18:30:15:866] R 0x354 0 8  0x80 0x00 0x00 0x00 0x00 0x00 0xA0 0x01
[18:30:18:266] R 0x354 0 8  0x80 0x00 0x00 0x00 0x00 0x00 0x00 0x0D
[18:30:18:466] R 0x354 0 8  0x80 0x00 0x00 0x00 0x00 0x00 0x00 0x02
[18:30:18:987] R 0x354 0 8  0x80 0x00 0x00 0x00 0x00 0x00 0x00 0x0F

Больше ничего «полезного» для комбинации не найдено.

Кроме это по CAN шине летают:

160 0 7  32 E3 42 00 00 FF F4
160 0 7  32 E3 42 00 00 FF F4
160 0 7  32 B3 48 00 00 FF F4
160 0 7  32 B3 48 00 00 FF F4
160 0 7  32 83 4D 00 00 FF F4
160 0 7  33 13 4E 00 00 FF F4
160 0 7  32 E3 4F 00 00 FF F4
160 0 7  32 93 4D 00 00 FF F4
160 0 7  33 23 49 00 00 FF F4

160 0 7  34 D3 F6 00 00 FF F4
160 0 7  34 D3 F6 00 10 FF D4
160 0 7  34 D3 F6 00 00 FF F4
160 0 7  34 D3 F6 00 00 FF F4
160 0 7  34 D3 F6 00 00 FF F4
160 0 7  34 D3 F6 00 00 FF F4
160 0 7  34 D3 F6 00 00 FF F4
160 0 7  34 D3 F6 00 00 FF F4
160 0 7  34 D3 F6 00 00 FF F4
160 0 7  34 D3 F6 00 00 FF F4
160 0 7  34 D3 F6 00 00 FF F4
160 0 7  34 D3 F6 00 00 FF F4
160 0 7  34 D3 F6 00 00 FF F4
160 0 7  34 D3 F6 00 00 FF F4
160 0 7  34 D3 F6 00 00 FF F4
7 байт. Шлет ЭБУ двигателя. Расход или трансмиссия?

 

182 0 8  07 00 00 00 42 00 00 00
182 0 8  07 00 00 00 0F 00 00 00
182 0 8  07 00 00 00 0D 00 00 00
182 0 8  07 00 00 00 0C 00 00 00
182 0 8  07 00 00 00 0A 00 00 00
182 0 8  07 00 00 00 0A 00 00 00
35D 0 8  00 00 01 00 03 03 80 03
35D 0 8  00 00 01 00 01 03 90 03
35D 0 8  00 00 01 00 03 03 E0 03
35D 0 8  00 00 01 00 01 03 80 03
27C 0 8  00 00 00 00 00 00 00 01
27C 0 8  00 00 00 00 00 00 00 02
27C 0 8  00 00 00 00 00 00 00 03
27C 0 8  00 00 00 00 00 00 00 06
27C 0 8  00 00 00 00 00 00 00 08
27C 0 8  00 00 00 00 00 00 00 09
27C 0 8  00 00 00 00 00 00 00 0E
6E2 0 6  01 00 04 00 00 24
6E2 0 6  01 00 04 0D 64 0D
6E2 0 6  01 00 04 00 4B 09
6E2 0 6  01 00 04 00 21 1D
265 0 8  00 02 00 02 00 00 00 02
265 0 8  00 02 00 02 00 00 00 04
265 0 8  00 02 00 02 00 00 00 05
265 0 8  00 02 00 02 00 00 00 08
265 0 8  00 02 00 02 00 00 00 0A
265 0 8  00 02 00 02 00 00 00 07
260 0 8  00 02 00 02 00 00 00 01
260 0 8  00 02 00 02 00 00 00 02
260 0 8  00 02 00 02 00 00 00 03
260 0 8  00 02 00 02 00 00 00 0B
260 0 8  00 02 00 02 00 00 00 0C
260 0 8  00 02 00 02 00 00 00 07
260 0 8  00 02 00 02 00 00 00 00
555 0 4  46 E1 27 01
555 0 4  46 E1 27 01
555 0 4  46 E1 27 01

Пример работы с индикаторами неисправности

uint8_t FAILS = 0x00; // Аварии. Нет аварий.
uint8_t AKB = 0x00; // Норма заряда АКБ. Нормы нет.

FAILS |= 1<<0; // Зажечь индикатор Check Engine постоянно
FAILS |= 1<<1; // Моргать индикатором Check Engine 1 Гц.
FAILS |= 1<<2; // Зажечь индикатор — нет давления масла
FAILS |= 1<<3; // Зажечь индикатор — перегрев!

AKB |= 1<<0; // Тушим лампочку аварии заряда АКБ
// Панель сама измеряет напряжение, не знаю что там еще за биты

message.id = 0x551;
message.header.length = 8;
message.header.rtr = 0;

message.data[0] = 0x00; // Никакой реакции. Младший байт температуры двигателя?
message.data[1] = 0x00; // Никакой реакции, кроме 0xFF — начнет моргать лампочкой перегрева 1Гц. Старший байт температуры?
message.data[2] = 0x00; // Ничего не делает, вольтаж?
message.data[3] = AKB; // Норма заряда, может еще и вольтаж?
message.data[4] = FAILS; //Аварии
message.data[5] = 0x00; // Никакой реакции. COUNTER.
message.data[6] = 0x00; // Никакой реакции.
message.data[7] = 0x00; // Никакой реакции.

Управление тахометром

for (uint16_t engine_RPM = 0; engine_RPM < 8500; engine_RPM=engine_RPM+10) {
uint8_t RPM_code = engine_RPM / 32;
PRINT(«RPM=%d  Code=%d \r\n», engine_RPM, RPM_code);
message.id = 0x180;
message.header.length = 8;
message.header.rtr = 0;
message.data[0] = RPM_code; // allow up to 255
message.data[1] = 0x00;
message.data[2] = 0x00;
message.data[3] = 0x00;
message.data[4] = 0x00;
message.data[5] = 0x00;
message.data[6] = 0x00;
message.data[7] = 0x00;
mcp2515_send_message(&message);
}

Спидометром

for (uint8_t speed_kmH = 0; speed_kmH < 250; speed_kmH++) {
_delay_ms(300);
uint8_t speed_code = speed_kmH / 2.5;
PRINT(«Speed=%d km/H Code=%d \r\n», speed_kmH, speed_code);
message.id = 0x1F9;
message.header.length = 8;
message.header.rtr = 0;
message.data[0] = 0x00;
message.data[1] = 0x00;
message.data[2] = speed_code;
message.data[3] = 0x00;
message.data[4] = 0x00;
message.data[5] = 0x00;
message.data[6] = 0x00;
message.data[7] = 0x00;
mcp2515_send_message(&message);
}

Leave a Reply