USB始めました。 *USB MSC について、
FatFsで USBメモリをコントロールしたくて、PICマイコンでUSBのホストコントロールに挑戦しています。
いくつかのPICマイコンは、USBホストとして動く OTGモジュールを持っています。 これをUSBホストとして動かすためには通常、1.Harmonyを導入する。 2.MLAを導入する。 いずれかの方法となります。
最近(2019)は MCCでも USBホスト機能を実装できるようになってきていますが、残念ながら HIDやCDC のみであり、MSCとしての実装がありませんでした。
MCCにUSB-MSCの設定が無い理由として考えられるのは、、MSCを使うには、USB通信ドライバの上に、SCSIインターフェース、ファイルシステムを構築を構築する必要があり、アプリケーションが大きくなる為ではないかと思われます。 ただでさえ複雑なUSBのエニュメレーション処理に加え、さらに2つの処理層が必要となりプログラムが大きくなってしまう為ではないでしょうか。
しかしながら、Interface 2014年11月号のUsbStadyの記事によれば、単純に一つのUSBデバイスをマイコンに接続するだけならば、エニュメレーションをすっ飛ばして
USBにアドレスとCONFIGを設定するだけで、後は単純なシリアル通信なので、HarmonyやMLAのような巨大なソースは必要ないと説いています。
UsbStady記事では、PIC24FJ64GB002を使用したサンプルプロジェクトも公開されており、これをベースに自分好みの USB MSC ドライバを構築できそうだと考え、やって見ることにしました。
1か月間悪戦苦闘して、サンプルプロジェクトから自分好みに組み直して、曲がりなりにも動くようになりました。 いろいろと気づいた点を以下メモしておきます。
・PICマイコンに搭載されている USBモジュールは、設定やステータスのレジスタが多く、使い方が複雑です。
・ホストモード・クライアントモードを切替え出来るように作られている為か、レジスタもそれぞれ用の設定が入り乱れているように思われます。
・USBモジュールのレジスタで U1EPxという名前のレジスタがあるのですが、これが各USB通信のエンドポイントと対応した名前となっています。 しかしながら、ホストモードでは、U1EP0 のレジスタのみ使用するとあり(BDTについても同様"0"のみ使用)これを使用して、通信のEP0,EP1,EP2 をコントロールする為さらに混乱しました。
・USB通信の一つのトランザクションは、トークン → データ → ハンドシェイク の流れですが、トークンは、U1TOKレジスタを更新した段階で自動発行され、またハンドシェイクは、U1EP0.EPHSHK bitをセットすればUSBモジュールが自動で発行・取得してくれます。 マニュアルにハンドシェイクはソフトウェアで行えとの記述があり、しばし迷いました。
取得したハンドシェイクのPID情報は、BDTテーブルのPIDへと反映されます。 またデータについては、BDTテーブルに設定するアドレスのバッファへDMAで格納、もしくはバッファからDMAで転送されます。
・また SOFパケットも U1CON.SOFEN bitをセットすれば、自動で 1ms事にUSBモジュールが発行するので、一度送信設定すれば、後は気にする必要はありません。
・問題はUSBメモリ側が返す NAK です。 USB側の動作は非常に遅い(使用したUSBメモリが古い)ので マイコンのUSBモジュールがコマンドを 発行すると、USBメモリ側からは NAK ばかりが返信されてきます。
USB通信の受信(マイコンのUSBモジュールではRX)でUSBメモリから帰ってくる NAK については、すぐさま受信をリトライし続けると、無応答となってしまいますが、1msのインターバル(SOFトークン1回分のwait)を設けてリトライすれば、無応答とはならずに、NAKを返し続けてくれて最後はACKとなり受信が完了する事ができました。(この現象はUSBにアドレスを設定するところで顕著でした。USBのアドレス設定は重たい処理なのかもしれません。)
USB通信の送信(マイコンのUSBモジュールではTX)においては、SCSIでWRITEコマンドを発行し、続いて 64バイトのデータを8回(計512バイト)連続して送と、NAKすら返さずいきなり無応答となってしまう現象が発生しました。 試行錯誤して、64バイト送るごとに 4msのインターバルを入れる事で、無応答となるのを回避する事ができました。(速いUSBメモリでは1msのインターバルでOK) その為 512バイトを書き込むのでさえ36msかかってしまう事になってしまいましたが、目をつむることにしました。
20190829+64h??
下記に成果物をアップしておきます。
PIC24_USBMSCtest プロジェクト
2019年8月30日金曜日
登録:
投稿 (Atom)
KT0913 FMラジオの作成(8) 出来上がったPCB基板にミスあり。
FusionPCB から基板がとどきました。20240121. 1月11日に発注したので10日で出来上がって届きました。 早速組み立てましたがが、イヤホンジャックのフットプリントが裏返っており、痛恨のミス。。。 しかしながら、他にも問題が無いか一通り組み立ててチェックしました...
-
20200102 HARMONY 3 のインストールの仕方で迷いましたので、備忘録として今回のインストールした手順を記載しておきます。 下記がHarmonyの使い方などが記載されているwikiページです。 https://github.com/Microchip-MPLA...
-
以前から課題だった、PICマイコンでUSBメモリを取り扱いたい思いが強くなって、以前 インターフェース2014年12月号 を引っ張り出して、 UsbStudy の記事を再読しています。 週末に秋月に部品発注して記事にのっていた実験用のボードを組み立てました。20190628+1...
-
DMA転送のサンプルです。 文字列 "Hello World!" を UART2 TX レジスタへ1バイトずつDMA転送します。 転送のトリガーは TMR5 の割り込み発生です。 また、メッセージデータを半分まで転送したら LED2をONにし、全メッセー...