2015年3月30日月曜日

目黒川の桜は満開の一歩手前

本日の目黒川の桜は、満開の一歩手前ってところでした.まだ蕾が一部残っていて、散り始める前の段階です.明後日あたりは桜吹雪が舞い散っていいかんじかと思います.

中目黒駅周辺は月曜日だっていうのに大混雑で、辟易して早々に退散し、家へ帰る道すがら、駒沢通りを渡って共済病院付近へ来ましたら、ここら辺は空いてていいかんじでした. フツーに歩けるもん.
町内会で募集したぼんぼりの、ヒラサカバージョンが飾られているのを確認しました.「家内安全」じゃなくて「銀河統一」にすりゃヨカッタなどと危険なコトを思い走ってしまうのは脳内に「銀河英雄伝説」の短期記憶がまだたくさん残っているからでした.
わたしの場合、桜の花はよろしいのですが、この後、秋頃までは桜の木の下を歩けない長く辛い季節が続きます.アメリカヒロヒトリを始めとする毛虫がはびこる恐ろしい季節だからです.

絶滅せよ  >  幼虫殿

かしこ


人気ブログランキングへ

EZ-USB FX2LP を動かしてみる (13) パケットモニタもどき

USBの解説本を読むと、さまざまなパケットやトランザクションがホストとデバイスの間を飛び交うと書かれています.

EZ-USB FX2LPをPCに繋いだときにはどんなパケットやトランザクションが飛び交っているのかをモニタしたいと思い、PCアプリのUSB protocol analyzerを使ってみましたが、物足りなさを感じて断念.

FX2LPの割り込みルーチンに小細工して「どの割り込みが起動されたか」をモニタしようと思い、FPGAでシリアル通信でPCに表示する回路を作りました.
USB割り込みハンドラに、割り込み番号を出力するルーチンUsbID_out()を密かに仕込んでおきます.使っているLSIがFX2LPの56pinなので、UART機能が使えない(外部ピンがない)のでこのようなめんどくさい事態になってしまいました.
// Setup Token Interrupt Handler
void ISR_Sutok(void) interrupt 0
{
   EZUSB_IRQ_CLEAR();
   USBIRQ = bmSUTOK;         // Clear SUTOK IRQ
   UsbID_Out(0x08);
}

それで、FX2LPを起動した直後に、デバイスディスクリプタを送信などしていると思われる場面でのFX2LP内部の割り込みの推移はこんなでした.

しかし問題は、これを知っても大した役には立たないというコトでした.無駄じゃ無駄じゃ.

SUTOK          セットアップトークン
USBRESET    USBリセット
SUSPEND      サスペンド
USBRESET  
HISPEED        ハイスピード
SUTOK  
SUDAV          セットアップトークンavailable
USBRESET
HISPEED
SUTOK  
SUTOK  
SUDAV  
SUTOK
     :
  中略         SUDAVとSUTOKの繰り返し
     :
SUTOK  
SUDAV  
SUTOK  
SUDAV

その12へ     その14へ

かしこ


人気ブログランキングへ

厚木市七沢、黄金井酒造 再び (悔恨)

昨年の7月に訪れました七沢にある黄金井酒造を再び訪れ、「新酒を楽しむ会」に参加しました.大変悔いの残る幕引きではありましたが、お酒は大変美味しかったとです.お酒が美味しすぎるのも困ったもんです.

↓このように10数種類の新酒を賞味しました.
↓利き酒クイズがありました.4種類の製品と、ブラインドの4種類のマッチングを当てるのが出題でした.お客が36名ぐらいいて、7名が全問正解で賞品をもらいました.
↓わたしは全問正解者の一人になったので、賞品の「盛枡大吟醸おり酒」を手に満面の笑みと言ったシーンがこちらです.右の人は都立大マンガ研究会OBの先輩.
しかしこの後が悲惨だったのです.

上のシーンの次の記憶は、タクシーで山の手通りのドン・キホーテの付近を走っている場面にまでいきなり跳びます.一体何が?という感じですが、どうやらというか確実に新酒の会で一発で記憶が飛ぶほど飲み過ぎたようです.同行者によると二次会には行かなかったらしいです.

