Емельянов Эдуард Владимирович (eddy_em) wrote,
Емельянов Эдуард Владимирович
eddy_em

Category:

CAN-сниффер

Можно сказать, дописал CAN-сниффер.

Железяка работает на STM32F042 или STM32F072 с достаточным количеством ног, чтобы одновременно можно было подключить и CAN, и USB. В принципе, можно убрать USB и работать через USART1.
Подключаемся терминалом, нажимаем Enter и тем самым активируем USB-консоль (по умолчанию активирован вывод в USART1, а т.к. у меня используется один буфер и туда, и сюда, то одновременно USART1 и USB могут подглючивать, выплевывая куски чужих буферов).
Если в CAN-шине что-то есть, начинаем получать сообщения вида "Timestamp #ID data0 ... dataN" — время со старта МК в условных миллисекундах, идентификатор и данные сообщения. Timestamp - в десятичной форме, остальное - в шестнадцатеричной.
Сейчас у меня для тестов подключен резервный контроллер для термомониторинга. Если там ввести команды P, 0P, 1P, 2P ("широковещательный" пинг и пинг на контроллеры с номерами 0..2), получаем в терминале сниффера:
810442 #0x07f7 0xa5 0x00
811541 #0x02a0 0xa5 0x00
812579 #0x02a1 0xa5 0x00
813580 #0x02a2 0xa5 0x00

Если нажать ? или символ, на который нет короткой команды, как обычно вылезет справка:
'a' - add ID to ignore list (max 10 IDs)
'b' - reinit CAN with given baudrate
'B' - send broadcast dummy byte
'C' - send dummy byte over CAN
'd' - delete ignore list
'f' - add/delete filter, format: bank# FIFO# mode(M/I) num0 [num1 [num2 [num3]]]
'F' - send/clear flood message: F ID byte0 ... byteN
'G' - get CAN address
'I' - reinit CAN (with new address)
'l' - list all active filters
'p' - print ignore buffer
'P' - pause/resume in packets displaying
'R' - software reset
's/S' - send data over CAN: s ID byte0 .. byteN
'T' - gen time from start (ms)
'U' - send test string over USB
'W' - test watchdog

Часть опций нафиг не нужны и являются тестовыми, основные же — 'a' (дополнить "черный список" софтового фильтра очередным идентификатором), 'b' (поменять скорость шины), 'd' (очистить "черный список"), 'f' (добавить/удалить аппаратные фильтры; по умолчанию активировано 2 фильтра: на четные для FIFO1 и нечетные для FIFO0), 'F' (запустить "флудовое" сообщение, которое будет вбрасываться в шину каждые >5мс), 'l' (отображение активных аппаратных фильтров), 'p' (отображение "черного списка"), 'P' (приостановить/возобновить отображение пойманных в шине пакетов), 's' (послать одиночное сообщение).
Список аппаратных фильтров отображается вполне человекочитаемо:
Filter 0, FIFO0 in MASK mode: ID=0x01, MASK=0x01 
Filter 1, FIFO1 in MASK mode: ID=0x00, MASK=0x01

Задается в формате №банка №FIFO режим данные, где №банка — номер банка фильтра (от 0 до 27), №FIFO — буфер FIFO для этого фильтра (0 или 1), режим — список идентификаторов (I, можно до четырех идентификаторов указать) или маска (M, можно указать до двух штук).
Сообщение отсылается просто: указываем идентификатор и (если нужно) байты данных. Например, чтобы послать на контроллер запрос на измерение температуры, пишем: s 0x02a1 0xa5 0x0c
В ответ получаем:
Message parsed OK

1285940 #0x02a0 0x5a 0x01 0x0c 0x01 0x68

0x0168 — это 36°C (условных, т.к. температура МК у STM32 измеряется довольно-таки грубо).
Если захотим пофлудить в шину, запускаем то же самое, но вместо 's' пишем 'F': F 0x02a1 0xa5 0x0c. В этом случае, если выхлоп не стоит на паузе, будем получать гору сообщений вроде
1525728 #0x02a0 0x5a 0x01 0x0c 0x01 0x68
1525733 #0x02a0 0x5a 0x01 0x0c 0x01 0x68
1525738 #0x02a0 0x5a 0x01 0x0c 0x01 0x68
1525743 #0x02a0 0x5a 0x01 0x0c 0x01 0x6a
1525748 #0x02a0 0x5a 0x01 0x0c 0x01 0x67

Сначала я "флудилку" запускал в свободном режиме, но то ли USB у меня начинал "захлебываться", то ли еще почему срабатывал вотчдог, и я поставил минимальную паузу на примерно 5мс.
Чтобы закончить "флуд", вводим неправильные данные команде 'F' (проще вообще не давать параметры):
F
NO ID given, send nothing!

(на самом деле у меня между эхом F и этим сообщением прошло 320мс — так долго я раздумывал нажать Enter; во второй раз нажал быстро, получилась пауза в 90мс).

Было бы неплохо проверить эту штуку на реальной CAN'овской железяке, но сейчас на работе, к сожалению, ничего подходящего нет. Буду ждать, пока придут драйвера ШД на CanOpen. Для них нужно будет либо под STM32 какую-нибудь canopen-прослойку написать, либо же использовать сниффер и весь cannopen'овский тупняк делать на компьютере.
Как я ненавижу CanOpen!!!
Tags: #id, stm32
Subscribe

  • Опять Подорванка смыла мост

    В четверг лило настолько, что, похоже, опять на подорванке забилась стремнина бревнами, а потом внезапно это все прорвало. МЧСовсцы перетаскивали…

  • Аж коробит…

    Уже который раз вижу (даже в прессе) выражение: "ставить прививку". Это что за странное такое словоблудие? Либо эпохи царской России, либо даже…

  • Упаковочка

    Получил сегодня пару посылок с алиэкспресса. Одна из них была с новым для меня способом доставки (на посылке не указывался адрес, а лишь "до…

promo eddy_em august 17, 2019 12:33 3
Buy for 10 tokens
Юра намедни напечатал корпус для хронометра. Для первого блина получилось неплохо: И еще немного фотографий:
  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic
  • 0 comments