CANBUS Protokoll¶
Dieses Dokument beschreibt das Protokoll, das Klipper für die Kommunikation über den CAN-Bus verwendet. Informationen zur Konfiguration von Klipper mit CAN-Bus finden Sie unter
Mikrocontroller-ID-Zuweisung¶
Klipper verwendet nur CAN 2.0A Standard-CAN-Bus-Pakete, die auf 8 Datenbytes und einen 11-Bit-CAN-Bus-Identifier begrenzt sind. Um eine effiziente Kommunikation zu unterstützen, wird jedem Mikrocontroller während der Laufzeit eine eindeutige 1-Byte-CAN-Bus-Nodeid (canbus_nodeid) für den allgemeinen Klipper-Befehls- und Antwortverkehr zugewiesen. Klipper-Befehlsnachrichten, die vom Host zum Mikrocontroller gehen, verwenden die CAN-Bus-ID canbus_nodeid * 2 + 256, während Klipper-Antwortnachrichten vom Mikrocontroller zum Host canbus_nodeid * 2 + 256 + 1 verwenden.
Jeder Mikro-Kontroller hat eine vom Hersteller eindeutige Chipidentifizierung, die bei der Vergabe der Id genutzt wird. Diese Chipidentifizierung kann länger als ein CAN Packet sein, weshalb diese gehasht wird um eine 6 byte lange (canbus_uuid) aus der Chipid zu erhalten.
Admin Nachrichten¶
Admin-Nachrichten dienen der ID-Zuweisung. Vom Host an den Mikrocontroller gesendete Admin-Nachrichten verwenden die CAN-Bus-ID 0x3f0, vom Mikrocontroller an den Host gesendete Nachrichten die CAN-Bus-ID 0x3f1. Alle Mikrocontroller hören auf Nachrichten mit der ID 0x3f0; diese ID kann als "Broadcast-Adresse" verstanden werden.
CMD_QUERY_UNASSIGNED Nachricht¶
Dieser Befehl fragt alle Mikrocontroller ab, denen noch keine canbus_nodeid zugewiesen wurde. Nicht zugewiesene Mikrocontroller antworten mit einer Antwortnachricht RESP_NEED_NODEID.
Das CMD_QUERY_UNASSIGNED Nachrichtenformat ist: <1-byte message_id = 0x00>
CMD_SET_KLIPPER_NODEID Nachricht¶
Dieser Befehl weist dem Mikrocontroller mit einer bestimmten canbus_uuid einecanbus_nodeid zu.
Das Nachrichtenformat von CMD_SET_KLIPPER_NODEID lautet: <1-byte message_id = 0x01><6-byte canbus_uuid><1-byte canbus_nodeid>
RESP_NEED_NODEID Nachricht¶
Das Nachrichtenformat von RESP_NEED_NODEID lautet: <1-byte message_id = 0x20><6-byte canbus_uuid><1-byte set_klipper_nodeid = 0x01>
Datenpakete¶
Ein Mikrocontroller, dem über den Befehl CMD_SET_KLIPPER_NODEID eine nodeid zugewiesen wurde, kann Datenpakete senden und empfangen.
Die Paketdaten von Nachrichten, die die Empfangs-CAN-Bus-ID des Knotens (canbus_nodeid * 2 + 256) verwenden, werden schlicht an einen Puffer angehängt; sobald ein vollständiger MCU-Protokollnachrichtenblock gefunden ist, wird dessen Inhalt geparst und verarbeitet. Die Daten werden als Bytestrom behandelt - der Beginn eines Klipper-Nachrichtenblocks muss nicht mit dem Beginn eines CAN-Bus-Pakets zusammenfallen.
Ebenso werden Antworten auf MCU-Protokollnachrichten vom Mikrocontroller an den Host gesendet, indem die Nachrichtendaten in ein oder mehrere Pakete mit der Sende-CAN-Bus-ID des Knotens (canbus_nodeid * 2 + 256 + 1) kopiert werden.