そして、超貴重な「盛枡大吟醸おり酒」をどこかに置き忘れてしまったのでした.

悔いが残る、、、立ち直れそうにありません.お酒の神様ごめんなさい.

がくっ、、、


人気ブログランキングへ

2015年3月29日日曜日

中国で見た謎のボタン、それはiButton

むか~し、ジムボタンという独特なアニメがありました.シャザーンという独特なアニメもありました.しかし今回はジムボタンともシャザーンともほとんど無関係です.
むか~し、中国に行って泊まったホテルのルームキーが、なんとも独特な形状だったので記憶に残っておりました.↓これです.
大きめのボタン電池にしか見えないのですがこれでルームキーなんです.ポケットの中でショートしたり液漏れしそうで大丈夫なのかなぁという予感が一瞬よぎる不吉な形状.部屋のドアの覗き窓がついている付近には、丸い凹部が設けられていて、そこへこのボタン電池を接触させると鍵が開きます(接触がビミョーでしくじりやすい).なんじゃぁこりゃ-?と驚きましたわ.右の指輪型のキーは「出て来いシャザーン」みたいでイケてるデザインと言えるだろう.

さきほど、1-wireというシリアル伝送規格を調べていたら、この謎めいたボタン電池状物体は「iButton」という規格名のれっきとした汎用品なのだそうでした.知らなかったなー.日本では一度もお目にかかった経験がありませんしー.

中身はこんな風になっている.どうやらボタン電池を内蔵しているっぽい.ホストから電力供給してもらうのがベターと思いますが、キーナンバーを記憶するバックアップ電池なのかも.
Felicaが普及した日本でiButtonが普及するチャンスは高くなさそうですが、今日も世界のどこかでiButtonは使われているのですね.

かしこ


人気ブログランキングへ

2015年3月26日木曜日

「アインシュタイン vs 量子力学」 読了


以下、科学的には誤りを多く含んでいると思いますが、先にそれを詫びておきます.orz

不確定性原理は「量子の位置と運動量を同時に確定できない」と言っているわけですが、量子のような小さくて軽い物体をノーダメージで測定できるわけないじゃんという測定技術上の理由だけではなくて、「量子は本質的にそういうモノであって存在確率でしか表現できない」と主張したのが右の写真のボーアを始めとする量子力学の創始者達でした.

それに対して、「神はサイコロ遊びをしない」と言って量子力学を批判したのが実在にこだわるアインシュタインだったというのは有名な話です.

そういった「アインシュタイン vs 量子力学」の論争は20年以上も続いたそうで、今でもその火はくすぶり続けているそうです.その経緯を概観した科学史の本(右図)を読みました.外人が書いた本を和訳したのかと思ったら、日本人による書き下ろしだったので日本語は読みやすい.けれど、書かれている内容は難解でした.
『非局所相関において、光速を超えて因果作用が伝達しないかどうかを議論するのは難しい.ジュン・サクライは、先に述べたように情報が伝達しないことをもって因果作用も光速を超えないとするのだが、因果とは何かということ自体がいまだ明らかになっていない.因果に関する哲学的理論のうちには、この問題における非局所作用が因果作用であると結論づけることができるものもいくつかあるのだ』

↑全般的にこういう内容です(笑).日本語表現は分かり易いけど意味はとても難しい.量子力学の実在論争ってのはガチでこういう哲学的難解さなのでしょう.

------
この本は科学史を紹介するだけではなく、筆者が「こうであろう」と予想するモデルも巻末に記されています.それを紹介します.

1935年にアインシュタインらが量子力学の不完全さを指摘するために提案した「EPR思考実験」というのがあります.その後改良されて、右図は改良版です.

この図の横軸は距離、縦軸は時間です.時刻t0に量子が生まれて、それぞれ逆向きのスピンを持って反対方向へ飛び去った.時刻t1で左の量子スピンを観測したら+1だった.ならば右の量子スピンは作用反作用的に-1だとわかる.ここまではアインシュタインが何10年もゴネる理由になりません.最初から左が+1、右が-1だったんだよね、というだけの話です.

しかし、量子力学では、時刻t1の直前までは、量子スピンは+1-1のどっちも確率50%で確定していなかったのだ、と仮説します.実験結果もそれを支持する.

