Ich arbeite derzeit an einem I2C-EEPROM-Projekt, bei dem Bit-Banging zum Ansteuern der SDA- und SCL-Leitungen verwendet wird.
Meine Lesefunktion funktioniert einwandfrei, aber wenn ich ein Byte mit einer führenden "1" schreibe, lese ich FF immer zurück. auch wenn das Byte zuvor mit etwas anderem programmiert wurde. Führende "0" ist perfekt. Es ist nicht meine Leseroutine; Wie ich auf dem Bereich sehen kann, gibt es FF zurück.
Ich suche nach Vorschlägen, warum dies sein könnte. Gibt es irgendwelche offensichtlichen Fehler, die das Problem verursachen könnten? [Ich kann den Code nicht posten - Firma vertraulich ... :(]
Jede Wellenform, die ich betrachte, entspricht genau der Spezifikation. Ich entkopple das EEPROM. Meine Klimmzüge sind 2,2k, also innerhalb der Spezifikation. Ich takte in diesem Prototyp mit ungefähr 500 Hz. Der Chip sendet ACKs an jedes meiner Bytes, damit er sie erkennt. Aber es funktioniert einfach nicht ...
Ich benutze einen Microchip 24LC256 .
Vereinfachter Schreibalgorithmus für ein Byte:
wait
SDA low
SCL low
wait
for each bit
if bit is set: SDA high
if bit is unset: SDA low
wait
SCL high
wait
wait
SCL low
wait
wait
SDA high
SCL high
wait
wait
check ACK status
SDA low
SCL low
wait
return ACK status
Vereinfachter Lesealgorithmus für ein Byte:
wait
SCL low
SDA high
for each bit (8 bits)
SCL high
wait
wait
SCL low
wait
check and store received bit
wait
do a NACK or ACK depending on if it is the last byte
Antworten:
Sie lesen die Daten, nachdem die Uhr wieder niedrig ist. Sie müssen das tun, um die Uhr hoch und niedrig zu stellen. Nachdem die Uhr niedrig ist, darf der Slave die Datenleitung ändern, nicht solange sie hoch ist.
Das Lesen sollte also so sein:
quelle
Das Problem am Ende stellte sich heraus, dass ich unter bestimmten Bedingungen versehentlich eine STOP-Bedingung gesendet habe, weil das Timing verstümmelt war. Ich gab die Verwendung des Oszilloskops auf, holte den Logikanalysator heraus und konnte das Problem in 15 Minuten beheben, da es den STOP hervorhob, der nicht hätte vorhanden sein dürfen. Ich werde anhand der hilfreichsten Antwort auswählen, wem das Kopfgeld gegeben werden soll. Vielen Dank für alle Lösungen.
quelle
OK, Ihr Bereich beweist, dass das erste Byte, das in den PIC eingeht, schlecht ist, es ist also nicht die PIC-Lesefunktion.
Haben Sie überprüft, ob der Schreibzeitpunkt auf der Empfangsseite in Ordnung ist?
Schlägt dies in beiden Modi unten fehl?
Die Spezifikation zeigt "Das wichtigste Bit (MSB) 'b7' wird zuerst gesendet". Dies fällt auch zusammen, wenn b7 = 1 ist, dass das gesamte Byte als FF zurückgelesen wird. Entweder wird es nicht geschrieben und nur gelöscht (Fehlerbedingung), wenn b7 = 1 ist, oder es wird ungeachtet des vorherigen Inhalts schlecht als FF zurückgelesen. Da jedes Schreiben ein byteweites Löschen vor dem Schreiben ist, kann es sich dennoch um ein schlechtes Schreiben oder ein schlechtes Lesen handeln oder das Timing des 1. Bytes ist unterschiedlich.
Vorschlag: Überprüfen Sie das PTC-Signal während eines Schreib- / Lesevorgangs, um den normalen Betrieb sicherzustellen.
Es besteht die Möglichkeit, einen externen Takt zum Timing der Länge eines E / W-Zyklus mithilfe von PTC zu verwenden. Haben Sie versucht, dies zu verwenden?
tE / W-Zykluszeit
Besteht es diese Kriterien?
quelle
Klingt so, als könnten es ein paar Dinge sein:
0xFF
. Der Pin könnte als Ausgang für den Bus übrig bleiben, während Sie daraus lesen.0xFF
angezeigt (und es wird höchstwahrscheinlich dasselbe zurückgegeben, da es sich wahrscheinlich um einen ungültigen Befehl / eine ungültige Bedingung handelt).quelle
0xFF
s zurückgegeben werden? Siehe auch meine Änderungen oben.Ich habe dies oben als Kommentar eingereicht, aber mein Vertrauen in die Antwort ist in den tiefen Nischen meines Geistes leise gewachsen, so dass ich es zu einer Antwort mache.
Ich habe eine verrückte Vermutung, dass dies mit ziemlicher Sicherheit ein Softwarefehler auf niedriger Ebene ist, der sich auf die Signiertheit einiger Variablen bezieht. Sind Sie in Ihrem für jeden Bitcode versehentlich vorzeichenerweiternd mit einer Rechtsverschiebungsoperation? Wenn Sie dann sind, wird Ihr führender Sie nach 7 Schichtoperationen schließlich mit einem 0xFF verlassen.
Steven hat in einem Kommentar darauf hingewiesen, aber haben Sie die Heiligkeit Ihrer Schreibvorgänge auf einem Osilloskop gesehen, oder nehmen Sie nur an, dass sie funktionieren, wenn die Hälfte der Rücklesungen gut aussieht? Wenn Sie nicht versucht haben, die Schreiboperation des Werts 0xAA zu betrachten, ist dies möglicherweise eine gute Sache.
Wenn Sie den tatsächlichen Code Ihrer inneren Schleife und die zugehörigen Variablendeklarationen angeben können, können wir möglicherweise einen Fehler erkennen.
quelle