USB interface : USBHost and USBDevice
.
2020/5/1 USBDevice 追記
1.USBHOSTとUSBDEVICE
USBは唯一のホストに多数のデバイスが繋がり、ホストが主導権を握ってデバイスを制御しています。
mbed-os5.14.2では、
\mbed-os\features\unsupported
内に、USBDeviceとUSBHostのディレクトリが存在して、正式サポートではありませんが制御プログラムが存在していました。
2019年12月にリリースされたmbed-os5.15.0では、
\mbed-os\features\unsupported
自体が存在しません。
ちなみに、ファイル群はGitHubの下記で確認出来ます。
https://github.com/ARMmbed/mbed-os/tree/master/features
しかし、
\mbed-os\drivers
内にUSBxxx.h(xxxはAudio、MSDなど様々)のヘッダーファイルが多数存在していることが確認出来ます。
そして、下記のMbedドキュメンテーション内にUSBの記述があります。
https://os.mbed.com/docs/mbed-os/v5.15/apis/usb.html
従ってmbed-os5.15.0で、USBの正式サポートが開始された模様です。
しかし、このUSB機能はデバイスとしてのもので従来のUSBDeviceに相当するものです。
それでは、USBHostは何処にあるのでしょうか?
確認した限り、mbed-os5.15.0内では見つけることが出来ませんでした。
そこで、今回は二つの違った方法で、ホストとデバイスの両機能を確認してみました。
機能 | 使用OS | 追加ライブラリ | コメント | |||
ホスト | mbed-os5.14.2 | USBHOST | mbed-os5.15.0ではエラー発生でコンパイル出来ず | |||
デバイス | mbed-os5.15.0 | 無し | jsonファイルでの機能追加実施 |
2.USB機能を確認するために使用したボード類
No. | 種類 | ボード名 | リンク先 |
1 | ボード+自作回路 | Nucleo-F446RE | https://os.mbed.com/platforms/ST-Nucleo-F446RE/ |
2 | ボード+自作回路 | Nucleo-F401RE | https://os.mbed.com/platforms/ST-Nucleo-F401RE/ |
3 | ボード+自作回路 | Nucleo-F411RE | https://os.mbed.com/platforms/ST-Nucleo-F411RE/ |
4 | USB機能付ボード | Nucleo-F446ZE | https://os.mbed.com/platforms/ST-Nucleo-F446ZE/ |
5 | USB機能付ボード | DISCO-F469NI | https://os.mbed.com/platforms/ST-Discovery-F469NI/ |
今回手持ちのボードの関係で、STM32F4シリーズに偏っていますが、他のボードでの動作は確認していません。
3.自作回路の詳細
右側中央のUSBコネクタ下に切り替えスイッチがあり、USBHOSTとUSBDEVICEの機能切り替えを行っています。
DISCO-F469NIのボードには、OTG機能とそれに伴う電源回路の自動切換え機能が備わっているので、ホスト・デバイス気にせずに接続できます。
しかし自作ボードでは手を抜いて接続していますので、切り替えには注意してください。
USBHOST側では、5VがUSBコネクタに出力されます!!
回路図左側下部分は、内蔵RTC用のバックアップ回路です。
USB機能確認には不要ですが、時刻設定を正しく行えばUSBメモリ制御時などには、ファイルのタイムスタンプに反映されます。
4.USBDEVICE
Win10のPCをホストとして、Mbedボードをデバイスとして接続して確認しました。
Nucleoボードは、ST-LinkによりPCに接続してプログラムをCopy&pasteで書き込んでいますが、このUSBもデバイスとして接続されているので、今回はPCへ二本のUSBケーブルを接続する形態となります。
Nucleoボード上でジャンパーやクロック配線などを修正すれば、ST-Link側を接続せずUSBDeviceのUSB電源供給で動作させることも当然出来ますが、簡単な実験の割には準備が大変でしょう。
今回プログラムを下記に公開しました。
ドキュメンテーション内のサンプルプログラムと大きく変更していません。
Import programSTM32F4xx_USBDevice_examples
1st working sample
Import programUSBDevice_microSD_RW_F469NI
1st working sample
USBDeviceのMSD(Mass Storage Class)機能に関して、コメントしておきます。
普段使っているUSBメモリはデバイスなので、USBDeviceのMSD機能では制御出来ません。
これは、下記説明のUSBHost側でMbedがホストとして制御することになります。
それでは、USBDeviceのMSD機能はどのように使うのでしょうか?
MbedボードにSD、microSD、あるいはEEPROMのような媒体でStorageクラスのデバイスを制御し、さらにUSBDeviceでPCに接続することでPCからMbed上のStorageを仮想ドライブとして制御します。
上記のSTM32F4xx_USBDevice_examplesで、select_example.cpp内の下記部分を
#define EXAMPLE_NUMBER 1
としてコンパイルし動作させると、PCからUSB経由のストレージとして認識されてます。
今回は、microSDを接続していますので、そのmicroSDに対して読み書きなど通常にストレージに対する操作が行えます。
F469NIには、microSDもすでに実装されているので、ハードウェアは何も変更せずに、機能確認が行えます。
使用したUSBコネクタは、Type-Aですがこのままではホストとしては良いですが、デバイスでは接続に変換ケーブルなどが必要でしょう。
私は、aitendoで「ゆーえすびー4兄弟」を購入して、使用しています。
http://www.aitendo.com/product/14611
残念ながら、現時点(2020年1月)では在庫なしとなっています(2020/5/1 また少し入荷した模様)。
2020/5/1 追記
下記forumにてUSBDeviceの同時並行動作に関する質問がアップされていますが、本日時点では何方からも回答がありません。
https://forums.mbed.com/t/multiple-usb-components/6817
DAPLinkでもUSBMSDとUSBSerialが同時に使用できるわけですから、試してみる価値があります。
色々と試行錯誤したのですが、残念ながらMbedの提供するライブラリでは対応できないと勝手に結論付けしました。
何方か方法をご存じの方は、教えていただけないでしょうか? よろしくお願いします。
暫定的な方法として、USBMSDとUSBSerialの切り替えを行いそれなりに動作したので、公開します。
Import programChange_USBMSD_and_USBSerial
function test USBMSD(as external strage for PC USB) and USBSerial. Switching between USBMSD and USBSerial(Not work simultaneously)
プログラムを立ち上げると、先ずはUSBSerial機能が動作しますので、TeraTermなどで接続します。
接続が上手くいくと、プログラムが進みUSBMSD機能に切り替わりますので、少し待つとPC(私はWin10に接続)側に外付けドライブとして認識され、メモリ内容のR/Wが可能になります。
ここでMbedボードのスイッチを押すと、USBMSDからUSBSerialに切り替わり、再び(起動したままにした)TeraTermに制御が移りファイル内容を確認するMonitorが起動します。
時刻設定(t 20 5 1 9 33 20)やディレクトリ(dir)の確認、テキストファイルの内容確認(type)などが出来ます。
終了は、qとEnterです。
これで再びUSBMSDが起動できる準備ができます。
少し煩雑ですが一様切換えて使用できるようになりました。
5.USBHOST
ホスト機能のサンプルプログラムで、USBメモリとして使用しています。
Import programSTM32F4xx_USB_Memory
USB Memory control program using USBHost library
ライブラリーはmbed-os5.14.2の\mbed-os\features\unsupported内のファイル群を中心に借用したものをまとめました。
Import libraryUSBHOST
Added TARGET_DISCO_F469NI in USBHOST\USBHost\TARGET_STM\USBHALHost_STM_TARGET.h
6.謝辞
Mbedボードで簡単にUSB機能が使えることを教えていただいたのは、OkamotoさんのUSBプログラムからでした。
/users/va009039/
まだMbedでUSBサポートが何も無かった頃からのプログラム発表で、私もC270カメラの画像をmicroSDで記録する装置を2014年当時に作成出来たのは、Okamotoさんのおかげです。
Import programF401RE-USBHostC270_example
Simple USBHost WebCam test program
この頃は、Mbedでの活動を控えておられるようですが、やっとMbedで正式サポートができるまで5年以上の歳月が経過したことになります。
C270もUSBHOSTが正式版になる近い将来(2020年中に期待)には、再度確認したいと思います。
Okamotoさん、ありがとうございました。
3 comments on USB interface : USBHost and USBDevice:
Please log in to post comments.
KenjiArai様 以前からいろいろ記事で教えていただいている初心者です。主にデータをログするためにNucleo F446Reを使っているのですが、SDカードにログするのにSPIでSDカード接続しようとしてきたのですが、Arai様の過去記事にあるようにmbed OSの変遷で、SDカード接続ができなくなったり、混乱しております。そこで、SPI接続でなく、F446REをUSB HOSTとしてUSBメモリーにログしたほうが、速度も速く、SPIの素人配線でのノイズなどの余計な心配がないのではないかと思い。F446REでのUSB HOSTでUSBメモリー接続を探したら本記事をみつけた次第です。初歩的で申し訳ないのですが、記事内の回路図では、SDカードがSPI接続されてますが、これはUSB DEVICE用配線だたおおもうので、USBHOSTでUSBメモリーを使う場合は、配線する必要はないでよろしいでしょうか。 稚拙な質問で申し訳ございません。宜しくお願いいたします。