BLE module selection: choose nRF52840 (MDBT50Q, SWD pins 51/53); note u.FL vs chip-antenna SKU; reject AT-command and SPI-host modules

This commit is contained in:
2026-08-18 00:26:23 +02:00
parent 37f73457bb
commit e5967be136
+52 -5
View File
@@ -1,15 +1,62 @@
# BLE-MIDI add-on: EFM8 ↔ nRF52 custom framed protocol # BLE-MIDI add-on: EFM8 ↔ nRF52 custom framed protocol
Plan for adding Bluetooth MIDI to the QuNexus by attaching a BLE-MIDI Plan for adding Bluetooth MIDI to the QuNexus by attaching a BLE-MIDI
module (bare **nRF52832**, chosen for lowest power / battery-later) to the module to the EFM8's dormant **UART1** — the same pair wired to the empty
EFM8's dormant **UART1** — the same pair wired to the empty MIDI-expander MIDI-expander jack (**P1.2 / P1.3**, pins 44 / 43). UART1 is never enabled
jack (**P1.2 / P1.3**, pins 44 / 43). UART1 is never enabled in stock v2.2.1 in stock v2.2.1 firmware (no `XBR2` write, no `SBUF1`/`SCON1` use), so we
firmware (no `XBR2` write, no `SBUF1`/`SCON1` use), so we reclaim it for BLE reclaim it for BLE without disturbing the DIN-MIDI UART0 or the P2/P3/P4
without disturbing the DIN-MIDI UART0 or the P2/P3/P4 scan bus. scan bus.
See [[EFM8UB20_PINOUT.md]] for the pin map and the port-config block this See [[EFM8UB20_PINOUT.md]] for the pin map and the port-config block this
modifies. modifies.
## Module selection
**Chosen: Seeed/Raytac MDBT50Q — nRF52840, 1 MB flash / 256 kB RAM, BT 5.4,
~15.5 × 10.5 × 2.05 mm, certified.** SWD is broken out (**pin 51 = SWDIO,
pin 53 = SWDCLK**), it ships **blank**, so we SWD-flash our own BLE-MIDI +
framed-protocol firmware onto it. The nRF52840 has the most BLE-MIDI
reference code of any nRF52 (Nordic nRF5 SDK BLE-MIDI example, Adafruit
Bluefruit MIDI mode) — we lift the BLE-MIDI GATT layer and add our
framed-protocol UART handler on top. Battery-acceptable (system-off ~1.5 µA,
BLE-connected a few mA avg). Wiring uses only 6 of its 61 pads: VDD, GND,
UART TX, UART RX, SWDIO, SWDCLK.
> **Antenna variant — watch the SKU.** The Seeed **MDBT50Q-U1M** is the
> **u.FL** variant: **no onboard antenna**, just a u.FL jack → needs an
> **external 2.4 GHz antenna on a u.FL pigtail** routed to a board edge
> inside the case (keep-out ~3–5 mm at the antenna end). If you'd rather
> avoid the external antenna, get the **chip-antenna variant Raytac
> MDBT50Q-1MEN** (same module, onboard chip antenna, no u.FL). Same SWD
> pins, same firmware. Prefer the chip-antenna SKU unless the u.FL +
> external antenna is deliberately wanted for edge placement.
**Smaller fallback (if case space is tight): Raytac MDBT42Q-512KV2 —
nRF52832, 512 kB / 64 kB, ~6.5 × 7.1 × 1.6 mm, onboard chip antenna.** Same
SWD-exposed/blank profile, lowest power, smallest fit, and it *does* have
the integrated antenna — but less headroom and less ready-made BLE-MIDI
code than the 52840.
### Hard selection rules (do not re-evaluate against these)
- **Must expose SWD and be blank/reflashable.** We load our own BLE-MIDI
firmware; a sealed module is unusable.
- **Reject AT-command / "transparent serial" modules** (e.g. Raytac
MDBT42T-AT / WRL-25466, nRF52805). They advertise the **Nordic UART
Service** (`6E400001-…`), not **BLE-MIDI** (`03B80E5A-…`). iOS/macOS/DAWs
scan for the MIDI UUID and will not present an NUS device as a MIDI
source. Their AT command set cannot change the advertised service. The
MDBT42T-AT also exposes **no SWD** (19 pads, none SWDIO/SWCLK), so it
can't be reflashed either — doubly unsuitable.
- **Reject SPI-only radio modules that need a host to run the BLE stack**
(e.g. Raspberry Pi Radio Module 2 / RMC20452T, Infineon CYW43439). The
BLE stack (BTstack) runs on an RP2040 host over a bespoke gSPI; the
module cannot talk to the EFM8 directly (no SPI on the EFM8, and it
can't run BTstack). That makes a 3-chip build (EFM8 + RP2040 + radio),
and the Wi-Fi combo chip is power-hungry — wrong for battery-later.
(A Pico W is the cheap bench-prototype instantiation of that
architecture, but it is not the final-build path.)
## Transport: frame everything (SLIP-style) ## Transport: frame everything (SLIP-style)
MIDI bytes and control commands share one UART, so **both** are carried in MIDI bytes and control commands share one UART, so **both** are carried in