<カメレオンUSB FX2のアプリケーション>

「カメレオンUSB FX2」のアプリケーションを開発するためには

の3つが必要になります。

アプリケーションの流れとしては、MAX2でデータを取得して、PCに転送し、PCでデータを加工して利用する。(あるいはその逆)
というのが一般的な「カメレオンUSB FX2」のアプリケーションの流れになると思います。

FX2LPのCPUである8051は8bitで、動作クロックも48MHzと貧弱ですので、数100Mbpsという高速データを取り扱うアプリケーションの場合は、FX2LPがデータ処理を行うことは現実的ではありません。(ファームウエアとして実装しなければならない機能はUSB制御としての基本的な機能のみですむはずです。)

また、ホストアプリケーションにしてもユーザが本当に行いたいことは、データを加工することです。USBの制御についてはあくまでも必要だから行うだけで、できるだけ手を抜きたいところではあります。

ということで、ファームウエアについては、高速転送を可能にするFX2LPのFIFOを使用する汎用的なものを用意しました。多くの場合、この標準的なファームウエアで対応できるはずです。
ホストアプリケーションに関してはUSB制御にかかわる部分はライブラリ化して、ユーザが自分の行いたいデーター処理に専念できるようにしています。

MAX2のデザインに関しては、実際のアプリケーションのハード部分のインターフェイスに当たりますので、汎用化は難しくアプリ毎に開発してください。


<カメレオンUSB FX2ライブラリ>

「カメレオンUSB FX2」はCypressの提供するデバイスドライバCyUSB.sysによって制御されます。CypressではCyUSB.sysを制御するためのクラスライブラリとしてCyAPIを提供しています。今回作成した「カメレオンUSB FX2ライブラリ」も基本的にはこのCyAPIを呼び出す形で実装されています。

「カメレオンUSB FX2ライブラリ」はCyAPIを使って下記の機能を実装しています。

  1. PCアプリからFX2LPへのファームウエアのダウンロード
  2. 複数のFX2LPを識別する機能
  3. CyAPIの非同期転送関数を使用した高速データ転送の仕組み

「カメレオンUSB FX2」のアプリケーションはファームウエアは基板のEEPROMには書き込まず、PCアプリケーション側に持ちます。そして必要に応じてFX2LPに転送することになります。このためには、ファームウエアのダウンロード機能は外すことは出来ません。

「複数のFX2LPを識別する機能」については、かねてから多くの要望があり実装しました。具体的な用途としては、既に開発が完了した「カメレオンUSB FX2」の機器を使用しているPCで、別の新たなアプリケーションが開発できるようになります。

FX2LPには、EEPROMからベンダID、プロダクトID、デバイスID(CyConsoleのbcdDevice)だけを取得して、FWは後でPCからダウンロードできる機能があります。ベンダIDとプロダクトIDを変えてしまうと、デバイスドライバも変えなくてはならず、今回の目的には使用できなくなりますが、ベンダIDとプロダクトIDはFX2LPのままで、デバイスIDだけを個別に振り分けます。

CyAPIはデバイスIDを取得できますので、対象となるデバイスIDを持つ機器にFW(ファームウエア)をダウンロードすればOKです。
ところが、問題があります。FWをダウンロードすると今度はFWが持つベンダID、プロダクトID、デバイスIDを使用するようになり、再度識別出来なくなってしまいます。この問題を回避するためにライブラリでは、FWをFX2LPにダウンロードする際に、プロダクトIDを変更するようにしています。
(このため複数のFX2LPを識別するFWは、必ずベンダID「04B4」、プロダクトID「1004」、デバイスID「0000」に設定してください。)
(EEPROMにデバイスIDを書き込むにはFX2WRID.exeを使用します。)

「非同期転送を使用した高速データ転送の仕組み」ですが、高速データ転送は「カメレオンUSB FX2」の目玉でもありますので、この機能を使いやすい形で実装するのは重要です。

CyAPIではデータ転送の仕組みは、同期方式と非同期方式の2種類が提供されています。同期方法は受信するバッファを指定して、CyAPIの関数を呼び出します。この方法は扱いが楽でよいのですが、データの取りこぼしが発生します。FX2LPのFIFOのバッファは最大で2Kbyteまで設定することが出来るので、2Kbyteが溢れるまでに、PC側がデータを取り込んでくれれば、途切れることなくデータを送信出来ます。ところが同期方法を使用してデータを転送すると、PC側の処理が追いつかずに取りこぼしが起きます。(想像ですが同期方式は新たな転送バッファを用意する際に必ず、ユーザーモードとカーネルモードの切り替えが必要になるためと思われます。)

取りこぼしを防ぐには「カメレオンUSB FX2」側により大きなバッファメモリを用意して、データを保管し、PC側の要求に応じて転送することで回避することも可能ですが、あまり現実的ではありません。

そこで登場するのが非同期転送方式です。この方法のメリットは、アプリケーション側で用意した複数個のバッファを事前に、デバイスドライバに登録出来る点です。このように十分な容量(64Kbyte以上)を持つバッファを複数個(8個以上)登録しておくことで、デバイスドライバは潤滑にデータを取り込むことが可能になります。

非同期方法の問題点は、用意したバッファにデータが届いているかをアプリ側で個別に調べたり、決められた手順でバッファを開放したりと面倒なところが難点です。今回「カメレオンUSB FX2ライブラリ」では、バッファにデータが届いた際に呼び出されるコールバック関数を導入することにより、面倒な作業は全てライブラリがわに任せることが出来ます。


コンソールアプリケーションアーカイブ