USBデバイス開発ガイド
目次
- 背景
- USBとは何か?
- USB配線
- USB-Cに関する注意点
- 差動ペアによるデータ転送
- PCBにおけるUSB
- USBのさまざまな速度
- プロトコルとソフトウェア層
- シリアルポートデバイスを作る
- STM32マイクロコントローラとNucleoボード
- 実際のUSBポート設定
- ソフトウェア作成
- 書き込みと実行
- 結論
背景
- USBデバイスはコンピュータの機能を拡張するのに役立つ。
- この記事の目的は、USBデバイスを最初から最後まで作る過程を案内すること。
USBとは何か?
- USBはデータ交換と電力供給のための業界標準。
- USBはシリアルバスであり、ビットは1つずつ送信される。
- USBは単なる接続規格を超え、通信プロトコルも含んでいる。
USB配線
- USB 2.0接続には4本の主要な配線がある:
- +5V配線: ホストからデバイスへ電力を供給する。
D-とD+配線: 差動ペアとして1ビットを送信する。
GND配線: 接地の役割を果たす。
USB-Cに関する注意点
- USB-Cは両方向で接続できる。
- USB-Cは速度やバージョンを示すものではない。
差動ペアによるデータ転送
- 差動ペアは2本の配線を使って1つのビットを送信する。
- 差動ペアは電圧ノイズの除去に有利。
PCBにおけるUSB
- USBコネクタをPCBに追加する際は、差動ペアの長さを同じに保つ必要がある。
- 差動ペアのトレースは互いに近くなければならない。
- 特定のインピーダンスを維持する必要がある。
USBのさまざまな速度
- USB 2.0はフルスピード(12 Mbit/s)とハイスピード(480 Mbit/s)で動作できる。
- ホストとデバイスは接続時に速度をネゴシエートする。
PCBでの速度に関する簡単な注意点
- フルスピードでは、インピーダンスやトレース長に対してそれほど厳密でなくてもよい。
プロトコルとソフトウェア層
- USBはネットワークのように動作し、さまざまなエンドポイントと構成を持つ。
- ホストはドライバを通じてUSBデバイスを認識し、利用する。
USBデバイスクラスとホストでの利用方法
- オペレーティングシステムはさまざまなUSBデバイスクラスを認識する。
- たとえば、大容量ストレージデバイスやシリアルデバイスなどがある。
シリアルポートデバイスを作る
- シンプルなUSBシリアルポートデバイスを作ってみる。
- STM32マイクロコントローラとNucleoボードを使用する。
STM32マイクロコントローラとNucleoボード
- NUCLEO-F103RBボードを使用する。
- ボードはプログラマとマイクロコントローラで構成される。
実際のUSBポート設定
- USBポートを設定し、外部5V電源を使うようにジャンパを設定する。
PA12とPA11ピンをUSB_DPとUSB_DMに設定する。
PA12ピンに1.5 kΩ抵抗を接続してプルアップする。
ソフトウェア作成
- STM32CubeIDEでUSBデバイスモードを設定する。
- シリアルポートデバイスとして設定し、ホストが認識できるようにする。
CDC_Receive_FSルーチンでLEDを点灯させるコードを書く。
書き込みと実行
- コードをビルドし、STM32CubeProgrammerを使ってボードに書き込む。
- ボードを外部5V電源に接続し、シリアルポート経由でLEDを制御する。
結論
- USBシリアルポートデバイスを最初から最後まで作ってみた。
- STM32CubeIDEの多くのボイラープレートコードやUIベースの設定は煩雑に感じられるかもしれない。
- LinuxベースのSoCを使うほうが、よりすっきりしたアプローチになる可能性がある。
GN⁺の意見
- STM32CubeIDEのボイラープレートコード: 多くのボイラープレートコードが生成され、コードレビューが難しくなる可能性がある。
- Linuxベースのアプローチ: Linux SoCを使えば、より標準化されたAPIと明確なコード分離が可能になる。
- インピーダンスとトレース長: 高速USB接続には、インピーダンスとトレース長への注意が必要。
- 差動ペアの利点: 差動ペアは電圧ノイズの除去に有利で、安定したデータ転送を可能にする。
- マイクロコントローラの選択: プロジェクトに応じて適切なマイクロコントローラを選ぶことが重要。STM32以外にもさまざまな選択肢がある。
1件のコメント
Hacker Newsのコメント
STマイクロコントローラの使用に関する意見: USBに関する良い記事だが、STマイクロコントローラに焦点が当たりすぎている。最近のESP32エコシステムは、より簡単なプラグアンドプレイ方式を提供している。初心者には、高速処理ではなく基本的なUSBコントローラICを使うほうが適している。
USB準拠テストの経験: 昔USB準拠テストを行ったとき、突入電流テストで多くの問題があった。高速デジタル設計に意識が向きがちだが、準拠テストでは細かな部分が重要になる。
USB-C関連のヒント: CCピンは適切な抵抗に接続する必要がある。USB 2.0では差動配線やインピーダンスは大きな問題ではない。長さをおおむね揃えて直接接続すればよい。
STM32の代替案: ARMプロセッサのはんだ付けが難しいなら、小型コントローラやVUSBライブラリを使うことも検討に値する。Arduinoスタイルのプログラミングを好むなら、多くのボードをUSBデバイスとして簡単に使える。
ESP32と安価なハック方法: 主にESP32を使っているが、捨てられたUSBキーボードのコントロールボードを活用すれば、安価で堅牢なカスタムコントローラを作れる。
STM32で64バイト超の受信をサポート: 64バイトを超えるフレームを受信する方法についての質問。リファレンスマニュアルにある設定が通常のレジスタではないため、扱いが難しい。
ベアメタルUSBコード作成の経験: MCUでベアメタルUSBコードを書くのは、SPIやI2Cより複雑だ。ベンダー提供ソフトウェアをできるだけ活用するのがよい。高速転送にはバルク転送を使い、ホスト側の問題も確認すべきだ。
仮想USBデバイスの作成: Raspberry Piを使って仮想USBデバイスを作成し、PCに接続した。MTPカメラをエミュレートしてソフトウェアを欺くために使っている。
USB 3対応開発ボードへの質問: USB Cモニターシンクをプロトタイピングしたいが、DisplayPortを受信できる十分な電力を持つボードを見つけるのが難しい。
USB利用のコスト: USBは無料ではない。ベンダーIDを取得するには、6,000ドルの一時費用を支払う必要がある。