CAN на ESP32 с Nodemcu
Я пробовал различные сборки Nodemcu на основе idf 4 (включая онлайн-конструктор) и не могу заставить шину CAN работать на встроенном контроллере CAN. Когда я делаю menuconfig, я ничего не вижу о модуле CAN, кроме конфигурации TWAI. Я считаю, что модуль включен в сборку по умолчанию, но, возможно, это не так. Спасибо за любой совет!
local can = require("can") --just for test
can.setup({
speed = 500,
tx = 5,
rx = 4,
dual_filter = false,
code = 0,
mask = 0xffffffff
}, function(format, msg_id, data)
print(format, msg_id, data)
end)
sendTimer = tmr.create()
sendTimer:register(1000, tmr.ALARM_AUTO, function()
can.send(can.STANDARD_FRAME, 0x123, "a");
print('send...')
end)
can.start()
sendTimer:start()
Пытаюсь отправить и получить сообщение CAN, но это не работает. Некоторые из моих сборок выдают сообщение о том, что CAN не определено (can.lua:2: попытка индексировать нулевое значение (поле 'can')), и сборка из онлайн-сервиса ( где в списке модулей оказывается kan) дают эффект:
- переданное сообщение с другого устройства, которое я вижу в CAN-сниффере, но в моем коде обратного вызова нет вызова.
- Когда я пытаюсь отправить сообщение каждые 1000 мс, я не вижу никакой активности на выводе TX на ESP32 (измерьте осциллографом)
1 ответ
Как оказалось, CAN-контроллер в ESP32 довольно специфичен. В espidf есть упоминание:
Внешний трансивер должен внутренне связать вход TX и выход RX так, чтобы изменение логического уровня линии сигнала TX можно было наблюдать на линии RX. Если этого не сделать, контроллер CAN будет интерпретировать разницу в логических уровнях между двумя сигнальными линиями как потерю в арбитраже или битовую ошибку.
Мне удалось установить обмен сначала между 2, а затем и 3 устройствами, но подключив другое, отличающееся только ревизией чипа (судя по отладочной информации, успешно работающие устройства имеют чип rev3, а устройство, вызвавшее в конечном итоге у автобуса, который должен упасть, есть чип rev1). Никаких закономерностей относительно доработки чипа в документации или опечаток мне найти не удалось.