だとすると、時刻t1で左のスピンが確定したと同時に、無限の速さで右のスピンが-1だと確定すると言ってます.それじゃ光速を超えてるじゃん.このパラドックスをどうやって説明するんじゃ? 説明出来なければ量子力学は不完全なのだ、とアインシュタインは突きつけました.
量子力学が不完全であるならば、克服できる未知の作用があるはずで、それを発見すれば確率に依らず量子を決定論に引き戻せるとアインシュタインは考えたそうです.

けれどその後、「ベルの不等式」が成立しない → 未知の作用はない、と結論づけられ、量子の超高速な振る舞いはあるけれど、理由は不明、というのが現在の状況と思えばあっていると思う.

------
この本の筆者自身は理論物理学者ではないので、誰かの説を支持表明しているのですが、筆者は、「時間対称的な解釈」によって、超高速に見える量子の振る舞いを説明できるとしている.

「時間対称的な解釈」とは、
量子では、
   -過去が未来を決定するだけでなく、
   -未来が現在を決定する  (未来からの干渉がある)
と解釈する説です.

スピン情報が無限速度で伝わったのではなく、(スピンが確定済みの)未来から現在へ、スピンが情報が伝播して来たのだという解釈です.

どーせ何でもアリな量子世界ならば、このくらいハンパない理論が真実であっても、ヒラサカは許す.速度無限大の情報伝播よりもよほど気が効いているじゃぁないか?

-----
書かれている話題はこれだけではありません.

不満な点をひとつ挙げるとすれば、アインシュタインの実存主義は理解しやすいのでよしとして、ボーアらコペンハーゲン解釈派の人々はどういう理由であのような非実存的解釈(確率オンリーの理論)にたどり着いたのか?を詳しく解説してくれたらもっとよかった.

図書館で借りたのでもう返却せねばならないが、この本は自腹で買って暇なときに少しづつ読もうかとも思う.あるいはどなたかが読み終わったらわたしに進呈してくださるとありがたい.入院して暇な時に手元に在ると最適な本でした. (入院する予定はないけど)

かしこ


人気ブログランキングへ

EZ-USB FX2LP を動かしてみる (12) EPとFIFOとDACその4

サンプルプログラム(下記)は、EP2 FIFOサイズを512BYTEに設定して使っています.
FIFOのバンク数は、2つ、3つ、4つをセレクトできます.

疑問:  このFIFOバンクって、多数の短いパケットを送信したらどのように働くのだろう?

具体的にはこういう疑問です.
たった5バイトしかデータ転送しないとして、512BYTEがオーバーフローするまでじーっと黙っているのだとすると、103回データ転送しないとFIFOが出力移行しません.まぁそりゃないだろと思います.たとえ5バイトでも、一回受信したら律儀に5バイトを出力するんだろと思う.
しかし、だとすると、ゴージャスな4バンク構成にしても、たった5x4=20バイト溜まっただけでFIFOがオーバーフロー間際の断末魔になってしまいます.それも悲しいように思います.

そこで実機で確かめました.

↓たった5バイトを転送しても、一瞬でデータは出ていってしまいますので観測しにくい.そこで、RDY0を発生させる回路に細工してRDY0をON/OFFできるようにしました.SWでザックリ切断です.

FX2LPでdownloadするプログラムのプロジェクトファイルはこちらです.
フォルダ中には、バンク数違いの3つのプロジェクトが入っています.
 FIFO2bank.Uv2    →  EP2のFIFOが、512BYTE x 2バンク
 FIFO3bank.Uv2    →  EP2のFIFOが、512BYTE x 3バンク
 FIFO4bank.Uv2    →  EP2のFIFOが、512BYTE x 4バンク

バンク数によって各設定の異なる部分は、バンク数設定と、念のためEP468を殺すと、リセットをバンク数回やる、の2点です.EP246を殺すのは、EP2がEP468のFIFOエリアを侵食するから.
2バンク設定
   EP2CFG = 0xA2; // EP2 is DIR=OUT, TYPE=BULK, SIZE=512, BUF=2x
   SYNCDELAY;
   FIFORESET = 0x80; // Reset the FIFO
   SYNCDELAY;
   FIFORESET = 0x82;
   SYNCDELAY;
   FIFORESET = 0x00;
   SYNCDELAY;
   OUTPKTEND = 0x82; // skip EP2 FIFO data (BUF0)
   SYNCDELAY;
   OUTPKTEND = 0x82; // skip EP2 FIFO data (BUF1)
   SYNCDELAY;

