Klipper CAN Bus Setup Guide

MKS Monster8 v2 + BTT EBB36 v1.1 / v1.2

USB-CAN bridge mode ยท 1Mbit ยท No separate CAN adapter required ยท Katapult bootloader

๐Ÿ”ฅ
EBB36 v1.1 Heater Warning

The BOOT pin is pulled HIGH during DFU mode. This pin is shared with the heater โ€” your heater will activate while in DFU mode. Remove 24V power before entering DFU mode on the EBB36 v1.1.

This applies to the v1.1 board only. The v1.2 does not have this issue. All other instructions are identical for both versions.

Overview 1. Katapult (Monster8) 2. Klipper (Monster8) 3. CAN Interface 4. Katapult (EBB36) 5. Klipper (EBB36) 6. printer.cfg Troubleshooting
i

Overview

This guide covers setting up the MKS Monster8 v2 as a USB-CAN bridge โ€” it connects to the host computer via USB and acts as the CAN interface for toolhead boards like the EBB36. No separate USB-CAN adapter is required.

MKS Monster8 v2

  • MCU: STM32F407VET6
  • CAN pins: PB8 (RX) / PB9 (TX)
  • Bootloader: 32KiB offset
  • Clock: 8 MHz crystal
  • Role: USB-CAN bridge + printer MCU

BTT EBB36 v1.1 / v1.2

  • MCU: STM32G0B1
  • CAN pins: PB0 (RX) / PB1 (TX)
  • Bootloader: 8KiB offset
  • Clock: 8 MHz crystal
  • Role: Toolhead board via CAN
  • โš ๏ธ v1.1: Remove 24V before DFU mode
โ„น๏ธ
Naming noteThe tool was renamed from CanBoot to Katapult. Use ~/katapult/ wherever a guide says ~/CanBoot/. The output file is still named canboot.bin for legacy compatibility.
โšก
BitrateThis guide uses 1000000 (1Mbit) throughout. All devices on the CAN bus must use the same bitrate.
1

Flash Katapult โ€” Monster8 v2

Prerequisites

sudo apt install git dfu-util
cd ~
git clone https://github.com/Arksine/katapult ~/katapult
pip3 install pyserial --break-system-packages

Jumper Setup โ€” Before Connecting USB

JumperActionReason
USB Power (VUSB) INSTALL Powers the board from USB 5V for initial flashing โ€” no main power needed
CAN SELECT (ร—2) INSTALL in CAN position Routes PB8/PB9 to the RJ12 CAN port. Must be in CAN position, not I2C position

Put the Board in DFU Mode

Connect via USB-C. Then: hold BOOT0, tap RESET, release BOOT0.

lsusb | grep "0483:df11"
# Expected: STMicroelectronics STM Device in DFU Mode

Configure and Build Katapult

cd ~/katapult
make menuconfig
SettingValue
Micro-controller ArchitectureSTMicroelectronics STM32
Processor modelSTM32F407
Bootloader offset32KiB bootloader
Clock Reference8 MHz crystal
Communication interfaceCAN bus (on PB8/PB9)
CAN bus speed1000000
make clean && make

Flash Katapult

sudo dfu-util -a 0 -D ~/katapult/out/canboot.bin \
  --dfuse-address 0x08000000:force:mass-erase:leave -d 0483:df11
โ„น๏ธ
Expected errordfu-util: Error during download get_status after "File Downloaded Successfully" is normal. The firmware flashed successfully.

Verify Katapult is Running

Double-tap the RESET button, then check:

lsusb
# Expected: ID 1d50:6177 OpenMoko, Inc. stm32f407xx

ls /dev/serial/by-id/
# Expected: usb-katapult_stm32f407xx_XXXX-if00
2

Flash Klipper โ€” Monster8 v2 (USB-CAN Bridge)

Configure Klipper

