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.2USBHOSTmbed-os5.15.0ではエラー発生でコンパイル出来ず
デバイスmbed-os5.15.0無しjsonファイルでの機能追加実施 

2.USB機能を確認するために使用したボード類

No.種類ボード名リンク先
1ボード+自作回路Nucleo-F446REhttps://os.mbed.com/platforms/ST-Nucleo-F446RE/
2ボード+自作回路Nucleo-F401REhttps://os.mbed.com/platforms/ST-Nucleo-F401RE/
3ボード+自作回路Nucleo-F411REhttps://os.mbed.com/platforms/ST-Nucleo-F411RE/
4USB機能付ボードNucleo-F446ZEhttps://os.mbed.com/platforms/ST-Nucleo-F446ZE/
5USB機能付ボードDISCO-F469NIhttps://os.mbed.com/platforms/ST-Discovery-F469NI/

今回手持ちのボードの関係で、STM32F4シリーズに偏っていますが、他のボードでの動作は確認していません。

3.自作回路の詳細

https://os.mbed.com/media/uploads/kenjiArai/usb_host_device.jpg
右側中央のUSBコネクタ下に切り替えスイッチがあり、USBHOSTとUSBDEVICEの機能切り替えを行っています。
DISCO-F469NIのボードには、OTG機能とそれに伴う電源回路の自動切換え機能が備わっているので、ホスト・デバイス気にせずに接続できます。
しかし自作ボードでは手を抜いて接続していますので、切り替えには注意してください。
USBHOST側では、5VがUSBコネクタに出力されます!!
https://os.mbed.com/media/uploads/kenjiArai/usb_2020-01-05.png
回路図左側下部分は、内蔵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:

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メモリーを使う場合は、配線する必要はないでよろしいでしょうか。 稚拙な質問で申し訳ございません。宜しくお願いいたします。

たびたびすみません。USB hOSTで、USBコネクタ部の配線5V,-D,+D,GNDだけ配線して、STM32F4xx_USB_Memoryをコンパイルして動作させてみたのですが、MEMORY TESTでドットを何個か表示した後で Cannot detect USB MEMORYと言われてしまいます。 USBが動いているかオシロでみたのですが、それらしき波形が +D,-Dででてました。このエラーどこが怪しいでしょうか。初心者なので、りんぷんかぷんで、初歩的な間違いをしていると 思います。ご指導いただければ幸いです。宜しくお願いいたします。

28 Apr 2020

松橋さん
返信が遅れてすみません。
USBメモリを使用する場合には、SDカード部分の配線は不要です。
SDカードの回路を記載したのは、おっしゃる通りUSBDEVICEとして、ホストからUSB経由でSDカードにアクセスする場合に使用しました。
STM32F4xx_USB_Memoryのプログラムを使用し、F446RE用としてbinファイルが生成できれば、ご指摘の通りUSBコネクタ部の配線5V,-D,+D,GNDだけ配線して動作します。
本日再度コンパイルして実機で確認して動作しています(残念ながら最新mbed-os5.15.2ではエラー発生でコンパイルできませんでした)
配線の再確認を行って再度トライしてみてください。
過去の経験で、USBメモリとの相性がありそうですので、いくつかお持ちであれば取り替えて確認したらいかがでしょうか?
私は、オンラインコンパイラーとprintf利用のデバッグしかしていませんので、どこで問題が発生しているかは残念ながら把握していません。
最近の16GBより10年以上前の頂いた256MBのUSBメモリが安定して動作しています。

Please log in to post comments.