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 です。

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 プロジェクト






 


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で読み書きします。

  • 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



2019年7月2日火曜日

マイコンでUSBメモリを取り扱う為に、、、

以前から課題だった、PICマイコンでUSBメモリを取り扱いたい思いが強くなって、以前インターフェース2014年12月号を引っ張り出して、UsbStudyの記事を再読しています。
週末に秋月に部品発注して記事にのっていた実験用のボードを組み立てました。20190628+1.5h

ソースを読み解きはじめましたが、まずは実験機のconfig設定を資料に起こしています。
20190630+5.0h



PICにUSBメモリをMSC(Mass Storage Class)として実装する方法は、以下3つの方法があるようです。 最終的にはPIC32MM(MXではない)に実装できればともくろんでいます。自分の備忘録として以下に関連する資料へのリンクを整理しておきます。



USB通信/USB Mass Storage Class についての参考ドキュメントへのリンクです。

その他USB関連の参考リンク

SCSIコマンドに関する参考リンク



インターフェースのUsbStudyの記事とsampleソースコードを読んでいますが、PIC24FJ64GB002の USBレジスタの設定とデータの受け渡し部分で躓いています。 各エンドポイント用のバッファを、RAMメモリ上に確保して、BDTテーブルにバッファの先頭アドレスを格納してUSB機能ペリフェラルのDMAで、そのバッファの内容を通信する仕組みとなっているらしいのですが。。。20190707+8.0h


2019年7月1日月曜日

トランジスタ技術の2019年7月号の特集記事「月着陸船アポロに学ぶ 確率統計コンピュータ」が、そそる内容だったので、この記事で作成する「倒立振り子ロボット」に挑戦してみたいと考えています。 ちなみにロボット本体の予算は2万円ほどになるようです。 全体の作業工数見積もりは、30hで半年ぐらいの期間かな。 しかしながら、この手のプロジェクトは過去に何度も途中で放棄してしまっているのでどうなるか。。。



トランジスタ技術 2019年 7月号「月着陸船アポロに学ぶ 確率統計コンピュータ」

特集目次
チューニングなしで一発立ち!数式で倒立ロボットの姿勢制御に挑戦
月着陸船アポロに学ぶ確率統計コンピュータ

イントロダクション 自動運転の大先輩「アポロ11号」に学ぶ

プロローグ [DVD動画ダイジェスト]初めての統計的「推定」信号処理

ホントの姿勢を推定して「倒れないぞ…」と頑張る
 第1章 学習キット「カルマン倒立振子」の製作

特集を読み解くための基礎
 第2章 カルマン・フィルタのプログラミングI 3つの数学

2輪車のメカをモデル化する
 第3章 カルマン・フィルタのプログラミングII 力学の基礎

2輪車の操縦士を数式で表す
 第4章 カルマン・フィルタのプログラミングIII 現代制御理論の基礎

センサ測定値の誤差は正規分布に従う
 第5章 カルマン・フィルタのプログラミングIV 確率・統計の基礎

2輪車のホントの姿勢を高精度推定
 第6章 カルマン・フィルタのプログラミングV マイコンに実装する5つの計算式


※数式が沢山でてきたところで進まなくなりました。。。20190701

2019年4月3日水曜日

100V交流から、5V 10mAの電源を取る回路

100Vの交流をON/OFFをする制御回路を作るとき、センサーなりマイコンなりを動かす5V程度の電源が必要になります。 せっかく100Vの電源があるのだから、そこから必要な電源を取りたいですよね。

トランスで電圧を落としたり、スイッチ電源にしたり、いろいろあるのですが、コンデンサと抵抗とブリッジダイオード、ツェナーダイオードで4.7V 10mAを取り出す回路です。

LT Spice でシュミレーションしてみたところ、30mAを消費して10mAを出力していました。 効率はかなり悪いですね。


LT Spiceのascファイルなど
https://drive.google.com/open?id=1JWPdwcLXVjhVDGnkOBG_4s7bFXdJEkxr



2018年8月30日木曜日

FabCafe Tokyoに行ってきました。

FabCafe Tokyoに行ってきました。(20180827)
目的はレーザー加工機のワークショップです。 

レーザー加工機のワークショップは、2時間枠でおおよそ下記3つのパート行われました。

  1. テキスト資料を使った座学
    • レーザー加工機の特徴の説明
    • FabCafeで使える素材、厚みの説明。
    • Illustratorの使い方。レーザー加工機出力用のデザインのポイント。
  2. Illustratorを使ってコースターデータの作成。
  3. レーザー加工機でコルク板にコースターを出力


私は Illustrator は、まったく使った事がないので、コースターのデザインを作る事が出来ませんでした。

しかしながら講師の方に色々と質問が出来、また事前に用意していた JW_CADの加工データ(dxf出力)がFabCafeの機器で読み込める事の確認など、目的を果たす事ができました。
今まで作ってきた、JW_CADのデータが使えるか、またレーザー加工機を使用するまでの手順の確認。 FabCafe Tokyo の雰囲気などを確認できたのは大きな収穫です。


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

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