なぜホストインタフェースが壁になるか

Bluetoothモジュール は単独では動きません。データを渡す MCU の裏に控えています。ホストインタフェースの品質——フレーミング、フロー制御、スリープハンドシェイク——が、製品が1週間で出るか3ヶ月かを決めます。本稿では量産向けのホストプロトコルを解説します。

物理層

  • UART 115200-921600 bps、8N1。921600 では基板をきれいに、配線 30 cm 未満に。
  • 460800 超は溢れ防止にハード RTS/CTS 必須。
  • 任意:スリープ連携用の `HOST_WAKE` GPIO 1 本。

2つのスタイル

スタイル 長所 短所
AT コマンド(文字) デバグ容易、人が読める 冗長、パーサ負荷
バイナリ(TLV/COBS) コンパクト、高速 ツール要

量産設定は AT、バルクデータはバイナリ。

AT フレーミング

<CR><LF>AT+NAME=Sensor01<CR><LF>
応答: <CR><LF>OK<CR><LF>
エラー: <CR><LF>ERROR:code<CR><LF>
  • 終端は CRLF。`\n` 単体には依存しない。
  • 立ち上げ時はエコーON、量産はOFF。
  • 非同期イベントは勝手に届く:`+EVENT:conn 1`。

バイナリフレーミング(TLV)

[0xAA][Len:2][Cmd:1][TLV...][CRC:2]
  • COBS で 0x00 エスケープを除去。
  • CRC-16/CCITT;全フレームで再計算。

フロー制御

  • CTS が Low = モジュールビジー、ホストは停止。
  • バルク送信はウィンドウ 4-8 フレーム;次バースト前に `OK` 待ち。

スリープハンドシェイク

モジュールは省電力で寝ます。ホストは送信前に起こします。

HOST: HOST_WAKE アサート(またはブレーク送信)
MODULE: 2 ms 以内に RTS を上げる
HOST: RTS 待ってから送信

これがないとバイトは静かに失われます。

スループット計算

115200 bps、8N1 効率 ≈ 11 bit/byte → 生 ~10.4 KB/s。プロトコル+ACK オーバヘッド ≈ 30% → 実効 ~7 KB/s。1 KB/s センサストリームなら余裕;音声は 921600 または SDIO を使ってください。

よくある落とし穴

  • CTS 忘れ → 高速で代入消失。
  • ホストパーサに watchdog なし → 不良フレームで停止。
  • ウェイク線なしで寝る → 「急に止まった」。
  • SDK 間で `\n` と `\r\n` を混ぜる。

最小ホスト状態機械

IDLE → SEND → WAIT_ACK → (RETRY|OK) → IDLE、ACK タイムアウト 500 ms、リトライ 3 回。

清潔な Bluetoothモジュール のホストプロトコルは意図して退屈です——それこそが、他のファームウェアを面白くする土台です。