UNO Q / SPI3 LAB

実機測定レポート 2026.09.12

内部SPI3は、
どこまで速くなるか。

STM32U585とQRB2210の間で、クロック・DMA・転送サイズを変えて測定。標準構成の制約を越え、片方向で実効24 Mbpsに到達した。

STM32U585 MCU / SlaveSPI3 ⇄QRB2210 Linux / Master

連続転送で確認した速度

65,532 bytes / frame

MCU → Linux

24.00 Mbps

40 MHz · 10分 · 1.80 GB

観測エラー 0

全二重 / 各方向

15.38 Mbps

約21.33 MHz · 10分 · 各1.15 GB

観測エラー 0

Linux → MCU

15.34 Mbps

約21.33 MHz · 90秒 · 172.59 MB

観測エラー 0

速度はヘッダーを除いた検証済みpayload。全二重は同時に流した両方向それぞれの値。クロックはレジスタから算出し、電気波形は未測定。

クロックだけでは、速度は決まらない。

標準API → DMA → 大きな転送単位
標準構成とDMA版のクロック探索、全二重の転送サイズ比較、10分間の連続検証のグラフ

左は異なる構成の短時間探索。中央は要求22 MHz(算出約21.33 MHz)で各サイズ約8秒。右は10分間の連続検証。すべての条件を同じ時間測定したものではありません。

実験から分かったこと

観測と推定を分けて読む
01 / SOFTWARE

約1 Mbpsは、基板全体の限界ではなかった。

標準Zephyr同期API版は512 B・2 MHzで0.655 Mbps/方向。4 MHzでは17フレームすべてが破損しました。同じ512 B・4 MHzでもDMA版は10秒間、エラー0で転送できました。

DMA化に加え、転送の準備が整ってからREADYを通知する同期方式も変更しています。

02 / TRANSFER SIZE

小さいブロックでは、処理の手間が効く。

全二重のサイズ探索では、64 Bで約0.075 Mbps、4 KBで5.93 Mbps、32 KBで12.70 Mbps、65,532 Bで14.87 Mbps/方向。大きな転送は効率が上がる一方、RAMと1フレーム分の待ち時間が増えます。

03 / PROCESSING

CRCとワード幅にも改善の余地があった。

32 KB・要求22 MHzでは、MCUのソフトCRCで11.55 Mbps、ハードウェアCRCで12.48 Mbps、さらにLinuxを32ビット転送ワードにして13.31 Mbps/方向になりました。いずれも短時間の比較です。

04 / REMAINING COST

残る時間差は、主にSPI呼び出しの中。

40 MHzの片方向試験でSPI呼び出しは平均20.27 ms。隙間なくクロックを出した場合の13.11 msより長く、READY待ちは10分間で合計0.56秒でした。Linux側のDMA利用も確認済み。CS操作やドライバ内の待ち時間が次の調査候補です。

40 MHzクロック ≠ 40 Mbpsの実効転送

MCU→Linuxの最大連続実効速度は24.00 Mbps。全二重40 MHzを達成したという結果ではありません。MOSI経路のレベル変換IC TXS0101の1.8/3.3 V条件は22 Mbpsのため、MOSIにデータを流す試験は要求22 MHzまでとしました。

43試験の実測データ

CSVをダウンロード

成功だけでなく、初期化失敗や意図的な異常注入も含みます。連続検証と短時間探索を区別して比較してください。

速度はMbps、CPU率はLinuxベンチマークプロセス(1コア=100%)。横にスクロールできます。
試験 / 状態方向要求 MHz算出 MHzフレーム BMCU → LinuxLinux → MCUCRC / ACK / MCU異常Timeout / I/OCPU %

「—」は未計測または該当方向にbulkデータを流していない項目。算出クロックが0または欠落する初期データを、実クロック0 MHzとは扱っていません。

「エラー0」を、検証する。

CRC32 / 連番 / ACK / 受信カウンタ
標準APIの4・8 MHzでは17件中17件が破損。DMAの4 MHzと片方向40 MHz、全二重約21.33 MHzの試験は受信CRC破損0件

送信データを意図的に1ビット壊した試験では、MCUが異常1件、LinuxがACK不一致1件を検出して異常終了しました。CRC32はすべての誤りを必ず検出するものではなく、「エラー0」は今回の時間・データ量で異常を観測しなかったことを表します。

測定条件と、この結果の範囲

構成・測定方法

STM32U585をSlave、QRB2210/LinuxをMasterとした内部SPI3、Mode 0。STM32はZephyr / Arduino、LinuxはネイティブCとspidev。DMA版はGPDMAチャネル6/7を使用しました。MIC・LCD・音声・STT処理は含めていません。

固定seedの疑似乱数payloadをRAMに用意し、32 BのヘッダーでCRCと連番等を検証。初回フレームと最後の未ACKフレームを適切に除外した検証済みpayloadを速度としています。最大フレームは65,532 B、payloadは65,500 Bです。

40 MHzの条件と、未検証の項目

40 MHzはMOSIを一定にしたMCU→Linux専用モードの観測値です。VDDIO2補償は有効ですが、HSLVは既存オプションバイトにより無効のまま。データシートの全条件を満たす保証試験ではありません。

1台・USB接続中での結果です。電源条件の比較、物理的な電源再投入、温度掃引、複数台、UART/RPCや他の周辺機器との同時負荷は未検証。全クロック×全サイズの総当たりでも、絶対的な性能限界の証明でもありません。

CPU負荷・メモリ・使い始める設定

MCU全体のCPU率は未計測。LinuxプロセスCPU率は片方向40 MHzの10分試験で9.656%、全二重の10分試験で6.613%(1コア=100%)。別途、全二重試験内180秒のLinux全体を観測し、全コア合計のbusy率は約2.89%でした。後者にはSPI以外の処理も含まれます。

最大フレームのTX/RXバッファは合計131,064 B。スケッチ用RAM枠262,144 Bに対するグローバル領域は162,000 B。bulk転送の開発開始候補は16 MHz・65,532 B・DMAで、30秒の実測は各方向12.50 Mbps。量産認定値ではなく、低遅延が必要ならブロックを減らす選択になります。

クロックの読み方

分周レジスタとクロック源レートから算出しています。要求22 MHzは約21.333 MHz、要求36/38 MHzは約33.333 MHz、要求40 MHzは40 MHz。オシロスコープによる波形測定はしておらず、元データのactual_wire_hzはnullのままです。

データと再現用の資料

CSV、未加工の測定結果、コード・プロトコル・実行手順をまとめて確認できます。

実験用ファームウェアには、すべての切断や異常からの自動復旧、他用途とのDMA資源共有は実装していません。

仕様確認に使った一次資料