やまちゃんのオーディオブログ

真空管アンプ、最近は資金調達のためのFX,MetaTrader4ネタもやっています。

ez-usb fx2lp usbマイコンの基本の解説

8.bulkloopのファームウェアを読んで解説する2

投稿日:2013年6月8日 更新日:

fw2.c、bulkloop.cの概要を説明します。
「//」は、コメント文であり、CPUはなんら処理しません。
includeは、別ファイルの引用です。
#define DELAY_COUNT 0x9248*8Lの「#define」は、定数を定義しています。
const char code EPCS_Offset_Lookup_Table[] も、配列変数の定義です。
これらの定義は、
後で出てくる、{}内でも、その定義は有効です。
つまり、C言語はオブジェクト指向となっており、
「a=1 {b=2; {c=2;} d=c; }とした場合、
一番内側のc=2という代入は、「{c=2;}」の中でのみ定義が、局所的に有効になります。
d=c;では、何も代入されません。
また、「{c=2;}」では、a=1;、 b=2;という定義も、有効になります。
{b=2;}の中では、a=1 が有効になります。

「void SetupCommand(void);」等は、このファイルで定義する関数の一覧を表します。
voidとは、空を表し、「(void)」とは、関数内に入力すべき変数がないことを表し、
「void SetupCommand」とは、a=SetupCommand()のように、SetupCommand()を実行した結果なんら値を返さない関数であることを意味します。これに対し、SetupCommand()が何らかの整数を出力として返すとすれば、「int SetupCommand()」とします。そうするとこの関数を実行するコマンドである、「a=SetupCommand();」では、aに整数値が代入されます。

次に、void main(void){}内は、メイン関数(メインプログラム)を表しており、以上の定義を前提に、最初に実行される、プログラム(CPUへの順次命令される手順)が実行されます。
mainの中にも、「 DWORD i;」など、メインのみで使われる変数の定義があります。
ちなみに DWORDとは、fx2.hで、
typedef unsigned short WORD;」と定義されていますから、変数定義です。その後、 sleep等の状態定義を経て、「TD_Init();」は、初期設定のサブルーチンで、このコードは、TD_Init()を、引数なし(カッコ「()」内がなし)で呼び出すという物です。「TD_Init()」は、「bulkloop.c」のファイル内にあります。
そして、TD_Init()は、main{}の外に独立して、記載されています。したがって、TD_Init()内の変数の定義は、TD_Init()を実行終えると終了し、main{}では、有効になりません。
「bulkloop.c」の「TD_Init();」では、
「IFCONFIG |= 0x40;」等の重要な設定がなされており、前回「7.bulkloopのファームウェアを読んで解説する」のとおり、trmマニュアルp334に従い、基本的設定をします。「EP2CFG = 0xA2; SYNCDELAY; EP4CFG = 0xA0;」についても、実用上、変更が必要です。

その後も、初期設定のコードが続き、while(TRUE){}内で、「TD_Poll();」という関数が繰り返し実行されます。「TD_Poll();」は、サブルーチンですが、実質のメイン関数であり、「bulkloop.c」のファイル内にあります。
ですから、実質的に、実用へ改造すべきは、「bulkloop.c」の「TD_Poll();」となります。
「while(TRUE){}」 において、whileとは、()内の論理が正である限り、{}を実行することになります。ここでは、「(TRUE)」は常に真ですから、fx2lpが起動している限り、「TD_Poll();」が、永遠に、繰り返し実行されることになります。

