酔漢電子工作手帳

2007-09-09

あーだこーだ

| 12:03 | あーだこーだ - 酔漢電子工作手帳 を含むブックマーク はてなブックマーク - あーだこーだ - 酔漢電子工作手帳

どうもこう、FT2232用のSPI DLLである、FTCSPI.DLLが気に入りません。このDLLの最大の欠点は、すでに書いたように「Read/Write」を同時にできないことです。SPIペリフェラルIBM PCが登場する以前から存在しており、当然のようにLinux的、Windowsプログラミングパラダイムと遠い世界を作っています。Read/Writeを同時に転送でき、かつRead/Writeを異なるクロック・エッジで駆動できなければすべてのデバイスに対応できません。すべてというは贅沢かもしれません。がしかし、Analog DevicesのADCを見たら、双方向転送と送受逆エッジが当然のように行われていました。orz

当面の目標はSPI FLASHプログラマですから、これは無視すればよさそうなものです。が、内部APIをこの仕様で固めてしまうと、後が面倒そうです。そういうわけで、MPSSEを自分でいじれないか調べてみました。

MPSSEはシーケンサー

FT2232のMPSSE(Multi-Protocol Synchronous Serial Engine)は、ワンショットのシーケンサーです。このシーケンサーは分岐を持たず、内部クロックに同期して命令を実行します。命令は純命令とデータからなります。たとえば、byte送信命令を実行すると、次の2バイトは送信byte数と解釈され、続くnバイトが送信データと解釈されます。命令セットはFTDIのAN2232C-02に掲載されています。

命令ごとにクロック・エッジを指定できる

MPSSE命令は、命令ごとにクロック・エッジを指定できます。それも、送受ごとに別エッジを指定できます。また、命令ごとにMSB first, LSB firstを指定できます。しかし、同時に送受する場合、MSB/LSB firstを分けることはできません。

通常のデータパイプ越しにデータを送る

実行する命令は送信データとして送ります。このとき、あらかじめFT2232の動作モードをFT_SetBitMode APIでMPSSEに変更しておかなければなりません。そうしなければUARTデータとしてすべて送信されてしまいます。送信にはFT_Write APIを使います。

通常のデータパイプ越しにデータを受ける

受信データはFT_Read APIで受信します。ただし、MPSSEは受信命令を受けなければ受信動作を開始しません。したがって、受信の前にFT_Writeで受信命令を送る必要があります。

クロックはトグル

送信命令も受信命令も、クロックのトグルはXORを使います。したがって、クロック・ピンの初期状態は別途設定しなければなりません。

参考リンク

USB-008によるSPI通信実験
Human Dataによる実験です。ここが取っ掛かりになって今回の調査を行えました。
MPSSE Projects
FTDIのMPSSE関連プロジェクトページです。HDLの実験はDelphiを使っているので、Delphiのソースをここで確認して追跡できた。FTCSPI.DLLはソースが公開されていないため、このソースは非常に勉強になりました。というか、これがなければMPSSEの命令セットとHDLの実験の間にはミッシング・リンクが残ったままだったでしょう。
FTDI Application Notes
MPSSEの命令セットはここからダウンロードできます。

そんなこんなで調査は終わりです。とりあえず今のままSPI Flash Programmerを完成させ、自分用のSPI IFは別途気が向いたら作りますか。

トラックバック - http://ecrafts.g.hatena.ne.jp/suikan/20070909