cd ~/klipper
make menuconfig
Klipper menuconfig for Monster8 v2
Klipper menuconfig for Monster8 v2 โ€” USB-CAN bridge on PB8/PB9 at 1000000 baud
SettingValue
Enable extra low-level configuration optionsYes [*]
Micro-controller ArchitectureSTMicroelectronics STM32
Processor modelSTM32F407
Bootloader offset32KiB bootloader
Clock Reference8 MHz crystal
Communication interfaceUSB to CAN bus bridge (USB on PA11/PA12)
CAN bus interfaceCAN bus (on PB8/PB9)
CAN bus speed1000000
โš ๏ธ
Communication interface must be USB-CAN bridgeSetting this to plain "USB" will NOT create a can0 interface on the host. It must be "USB to CAN bus bridge (USB on PA11/PA12)".
๐Ÿšซ
Do not use alternate CAN pinsPA8/PA9 (EXT_1 header) and the dedicated CAN header TX/RX pins will not work โ€” they are not connected to the STM32 hardware CAN peripheral. Only PB8/PB9 (RJ12 port) works reliably.
make clean && make

Flash via Katapult

Double-tap RESET to enter Katapult mode, then flash:

python3 ~/katapult/scripts/flash_can.py -d \
  /dev/serial/by-id/usb-katapult_stm32f407xx_<YOURID>-if00
3

Set Up CAN Interface on Host

Kernel Requirement

The host kernel must have gs_usb support. Verify:

sudo modprobe gs_usb && echo "gs_usb available"
# If this fails, enable CONFIG_CAN_GS_USB=y and rebuild kernel

Configure can0

sudo nano /etc/network/interfaces.d/can0
allow-hotplug can0
iface can0 can static
 bitrate 1000000
 up ifconfig $IFACE txqueuelen 256
 pre-up ip link set can0 type can bitrate 1000000
 pre-up ip link set can0 txqueuelen 256

Jumper Change โ€” Before Connecting 24V

JumperActionReason
USB Power (VUSB) REMOVE Prevents back-feeding 5V through USB when 24V main power is connected. Failure to remove can damage the board.
120R termination INSTALL Terminates the Monster8 end of the CAN bus. Required when the Monster8 is at one physical end of the bus.

Reboot, then connect the Monster8 via USB and apply 24V power.

lsusb | grep "1d50:606f"
# Expected: OpenMoko, Inc. Geschwister Schneider CAN adapter

ip link show can0
# Expected: can0: <NOARP,UP,LOWER_UP,ECHO> ... state UP

Verify Monster8 on CAN Bus

~/katapult/scripts/flash_can.py -i can0 -q
# Expected:
# Detected UUID: XXXXXXXXXXXX, Application: Klipper
โœ…
Note the Monster8 UUID โ€” you will need it for printer.cfg.
4

Flash Katapult โ€” EBB36 v1.1 / v1.2

๐Ÿ”ฅ
v1.1 ONLY Heater warning โ€” remove 24V before DFU mode The BOOT pin is shared with the heater output on the EBB36 v1.1. Entering DFU mode while 24V is connected will activate the heater. Remove 24V power before proceeding. The v1.2 board does not have this issue.

Jumper Setup โ€” Before Connecting USB

JumperActionApplies ToReason
USB Power INSTALL v1.1 + v1.2 Powers the EBB36 from USB for DFU flashing

Put the EBB36 in DFU Mode

v1.1 Disconnect 24V power first. Then connect via USB.

v1.2 Connect via USB. 24V power state does not matter.

Hold BOOT, tap RESET, release BOOT.

lsusb | grep "0483:df11"
# Expected: STMicroelectronics STM Device in DFU Mode

Configure and Build Katapult

cd ~/katapult
make menuconfig
Katapult menuconfig for EBB36
Katapult menuconfig for EBB36 v1.1 / v1.2 โ€” STM32G0B1, CAN on PB0/PB1, 1000000 baud
SettingValue
Micro-controller ArchitectureSTMicroelectronics STM32
Processor modelSTM32G0B1
Bootloader offset8KiB offset
Clock Reference8 MHz crystal
Communication interfaceCAN bus (on PB0/PB1)
CAN bus speed1000000
Support bootloader entry on rapid double clickYes [*]
โ„น๏ธ
Small binary size is expectedThe canboot.bin for STM32G0B1 is approximately 4304 bytes. This is correct โ€” the bootloader is genuinely that small for this MCU.
make clean && make

Flash Katapult

sudo dfu-util -a 0 -D ~/katapult/out/canboot.bin \
  --dfuse-address 0x08000000:force:mass-erase:leave -d 0483:df11

The EBB36 will disappear from USB after flashing โ€” this is expected. Katapult runs in CAN-only mode with no USB presence.

