USB-UARTブリッジICとは何でしょうか。ESP32Devkitcでは、下のようにCP2102というUSB-UARTブリッジICを搭載しています。これはESP32のUART信号をUSB信号に変換するICで、マイコン-PC間で信号のやり取りをするときに使います。今回はこのICの使い方をしらべてみました。
ちなみに下はRaspberry Pi Picoですが、ESP32と違い、RP2040にはUSBモジュールを内蔵しているため、外部でUSB信号の変換が不要で、直接USBコネクタとつなげられています。
UART信号とは?
UART信号は基本的には、8bitのデータをひとまとまりとして、データを送信します。Highの値は、マイコンの電源電圧によって、5Vだったり3.3Vだったりします。二つのUART間は、こんな感じでつながります。
下図は、信号フォーマットの概要です。かなりシンプル。
信号がアイドル状態のときはHighにいて、信号がくると、フレームの先頭の合図として、信号をまずlowに落とします。これがstart bit。そのあとは8bit分のデータがきます。データの後にくるparity bitです。データの整合性をチェックするbitで偶数パリティか奇数パリティかを選べます。
偶数パリティはデータの中の1をカウントして、数が偶数なら0、奇数なら1にします。奇数パリティはその逆で、1をカウントして、数が偶数なら1、奇数なら0にします。
例えば、11001101(0xCD)の偶数パリティは1です。マイコン側でこの信号を受け取り、このデータから偶数パリティを計算し、結果0となり、送られてきたパリティビットと一致しない場合には、どこかの信号が怪しいと判断でき、データを使うのをやめるみたいな処理ができます。
parity bitのあとはフレーム終了の合図として、信号をhighにします。これがstop bitです。
ちなみにUARTはI2Cなどと違って、同期のためのクロック信号を使いません。じゃあどうやって、信号をとるタイミングを合わせているかというと、Start bitのタイミングでよーいスタートで時間を計測し、あらかじめ決められたボーレートのタイミングでデータをサンプリングします。
同期の仕方は上図のような感じです。start bitの立下りのタイミングでタイマをONにして、各bitの中央付近で何点かサンプリングして、LowなのかHighなのかを判定します。サンプリング回数やLow/Highの判定の仕方はマイコンの仕様によってかわってきます。
CANの通信プロトコルとか勉強した後だと、こんなんで上手くいくのか?って不安になるぐらいシンプルですね。
USB信号とは?
UART信号とちがい、USB信号は複雑ですので、詳細な説明は省略しますが、UARTのようにシングルエンドではなく、D+とD-の端子の差動でデータを転送します。
USB2.0ピンアウトが下。VBUS (5V), GND, データ転送用のD+, D-の4ピン構成になってます。
UARTでは信号を一本の信号線でもって、データ転送していましたが、USBの場合は、D+とD-の差動からNRZIで符号化したものをデータ転送しています。
USBのフォーマット
USBのフォーマットについては、複雑なので、省略します。今回は、パケットという最小構成でデータを転送する。ホスト(PC)とデバイス間でパケットのやりとりをして、データ転送をする仕組みをつくっているということだけを理解しておきます。
CP2102N
Silicon Labs社製のUSB-UART変換ICです。変換ICはFTDIが有名ですが、Silicon Labsも主に低価格向けの製品を中心に販売しています。メーカのサイトで、PC用のUSBドライバや仮想COMポート用のドライバ、そのほか、資料やサンプルコードなど結構な量の情報がまとまっているので、開発するときに参考になります。
Technical Resource Sarch – Silicon Labs
上のリンクにとんだら、左のツリーでinterfaceをクリックすると、関連資料をみることができます。
VCPとDirect Access Driver
CP2102NとPCをつなぐ場合にやり方が二通りあります。ひとつはVCPというドライバをいれ、CP2102Nを仮想COMポート(RS232)として、認識させる方法とDirect Accessというドライバをいれ、そのままUSB機器として、認識させる方法です。
後者は、APIなどが用意されていて、ゴリゴリにドライバを1から作る必要はありませんが、ある程度のアプリ開発は必要です。一方で、前者はTeratermなどのターミナルソフトがあれば、通信の確認ぐらいはすぐにできるので、より簡単です。
C#ではCOM制御用のクラスがあり、プログラムからももちろん制御可能です。
VCPのインストールの仕方
ESP32ユーザならば、すでにこのドライバーがPCにインストールされていると思うので、必要ありません。もしインストールされていないとCP2102とつなぐと、下のように不明なデバイス扱いになります。
不明なデバイスを右クリックして、プロパティを表示します。
ドライバの更新をクリック
コンピュータ内を参照をクリック。エクプローラが表示されるので、上のリンクでダウンロードしたフォルダを選択すれば、OKです。
うまくいくと下のようにCOMポートが割り当てられます。
Pinout
ICのパッケージがQFNで20pin, 24pin, 28pinで3つのバリエーションがあります。参考にQFN24のピンアウトは、下のとおり。
基本はTXD, RXDにUARTをつなげ、D+、D-をUSB端子につなげるだけです。
ちなみにQFNはリード線がないため、手ハンダしづらい(少なくとも自分は自信ない)ので、今回の回路テストでは、下のようなアダプタを使いました。
bus powered か self powered
CP2102Nを使用する際は、供給電源をUSBの電源5Vから供給するか、既にレギュレートされた他の電源3.0-3.6Vを利用するかを決めます。
もし、前者だと、ICに内蔵しているレギュレータを使用することになり、後者だと内蔵しているレギュレータは使用する必要はありません。この時の推奨回路図がデータシートに記載されてましたので、以下に比較しておきます。レギュレータを使わない場合はVDDと短絡させればよいようですね。
今回のテストは、self powered で外部のレギュレータから3.3VをICに給電することにします。
VBUSは分圧しとく
CP2102NのVBUSピンの役割はUSBネットワークに接続されたかどうか検知するためのものらしいですが、self poweredモードの場合は、USBをPCに接続して、USBから5Vを供給したタイミングで、ICの電源3.3V(VDD)がまだ供給してないってパターンも想定されます。
VBUSの定格は、
なので、IC電源OFFでも定格を上回らないように分圧します。推奨回路によると、22.1kOhmと47.5kOhmですので、これを採用します。
テスト回路図
テスト回路は下のとおりです。
Virtual COM Port Driverを使ったテスト
UART側も最終的にUSB変換をして、COM19として、認識させ、USB側のCOM13と双方向に通信を行った結果が下です。
問題なく、両方向から信号が送受信できたことがわかります。通信が確認できたので、今回はここまでにします。Silicon LabsのSimplicity Studioというツールを使えば、CP2102Nに設定されているROMを編集したりできるようなので、また次回にトライしてみようと思います。
CP2102Nばんざい