ESP-IDFを使ってみる

USB OTG

ESP32-S2ではUSB OTGを使うことができます。
こ ちらのtusb_serial_deviceのサンプルをビルドしてみました。
結線はこ ちらのREADMEのままですが、USBコネクターのGNDを、ボードのGNDに接続する必要が有ります。

ESP32-S2のデータシートを見ると

The ESP32-S2 has a full-speed USB OTG peripheral with integrated transceivers and is compliant with the USB 1.1 specification.
GPIO19 and GPIO20 can be used as D- and D + of USB respectively.
It is recommended to reserve series resistor and capacitor to the ground on each line, and place them close to the chip side.

って書いてありますが、特に抵抗とコンデンサーを入れなくても動いています。
この様なMini-BのUSB基盤を使っています。


USBケーブルをWindowsマシンのUSBポートに接続し、ファームをビルドすると、いきなり新しいCOMポートが出現します。


TeraTermでこのポートをオープンし、適当な文字を打ち込んでみましたが、きちんと受信出来ています。


USB Host機能を持っているわけではないので、例えばArduinoとUSBで繋いでも、USB OTG経由で通信はできません。
USB OTGで通信できるのは、相手側がUSB Host機能を持っているWindowsマシンやLinuxマシンだけです。

ホストがこのポートに接続するとLine Statusがdtr:1, rst:1に変化するので、ホストが接続中かどうかを
esp-idf側で知ることができます。




次にこ ちらのtusb_consoleのサンプルをビルドしてみました。
このサンプルはESP32の標準出力をUSB OTGポートに出力するものです。
ファームをビルドしてTeraTermでUSB OTGポートに接続すると、TeraTermにこのように表示されました。
サンプルのソースを見てみると、fprintf()だけでなく、ESP_LOGI()の出力もUSBポートに出すことができます。
シリアル通信を行うプログラムを作る場合、ログの出し場所に困るのですが、これで解決です。


tusb_consoleとtusb_serial_deviceはよく似ています。
メチャクチャ簡単に書くと、tusb_consoleはUSBへの出力だけ、tusb_serial_deviceはUSBの入出力が可能になり ます。
どちらもUSBドライバーを登録した時点で有効になるので、ESP32のブートローダーが出すメッセージはUSBには出ていきません。

esp-idf v5の時点で、tusb_serial_deviceでUSBから一度に読めるのは最大64バイトです。
Windowsなどで70バイトのデータをUSBに書き込んでも、tinyusb_cdcacm_read()では一度に読めずに、64バイトと 6バイトに分割されてしまいます。

続く...