saltylab-firmware/USB_CDC_BUG.md
2026-02-28 11:59:53 -05:00

2.0 KiB

USB CDC TX Bug — 2026-02-28

Problem

Balance firmware produces no USB CDC output. Minimal "hello" test firmware works fine.

What Works

  • Test firmware (just sends {"hello":N} at 10Hz after 3s delay): DATA FLOWS
  • USB enumeration works in both cases (port appears as /dev/cu.usbmodemSALTY0011)
  • DFU reboot via RTC backup register works (Betaflight-proven pattern)

What Doesn't Work

  • Balance firmware: port opens, no data ever arrives
  • Tried: removing init transmit, 3s boot delay, TxState recovery, DTR detection, streaming flags
  • None of it helps

Key Difference Between Working & Broken

  • Working test: main.c only includes USB CDC headers, HAL, string, stdio
  • Balance firmware: includes icm42688.h, bmp280.h, balance.h, hoverboard.h, config.h, status.h
  • Balance firmware inits SPI1 (IMU), USART2 (hoverboard), GPIO (LEDs, buzzer)
  • Likely culprit: peripheral init (SPI/UART/GPIO) is interfering with USB OTG FS

Suspected Root Cause

One of the additional peripheral inits (SPI1 for IMU, USART2 for hoverboard ESC, or GPIO for status LEDs) is likely conflicting with the USB OTG FS peripheral — either a clock conflict, GPIO pin conflict, or interrupt priority issue.

Hardware

  • MAMBA F722S FC (STM32F722RET6)
  • Betaflight target: DIAT-MAMBAF722_2022B
  • IMU: MPU6000 on SPI1 (PA4/PA5/PA6/PA7)
  • USB: OTG FS (PA11/PA12)
  • Hoverboard ESC: USART2 (PA2/PA3)
  • LEDs: PC14, PC15
  • Buzzer: PB2

Files

  • PlatformIO project: ~/Projects/saltylab-firmware/ on mbpm4 (192.168.87.40)
  • Working test: was in src/main.c (replaced with balance code)
  • Balance main.c backup: src/main.c.bak
  • CDC implementation: lib/USB_CDC/src/usbd_cdc_if.c

To Debug

  1. Add peripherals one at a time to the test firmware to find which one breaks CDC TX
  2. Check for GPIO pin conflicts with USB OTG FS (PA11/PA12)
  3. Check interrupt priorities — USB OTG FS IRQ might be getting starved
  4. Check if DCache (disabled via SCB_DisableDCache) is needed for USB DMA