Ihr Unter der Annahme der MSSP periphere
kurze Antwort mit: 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 an der 9. Taktflanke überprüft wird und der SSPIF-Interrupt erst am Ende des 9. Takts ausgelöst wird. Sie könnten versuchen, das BF-Bit, wie es gesetzt ist, wiederholt zu überprüfen, sobald das Datenbyte in das E/A-Register (8. Takt) geschoben wird. Wenn Sie einen Vergleich durchführen und das SSPOV-Bit vor dem 9. Taktzyklus setzen, sollte dies einen NACK erzeugen, dies ist ziemlich skizzenhaft, wenn Sie Interrupts laufen haben.
längere Antwort: Es klingt wie Ihr Versuch zu validieren, wenn das Datenbyte, das der Slave empfängt, gültig ist oder nicht ack verwendet. persönlich würde ich das nicht tun, ack ist es, die integrität der linie zu signalisieren, datenintegrität nicht zu verifizieren. Wenn das Gerät ein Slave ist, muss der Master per Definition genau wissen, wie es funktionieren soll und kann die Gültigkeit des Bytes überprüfen, bevor es auf den I2C-Leitungen ausgegeben wird. In solchen Fällen gehe ich davon aus, dass Sie auch die Kontrolle über den I2C-Master-Code haben, eine gemeinsame Header-Datei verwenden, die alle Befehle definiert, oder gültige Daten-Bytes, die gesendet werden können, um Fehler im Code zu vermeiden.
Wenn Sie aus irgendeinem Grund sicherstellen müssen, dass das richtige Byte gesendet wurde, lassen Sie den Master den Slave nach einem Antwortbyte fragen, lassen Sie den Slave einen Code zurückgeben, der das Ergebnis der vorherigen Übertragung angibt.
Wenn Sie die Integrität der I2C-Linie garantieren möchten, funktioniert keiner dieser Ansätze wirklich. Ihre einzige Option wäre, eine Menge von Bytes beim Booten oder periodisch mit einem CRC zu senden und zu überprüfen, ob es auf dem Slave übereinstimmt. Im Allgemeinen werden I2C-Leitungen entweder funktionieren oder nicht, sie sind langsam, haben im Allgemeinen kurze Leiterbahnen und haben eine hohe zulässige Buskapazität, wenn sie nicht funktionieren, werden Sie überhaupt keine Ack sehen.
Frage zur schnellen Klärung: Wird Ihr PIC bei dieser I2C-Transaktion Master oder Slave (oder beides) sein? – Nate
Zwei PICs, ein Slave und ein Master. Das Problem scheint im Slave zu liegen (die Entscheidung, ein irrelevantes Register zu aktivieren). Sie könnten über mehrere Master denken? Wenn Sie sind und Sie Informationen zu geben haben, zögern Sie nicht zu antworten ... – Gauthier