3バンク設定
   EP2CFG = 0xA3; // EP2 is DIR=OUT, TYPE=BULK, SIZE=512, BUF=3x
   SYNCDELAY;
   EP4CFG = 0;  ←念のためEP4を殺しておく
   SYNCDELAY;
   EP6CFG = 0;  ←念のためEP6を殺しておく
   SYNCDELAY;
   EP8CFG = 0;  ←念のためEP8を殺しておく
   SYNCDELAY;
   FIFORESET = 0x80; // Reset the FIFO
   SYNCDELAY;
   FIFORESET = 0x82;
   SYNCDELAY;
   FIFORESET = 0x00;
   SYNCDELAY;
   OUTPKTEND = 0x82; // skip EP2 FIFO data (BUF0)
   SYNCDELAY;
   OUTPKTEND = 0x82; // skip EP2 FIFO data (BUF1)
   SYNCDELAY;
   OUTPKTEND = 0x82; // skip EP2 FIFO data (BUF2)
   SYNCDELAY;

4バンク設定
   EP2CFG = 0xA0; // EP2 is DIR=OUT, TYPE=BULK, SIZE=512, BUF=4x
   SYNCDELAY;
   EP4CFG = 0;  ←念のためEP4を殺しておく
   SYNCDELAY;
   EP6CFG = 0;  ←念のためEP6を殺しておく
   SYNCDELAY;
   EP8CFG = 0;  ←念のためEP8を殺しておく
   SYNCDELAY;
   FIFORESET = 0x80; // Reset the FIFO
   SYNCDELAY;
   FIFORESET = 0x82;
   SYNCDELAY;
   FIFORESET = 0x00;
   SYNCDELAY;
   OUTPKTEND = 0x82; // skip EP2 FIFO data (BUF0)
   SYNCDELAY;
   OUTPKTEND = 0x82; // skip EP2 FIFO data (BUF1)
   SYNCDELAY;
   OUTPKTEND = 0x82; // skip EP2 FIFO data (BUF2)
   SYNCDELAY;
   OUTPKTEND = 0x82; // skip EP2 FIFO data (BUF3)
   SYNCDELAY;

-----
以下が動作確認結果です.

programのdownloadにも使っている「USB Control Center」というアプリを使うと、任意のバイト数のデータ転送ができます.それを利用して、2バンク、3バンク、4バンクそれぞれを動かします.

なお、上の回路図のRDY0のSWをオフしておきます.するとデータがFIFOにブタ積みされても、便秘状態なのでデータが排出されません.この実験では強制便秘にしています.

↓まず最初に、2バンクで動作させたのがこの結果.abcdeという文字が見えますが、このabcdeが転送したい5バイトです.Transferボタンを1回押すと、5バイト送信される仕組みです.
右のペインには、Transfer completeが2回表示され、3回目でTransfer Failedになっています.これは何が起きているのかというと、FX2LPの起動直後にFIFOが2バンクとも空っぽなので、2回までは耐えられる.でも3回目で「お漏らし」エラーを出してます.
↓つぎは3バンクでのお試し結果.空っぽのFIFOが3バンクあるので、3回目までは耐えて、4回目で「お漏らし」エラーしてます.
↓最後は4バンクでのお試し結果.空っぽのFIFOが4バンクあるので、4回目までは耐えて、5回目で「お漏らし」しちゃってます.

以上より、FX2LPのFIFOバンクはこのように動作するんだとわかりました.

たとえ5バイトのデータ転送でも、その都度出力移行する.
短いデータを何発も転送すると、すぐにFIFOがオーバーフローしてしまうリスクあり.

うーん、やっぱりそうか、、、そうなのか、、、

その11へ     その13へ

かしこ


人気ブログランキングへ

