酔漢電子工作手帳

2007-09-11

SPI迷宮

| 12:31 | SPI迷宮 - 酔漢電子工作手帳 を含むブックマーク はてなブックマーク - SPI迷宮 - 酔漢電子工作手帳

FT2232のFTCSPI.DLLではなくFTDXX.DLLを使ったSPIインターフェースを組んでみました。MPSSEを直接使います。デバイスの検索や初期化はFTCSPI.DLLを使い、Open()したあとにMPSSE命令を直接流し込んで実験します。

以前からうるさく言っていたRead/Write関数を実装し、M25P40のIDを読み取ることに成功しました。これまでの経験があるせいか、別に躓くこともなくあっさりと成功しています。あとは、関数を磨き上げ、きちんとしたクラスとして実装する作業が待っています。

SPIは、モトローラがろくすっぽ仕様を決めなかったため、極端にばらつきのある実装がたくさんあります。そのため、いつまでたってもマスター側には理解しにくい設定が残っています。PhilipsががっちりとI2Cを管理しているのとは好対照です*1

SPIを良くまとめた文書を読みたければ、Freescale(Motorola)ではなく、えるむさんによる解説を読むのが一番の近道です。

MPSSEを使ったSPI実装にはひとつ問題があります。えるむさん言うところの「ラッチ先行」形式しか実行できないのです。「シフト先行」についていくつか実験を行いましたが、あからさまに異常動作をするだけで、きちんとした結果を出せませんでした。

スレーブ側が「シフト先行」でなければ動かないようなデバイスだと、問題が起きるでしょう。

もうひとつ、MPSSEのアプリケーションノートには、同期シリアルインターフェースマニュアルが陥る典型的な落とし穴があります。

命令の"-ve TCK/SK on write" bitを1にすると、送信時に立下りでデータをシフトします。ところが、"-ve TCK/SK on read" bitを1にすると、受信時に立下りでデータをサンプルすると言うのです。本当ですかね。受信時も1で「データをシフト」の間違いじゃないですか?

同期転送でエッジの区別をつけられないマニュアル・ライターは掃いて捨てるほど居ます。おかげでこんなところでも疑心暗鬼に。困ったものです。

*1:そういえば、MOMI/SISOを使った3Wire SPIって誰が使い始めたんだろう

まやまや2007/09/11 14:04よく実際SPIの動きとデータシートの記述がちがうものもありますね。これにはいつも参ってしまいますが…。
えるむさんのところにSPIにかんする詳細をまとめてあるページがあったんですね。知りませんでした。真実はわかりませんが、MOMI/SISOのSPIもFreescaleが使いだしたんじゃなかったかと。

suikansuikan2007/09/12 21:30I2Cだとかなり安心できるのですが、あれはあれで遅いとかありますしね。

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