2009-06-03 16 views
2

PIC16F88XのI2Cプロトコルを調べています。 私がしたいのは、I2Cで受信したデータに応じて、I2CスレーブをACKまたはNACKのどちらかにすることです。データのPIC I2CスレーブACK

PICは、回線上で送信されたI2CアドレスでACKまたはNACKできますが、読み取った内容からは後続の受信バイトで常にACKになります。あれは正しいですか?次の通信において

Start - I2c_Addr+write/ACK - Register_value/Nack 

Iスレーブレジスタ_値の値に応じてACKまたはNACKにできるようにしたいです。スレーブがRegister _の値を理解できない場合、それはAckではありません。

誰かがこれが不可能であることを確認するか、それを行う方法を教えてください。

+0

質問:このI2Cトランザクションでは、PICはマスターまたはスレーブ(またはその両方)になりますか? – Nate

+0

2つのPIC、1つのスレーブ、1つのマスター。問題はスレーブにあるようです(無関係なレジスタをNAckすることに決めました)。 複数のマスターについて考えているかもしれませんか?あなたがいて、あなたが与える情報があれば、返信することを躊躇しないでください... – Gauthier

答えて

7

と仮定すると、あなたのMSSP周辺

短い答えを使用して:どのようなあなたが求めては、少なくともビット叩いI/Oラインなしで、PICとはおそらく不可能です。その理由は、9クロック目でack/nackがチェックされ、9クロック目が終了するまでSSPIF割り込みが発生しないからです。データバイトがI/Oレジスタ(8クロック目)にシフトするとすぐにBFビットがセットされるので、BFビットを繰り返しチェックすることができます。比較を終了して9クロックサイクル前にSSPOVビットをセットすると、NACKが生成されるはずです。これは、割り込みを実行している場合は非常にスケッチです。

答え:スレーブが受信するデータバイトが有効かどうかを確認しようとしているようです。個人的に私はこれをやっていないでしょう、確認は、データの整合性を検証するのではなく、行の整合性をシグナルすることです。デバイスがスレーブの場合、マスタは定義どおりに動作する方法を正確に把握し、I2Cライン上にプッシュする前にバイトの有効性をチェックできなければなりません。このような場合は、I2Cマスタのコードを制御していることを前提に、コードの不一致を避けるために送信できるすべてのコマンドまたは有効なデータバイトを定義する共通ヘッダーファイルを使用します。

何らかの理由で適切なバイトが送信されたことを保証する必要がある場合は、スレーブに応答バイトを要求し、スレーブに以前の転送の結果を示すコードを返させます。

I2Cラインの完全性を保証することを目的としている場合は、これらのアプローチのどれも実際には機能しません。あなたの唯一のオプションは、ブート時に大量のバイトを送信するか、CRCを使って定期的に送信し、スレーブ上で一致するかどうかをチェックすることです。一般的に、I2Cラインは動作しないか、低速であり、一般的にトレースが短く許容バス容量が高くなります。動作しない場合は、まったく確認できません。

+0

素敵な答えをありがとう、これは私が(不幸にも)期待したものでした。 私はBFビットについても考えていました.BFに割り込みを入れるのは良いことでした。 – Gauthier

1

I2CハードウェアがPICに組み込まれている場合は、私の推測はありません。私が扱ってきたハードウェアソリューションには、伝送に何か問題がないかぎり(たとえばビットがないなど)、2番目のバイトをACKすることができない状態マシンがあります。あなたは、ビットバンギングとACK用のオープンコレクタバッファを使って、ソフトウェアで独自のI2C実装を行う方がよいでしょう。それからあなたは何でもすることができます。それはI2C標準ではありませんので、あなたの仕様に合っていないデバイスをバス上に置いた場合は注意してください。私は自信がないのですが、標準のI2Cデバイスであれば、ACKを受信しないとデータを再送するかもしれないし、障害が発生した後に誰がバスを制御しているのかわからないので、 )。

関連する問題