EZ-USB FX2LP を動かしてみる (11) EPとFIFOとDACその3

今回は、回路の具体例とプロジェクトの具体例です.

プリント基板
まずプリント基板の改造から.回路図はこちらにあります.
↓基板の外部回路はDACと2^12分周回路です.
↓DACは、こういうR2Rラダー型DACにしました.実験波形ぐらいなら出ます.R=1kΩ、2R=2kΩで作りました.ポートは、PB7~PB0です.
↓2^12分周回路は74HC163を使ったこういう回路.74HC163は48MHzをclockとするには動作速度がキツイので30MHzで使わざるを得ませんでした.なので後日74AC163で作り直すつもりです.以後ではGPIF clock=IFCLK=30MHzで動かしています.回路図の30MHzはFX2LPプリント基板のIFCLKを接続します.RDY0はFX2LPプリント基板にそういう端子があります.電源はFX2LPの3.3Vです.
↓出来上がり状態はこんなです.FX2LP基板が手作り基板の下側に隠れてます.下の方の抵抗はDACのラダー抵抗です.
プロジェクト
プロジェクトフォルダをここに置きます.
解凍したら、この場所に置いて、master.Uv2をクリックするとKeil IDEが起動します.
C:\Cypress\USB\CY3684_EZ-USB_FX2LP_DVK\1.1\Firmware

gpif.cは、GPIF Designerが生成したファイルなのでBLACK BOXとして扱うので放置します.

descr.r51は、アセンブラソースです.USBのファイルディスクリプタが記述されています.

master.cは、USBの通信関係ルーチンです.今は説明を割愛します.

重要なのはfw.cですが、これもUSB通信関係のいろんなコードが書かれているので、そういう部分はよく判らないので飛ばして、FIFO関連の部分だけを抜き出して、以下で解説します.

FIFOの設定部分がこれです.

↓ますはCPU Clock周波数の設定で、48MHzにしてあります.SYNCDELAYというのは、レジスタを変更した後に挿入するべき空白期間です.おまじないとしておきます.
   // Initialize user device
   CPUCS = 0x10;       // CPU clock 48MHz
   SYNCDELAY;          // CLKOE=0, don't drive CLKOUT

↓GpifInit()が、CPIF Designerが吐き出したgpif.cに書かれたサブルーチン名です.常にこの名前です.この中では、IFCLK=30MHzであることとか、RDY0やCTL0の挙動について記述されています.
   GpifInit();  // GPIF initialization routine made by GPIF Designer
   SYNCDELAY;

↓以下はFIFOの設定です.REVCTLはそういう名前のレジスタで、fx2regs.hに記述されています.ここでやってる設定は良く理解できていません.
   REVCTL = 0x03; // REVCTL.0 and REVCTL.1 set to 1
   SYNCDELAY;

↓これもレジスタ設定.EP2について設定しています.出力である.バッファが512BYTEを2バンクである.EP4,EP6,EP8はシカトしてます.
   EP2CFG = 0xA2; // EP2 is DIR=OUT, TYPE=BULK, SIZE=512, BUF=2x
   SYNCDELAY;

↓この特殊なFIFORESETはどうしてこうするのかよく理解できてません.
   FIFORESET = 0x80; // Reset the FIFO
   SYNCDELAY;
   FIFORESET = 0x82;
   SYNCDELAY;
   FIFORESET = 0x00;
   SYNCDELAY;

↓2バンクあるEP2 FIFOの内容を捨てる.
   OUTPKTEND = 0x82; // skip EP2 FIFO data (BUF0)
   SYNCDELAY;
   OUTPKTEND = 0x82; // skip EP3 FIFO data (BUF1)
   SYNCDELAY;

↓FIFOの形態を、自走する(AUTOMODE)、8bit幅、などと設定.
   EP2FIFOCFG = 0x10; // EP2 is AUTOOUT=1, AUTOIN=0, ZEROLEN=0, WORDWIDE=8bit
   SYNCDELAY;

↓EP2をGPIFと接合しているのだと思う.
   EP2GPIFFLGSEL = 1;  // GPIF FIFOFlag is empty
   SYNCDELAY;

↓EP2スタート
   EP2GPIFTRIG = 0xFF; // start ep2
   SYNCDELAY;

