我尝试了各种基于 idf 4 的 Nodemcu 构建(包括在线构建器),但无法让 CAN 总线在内置 CAN 控制器上工作。当我执行 make menuconfig 时,除了 TWAI 配置之外,我看不到任何关于 CAN 模块的信息。我相信该模块默认包含在构建中,但也许情况并非如此。 感谢您的任何建议!
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 not not defined 的消息(can.lua:2: attempt to index a nil value (field 'can') ),并从在线服务构建(kan 在模块列表中的最终位置)给出了效果:
事实证明,ESP32 中的 CAN 控制器非常具体。 espidf中有一些提及:
外部收发器必须在内部连接 TX 输入和 RX 输出,以便可以在 RX 线上观察到 TX 信号线的逻辑电平变化。如果不这样做,将导致 CAN 控制器将两条信号线之间的逻辑电平差异解释为仲裁丢失或位错误。
我设法先在 2 个和 3 个设备之间建立交换,但是通过连接另一个仅在芯片版本上不同的设备(根据调试信息判断,成功工作的设备具有芯片 rev3,最终导致的设备下降的公共汽车有芯片 rev1)。 我在文档或勘误表中找不到关于芯片修订的任何规律。