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


и решил на её основе, использовать уже готовый имеющийся модуль 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[1])
{
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).
- +8
- 18 февраля 2016, 17:08
- astaninss
- 1
Файлы в топике:
can2usb Configuration.zip
Вопрос не совсем в тему, но нужна can компетенция.
Имеется пыж 206 — хочу на него поставить сигналку с can модулем, но ничего не находится (макс. 207).
Соотвественно вопрос — оно существует на него в природе или нет?
И стоит ли самому мутить подобный модуль?
Имеется пыж 206 — хочу на него поставить сигналку с can модулем, но ничего не находится (макс. 207).
Соотвественно вопрос — оно существует на него в природе или нет?
И стоит ли самому мутить подобный модуль?
При проектировании своего устройства, в программе нашел ошибку в коде микроконтроллера, из за которой неверно отправляются данные из программы Canhacker в шину (хотя отображается все верно в окне на экране компьютера), надо в main.c в функции сделать такие изменения:
uint8_t hexascii_to_halfbyte(uint8_t _ascii)
{
if((_ascii >= '0') && (_ascii <= '9')) return(_ascii — '0');
if((_ascii >= 'a') && (_ascii <= 'f')) return(_ascii — 'a'+0x0a);
if((_ascii >= 'A') && (_ascii <= 'F')) return(_ascii — 'A'+0x0a);
return(0xFF);
}
ошибка не моя, а исходного варианта автора, что нисколько не умаляет его заслуг:)
если надо выложить перекомпилированный проект — пишите :)
uint8_t hexascii_to_halfbyte(uint8_t _ascii)
{
if((_ascii >= '0') && (_ascii <= '9')) return(_ascii — '0');
if((_ascii >= 'a') && (_ascii <= 'f')) return(_ascii — 'a'+0x0a);
if((_ascii >= 'A') && (_ascii <= 'F')) return(_ascii — 'A'+0x0a);
return(0xFF);
}
ошибка не моя, а исходного варианта автора, что нисколько не умаляет его заслуг:)
если надо выложить перекомпилированный проект — пишите :)
А никому не попадалась раскладка с описанием CAN ID, соответствующим им блокам (интересуют автомобильные, конечно же) и передаваемым ими параметрам? Полагаю это должно быть более-менее стандартизовано… Или же сниф + реверсинг и здесь будет ответом? :)
- Vladimir_aka_Shuher
- 02 июля 2016, 20:22
- ↓
Попробовал в лоб повторить конструкцию, и либо невнимательно читал статью, либо одно из двух. Прием заработал, а вот отправка зависала и программа и адаптер, после анализа понял что не хватает питания CAN-трансиверу, по даташиту ему положено от 4.5 вольт, а на нем почему-то только 3.5 оставалось при питании от USB, видимо на входном диоде слишком много падает.
Переделал немного схему так, чтобы МК питался от USB через стабилизатор 3.3в, а CAN-трансивер уже от 12 вольт через стабилизатор на 5В и все взлетело, пакеты стали и отправляться и приниматься.
Единственная беда пока не разобрался — при отправке в цикле через какое-то время адаптер зависает.
Переделал немного схему так, чтобы МК питался от USB через стабилизатор 3.3в, а CAN-трансивер уже от 12 вольт через стабилизатор на 5В и все взлетело, пакеты стали и отправляться и приниматься.
Единственная беда пока не разобрался — при отправке в цикле через какое-то время адаптер зависает.
Комментарии (16)
RSS свернуть / развернуть