Железяка работает на 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!!!
Journal information