FIFOに関する肝の部分はこれだけです.あとはFIFOとGPIFに自走(AUTOMODE)させているのでCPU 8051は傍観者です.

USB通信はいまのところよく判らないので割愛します.

ビルドして、FX2LPにdownloadします.

アプリソフト
このfirmwareをdownloadしたFX2LP基板を動かすには、USBへデータを流し込むアプリソフトが必要です.
そのアプリソフトが、
C:\Cypress\USB\CY3684_EZ-USB_FX2LP_DVK\1.1\Windows Applications\Application Source files\cpp\bulkloop\x64\Release\bulkloop.exe      (64bit windowsの場合)
C:\Cypress\USB\CY3684_EZ-USB_FX2LP_DVK\1.1\Windows Applications\Application Source files\cpp\bulkloop\x86\Release\bulkloop.exe      (32bit windowsの場合)
です.
わたしは64bitでしか動かしていませんので、32bit版が動くのかどうかは知りません.

起動するとこんな画面が出ます.この画面の設定の通りにしてStartボタンを押すと、incrementalデータが間欠的にUSBへ送出されます.

以上の環境で動かすと、DACにこのようなノコギリ波が出てくる、というわけなのでした~

その10へ   その12へ

かしこ


人気ブログランキングへ

2015年3月25日水曜日

EZ-USB FX2LP を動かしてみる (10) EPとFIFOとDACその2

前回に引き続き、FIFOからincrementalデータを出力してDACからノコギリ波を出力するトライについてです.

↓具体的にはこのブロック図のように、EZ-USB FX2LPのCPU 8051を介さずにデータを流したい.USB経由でPCから大量のincrementalデータをバルク転送して、FIFOにブタ積みします.FIFOが満杯になると(512BYTE)自動的に出力し、、、を繰り返します.
ところが、いざやってみようとするとわからないことがたくさんありました.
●FIFOとGPIFの繋ぎ込みは具体的にどうなってるんだろう?
●EP2,EP4,EP6,EP8のうちEP2をGPIFに接続するのはどうやってるのか?
●FIFOのポインタを進行させるのは誰がトリガしてるの?
●FIFOの読み出しレートはどうやって設定すればいいの?

↓FX2LPを動かしてみて、こういう構造になっているんだとわかりました.OUTだけですが.
各信号の意味は、、、
●FD[7:0]はFIFOデータ出力です.16bitにも変更できます.FDはGPIFを通過しません.
●FEは、FIFO Emptyの意味で、FIFOがGPIFへ与えます
●FFは、FIFO Fullの意味で、FIFOがGPIFへ与えます
●enは、FIFOのポインタを進める信号です
●RDY0は、enの源信号とも言える信号で、要するにFD[7:0]のデータレートを決定しています.
     (ここでは、GPIFが出力する30MHzを2^12分周した7324HzをRDY0とした)
●CTL0は、データ出力したぞというモニタ信号です
     (RDYとCTLは、各数本用意されていて、わたしは各1本しか使わなかった)
●FIFOが空っぽになったらFDを止めなくてはイケナイ.それは次のアルゴリズムでenを生成することで実現する.つまり、FIFOが空ならFIFOポインタを止める.非RDY0ならFIFOポインタを止める.
        if (!FE & RDY0) en=1; else en=0;    ①     
●①のアルゴリズムは変更可能で、GPIF Designerで編集する

以上がわかったので、わたしはほぼ納得できました.

----
上記についての補足的説明です.

<その1>
FD[7:0]は外部ポートPB[7:0]に出力されます.(固定)
FD[15:8]は外部ポートPD[7:0]に出力されます.(固定)
FD[7:0]つまり8bitバスか、FD[15:0]つまり16bitバスを選択可能です.
だとすると、8bitバスで使うならば、PD[7:0]は空きますから、PD[7:0]をuser PORTとして使えるとばかり思っていたのですが、やってみたところどうもそうではないらしい.8bitバスと設定したにも関わらず、PD[7:0]にもデータが出力され続ける構造になっている、というのがわたしの経験から知り得たコトです.無用な期待はしない方がよいらしい.

