CAN

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