Forum: Mikrocontroller und Digitale Elektronik Ist der Signalverlauf bei I2C so üblich?


von Martin T. (martin5)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

nachdem ich die Platine für meine Raspi-Heizungsregelung aus diesem 
Beitrag "Re: Platinenentwurf für Heizungsregelung mit Raspberry Pi - Kritik?" in Betrieb genommen 
hatte, habe ich einige Kommunikationsschwierigkeiten mit einem 
angeschlossenen Relaisboard-Treiber. Um der ganzen Sache auf den Grund 
zu gehen, habe ich die I2C-Kommunikation mit meinen bescheidenen 
Analysemitteln (Saleae Logic 4) beobachtet. Dort fielen mir einige 
Signalverläufe auf, die ich durch eine Minimalvariante (Raspi <--> 
MCP23017) auf dem Breadboard bestätigen konnte.

Dort tauchen ab und zu so halbe Spitzen auf. Nach stundenlagem 
Draufschauen viel mir auf, dass diese Spitzen immer an der gleichen 
Stelle auftauchen, nämlich direkt vor dem ACK des MCP.

Meine Frage dazu wäre, ist das normal? Ich vermute, dass der Raspi die 
Leitung schneller los lässt, als der MCP zum ACK sie wieder auf GND 
zieht. Da dies alles innerhalb der Low-Phase des Takts passiert, sollte 
es keine negativen Auswirkungen auf die Kommunikation haben. Ist das 
richtig?

Danke! Martin

: Bearbeitet durch User
von gäst (Gast)


Lesenswert?

Empfängt der Master denn das ACK? Wenn ja würde ich mir an dieser Stelle 
keine weiteren Sorgen machen. Wichtig ist das bei der positiven Flanke 
des  SCL-Signals die SDA-Leitung einen festen Pegel angenommen hat - und 
das auch auf der Seite des Masters.

von Mike (Gast)


Lesenswert?

Martin T. schrieb:
> Nach stundenlagem
> Draufschauen viel mir auf, dass diese Spitzen immer an der gleichen
> Stelle auftauchen, nämlich direkt vor dem ACK des MCP.

Dann überleg mal, was vor dem ACK passiert. Da gibt der Sender den Bus 
frei und der Empfänger aktiviert für das ACK seinen Treiber. Warum 
sollte da der Bus zwischendurch nicht kurz hoch gehen?

von Rolf S. (audiorolf)


Lesenswert?

Mike schrieb:
> Warum
> sollte da der Bus zwischendurch nicht kurz hoch gehen?

Ja, das ist genau der Grund. Der Bus wird ja durch den R getrieben. 
Deshalb hat I2C in der SPEC auch eine Anforderung, spikes mit 50ns zu 
unterdrücken.

von Michael R. (Firma: Brainit GmbH) (fisa)


Lesenswert?

Martin T. schrieb:
> Ich vermute, dass der Raspi die
> Leitung schneller los lässt, als der MCP zum ACK sie wieder auf GND
> zieht.

Ich schließe mich der Meinung der Mehrheit an :-)

Allerdings - ich hätte selbst solche peaks noch nie beobachtet. 
Vermutlich deshalb, weil in meinen Fällen der Master für eine gewisse 
"hold time" SDA weiter am Pegel hält (oder erst später "loslässt") und 
der Slave sehr schnell mit dem ACK bei der Hand ist, sodaß sich diese 
zwei Aktionen überschneiden, und der Peak erst gar nicht auftritt.

Aber, wie du richtig vermutest - während SCL low ist, darf alles 
mögliche passieren, und sollte nicht stören.

: Bearbeitet durch User
von Georg A. (georga)


Lesenswert?

Die Peaks sind OK, nicht jeder Slave ist schnell... Sehr oft kann man 
auch an einem leicht höheren low-Pegel sehen, das jetzt der Slave die 
Leitung treibt und nicht nur der Master kaputt ist ;)

von Martin T. (martin5)



Lesenswert?

Vielen Dank für eure Antworten!

Jetzt habe ich zusätzlich zwei I2C-Buffer PCA9600 dazwischen geschaltet. 
Also Raspi <--> PCA9600 <--> PCA9600 <--> MCP23017.

Die Kommunikation läuft stabil, aber der Signalverlauf sieht ganz anders 
aus.

Der erste Screenshot zeigt die Messung am Master, der zweite die Messung 
am Slave. Die Buffer scheinen den Pegel nicht mehr vollständig auf GND 
ziehen zu können. Der Low-Pegel befindet mit 0,7V zwar noch innerhalb 
der Spezifikation (0,3 x 3,3 = 0,99), ist aber schon ganz schön knapp. 
Gibt es dafür eine Erklärung? Kann man dies ändern?

VG, Martin

von Klaus (Gast)


Lesenswert?

Martin T. schrieb:
> Gibt es dafür eine Erklärung

Nun, es gibt keinen wirklich "automatisch" umschaltetenden 
bidirektionalen Buffer. Anhand des gezeigeten Spannungsunterschied 
entscheidet der Treiber, in welcher Richtung er treiben muß.

Schau noch mal in die Spec der Treiber. Manche schließen da explizit 
aus, zwei hintereinander zu schalten.

MfG Klaus

von Georg A. (georga)


Lesenswert?

Eventuell zuviel Pullup auf der Busseite oder zuwenig auf der Leitung 
zwischen den beiden Buffern? Im Datenblatt zum PCA gibts noch Referenzen 
auf Application-Notes, evtl. steht da noch mehr drin...

von Bernd K. (prof7bit)


Lesenswert?

Martin T. schrieb:
> Meine Frage dazu wäre, ist das normal?

