2020年2月4日火曜日

PIC32MX USBMSC USBメモリのアクセス、不調の原因

アクセスがエラーになるUSBメモリがあるものの、それ以外のUSBメモリのアクセスが出来るようになりましたので、FatFsを組み込んで、いつものpicクラブの情報交換会に発表に行ってまいりました。

しかしながら持参したパソコンの調子が悪く、後閑先生からノートパソコンをお借りしてデモを実施したのですが、これがどうやっても途中でエラーが発生して、USBメモリのアクセスが上手くいきません。 なんとか持参したパソコンを再起動して、情報交換会の最後でデモを行う事ができました。 

この事象により今まで不安定だった原因がいくらか判明しました。
実はこのプロジェクトで作成したデモ用の基板は、秋月のUSB-シリアル変換器からのバスパワーで動かしています。 この USB-シリアル変換器の回路図を確認したところ、バスパワーの供給ラインの途中に保護用に100mAのポリスイッチが入っていました。



 
つまり、このUSB-シリアル変換器で供給できる電流は100mAまでです。USBによってはアクセスが発生した場合に大きな電流を消費し電源電圧が下がって不安定になったものと思われます。

この100mAのポリスイッチをバイパスし、USBメモリの根本に100uFのコンデンサを追加してかなり安定してUSBメモリにアクセスが出来るようになりました。

今回判明したUSBメモリの消費量が意外に大きいので、これは今後の設計の課題となりそうです。

20200204
















2020年1月17日金曜日

PIC32MX USBMSC USBメモリのアクセスが出来ない

なかなか進まない、USBメモリドライバの開発です。
PIC32MXでUSBメモリにアクセスするの、ようやく何とか出来るようになってきました。

20200111
前回までで、下記写真の右側のUSBメモリに、SCSIコマンドでアクセス出来るようになりましたが、左側のアマゾンで買った格安の青いUSBメモリと黒いUSBメモリが上手く動きません。 その為今一度、全てのUSBのDESCRIPTORを調べてみました。




20200115
DESCRIPTORを調べて対応して、下記写真の右側については、SCSIコマンドも上手く通りリードライトが出来るようになりました。
前回より一歩進んで黒いUSBメモリにもアクセス出来るようになりました。

黒いメモリが読めなかった原因が、IN/OUTのエンドポイント番号が他のUSBメモリと異なっていた為で、前回まで決め打ちでIN=EP1、OUT=EP2としていたのを、ENDPOINT DESCRIPTORを読込んで対応するようにしました。

その他、通信の各エンドポイントのDATA0/1の切り換えとか、BDTテーブルのピンポンバッファの指定が上手くなかったようでそのあたりも見直しました。

残るは、左側のアマゾンで買った格安のUSBメモリです。 これについてはSCSIコマンドのINQUIRYコマンドまでしか通らず、SCSIコマンドでのREAD・WRITEコマンドが出来ません。




20200116
アマゾンで買った格安USBメモリ(左の青いやつ)がどうしてもエラーとなるので、パソコンにWiresharkというソフトをインストールして、パソコンとUSBメモリとの通信をキャプチャする事にしました。 パソコンと 問題のUSBメモリとの間でどんなやり取りをしているのかを参考にしようというわけです。※パソコンからは問題のUSBメモリが普通に使える。

1点見つけたのは、"Test Unit Ready"のSCSIコマンドが上手く行かなかった原因が、CBWCB長(SCSIコマンド長)の指定が間違っていたことでした。そこを直し"Test Unit Ready"コマンドが通るようになりました。

このWiresharkというソフトは優れものでパソコンのいろんな通信の内容をパケットキャプチャできるのですが、残念ながら実際のUSBとパソコンの間の通信をキャプチャしている訳ではないので、PID、DATA0/1 などのいくつかの情報は取れないようです。 気になっていた、通信上のDATA0/1の遷移はわかりませんでした。


                       https://www.wireshark.org/


20200121
左側のアマゾンで購入した青い格安USBメモリは、どうしてもアクセス出来ないのでついに諦めました。。。パソコンからは読み書きできるのですけど、何が悪いんだろうなぁ。

2020年1月7日火曜日

PIC32MX USBMSC ドライバ試作

PIC32MX USBMSC ドライバがようやく何とか動き始めたので、一旦Githubにアップロードしました。

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






2020年1月2日木曜日

MPLAB HARMONY v3 インストール・セットアップ手順