訂正: この連載24号で書きますが、Ref. manualを読んでここの動作が判りました.結論から言うと、FD[7:0]の8bitバスの時には、PD[7:0]をuser PORTとして利用できます.ただし、4つのFIFO全てが8bitバスに設定されているコトがその条件です.一つでも16bitバスに設定されているとPDはuserに開放されません.というか、4つのFIFOそれぞれ独立に8bit/16bitを設定できるんだ?

<その2>
FEとFFは、①の条件判断文では、どちらか片方しか使えません.後述するGPIF Designerの条件文編集画面でFIFOFlagという信号が出てきますが、次のようにレジスタであらかじめ選択されているからです.
   FIFOFlag = EP2GPIFFLGSEL[1:0]==0 ? PF :
              EP2GPIFFLGSEL[1:0]==1 ? FE :
              EP2GPIFFLGSEL[1:0]==2 ? FF : Reserved ;

<その3>
GPIFへEP2を接続するのはどうしてるのか?
別記事で解説しますが、レジスタ設定のこの文がその役目をしてると思う.
    EP2GPIFTRIG = 0xFF; // start ep2
これって、同時にEP4,EP6,EP8をstartしちゃったらどうなるのかは知りません.

-------
というところまでわかったので、GPIF Designerの使い方へ話題が移ります.GPIF Designerの基本的な使い方は過去記事に書いたので省略します.

↓ブロックダイヤグラムはこうします.CLK30MHz、FD[7:0]、RDY0、CTL0、が設定のポイントです.
↓波形編集画面をこのように設定します.ピンクのデータと黄色のデータは、N番目とN+1番目のデータという意味です.Data波形の上で右クリックすると出てくるメニューでNext FIFO Dataを選ぶと設定できます.CTL0は1データ出力毎に、30MHzの4clock長(133nS)のパルスを出すという意味にしてあります.
↓肝心の条件判断文の設定に移ります.◆の上で右クリックでEdit...を選びます.
↓条件判断文をこのように設定します.FIFOFlagは、別の処でFE(FIFO Empty)がセレクトしてあるので、この条件判断文は、
        if (!FE & RDY0) goto S0; else goto S2;    ② 
goto S0の意味は、次のFIFOデータを出力しろ、という意味です.
goto S2の意味は、なにもしないでS2に留まり続けろ、という意味です.
↓Projectの説明は一旦省きまして、このGPIF Designが期待通りの動作をしたかどうかをチェックします.まずは細かいところから、CTL0(赤線)のパルス幅は、実測で134nSです.計算133nSですからピッタシです.OKOK
↓CTL0の間隔は、FIFOの読み出しレートを意味しています.実測では136uSecと観測されました.設計上はRDY0へ与えた7342Hzがデータレートになっている筈です.7342Hz→136uSecと計算され、実測値とピッタシです.OKOK
↓次はDACの出力波形(青線)を観測しました.CTL0は密度が濃すぎて全面赤色になってます.incrementalデータをFIFOにブタ積みしたので、それをDACから出力すると右上がりのノコギリ波形が観測されるはずです.実測では35,2mSecのノコギリ波でした.計算上は、136uSecで256周期でグルリと一回転しますから、136uSec x 256 = 34.8mSec と計算され、実測とピッタシです.OKOK
↓FIFOにブタ積みするincrementalデータは、PCのアプリが発生させています.このアプリは、16kBYTEを出力し、約1秒休む、を繰り返します.
↓オシロのスイープ速度を遅くして表示させると、FIFOが動いている場面と、FIFOが空っぽで停止している場面を観測できました.FIFOが動いている場面はCTL0がバタついています.2.26Secと実測されました.CTL0がHIGHレベルで止まっているのは約1Secです.
FIFOには16kBをブタ積みします.それを136uSec間隔でDACへ流すのですから、計算では 136uSec x 16k = 2.23Sec と計算されます.実測とピッタシです.OKOK
以上で動作確認はできました.