Ja. Das ist vollkommen innerhalb der Spezifikation. Zwischen der 
abfallenden und der nächsten aufsteigenden Taktflanke haben die Geräte 
Zeit ihre Ausgangstreiber zu schalten, gesampled wird an der 
aufsteigenden Flanke und während der Takt high ist muss der Pegel gleich 
bleiben aber sobald und solange der Takt auf low ist darf sich der Pegel 
ändern.

Der Master schaltet hier den Ausgang hochohmig beinahe im selben 
Augenlick wie er den Takt auf low zieht und erst wenn der Takt auf low 
ist wagt es der Slave sich zu bewegen (vorher darf er nicht, er muß auf 
low warten). Diesen Peak kann man mehr oder weniger stark ausgeprägt 
oftmals messen, mal so stark ausgeprägt wie bei Dir, manchmal auch gar 
nicht.

Deine Vermutung zur Ursache ist also korrekt, und auch die daß es die 
Übertragung nicht stören kann, es geschieht ja während der Takt low und 
die Datenleitung per Definition undefiniert ist.

von Martin T. (martin5)


Lesenswert?

Georg A. schrieb:
> Eventuell zuviel Pullup auf der Busseite
Da hängen nur 1,8k intern vom Raspi.

> oder zuwenig auf der Leitung zwischen den beiden Buffern?
Hab mal einige durchprobiert (4,7k, 10k, 15k, 100k). Am Low-Pegel ändert 
sich nichts. Wie zu erwarten, reduzieren sich die Überschwiniger bei 
höheren Werten, bei 100k wurde das Timing so schlecht, dass Fehler in 
der Kommunikation auftauchten. Als guter Kompromiss scheinen sich 10k 
darzustellen.

> Im Datenblatt zum PCA gibts noch Referenzen
> auf Application-Notes, evtl. steht da noch mehr drin...

Mein Englisch ist nun nicht das Allerbeste, aber ich vermute hier die 
Begründung aus dem Datenblatt:
1
 A logic LOW is transmitted to TX when the voltage at I2C-bus pin SX
2
 is below 0.425 V. A logic LOW at RX will cause I2C-bus pin SX to be
3
 pulled to a logic LOW level in accordance with I2C-bus requirements
4
 (maximum 1.5 V in 5 V applications) but not low enough to be looped
5
 back to the TX output and cause the buffer to latch LOW.

Wenn ich es richtig verstehe, muss das so sein, um wegen der 
bidirektionalen Kommunikation Feedback-Schleifen zu verhindern. Richtig?

VG, Martin

von spess53 (Gast)


Lesenswert?

Hi

>Hab mal einige durchprobiert (4,7k, 10k, 15k, 100k).

Dann lies einfach mal

http://www.nxp.com/documents/user_manual/UM10204.pdf

MfG Spess

von chris (Gast)


Lesenswert?

Das was man hier sieht nennt sich crosstalk. Kann es sein dass deine 
zwei i2c Leitungen nebeneinander verlaufen ?
Ansonsten beim Master Serienwiderstand erhöhen, so 250 ohm ca.

von Sebastian W. (wangnick)


Lesenswert?

Martin T. schrieb:
> Meine Frage dazu wäre, ist das normal? Ich vermute, dass der Raspi die
> Leitung schneller los lässt, als der MCP zum ACK sie wieder auf GND
> zieht. Da dies alles innerhalb der Low-Phase des Takts passiert, sollte
> es keine negativen Auswirkungen auf die Kommunikation haben. Ist das
> richtig?

Der BCM2835 des Raspberry Pi hat anscheinend einen schweren 
Design-Fehler im Zusammenhang mit clock-stretching slaves in der 
I2C-Hardware. Siehe 
http://www.raspberrypi.org/forums/viewtopic.php?f=44&t=13771, 
http://elinux.org/BCM2835_datasheet_errata#p35_I2C_clock_stretching, 
http://www.advamation.de/technik/raspberrypi/rpi-i2c-bug.html und 
https://github.com/raspberrypi/linux/issues/254.

LG, Sebastian

: Bearbeitet durch User
von Rolf S. (audiorolf)


Lesenswert?

Vielleicht kannst Du das im Slave deaktivieren?

von Bernd K. (prof7bit)


Lesenswert?

Im obigen Oszillogramm findet überhaupt kein Clock Stretching statt. Die 
Signale sehen übrigens vollkommen normal aus.

von Martin T. (martin5)


Lesenswert?

Martin T. schrieb:
> A logic LOW is transmitted to TX when the voltage at I2C-bus pin SX
>  is below 0.425 V. A logic LOW at RX will cause I2C-bus pin SX to be
>  pulled to a logic LOW level in accordance with I2C-bus requirements
>  (maximum 1.5 V in 5 V applications) but not low enough to be looped
>  back to the TX output and cause the buffer to latch LOW.

> Wenn ich es richtig verstehe, muss das so sein, um wegen der
> bidirektionalen Kommunikation Feedback-Schleifen zu verhindern. Richtig?

Und wenn man weiter liest, dann steht dort
1
The LOW level this chip can achieve on the I2C-bus by a LOW at RX is typically 0.64 V when sinking 1 mA.

Und weiter...
1
A ‘regular I2C-bus LOW’ applied at the RX/RY of a PCA9600 will be
2
propagated to SX/SY as a ‘buffered LOW’ with a slightly higher voltage
3
level.

Ich glaube, bzgl. der Low-Level sind jetzt alle Klarheiten beseitigt. 
Und wer lesen kann, ist klar im Vorteil :-)

VG, Martin

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.