Jumper Change โ€” Before Connecting to CAN Bus

JumperActionApplies ToReason
USB Power REMOVE v1.1 + v1.2 Board will now be powered by 24V via the CAN cable
120R termination INSTALL v1.1 + v1.2 Critical. The EBB36 is at the end of the CAN bus. Without this jumper the EBB36 will not communicate on the CAN bus at all. Jumper is near the CAN connector, labeled 120R.
๐Ÿšซ
Missing 120R jumper is the most common mistakeIf the EBB36 does not appear in the CAN query, check the 120R termination jumper first.

Verify Katapult on CAN Bus

Connect the EBB36 to the CAN bus. Apply 24V power via the CAN cable.

~/katapult/scripts/flash_can.py -i can0 -q
# Expected:
# Detected UUID: XXXXXXXXXXXX, Application: Klipper    โ† Monster8
# Detected UUID: YYYYYYYYYYYY, Application: Katapult   โ† EBB36
โš ๏ธ
EBB36 not appearing?Double-tap the RESET button. The bootloader has a brief window before jumping to the application. Try several times โ€” the timing is finicky.
โœ…
Note the EBB36 UUID โ€” you will need it for printer.cfg.
5

Flash Klipper โ€” EBB36 v1.1 / v1.2

Configure Klipper

cd ~/klipper
make menuconfig
Klipper menuconfig for EBB36
Klipper menuconfig for EBB36 v1.1 / v1.2 โ€” STM32G0B1, CAN on PB0/PB1, 1000000 baud
SettingValue
Enable extra low-level configuration optionsYes [*]
Micro-controller ArchitectureSTMicroelectronics STM32
Processor modelSTM32G0B1
Bootloader offset8KiB bootloader
Clock Reference8 MHz crystal
Communication interfaceCAN bus (on PB0/PB1)
CAN bus speed1000000
Optimize stepper code for step on both edgesYes [*] (recommended)
make clean && make

Flash via CAN

Ensure the EBB36 shows Application: Katapult in the CAN query, then:

python3 ~/katapult/scripts/flash_can.py -i can0 \
  -f ~/klipper/out/klipper.bin -u <EBB36_UUID>

Verify Both Boards Running Klipper

~/katapult/scripts/flash_can.py -i can0 -q
# Expected:
# Detected UUID: XXXXXXXXXXXX, Application: Klipper   โ† Monster8
# Detected UUID: YYYYYYYYYYYY, Application: Klipper   โ† EBB36
6

printer.cfg

[mcu]
canbus_uuid: XXXXXXXXXXXX  # Monster8 UUID

[mcu EBB36]
canbus_uuid: YYYYYYYYYYYY  # EBB36 UUID

Future Firmware Updates (OTA via CAN)

Once Klipper is running, future updates require no USB connection:

# Put EBB36 into Katapult mode
python3 ~/katapult/scripts/flash_can.py -i can0 -u <EBB36_UUID> -r

# Rebuild and flash
cd ~/klipper && make
python3 ~/katapult/scripts/flash_can.py -i can0 \
  -f ~/klipper/out/klipper.bin -u <EBB36_UUID>
!

Troubleshooting

SymptomLikely CauseFix
can0: No such devicegs_usb not loadedsudo modprobe gs_usb โ€” if fails, rebuild kernel with CONFIG_CAN_GS_USB=y
Unable to bind socket to can0Interface not upsudo ifup can0
Monster8 shows as 0483:df11 after flashKatapult not runningDouble-tap RESET button
EBB36 not in CAN queryMissing 120R termination jumperInstall 120R jumper on EBB36 near CAN connector
EBB36 not in CAN queryNo 24V powerVerify 24V wiring to EBB36 power input
EBB36 not in CAN queryKatapult jumped to appDouble-tap RESET โ€” timing is finicky, try several times
Heater activating during DFU v1.1BOOT pin shared with heaterRemove 24V power before entering DFU mode
No CAN traffic (candump can0 empty)CANH/CANL swappedSwap the two CAN signal wires
No CAN trafficWrong CAN pins in firmwareRebuild Monster8 with PB8/PB9, not PA8/PA9
WiFi lost after kernel rebuild (Surface RT)mwifiex was a kernel moduleRebuild with CONFIG_MWIFIEX=y and CONFIG_MWIFIEX_SDIO=y