ich programmiere einen Atmega16 in C. Ich versuche einen I2C softwaretechische zu implementieren. Der µC wird der Busmaster sein. Es stehen soweit alle Funktionen (startbedingung, stopbedingung, writebyte, readbyte). Allgemein habe ich mich an dem Code der Procyon Lib orientiert. Wenn ich habe der Slave auslesen möchte (also SDA realease und mit dem Master 8 (bzw 9) Clockimpulse erzeuge), dann will der Slave die Dataline partout nicht runterziehen. SDA bleibt unter allen Umständen high.
Hat jmd damit erfahrung?
Wäre suuper dankbar für Eure Tips!
Zusatzinfo: ich hab an denselben Ports schon mal mit der Hardwareunterstützung des I2C vom µC mit meinem Slave tadellos zum laufen gebracht.
Meine Softwareimplementierung dagegen funktioniert nicht
Ich habe mal versucht die Messung zu skizzieren (siehe Anhang).
Was mich beunruhigt ist
a) dieser kleine Peak der zwischen dem LSB und dem ACK Impuls auftritt (v.a. die Pegelhöhe ist genau mittig)
b) Dass beim 9. Clockimpuls die Dataline gegen Ende des Impulses von 0->1 wechselt.
schaltest Du im Master, wenn der Slave ziehen darf, auch wirklich den High Treiber ab?
Also ist der SDA Pin des Masters auf Input?
Sonst versucht der Slave runterzuziehen, aber der Master hält dagegen und es gibt einen Kampf der Treiber.
Kannst auch mal in Serie einen Wiederstand einbauen in die SDA Leitung. Dann kannst Du den Treiberkampf mit dem Oszi sehen
wie das die Hardware TWI macht.
Die bedient einfach nur den Pulldown Fet des Ausgangs.
Der Hightreiber bleibt aus. Damit kann der externe (oder interne) Pullup nach oben ziehen.
Wenn 1 oder mehrere Busteilnehmer runter ziehen, gibt es ein low auf dem Bus.
Lesezeichen