「bulkloop.c」の「TD_Poll();」では、
「EP2468STAT & bmEP2EMPTY」つまり、EP2468STATというレジスタは、EP2等の全てのエンドポイントが空(つまりデータ転送済み)であるか、満タンであるかを表す、8bitの状態集合を表すレジスタですが、そのうちの、「bmEP2EMPTY」という「0」ビット桁(FX2regs.hで定義)の値を見て、エンドポイント2が空であるか判断し、
空でない場合(「!」は、論理否定)には、「if(!(EP2468STAT & bmEP2EMPTY)){}」(条件#1とする)の{}内を実行します。ここで、エンドポイント2は、アウトエンドバッファつまりPCから送られたデータが格納される場所を表しています。

そして、「if(!(EP2468STAT & bmEP6FULL)){}」(条件#2とする)は、同様に、EP2468STATレジスタのbmEP6FULLを表すビットを見て、EP6が満タンであるかチェックし、EP6が満タンでなければ、{}内を実行します。ここで、エンドポイント2は、インエンドバッファ、つまりPCへ送られるべきデータが格納される場所を表しています。
つまりは、アウトエンドポイント2に、PCからデータが送信され、1つ以上のバッファが、空でなく、かつ、インエンドバッファ6が、満タンでなければ、後のfor{}内の通り、EP2から、EP4へバッファが全部コピーされます。そうすると、PCからEP2へ送られたデータは、EP6へ転送されます。PCがEP6へアクセスすることにより、PCは、その転送状況・内容、ひいては、fx2lpの基本的な動作を確認できるのです。ちなみに、このようにコピーされたEP2のデータは、EP2からEP6へ転送された後は、転送済みであり、空の扱いになります。

「 APTR1H = MSB( &EP2FIFOBUF ); APTR1L = LSB( &EP2FIFOBUF );」は、
オートポインターアドレスの上位バイトアドレスと、下位バイトアドレスへ、分割して記憶させるもので、EP2FIFOBUF[]は、1つのバッファ1024個のデータの行列(FX2regs.h参照)、
&EP2FIFOBUFは、EP2FIFOBUFという配列のポインタの番地「&」、MSBは、most significant bite(最上位バイト)、LSBは、least significant bite(最下位バイト)です。MSBは、最上位ビットの意味もあるが、ここでは、バイトを表しており、このMSB,LSBは、FX2regs.hに
定義(「#define MSB(word) (BYTE)(((WORD)(word) >> 8) & 0xff)」)がある。
「APTR1H = MSB( &EP2FIFOBUF );
APTR1L = LSB( &EP2FIFOBUF );
AUTOPTRH2 = MSB( &EP6FIFOBUF );
AUTOPTRL2 = LSB( &EP6FIFOBUF );
は、オートポインタを2種類設定している。
オートポインタの初期アドレスは、EP2FIFOBUF[]については、その冒頭EP2FIFOBUF[0]が、fx2lpに格納されるアドレスになるのだろうと思われる。EP6FIFOBUF[]も同様である。

fx2lpでは、オートポインタが設定されており、
「for( i = 0x0000; i < count; i++ )
{EXTAUTODAT2 = EXTAUTODAT1;}」
とするだけで、オートポインタ1のアドレスの先のデータが、オートポインタ2のアドレスの先のデータへ代入される(コピーされる)。つまり、EXTAUTODAT1,EXTAUTODAT2は、現在のオートポインタのアドレスにあるデータの値であるが、1つデータをコピーすると、fx2lpが備える機能として、配列のアドレス(引数[]の値)は、自動的にインクリメント(+1)がされるのである。
(ここで、for は、i=0x0000から、i < countになるまで、{}内を繰り返す。
1度{}実行するたびに、i++つまり、iはインクリメントされる。)

ここで、繰り返される数countは、「count = (EP2BCH << 8) + EP2BCL;」において、countは、繰り返すべき回数(10進数の整数)、EP2BCH(EP2バイトカウンタ上位(設定したEP2のバッファの個数))の8倍、EP2BCH(EP2バイトカウンタ下位)を足し算して、EP2BCを整数に直す。EP2BCHは、レジスタの値と関係がある。

「BOOL TD_Suspend(void)」以下は、割り込みを表している。

-ez-usb fx2lp usbマイコンの基本の解説

執筆者:


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA


関連記事

no image

4.即座にバルクループ(bulkloop)を立ち上げる!

今回は、基本となるサンプルであるバルクループを、速攻で、立ち上げることにしよう。 バルクループとは、 A.fx2lpのアウト用エンドポイントへ、256kバイトずつ、データを送り込み、 B. fx2lp …

no image

<前提2>ez-usb fx2lp以外の手段について2

usbの専用マイコンとしては、ftdiのFT2232Hがある。 これは、FX2LPよりお手軽で、 マイコンにプログラム(ファームウェア)をインストールする必要がない。 VISUAL STUDIOから命 …

no image

小さな小さな信号発生器(シグナルジェネレータ、ファンクションジェネレータ)

信号発生器、オシレータ、シグナルジェネレータ、またはファンクションジェネレータを購入して、 fx2lpに入力しようと考えた。fx2lpをスレーブとするクロックとして。 ところが、高い、大きい、6000 …

no image

ez-usb fx2の紹介

usbオーディオを自作し、自由に応用できるようにするため、 usbを用いて、データをDACなどに転送することを考えた。usbを用いたデータ転送としては、ez-usb fx2(fx2lp)という専用マイ …

no image

5.keilからファームウェアをコンパイルする!

前回では、すでに出来上がったファームウェアを、fx2lp1にインストールしたが、 今回は、keilでファームウェアをコンパイルして、動作を確認する。 C:\Cypress\USB\CY3684_EZ- …

[最近の記事]
2013年6月
 1
2345678
9101112131415
16171819202122
23242526272829
30