Notice: Memcache::get(): Server localhost (tcp 11211) failed with: Connection refused (111) in /home/a146/www/we.easyelectronics.ru/engine/lib/external/DklabCache/Zend/Cache/Backend/Memcached.php on line 134
Дружим программу CANHacker и модуль 2CAN от Starline / STM32 / Сообщество EasyElectronics.ru

Дружим программу 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[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

Комментарии (16)

RSS свернуть / развернуть
обязательно пишите еще:)
0
всегда в вантузе улыбала простыня из COM0 COM1 COM2 COM3 COM4 COM5 COM6 COM7… А потом ещё тыкать в проге, пытаясь угадать, в тот девайс попали или не :)
0
а можно куда-либо выложить табличку в экзель-файле?
или всё интересное, что там имеется отображено на скриншоте?
0
  • avatar
  • Doka
  • 24 февраля 2016, 12:44
файл удалил за ненадобностью, а интересное (то что меняется) — осталось на картинке.
0
Вопрос не совсем в тему, но нужна can компетенция.
Имеется пыж 206 — хочу на него поставить сигналку с can модулем, но ничего не находится (макс. 207).
Соотвественно вопрос — оно существует на него в природе или нет?
И стоит ли самому мутить подобный модуль?
0
Модули за 80-100USD не предлагать, нормальная цена ~20USD
0
неплохо узнать и проверить, что позволяет в этой машине шина CAN, (центральный замок, датчики дверей и т.п.), модуль у установщиков сигнализаций можно и за пиво наверное попросить, как замотивируеш.
0
Ну чето я не уверен тк знакомых установщиков нема.
А Can Hacker можно ведь к elm подсоединить (или там чтото другое)и посниффить?
0
CAN Hacker не работает с ELM.
0
При проектировании своего устройства, в программе нашел ошибку в коде микроконтроллера, из за которой неверно отправляются данные из программы 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);
}

ошибка не моя, а исходного варианта автора, что нисколько не умаляет его заслуг:)
если надо выложить перекомпилированный проект — пишите :)
0
Исправленная прошивка:
https://yadi.sk/d/xibJD2v8imUQ4
0
Прицепил бы лучше к топику.
0
получилось прикрепить:) а то недавно проблема была какая-то с этим:)
0
А никому не попадалась раскладка с описанием CAN ID, соответствующим им блокам (интересуют автомобильные, конечно же) и передаваемым ими параметрам? Полагаю это должно быть более-менее стандартизовано… Или же сниф + реверсинг и здесь будет ответом? :)
0
Внутренние посылки между модулями у каждого автопроизводителя свои и отличаются от модели к модели даже. Стандартизированы только общая диагностика OBD и основные сервисные штуки, типа ISO14229, но внутри там тоже у всех все по разному.
0
Попробовал в лоб повторить конструкцию, и либо невнимательно читал статью, либо одно из двух. Прием заработал, а вот отправка зависала и программа и адаптер, после анализа понял что не хватает питания CAN-трансиверу, по даташиту ему положено от 4.5 вольт, а на нем почему-то только 3.5 оставалось при питании от USB, видимо на входном диоде слишком много падает.
Переделал немного схему так, чтобы МК питался от USB через стабилизатор 3.3в, а CAN-трансивер уже от 12 вольт через стабилизатор на 5В и все взлетело, пакеты стали и отправляться и приниматься.
Единственная беда пока не разобрался — при отправке в цикле через какое-то время адаптер зависает.
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.