45 lines
2.0 KiB
Markdown
45 lines
2.0 KiB
Markdown
# 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
|