MPLAB XのプロジェクトはGithabにあげてあります。
2019年12月4日水曜日
PIC24 USBMSC&FatFs sample project
細々と作っていた、PIC24FJ64GB002のUSBメモリドライバが何とか動くようになり、FatFsを組み込んでUSBメモリ内が見れるようになりました。
2019年8月30日金曜日
USB MSC ドライバ 試作・テスト
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 プロジェクト
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年7月11日木曜日
PIC24F USB OTG ホスト機能 BDTについて、
PIC24FのUSB OTG ホスト機能について調べています。20190711+5.0h
USB OTG機能の BDT(バッファディスクリプタテーブル)の使い方が難しく難航しています。
そこで備忘録としてBDTについてメモをしておきます。
BDTは、USB機能のSIE(シリアルインターフェースエンジン)とCPU(PIC)とのデータ受け渡しとなるメモリバッファ(EPn)のアドレス情報などが格納されたテーブルとなります。USB機能はBDTに設定された情報をもとに、PICのメモリにDMAで読み書きします。
USB OTG機能の BDT(バッファディスクリプタテーブル)の使い方が難しく難航しています。
- PIC24 USB OTG 日本語マニュアル
- USB通信プロトコル (picfun/電子工作の実験室)
そこで備忘録としてBDTについてメモをしておきます。
BDTは、USB機能のSIE(シリアルインターフェースエンジン)とCPU(PIC)とのデータ受け渡しとなるメモリバッファ(EPn)のアドレス情報などが格納されたテーブルとなります。USB機能はBDTに設定された情報をもとに、PICのメモリにDMAで読み書きします。
- BDTの配置は512バイト境界に合わせる必要がある。
- U1BDTP1 レジスタにBDTのアドレスの上位7bitを格納する。
- ホスト機能の場合、EP0の領域のみを使用する。 ※USBの通信がEP1やEP2で通信が行われていても ホスト機能のはBDTのEP0領域のみ使用。
- EPnにはRX(受信)のエリアとTX(送信)のエリアがそれぞれある。
- RX,TXのエリアはそれぞれ レジスタ2Byte+アドレス2Byte構成となり、EP0だけで8Byte必要となる。
- BDT
- EP0
- RX
- RXレジスタ--------------16 bits
- RXバッファアドレス-----16 bits
- TX
- TXレジスタ--------------16 bits
- TXバッファアドレス-----16 bits
- data0, data1 を別々のバッファ(ピンポンバッファ)として使う場合は、上記をそれぞれに用意する為、16Byte必要となる。
- data0 EVEN(偶数) BD
- data1 ODD(奇数) BD
登録:
投稿 (Atom)
UTC7642_AMラジオ Ver.2.0 (2Tr+1IC) スーパーヘテロダイン(1)
UTC7642を使用したヘテロダイン方式のAMラジオをブレッドボードで試しています。 アンテナとバリコンは、 電子ウサギさんの記事 を参考にスーパー用にしています。 Q2(2SC1815)は他励式の局部発信(OSC)で放送周波数+455kHzの信号を作成し、Q1(2SC1815...
-
20200102 HARMONY 3 のインストールの仕方で迷いましたので、備忘録として今回のインストールした手順を記載しておきます。 下記がHarmonyの使い方などが記載されているwikiページです。 https://github.com/Microchip-MPLA...
-
以前から課題だった、PICマイコンでUSBメモリを取り扱いたい思いが強くなって、以前 インターフェース2014年12月号 を引っ張り出して、 UsbStudy の記事を再読しています。 週末に秋月に部品発注して記事にのっていた実験用のボードを組み立てました。20190628+1...
-
ポケットFMラジオなどは、イヤホンの線をアンテナと共用するような仕組みになっています。 アンテナと音声出力を一つの線で共用する為、それぞれにハイパスフィルタとローパスフィルタを入れます。 LTSpiceシミュレートして試してみます。 手持ちの部品の関係で、以下のような回路にしま...