feat: CAN bus driver for BLDC motor controllers (Issue #597) #610

Merged
sl-jetson merged 1 commits from sl-firmware/issue-597-can-driver into main 2026-03-14 16:27:36 -04:00
Collaborator

Summary

Implements CAN2.0B bus driver for two BLDC motor controllers (left / right wheels) on the STM32F722 flight controller.

  • include/can_driver.h / src/can_driver.c — full HAL_CAN2 driver
    • PB12 (RX) / PB13 (TX), AF9, 500 kbps (PSC=6, BS1=13tq, BS2=4tq, sample 77.8%)
    • Filter bank 14 (SlaveStartFilterBank=14); 32-bit mask; RX FIFO0; std IDs 0x200–0x21F
    • TX: 0x100+nid velocity+torque cmd (DLC=4, little-endian int16 pair) at 100 Hz
    • TX: 0x110+nid enable/disable cmd (DLC=1); follows arm state
    • RX: 0x200+nid feedback frame (DLC=8: vel_rpm, current_ma, pos_x100, temp_c, fault)
    • AutoBusOff=ENABLE for hardware recovery; can_driver_process() drains FIFO0 each tick
  • include/jlink.h — protocol extensions
    • JLINK_CMD_CAN_STATS_GET (0x10): on-demand stats request
    • JLINK_TLM_CAN_STATS (0x89): 16-byte stats telemetry
    • Added JLINK_TLM_SLOPE (0x88) + jlink_tlm_slope_t missing from Issue #600
  • src/jlink.cjlink_send_can_stats() frame encoder + dispatch
  • src/main.c — 100 Hz differential-drive TX, arm-state enable, 1 Hz stats TLM
  • include/config.hCAN_RPM_SCALE=10, CAN_TLM_HZ=1

Closes #597

## Summary Implements CAN2.0B bus driver for two BLDC motor controllers (left / right wheels) on the STM32F722 flight controller. - **`include/can_driver.h` / `src/can_driver.c`** — full HAL_CAN2 driver - PB12 (RX) / PB13 (TX), AF9, 500 kbps (PSC=6, BS1=13tq, BS2=4tq, sample 77.8%) - Filter bank 14 (SlaveStartFilterBank=14); 32-bit mask; RX FIFO0; std IDs 0x200–0x21F - TX: `0x100+nid` velocity+torque cmd (DLC=4, little-endian int16 pair) at 100 Hz - TX: `0x110+nid` enable/disable cmd (DLC=1); follows arm state - RX: `0x200+nid` feedback frame (DLC=8: vel_rpm, current_ma, pos_x100, temp_c, fault) - AutoBusOff=ENABLE for hardware recovery; `can_driver_process()` drains FIFO0 each tick - **`include/jlink.h`** — protocol extensions - `JLINK_CMD_CAN_STATS_GET` (0x10): on-demand stats request - `JLINK_TLM_CAN_STATS` (0x89): 16-byte stats telemetry - Added `JLINK_TLM_SLOPE` (0x88) + `jlink_tlm_slope_t` missing from Issue #600 - **`src/jlink.c`** — `jlink_send_can_stats()` frame encoder + dispatch - **`src/main.c`** — 100 Hz differential-drive TX, arm-state enable, 1 Hz stats TLM - **`include/config.h`** — `CAN_RPM_SCALE=10`, `CAN_TLM_HZ=1` Closes #597
sl-webui added 1 commit 2026-03-14 15:16:33 -04:00
- Add can_driver.h / can_driver.c: CAN2 on PB12/PB13 (AF9) at 500 kbps
  APB1=54 MHz, PSC=6, BS1=13tq, BS2=4tq, SJW=1tq → 18tq/bit, SP 77.8%
  Filter bank 14 (SlaveStartFilterBank=14); 32-bit mask; FIFO0
  Accept std IDs 0x200–0x21F (left/right feedback frames)
  TX: velocity+torque cmd (0x100+nid, DLC=4) at 100 Hz via main loop
  RX: velocity/current/position/temp/fault feedback (0x200+nid, DLC=8)
  AutoBusOff=ENABLE for HW recovery; can_driver_process() drains FIFO0
- Add JLINK_TLM_CAN_STATS (0x89, 16 bytes) + JLINK_CMD_CAN_STATS_GET (0x10)
  Also add JLINK_TLM_SLOPE (0x88) + jlink_tlm_slope_t missing from Issue #600
- Wire into main.c: init after jlink_init; 100Hz TX loop (differential drive
  speed_rpm ± steer_rpm/2); CAN enable follows arm state; 1Hz stats telemetry
- Add CAN_RPM_SCALE=10 and CAN_TLM_HZ=1 to config.h

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
sl-jetson force-pushed sl-firmware/issue-597-can-driver from a8816d4226 to 2996d18ace 2026-03-14 15:58:19 -04:00 Compare
sl-jetson merged commit c0bb4f6276 into main 2026-03-14 16:27:36 -04:00
Sign in to join this conversation.
No Reviewers
No Label
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: seb/saltylab-firmware#610
No description provided.