20200102
HARMONY 3 のインストールの仕方で迷いましたので、備忘録として今回のインストールした手順を記載しておきます。

下記がHarmonyの使い方などが記載されているwikiページです。
https://github.com/Microchip-MPLAB-Harmony/mhc/wiki

HARMONY 3 はMPLAB X IDEのプラグインですので、MPLAB X IDEがインストールされている必要があります。 それとPIC32のコンパイラ XC32もインストールしておいてください。
・MPLAB X IDEのインストール
・XC32コンパイラのインストール


MPLAB X を開いて、Tools>plugins をクリックします。

Available Plugins のタブから、MPLAB Harmony Configurator 3にチェックを入れて、Install ボタンをクリックします。

表示された、License Agreement のポップアップで、I accept...にチェックを入れ、Installボタンをクリックします。

Plugin のインストールが終わったら、"Restart Now"にチェックを入れ、Finishボタンをクリックして、MPLAB X IDE を再起動します。


MPLAB X IDE を立ち上げて、Tools>Enbedded>MPLAB Harmony 3 Content Manager をクリックします。

開いたポップアップで、Framework を格納するPathを入力し、Nextをクリックします。
例>D:Microchip\HM3   ※あらかじめフォルダを作成しておくと良いでしょう。

Harmony Content Managerが開きますので、Remote Packages 欄の下の Select All にチェックを入れた後、右の View & Accept All Licences をクリックします。

Accept All Licenses にチェックを入れ、Close ボタンを押して画面を閉じます。

Download Selected を押して選択した Packages をダウンロードします。



Application Browserの方は、Sample Project です。お好みでダウンロードしてもよいでしょう。 ダウンロードが終わったら、右上の×ボタンを押して画面を閉じます。


以上です。

2019年12月16日月曜日

次のプロジェクトの準備、PIC32MX,PIC32MM など。

USB メモリ用のドライバを PIC32MX250に移植しようとしているのですが、32bitになってBDTの構成が変わり、またピンポンバッファ EVEN/ODDを切り換えて使わなければならなくなり、ちょっとてこずっています。

PIC32MX のMCCの出力コードと久しぶりに戯れてみたのですが、MCC出力コードのスタイルがちょっと古臭い印象を受けました。 もしかしたらMCCのどこかの設定をミスったかもしれません。

ついでに、PIC32MMにも移植予定なので、Microchip Directに PIC32MMを発注しました。 購入したのは、PIC32MM0256GPMのピン数違いの028,044,064です。 

PIC32MMxxxGPMのシリーズはDIP品が無いので仕方なく SSOP, TQFP を購入して秋月の変換基盤に載せました。

DIP品が少なくなってきているのは残念ですが、SSOP,TQFP の変換基盤へのハンダ付けもだんだん上手くなってきているような気がします。 20191215(+3.0h)

2019年12月4日水曜日

PIC24 USBMSC&FatFs sample project

細々と作っていた、PIC24FJ64GB002のUSBメモリドライバが何とか動くようになり、FatFsを組み込んでUSBメモリ内が見れるようになりました。
MPLAB XのプロジェクトはGithabにあげてあります。

2019年9月24日火曜日

SCSIの日本語の資料がない、、、

PIC24用の USB MSC のドライバ(と呼んでいいものかどうか、、)のプログラムコードを整理していて、ふとSCSIが Big Endian で合っているいるのか気になりました。
元の sample コードが secter番号(32bit)を編集して順番を入れ替えていたので間違いはないと思うのですが、、、

そこで色々とネットを徘徊してみたのですが、残念ながら目的とする情報がなかなか見つかりませんでしたが、ようやくこちらのサイトを見つけたのです。(ポチさん大変感謝です。)

Amazonでも検索してみましたが、SCSI関係の資料はいずれも古く、古本を入手するしかありません。 ものによっては、1万円を超える値がついて希少本となっている有様。 こういった資料は電子書籍化しておいてほしいと思いました。20190838

SCSIは、Big Endianです。 
ちなみに USBはLitle Endian。 PICもLitle Endian です。

UTC7642_AMラジオ Ver.2.0 (2Tr+1IC) スーパーヘテロダイン(1)

 UTC7642を使用したヘテロダイン方式のAMラジオをブレッドボードで試しています。 アンテナとバリコンは、 電子ウサギさんの記事 を参考にスーパー用にしています。 Q2(2SC1815)は他励式の局部発信(OSC)で放送周波数+455kHzの信号を作成し、Q1(2SC1815...