Frage

Ich suche in das I2C-Protokoll für PIC16F88X. Was ich möchte, zu tun ist, einen I2C Slave zu ermöglichen auf die Daten auf dem I2C empfangen entweder ACK oder NACK abhängig.

Der PIC kann auf der I2C-Adresse ACK oder NACK auf der Linie geschickt, aber von dem, was ich, es wird immer ACK auf dem nachfolgend empfangenen Bytes gelesen habe. Ist das richtig?

In der folgenden Mitteilung:

Start - I2c_Addr+write/ACK - Register_value/Nack

Ich mag der Sklaven der Lage sein, Ack oder Nack in Abhängigkeit vom Wert in Register_value. Wenn der Slave Register_value nicht versteht, sollte es nicht Ack.

Könnte jemand bitte entweder bestätigen, dass dies nicht möglich ist, oder mir sagen, wie es zu tun?

War es hilfreich?

Lösung

Unter der Annahme, Sie die MSSP peripheren mit

kurze Antwort: Was für fragen ist nicht wahrscheinlich möglich, mit einem PIC, zumindest ohne Bit hämmert I / O-Leitungen. Der Grund dafür ist, dass ack / nack am 9. Taktflanke und der SSPIF Interrupt ausgelöst wird, nicht bis zum Ende des 9. Uhr überprüft wird. Sie könnten versuchen, wiederholt die BF Bit zu überprüfen, wie es so bald eingestellt wird, wie das Datenbyte in das I / O-Register (8 Uhr) verschoben wird. Wenn Sie einen Vergleich abziehen können und die SSPOV Bit gesetzt vor dem neunten Taktzyklus dies eine NACK erzeugen soll, ist dies ziemlich lückenhaft, wenn Sie irgendwelche Interrupts ausgeführt wird.

längere Antwort: es klingt wie Ihre, wenn das Datum-Byte des Slave zu validieren versucht empfängt gültig ist oder nicht ack verwenden. ich persönlich würde das nicht tun, ack ist die Integrität der Linie, um zu signalisieren, nicht die Datenintegrität überprüfen. Wenn das Gerät muss ein Slave der Master per Definition genau wissen, wie es funktioniert und die Gültigkeit des Byte prüfen kann, bevor es heraus auf den I2C Linien schieben. In solchen Fällen i annehmen, dass Sie auch die Kontrolle über den Code des I2C-Master haben, eine gemeinsame Header-Datei verwenden, die alle Befehle oder gültiges Datenbytes definiert, die im Code zu vermeiden Mismatches gesendet werden können.

Wenn Sie das richtige Byte garantieren muss wurde aus irgendeinem Grunde geschickt, hat den Master den Slave für eine Antwort Byte fragt, hat den Slave einen Code gibt das Ergebnis der vorherigen Übertragung anzeigt.

Wenn Ihre Absicht, die Integrität der I2C Linie zu gewährleisten ist, keiner dieser Ansätze wirklich funktionieren. Ihre einzige Möglichkeit wäre, eine Masse eines Bytes beim Booten zu senden oder in regelmäßigen Abständen mit einem CRC und prüfen, ob es auf dem Slave übereinstimmt. Im Allgemeinen I2C Linien werden entweder arbeiten oder nicht, sind sie niedriger Geschwindigkeit, haben in der Regel kurze Spuren und haben eine hohe zulässige Bus-Kapazität, wenn sie arn't arbeiten Sie überhaupt nicht ack sehen werden.

Andere Tipps

Meine Vermutung ist kein IF die I2C-Hardware ist mit dem PIC eingebaut. Alle Hardwarelösungen Ich habe mit einer Zustandsmaschine gearbeitet habe, die nicht aber ACK das zweite Byte helfen kann, wenn etwas nicht in Ordnung mit der Übertragung gibt es (ein Bit zum Beispiel fehlt). Sie wären besser dran, Ihre eigenen I2C Implementierung in Software mit Bit-Banging machen und ein Open-Collector-Puffer für den ACK. Dann können Sie alles, was Sie wollen tun. Es wird nicht I2C-Standard sein, also aufpassen, wenn Sie irgendwelche Geräte auf dem Bus setzen, die Ihre Vorgaben nicht berufstätig sind. Ich bin nicht sicher offhand aber ich denke, für jeden Standard I2C-Gerät, wenn es nicht einen ACK empfängt er die Daten erneut übertragen kann oder einfach nur Fehler, da es nicht sicher ist, die nach einem Ausfall der Steuerung des Busses hat (gekennzeichnet durch eine NAK ).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top