CAN
Этот модуль содержит функции для доступа к Controller Area Network (CAN).
В ESP32 доступен только один модуль CAN, который определен константой can.CAN0.
Controller Area Network (CAN bus) — это стандарт автомобильной шины, разработанный для обеспечения коммуникации между микроконтроллерами и устройствами в приложениях без использования хоста. Это протокол на основе сообщений, первоначально разработанный для мультиплексирования электропроводки в автомобилях, но также используемый во многих других контекстах.
Модуль CAN ESP32 основан на контроллере CAN SJA1000 и требует внешнего передатчика CAN, такого как VP231.
Предлагаемое подключение:
ESP32 | VP231 | Назначение |
---|---|---|
GPIO5 / GPIO12 / GPIO25 | D | CAN TX |
GPIO4 / GPIO14 / GPIO35 | R | CAN RX |
can.attach(id, speed, [rx queue] )
Подключить устройство CAN. При подключении устройства не определяются фильтры, и принимаются все пакеты CAN.
Аргументы:
- id: идентификатор модуля CAN, например, can.CAN0.
- speed: скорость шины CAN, выраженная в Кбит/с. Может быть 1000, 800, 500, 250, 125, 100, 50 или 25.
- rx queue (опционально): размер очереди приема, выраженный в количестве кадров. Если не указано, размер очереди приема устанавливается равным 200 кадрам.
Возвращает: ничего или исключение.
-- Attach the CAN device to CAN0 at 500 Kbps
can.attach(can.CAN0, 500)
can.addfilter(id, from, to)
Добавить фильтр. Принимаются только пакеты CAN, соответствующие фильтру.
Аргументы:
- id: идентификатор модуля CAN, например, can.CAN0.
- from: первый id.
- to: последний id.
Возвращает: ничего или исключение.
-- Attach the CAN device to CAN0 at 500 Kbps
can.attach(can.CAN0, 500)
-- Accept only packets from 200 to 250
can.addfilter(can.CAN0, 200, 250)
can.removefilter(id, from, to)
Удалить фильтр. Если удалены все фильтры, принимаются все пакеты CAN.
Аргументы:
- id: идентификатор модуля CAN, например, can.CAN0.
- from: первый id.
- to: последний id.
Возвращает: ничего или исключение.
-- Attach the CAN device to CAN0 at 500 Kbps
can.attach(can.CAN0, 500)
-- Accept only packets from 200 to 250
can.addfilter(can.CAN0, 200, 250)
....
-- Remove filter from 200 to 250
can.removefilter(can.CAN0, 200, 250)
can.send(id, frame id, frame type, len, data)
Отправить кадр данных CAN по шине CAN.
Аргументы:
- id: идентификатор модуля CAN.
- frame id: идентификатор кадра.
- frame type: тип кадра, может быть либо can.STD для 11-битного идентификатора, либо can.EXT для 29-битного идентификатора.
- len: длина кадра (максимум 8 байт согласно спецификации CAN).
- data: строка с данными для отправки.
Возвращает: ничего или исключение.
-- Attach the CAN device to CAN0 at 500 Kbps
can.attach(can.CAN0, 500)
-- Send a data frame with standard identifier 100 and contents 1234
can.send(can.CAN0, 100, can.STD, 4, "1234")
frame id, frame type, len, data = can.receive(id, [timeout)
Получить кадр данных CAN с шины CAN. Ответственность программиста фильтровать полученные кадры, так как возможности фильтрации в настоящее время не реализованы.
Аргументы:
- id: идентификатор модуля CAN.
- timeout (необязательно): таймаут, выраженный в мс. Если сообщение CAN не получено в течение таймаута, выдается исключение can.error.TransmitTimeout. Если таймаут равен nil или не указан, функция блокирует текущий поток, пока не будет получено сообщение CAN.
Возвращает:
- frame id: идентификатор кадра.
- frame type: тип кадра, может быть can.STD или can.EXT.
- len: длина полученного кадра.
- data: строка с данными полученного кадра.
-- Attach the CAN device to CAN0 at 500 Kbps
can.attach(can.CAN0, 500)
-- Receive data frame
id, type, len, data = can.receive(can.CAN0)
can.stats([table])
Получить статистику шины CAN.
Аргументы:
- table: если true, статистика помещается в таблицу Lua, если false — статистика выводится в консоль.
Возвращает:
если table равно false: ничего или исключение. если table равно true: таблицу Lua со статистикой шины CAN или исключение. Таблица имеет следующие поля:
- rx_packets: количество принятых пакетов
- rx_bytes: количество принятых байтов
- tx_packets: количество отправленных пакетов
- tx_bytes: количество отправленных байтов
- hw_overruns: количество ошибок переполнения оборудования
- sw_overruns: количество ошибок переполнения программного обеспечения
- bus_error: количество ошибок шины
- arbitration_lost_errors: количество ошибок потери арбитража
- passive_errors: количество пассивных ошибок
- irq_errors: количество ошибок прерывания
/ > can.stats()
RX packets:147 bytes:0
TX packets:3 bytes:24
hw overruns:0
sw overruns:0
errors:
hw overruns:0
sw overruns:0
bus:0 arbitration lost:0 passive:0 irq:0
can.dump(id)
Функция позволят прослушивать пакеты с инетрфейса. Для выхода нажмите Ctrl-c.
Аргументы:
- id: идентификатор модуля CAN.
Возвращает: ничего или исключение.
-- Attach the CAN device to CAN0 at 500 Kbps
can.attach(can.CAN0, 500)
can.dump(can.CAN0)
can0 00000064 [8] 10 bf ba 52 4d 3f dd 80
can0 00000064 [8] 9e cf e2 09 aa 2f 29 1e
can0 00000064 [8] fa 38 e3 9b 2f 31 0d 17
can0 00000064 [8] 4e af a4 dd b6 94 fb d0
can0 00000064 [8] df e7 61 e2 9b 62 4c c3
can0 00000064 [8] ba 4e ed 46 20 5e 45 9c
can0 00000064 [8] f9 55 e7 60 c3 b0 3f a7
can0 00000064 [8] 9d 5c 17 c3 53 dd ec 15
can0 00000064 [8] d5 c6 39 3c 36 c1 dd b9
can0 00000064 [8] 1c 72 95 d4 01 d3 b3 e6
can0 00000064 [8] 34 5d 14 a7 f9 92 7a 1e
can0 00000064 [8] 56 f8 01 2f 3e a6 3b 1b
can0 00000064 [8] 16 64 a5 85 5e 03 10 43
can0 00000064 [8] 58 87 ec 33 b7 0e a1 7e
can0 00000064 [8] bc 85 ed 8a ec fc ae 61
can0 00000064 [8] 5b da b9 63 19 a7 62 07
can0 00000064 [8] 9a 8c 9d 69 3a 9f b6 6e
can0 00000064 [8] a5 ea 9b 72 a9 d5 cc 73
can0 00000064 [8] 6e 40 73 23 a0 cf 7e 61
can0 00000064 [8] 08 91 93 d4 56 21 f9 57
can0 00000064 [8] 5a b1 2f 5d 3c b0 3a 56
can0 00000064 [8] a2 89 b5 98 cf 18 08 a8
can0 00000064 [8] 2e e4 b8 d8 b6 15 66 72
can0 00000064 [8] 49 3f 2b e7 a6 7a 8e b2
can0 00000064 [8] c3 99 9f fd 0f 63 08 47
can0 00000064 [8] 71 e8 0a 42 74 21 37 81
can0 00000064 [8] 05 f1 e7 41 e1 52 42 40
can0 00000064 [8] 67 c8 2f 5d ea 86 53 55