↓以下はお試しでやってみたコトです.GPIF DesignerのData波形をこのようにします.
↓すると、DataがLOWレベルに凹みます.GPIF Designerでは、LOWレベルはnot valid(De-active Data)の意味です.HIGHレベルはvalid(Active Data)の意味です.このように設定して回路を動かしますと、FD[7:0]に不定が一瞬出ますので、DACの出力波形がしっかりと乱れます.
↓ちなみにここで使ったDACは、R2Rラダー型の8bit DACなので、データのグリッジには素直に反応してしまうのでした.
今宵はここまでにしとうございます.


かしこ


人気ブログランキングへ

EZ-USB FX2LP を動かしてみる (9) EPとFIFOとDACその1

EZ-USBのこの基板を動かそうとしています.その8ではGPIFを少し使ってみました.次にFIFOを動かしてDACを駆動してみたいと思いつつ、苦戦しています.
↓わたしがやりたかったコトはこういうブロック図でした(過去形).    PCとUSBを使わない.CPU8051がFIFOにincrementalデータを一度だけ積む(512BYTE).あとはグルグルと永久にGPIF→DACへ出力させてみよう.上手く行けばDACの出力にはノコギリ波が出てくるはず.
ところが、わたしのdocument理解力によると、CPUがFIFOにブタ積みしたところで無限loopで出力し続けるコトは出来ないっぽい.1BYTE毎にCPUが介在すれば処理できるらしいけど、今はCPUが介在するデータフローには興味がないのでさておく.
↓CPUを介さずにデータを流そうとすれば、このようにUSB経由でPCから大量のデータをバルク転送するなら出来ました.FIFOが満杯になると(512BYTE)自動的に出力し、、、を繰り返す(AUTOMODE)わけです.

たったこれだけを動かすにもback ground知識がいろいろと必要になりました.

EP2とFIFOの構成
上図のEP2というのはエンドポイント2の略称です.
EZ-USB FX2LPには、6ヶのエンドポイントが内蔵されています.
 EP0  コマンド制御
 EP1  コマンド制御
 EP2  PC→FIFO→外部 へのデータフロー (EP2OUT)
 EP4  PC→FIFO→外部 へのデータフロー (EP4OUT)
 EP6  外部→FIFO→PC へのデータフロー (EP6IN)
 EP8  外部→FIFO→PC へのデータフロー (EP8IN)
必ずしもこういう使い方をしなくちゃイケナイわけではありませんが、サンプルプログラムではこういう構成がありがちです.EP2~EP8を全部OUTにすることもできます.

↓USBケーブルを流れるデータはパケット化されています.EZ-USB FX2LPを使う限りにおいては、パケットの構造を詳しく知る重要度は高くないように思います.OUTデータがエンドポイントにたどり着くまでには、さしずめ電車の操車場のような壮絶なポイント切替がうじゃうじゃと在って、最終的にユーザーデータのみがエンドポイントにたどり着く、というのがOUTデータフローのイメージかと.INデータフローはその逆かと.
それにしてもどうしてEP3とかEP5が抜けているんでしょうねぇ? そっちの方が気にかかるけどdocumentには何も書かれていません.奇数が嫌いなのだろうか?

エンドポイントというと、FIFOも含んでエンドポイントと呼ばれるみたいです.FIFOの仕様はどうなってるんでしょうか?
EZ-USB FX2LPの場合、FIFOは全部で4kB+αが内蔵されています.この「全部で」というところがクセ者です.αの部分はEP0,EP1のための小サイズのFIFO(下図上段)なのでさておくとして、4kBはEP2,EP4,EP6,EP8に割り振られます.
↓下図下段の1~12は割り振りパターンです.分かり易いのは12番目.EP2が4kBを全部占有して、他のEPはお休みという構成です.さらに1024BYTEが4つに分割されている理由は、FIFOが4バンク構成という意味です.バンク1つがOUT中に、2バンクはお休みで、1バンクがデータ積み込み中というゴージャスな使い方をします.
割り振りパターン1番目は、EP2,4,6,8が仲良く512BYTEの2バンク構成で分け合います.
割り振りパターン2~11は折衷案がいろいろ提供されています.
EP2~EP8のFIFOは、アドレスF000~FFFFの4kBに剥き出しになって見えます.FIFOなのにランダムアクセスができます.

あまりにハンパですが、今宵はこれまでにしとうございます.

その8へ    その10へ

かしこ


人気ブログランキングへ