跳转至

CANBUS 协议 (CANBUS protocol)

本文档描述了 Klipper 通过CAN总线进行通信的协议。参见了解如何在 Klipper 中配置 CAN 总线。

分配微控制器 ID (Micro-controller id assignment)

Klipper使用 CAN 2.0A 标准大小的 CAN Bus 包,是一个被限制在8 data bytes 和 11-bit CAN Bus 标识符。为了支持更高效的传输,每个微控制器 (micro-controller) 在运行时候去分配一个 1-byte 的CAN Bus nodeid (canbus_nodeid) 通常来说用于Klipper 的命令和响应通信。主机到微控制器的Klipper命令信息使用canbus_nodeid * 2 + 256的CAN总线ID,而从微控制器到主机的Klipper响应信息使用canbus_nodeid * 2 + 256 + 1

每个微控制器出厂时都有一个用于ID分配的唯一的芯片标识符。这个标识符可以超过一个 CAN 数据包的长度,一个哈希函数会用出厂标识符生成一个唯一的 6 字节标识(canbus_uuid)。

管理消息

管理信息用于 ID 分配。从主机发送到微控制器的管理消息使用CAN总线的 ID 0x3f0,而从微控制器发送到主机的消息使用CAN总线的 ID 0x3f1。所有的微控制器都听从ID 0x3f0上的消息;这个 ID 可以被认为是一个"广播地址"。

CMD_QUERY_UNASSIGNED 消息

该命令查询所有尚未被分配 canbus_nodeid 的微控制器。未分配的微控制器将以 RESP_NEED_NODEID 响应消息进行回应。

CMD_QUERY_UNASSIGNED 消息格式是:<1-byte message_id = 0x00>

CMD_SET_KLIPPER_NODEID 信息

这个命令根据微处理器给定的 canbus_uuid 给相应的微处理器分配一个 canbus_nodeid

CMD_SET_KLIPPER_NODEID 消息的格式是:<1-byte message_id = 0x01><6-byte canbus_uuid><1-byte canbus_nodeid>

RESP_NEED_NODEID 消息

RESP_NEED_NODEID 消息的格式是:<1-byte message_id = 0x20><6-byte canbus_uuid><1-byte set_klipper_nodeid = 0x01>

数据包

被 CMD_SET_KLIPPER_NODEID 命令分配了节点的微控制器可以接受和发送数据包。

带有节点接收 CAN 总线ID(canbus_nodeid * 2 + 256)的消息中的数据包被简单地添加到一个缓冲区,当一个完整的mcu 协议消息被找到时,其内容会被解析和处理。数据被视为比特流(byte stream)- Klipper信息块的开头不需要与CAN bus的数据包开头对齐。

类似地,mcu 协议消息响应通过将消息数据插入到具有节点发送 CAN 总线 ID 的一个或多个数据包(canbus_nodeid * 2 + 256 + 1)并从微控制器发送到主机。

回到页面顶部