Ist der Signalverlauf bei I2C so üblich?

OP #3819503
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
Angehängte Dateien:
Gast #3819516
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.
Gast #3819521
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?
(Firma: Brainit GmbH) #3819561
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.
OP #3819681
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
Gast #3819862
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
#3819958
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.
OP #3820309
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
#3820431
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
OP #3822068
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren