Кан хакер

Дружим программу CANHacker и модуль 2CAN от Starline

Прочитал замечательную статью на Хабре, habrahabr.ru/post/256493/:

и решил на её основе, использовать уже готовый имеющийся модуль 2CAN (описанный мной в предыдущей статье) совместно с написанной и довольно распространенной уже программой CANHacker. Удивительным образом, в статье автора, и имеющимся у меня модулем 2CAN совпадают по назначению все выводы микроконтроллера, разница только в частоте кварцевого генератора. Получается, вносить изменения в плату модуля мне не придётся. Установил программный продукт STM32Cube MX с необходимыми компонентами, и немного изменил настройки и код в проекте, любезно предоставленные автором статьи:
1. Меняем параметры системы тактирования:

2. Добавляем дополнительный вывод для контроля системы тактирования RCC_MCO -> PA8:

3. Далее генерируем код и затем автоматически запускаем компиляцию в KEIL, при этом возникает ошибка компиляции, имеющийся у меня KEIL не понимает две строчки на ассемблере, но так как мы не собираемся спать во время работы, закоментируем их:

4. Далее добавим команду, которая задает режим микросхемы трансивера CAN (PB7 -> «1»):

5. Припаиваем к модулю 2CAN выводы для подключения к шине CAN, и выводы для программирования по SWD, питание же платы осуществляется через разъем USB:

6. Припаиваем резистор ( 560 Ом, но не критично ) для правильной работы USB:

7. Программируем:

Соответствие выводов платы и модуля такое:

8. Проверяем как наш модуль определяется компьютером, и зададим более удобный для работы номер COM порта для модуля:

9. Запускаем программу, настраиваем на заданный COM порт, и подключаемся к работающей CAN шине какого либо устройства (драйвера от STM были уже установлены), результат есть:

Подключаться к шине автомобиля решил с помощью имеющегося диагностического адаптера ELM327 (удобный корпус, легко устанавливать и вынимать), просто припаяв провода к его разъему от 2CAN модуля:

Три провода, CANH (pin 6), CANL (pin 14) и «земля» (pin 4 & 5):

Вот к примеру показания с «Дастера» 1.6, там CAN шиной объединены только блок управления двигателем, блок ABS и блок 4WD, подключаемся:

И видим такие данные:

Записываем их в лог-файл. Импортируем в excel, проводим переупорядочивание и фильтрацию. И в результате можно увидеть следующие данные с can шины автомобиля: обороты двигателя, положение педалей газа, тормоза и сцепления, скорость каждого колеса в отдельности, работу кондиционера и т.д (некоторые значения пока для меня тайна). Полученные данные свел в таблицу, если что то надо исправить или дополнить, подсказывайте.

Некоторые данные нуждаются в простой обработке, где-то поделить, где-то рассчитать по формуле. Но все просто и без заморочек.
Или к примеру, Outlander III, подключаемся к CAN шине салона автомобиля, за приборным щитком.

Смотрим данные на экране компьютера, и что меняется при нажатии на кнопку открыть и закрыть автомобиль. И пары нажатий на соответствующие кнопки, хватает узнать какие команды надо подать, чтобы открыть или закрыть автомобиль. Эти коды кратковременно появляются в строчке, обведенные красным овалом. Повторяем эти команды в окне для передачи и:
Открыть автомобиль:

Закрыть автомобиль:

Что было добавлено в исходный код (в файле usb_cdc_if.c), выбор скорости:

case ‘S’: //изменить скорость CAN, добавим что нибуть свое, заполняя буфер и указывая количество данных //Эта команда установит контроллер CAN для заданного стандартного битрейтом. //Она работает только после включения питания или если контроллер находится в режиме сброса после команды «C». switch(Buf) { case ‘3’: //CAN = 100Kbls MX_CAN1_100(); LedR(1);LedG(1);LedB(0); break ; case ‘4’: //CAN = 125Kbls MX_CAN1_125(); LedR(1);LedG(0);LedB(0); break ; case ‘5’: //CAN = 250Kbls MX_CAN1_250(); LedR(0);LedG(1);LedB(0); break ; case ‘6’: //CAN = 500Kbls MX_CAN1_500(); LedR(0);LedG(0);LedB(1); break ; case ‘7’: //CAN = 800Kbls MX_CAN1_800(); LedR(0);LedG(1);LedB(1); break ; case ‘8’: //CAN = 1000Kbls MX_CAN1_1000(); LedR(1);LedG(0);LedB(1); break ; case ‘9’: //CAN = 95.238Kbls MX_CAN1_95(); LedR(1);LedG(0);LedB(1); break ; case ‘a’: //CAN = 83.338Kbls MX_CAN1_83(); LedR(1);LedG(1);LedB(1); break ; default : MX_CAN1_500(); LedR(1);LedG(1);LedB(0); break ; break ; } num_bytes = sprintf((char*)UserTxBufferFS,»\r»); break ; default : num_bytes = sprintf((char*)UserTxBufferFS,»\r»); break ; }
и несколько подобных процедур для задания скорости (в файле main.c, для примера укажу пару):
//——————————————————————————————————- /* CAN1 init function (500Kbps) */ void MX_CAN1_500(void) { hcan1.Instance = CAN1; hcan1.Init.Prescaler = 6; hcan1.Init.Mode = CAN_MODE_NORMAL; hcan1.Init.SJW = CAN_SJW_1TQ; hcan1.Init.BS1 = CAN_BS1_6TQ; hcan1.Init.BS2 = CAN_BS2_5TQ; hcan1.Init.TTCM = DISABLE; hcan1.Init.ABOM = DISABLE; hcan1.Init.AWUM = DISABLE; hcan1.Init.NART = DISABLE; hcan1.Init.RFLM = DISABLE; hcan1.Init.TXFP = DISABLE; HAL_CAN_Init(&hcan1); } //——————————————————————————————————- /* CAN1 init function (250Kbps) */ void MX_CAN1_250(void) { hcan1.Instance = CAN1; hcan1.Init.Prescaler = 12; hcan1.Init.Mode = CAN_MODE_NORMAL; hcan1.Init.SJW = CAN_SJW_1TQ; hcan1.Init.BS1 = CAN_BS1_6TQ; hcan1.Init.BS2 = CAN_BS2_5TQ; hcan1.Init.TTCM = DISABLE; hcan1.Init.ABOM = DISABLE; hcan1.Init.AWUM = DISABLE; hcan1.Init.NART = DISABLE; hcan1.Init.RFLM = DISABLE; hcan1.Init.TXFP = DISABLE; HAL_CAN_Init(&hcan1); }
И т.д. и т.п.
Про контрольные светодиоды думаю вопрос не актуальный.
Как то так, суеты на пол дня :). Конечно есть некоторые шероховатости в работе программы, но это уже не ко мне (я надеюсь). Если есть вопросы, советы, и если кому надо помочь запрограммировать такой модуль — спрашивайте тут. Извиняюсь за огромные фотки 🙂
Надеюсь, что никого не обидел написанием этой статьи…
С уважением, Астанин Сергей. ICQ 164487932.
Добавлю ссылку на проект: yadi.sk/d/l_b4Rox0kdxph
и просто прошивка: yadi.sk/d/xibJD2v8imUQ4
(к сожалению, ветка форума с первоначального сайта с познавательной перепиской вся пропала, что смог восстанавливаю, ссылки на проект если кому надо добавлю)
P.S. Немного еще исправил код в проекте, можно менять скорость обмена, и обмениваться используя стандартные заголовки. Разобрался с программой CANHacker, можно улучшать и модернизировать проект по необходимости, все просто.

Связь вполне устойчивая с другими блоками автомобиля, можно использовать (проверено на Volvo, Renault и Mitsubishi).

Это, вероятно, случалось с каждым из нас: вы едете в своем автомобиле и вдруг желтая лампочка «Check Engine» загорается на приборной панели как тревожное предупреждение о том, что возникли какие-то проблемы с двигателем. К сожалению, это оно само по себе не дает каких-либо намеков на то, что именно является причиной неполадки и может означать все что угодно, начиная от неплотно закрытой крышки топливного бака до проблем с каталитическим конвертером. Я помню, как Honda Integra 94-го года имела ЭБУ под креслом водителя и красный светодиод начинал мигать, если возникали какие-то проблемы с двигателем.

Подсчитав количество «блинков», можно было определить код ошибки. По мере того, как ЭБУ автомобилей становятся все более и более сложными, количество кодов ошибок возрастает экспоненциально. Использование бортовой диагностики автомобиля On-Board Diagnostic (OBD-II) позволяет решить эту проблему. Данный адаптер позволяет использовать персональный компьютер для OBD диагностики. Адаптер AllPro функционально совместим с ELM327 и поддерживает все существующие OBD-II протоколы обмена данными:

VPW, PWM и CAN
Первых два протокола ISO описаны в указанной выше предыдущей публикации. Детальное описание OBD протоколов выходит за рамки данной статьи, я лишь их кратко перечислю.J1850 VPW (Variable Pulse Width) — протокол автомобилей General Motors и некоторых моделей Chrysler со скоростью передачи 10.4 кбит/с по одному проводу.

Напряжение на шине VPW изменяется от 0 до 8 В, данные по шине передаются чередованием коротких (64 мкс) и длинных (128 мкс) импульсов. Реальная же скорость передачи данных по шине изменяется в зависимости от битовой маски данных и находится в пределах от 976 до 1953 байт/с. Это самый медленный из OBD протоколов.

J1850 PWM (Pulse With Modulation) используется в автомобилях корпорации Ford. Скорость передачи здесь 41.6 кбит/ с с использованием дифференциального сигнала по двум проводам. Напряжение на шине изменяется от 0 до 5 В, a длительность импульса составляет 24 мкс. Работа с этим протоколом требует аккуратности в программировании микропроцессора, так как скорость выполнения инструкций языка «C» на PIC микропроцессоре даже с улучшенной PIC18 архитектурой становится сопоставимой с длиной короткой посылки PWM протокола (7 мкс).

CAN (Controlled Area Network) протокол разработан Robert Bosch в 1983 году и окончательно стандартизирован в ISO 11898. Использование CAN шины данных в автомобиле позволяет различным устройствам общаться друг с другом, минуя центральный процессор, так называемый multi-master режим.

Плюсами является также повышенная скорость передачи, до 1 Мбит/с и лучшая помехоустойчивость. Изначально протокол предназначался для использования в автомобилях, но теперь применяется и в других областях. Чтобы повысить надежность передачи данных, в шинах CAN применяется способ дифференциальной передачи сигналов по двум проводам. Образующие эту пару провода называются CAN_High и CAN_Low.

В исходном состоянии шины на обоих проводах поддерживается постоянное напряжение на определенном базовом уровне, приблизительно 2.5 В, называемым рецессивным состоянием. При переходе в активное (доминантное) состояние напряжение на проводе CAN_High повышается, а на проводе CAN_Low снижается, рис.1.

Существует также два формата сообщений или фреймов — стандартный с 11 битным адресным полем (CAN 2.0A) и расширенный с 29 битным полем (CAN 2.0B). Стандартом ISO 15765-4 определяется использование для целей OBD как CAN 2.0A, так и CAN 2.0B. Вместе со скоростями передачи по шине 250 и 500 кбит/с это создает 4 различных CAN протокола.

Поддерживает ли ваш автомобиль OBD-II?
OBD является обязательным только в Северной Америке и Европе. Если в Америке это правило действует с 1996 года, то Евросоюз принял EOBD вариант автодиагностики, основанный на OBD-II, сравнительно недавно. В Европе OBD стал обязательным, начиная с 2001 года, а для дизельных двигателей даже с 2004. Если ваш автомобиль выпущен до 2001 года, то он может вообще не поддерживать OBD даже при наличии соответствующего разъема.

Например, Renault Kangoo 99 года не поддерживает EOBD (хотя редакционная Kangoo dcI60 2004 года с CAN протоколом прошла успешную стыковку с описанным адаптером, а Renault Twingo поддерживает! Те же самые автомобили, сделанные для других рынков, например Турции, могут тоже не быть совместимыми с OBD протоколом. Как определить, какой протокол поддерживается электронным блоком управления автомобиля?

Первое — можно поискать информацию в интернете, хотя там много неточной и непроверенной информации. К тому же, многие автомобили выпускаются для разных рынков с различными протоколами диагностики. Второй более надежный способ — найти разъем и посмотреть, какие контакты в нем присутствуют. Разъем обычно находится под приборной панелью со стороны водителя. Протокол ISO 914-2 или ISO 14230-4 определяется наличием контакта 7, как показано в таблице 1.

Большинство автомобилей последних лет выпуска поддерживает только CAN протокол с контактами 6 и 14 соответственно. В Европе и Северной Америке все новые автомобили, начиная с 2007/ 2008 года, должны использовать OBD только на основе CAN. Замечу, однако, что, как правильно отмечено в комментарии, «Если марка присутствует в таблице, то это не дает гарантии поддержки OBD-II».

Использование L-line в ISO 9141/14230…Отдельно хочется сказать по поводу L-линии в ISO 9141-2/ 14230-4 протоколах. Сейчас она практически нигде не используется, так как для процедуры инициализации связи вполне достаточно только K-линии. В стандарте же, однако, сказано, что сигнал инициализации должен передаваться по двум линиям одновременно, K и L. Владимир Гурский из www.wgsoft.de, автор программы «ScanMaster ELM», собрал большую коллекцию различных ЭБУ.

В качестве примера необходимости L-линии он приводит Renault Twingo 1.2л 2005 года выпуска. Использование здесь при иницилиазации только K-линии приводит к неверному адресу двигателя в ответах ЭБУ. Если же инициализация производится по K и L одновременно, то тогда все работает правильно.

рис 2

AllPro адаптер на PIC18F2455
Схема моего всепротокольного OBD-II адаптера показана на рис.2. Основой является микроконтроллер Microchip PIC18F2455, имеющий модуль USB интерфейса. Устройство использует напряжение питания 5 В от шины USB. Конденсатор C6 служит фильтром внутреннего стабилизатора 3.3 В для обеспечения работы USB шины. Светодиоды D2 и D3 являются индикаторами приема/передачи, а светодиод D1 использован для контроля статуса USB шины.

Выход ISO 9141/14230 интерфейса управляется половинкой драйвера IC2-2, а входной сигнал подается через делитель R12/R13 на вход RX (вывод 18), который является триггером Шмидта, как и большинство входов PIC18F2455, что обеспечивает достаточно надежное срабатывание. Для контроля L-линии используется IC3-1 и R10.

Шина J1850 VPW требует напряжения питания 8 В, получаемого от стабилизатора L78L08 IC4. Сигнал на выход VPW подается через инвертор IC3-2 и буферный полевой транзистор Q1. Делитель R7/R8 и внутренний триггер Шмидта на входе RA1 составляют входной интерфейс J1850 PWM протокола. Внутренний компаратор (входы RA0 и RA3) PIC18F2455 вместе с резисторами R4, R5 выделяет дифференциальный сигнал PWM. Для контроля выхода PWM шины используются IC2-1 и полевой транзистор Q2.

Отдельно хочется сказать по поводу поддержки CAN. Microchip не выпускает контроллеры, содержащие и CAN, и USB. Можно использовать контроллер с CAN модулем и внешний USB чип типа FT232R. Или наоборот, подключить внешний CAN контроллер, как сделано в этом адаптере. CAN интерфейс здесь образуют контроллер MCP2515 (IC5) и трансивер MPC2551 (IC6). MCP2515 подключен через SPI шину к PIC18F2455 и программируется каждый раз при подаче питания адаптера.

Согласующие (bus termination) RC цепочки R14/ C10 и R15/C11 предназначены для уменьшения отражений на CAN шине согласно стандарту ISO 15765-4. Использование их не обязательно, при относительно коротком кабеле отражениями можно пренебречь. Вместо PIC18F2455 можно использовать PIC18F2550 с той же самой прошивкой, см. варианты замены в таблице 2.

таблица 2

Внешний вид устройства показан на рис.3 и обложке, а печатная плата на рис.4.

Программирование PIC18F2455

Для программирования PIC18 можно использовать несложный JDM программатор , схема показана на рис.5.

рис 5

Он очень прост и может бы собран за час на макетной плате. Недостатком является то, что программатор требует наличия последовательного (Com) интерфейса в компьютере и не работает с виртуальными USB/Com адаптерами. Использование ноутбуков также не рекомендуется, так как они не обеспечивают необходимого напряжения на выходе Com порта.

рис 6

Разводка программатора показана на рис.6 и сделана с использованием так называемой «stripboard» технологии, достаточно популярного подхода к макетированию. Типичная stripboard имеет матрицу отверстий с шагом 2.54 мм для монтажа электронных компонентов, соединенных полосками меди на обратной стороне, отсюда и название — stripboard.

Разрезав полоски на обратной стороне и установив сверху проволочные перемычки, можно быстро собрать относительно несложные конструкции. Полоски легко перерезаются зенковкой отверстий обычным сверлом. Существует даже специальная программа — «LochMaster» для проектирования конструкций таким способом. При использовании программатора следует обратить внимание, что корпус персонального компьютера (контакт 5 DB9 разъема) не соответствует корпусу программатора.

Другим условием является использование «полноценного» последовательно кабеля со всеми проводами, необходимыми для работы схемы. Программатор надежно работает с WinPic , единственная проблема заключается в том, что требуется отдельно загрузить файл-дескриптор PIC18F2455.dev (или PIC18F2550.dev) из дистрибуции Microchip IDE после того, как установлен собственно WinPic.

Другой программой, работающей с JDM программатором, является PICPgm , никаких дополнительных файлов здесь не требуется, хотя автору следует поработать над английской грамматикой, рис.7. Прошивка адаптера доступна .

OBD-II кабель
Для подключения к бортовому компьютеру адаптер использует «стандартный» DB-9/OBD-II кабель. Разводка кабеля показана в таблице 3.

Подключение и тестирование устройства. Правильно собранный адаптер в налаживании не нуждается и распознается Windows как USB устройство. Микропроцессор PIC18F2455 не имеет собственного драйвера и использует Windows 2000/XP/Vista CDC (Communication Device Class ) драйвер usbser.sys виртуального Com порта.

По поводу использования драйвера хочется, однако, добавить, что согласно информации www.usb.org исправил баги в usbser.sys только начиная с Windows XP SP2 и использование адаптера с Windows 2000 может быть проблематично. После того, как адаптер распознался как USB устройство и драйвер установлен, можно приступать к тестированию.

Для этого требуется подключить источник стабилизованного напряжения 12 вольт на выводы 1 и 9 разъема J2 и подключить адаптер к персональному компьютеру через USB кабель. Проверяется наличие напряжения 8 В на выходе стабилизатора IC4. Следующим шагом является запуск Windows приложения HyperTerm и подсоединения к Com порту адаптера.

Устройство имеет процедуру самодиагностики с проверкой прохождения сигнала со выхода на вход по всем протоколам. Для этого используется команда «AT@3», рис.8.

Прохождение проверяется по следующим цепям:

• IC2-1, R4 для отрицательной шины PWM
• Q2, D6, R5 для положительной шины PWM
• IC3-2, IC4, R11, Q1, D5, R7, R8 для VPW
• IC2-2, R9, R12, R13 для ISO 9141/14230
• Ответ контроллера MCP2515 по шине SPI

Например, отсутствие IC2 приведет сразу к двум ошибкам, рис.9.

Процедура самодиагностики не включает проверку CAN трансивера MCP2551, здесь можно просто замерить напряжение на выводах 6 и 7. Оно должно быть в пределах 2.5 В.

Работа с Адаптером
Адаптер совместим по системе команд с ELM327 и может использоваться с приложениями, работающими с ELM327. Я предпочитаю использовать «ScanMaster ELM» Владимира Гурского , рис.10.

рис 10

Адаптер работает также со следующими приложениями:
• ScanTool.net for Windows v1.13
• Digimoto
•PCMSCAN
• EasyObdII Pro
В качестве примера приведу ситуацию, которая случилась с VW Passat моего знакомого. В автомобиле загорелась лампочка «Check Engine», подключение ANPro адаптера определило ошибку Р0118 -«engine coolant temperature circuit high input», т.е. высокий уровень сигнала с датчика температуры охлаждающей жидкости, рис. 11. Дальнейшее расследование выявило неисправный датчик. После замены датчика ошибка была стерта с помощью «Clear Trouble codes» кнопки, см. рис.12. Ошибка исчезла и больше не появлялась, рис.13.

ВСЁ ДЛЯ СТАТЬИ В АРХИВЕ…СКАЧАТЬ…

Сообщества ›
Arduino для автомобиля ›
Блог ›
Доступный КАН сниффер (CAN sniffer) своими руками.

Продублирую тут.Некоторое время назад занялся CAN шиной. Наконец созрела статья, как сделать простейший кан сниффер для Астры (легко адаптировать к любой другой марке, конечно).
Начнём сразу со схемы!

Схема соединения
Все компоненты подписаны и легко находятся на Али. Могу потом добавить конкретные ссылки, где брал я.
Соответственно, понадобится плата с контроллером STM32F103C8T6, плата стабилизированного регулятора напряжения, плата CAN трансивера MCP2551. По желанию можно добавить блютус модуль — очень удобно для записи логов на смартфон.
Программируется и прошивается с помощью АрдуиноIDE. Для прошивки придется купить USB-TTL преобразователь (пригодится для отладки) или, что проще, ST-Link V2.
Предварительная подготовка платы — см. известный источник на гиктайме.
Сама библиотека для работы с кан-шиной появилась недавно, и в основном репозитории её нет, поэтому выкладываю архив Arduino IDE, гарантированно работающий (сохранял для себя).
Ну и, конечно, файл программы: cloud.mail.ru/public/GX5y/9g61ucVCY
Работает следующим образом: после подачи питания сниффер пытается по очереди подключиться к MS CAN, в случае неудачи — к LS CAN, и далее по кругу. Как только подключение успешно, все пойманные пакеты печатаются в UART (или, проще говоря, в ком-порт).
В случае подключения к компу Вы ловите данные через терминал. А в случае с блютусом — через замечательную программу для андроида BlueTerm2.
Затем полученный файл дербаним любимым эксэлем.
На этом всё! Не очень литературно, но суть, надеюсь, изложил понятно.
П.С. Позже добавлю скриншот из блютерма, соберу тестовый образец в более менее приличном виде.

Добавлено:
По многочисленным вопросам.
Цели следующие.
ЛС кан:
оповещение о выключенных фарах во время движения,
отображение температуры мотора и напряжения на одометре или на стрелках приборов,
функция «спасибо» — моргнуть только задними аварийками,
отображение реальной скорости на одометре
отображение, какая дверь открыта (на одометре?)
другие плюшки – см «кан адаптер» и «мини кан адаптер»
МС кан:
включение и отключение компрессора одним нажатием (климат контроль)
ввод команд цифровыми кнопками магнитолы д команд цифровыми кнопками магнитолы

Реализация — неспешная.

Добавлено: пример лога
Hello World!
Starting sniffer v0 program
Time (ms) ; ID ; Length ; B0 ; B1 ; B2 ; B3 ; B4 ; B5 ; B6 ; B7
8; 110; 5; 0; 48; 16; 4A; E; 0; 0; 0
29; 108; 8; 13; C; 34; 0; 0; 0; 0; 0
79; 625; 8; 0; 48; 50; 0; 0; 0; 0; 0
83; 108; 8; 13; C; 38; 0; 0; 0; 0; 0
108; 110; 5; 0; 48; 16; 4A; E; 0; 0; 0
112; 130; 7; 0; DB; 28; 0; 0; 0; 0; 0
129; 108; 8; 13; C; 38; 0; 0; 0; 0; 0
179; 625; 8; 0; 48; 50; 0; 0; 0; 0; 0
183; 108; 8; 13; C; 38; 0; 0; 0; 0; 0
208; 110; 5; 0; 48; 16; 4A; E; 0; 0; 0

И после импорта данных в эксель:

данные в экселе — делай что хочешь!
А уж там полная свобода анализа. Например, разобрать сообщение побитово и смотреть нули и единицы.

Добавлено. Важно!
С указанным преобразователем напряженияиногда наблюдается падение шины LS, уже при подключении устройства. Не знаю, с чем связано. Возможно, решится добавлением конденсатора.
==> Barm76 подсказал, что питание нужно обвесить конденсаторами: вход 220 мкФ 25В, выход 470 мкФ 16В

Все эксперименты на ваш риск. 🙂