https://github.com/PlanetxGear/PIC32MX_USBMSC_Driver_sample
PIC24F用に作成したUSBMSCドライバをPIC32MX用に移植したのですが、これがどうやっても動かない。。。USBメモリのAttach/Detachは検出するものの、USBメモリに最初にAddressを書き込みに行ったところでウンともスンとも言わなくなる状態です。 結局、USBのコントロールレジスタにBDTテーブルのメモリアドレスを設定する箇所が間違っていて、ここを「仮想アドレスから物理アドレスに変換して」設定しないといけなかったのです。 ここを見つけるのに一月かかってしまいました。 うっすらと以前に同じ経験をしたような記憶も、、、忘れていましたが。。。 なんにせよDMAなどを使うときは要注意、、いやいやDMAをもっと活用して「仮想アドレスから物理アドレスに変換する」ことを頭に入れておかないといけないですね。
20200105
ついでにこの問題点について、どうやって気づいたかも記載しておきます。
つまずいた点は、PIC側からUSBに向けて USB Addressを設定する SETUPコマンドを送信しても、それが ACKなのかNAKなのかのリターンが帰ってこない現象です。(※実際はBDTのアドレス設定が間違っていたので、そこにACK,NAKが書き込めていない。)
USB peripheral のレジスタ設定手順と、USBへの供給クロック設定を何度も見直しましたが原因わからず、、結果USBへの供給クロック設定についての以下の2点について疑問が残りました。
1.USB PLL のロックステータスフラグ(ULOCK@OSCCON)がどうやっても”1”が立たない。
2.DEVCONF2のUSBENBLの設定が、DATASHEETの記述と、MCCの設定表記と食い違いがあるように思える。
※ちなみに1.2.について現状はまだ判然としていません。20200108
これらについて、実際にPIC32MXでどのように設定されるのかネットを色々さがしたのですが見つからず、Harmony v3 で作ったプロジェクトと比較してみる事にしました。しかしながら Harmony v3は使った事が無かったので、プロジェクトを作るのにも一苦労して出来上がったプロジェクトも またロクに動かすことができませんでした。
USBモジュールやクロック設定した空のプロジェクトは出来てコンパイルも通す所までできますが、USB関連のFunctionが多くどれをどの順番でMain処理に並べて行けばよいのかがよくわからなかったのです。
そんな訳で続いて挑戦したのが、気分を変えてPIC32MMのテスト基板の組み上げと、MPLAB Xでのプロジェクト作成です。 PIC32MMのプロジェクトは、MCCからUSB(CDC、HID)の設定ができるので、 つまりこれを参考にしようというわけです。
MCCの設定は慣れたものなのでサクっと作り上げて、動かしてみたところDMA関係のレジスタに設定されたアドレス値が想定と異なっていたのでようやく気が付きました。
後でマニュアルを確認しましたが Note にちゃんと「物理アドレスを設定せよ」と書いてありました。
最近は、取り組むプロジェクトが長丁場になる傾向があるのでブレッドボードはやめて、ユニバーサル基板にハンダ付けして組み上げるのですが、適当に作るのでいかんせん雑になります。作業も遅いので今回作ったPIC32MMの簡単なテスト基板でも4~5時間はかかってしまいました。
左から、PIC24FJ64GB002 / PIC32MX250F128B / PIC32MM0256GPM028
0 件のコメント:
コメントを投稿