Forum: Mikrocontroller und Digitale Elektronik I2C Takt Pullup abhängig? (AVRxDB)


von Veit D. (devil-elec)



Lesenswert?

Hallo,

ich spiele gerade mit einem AVR128DB64 rum und probiere Formeln aus wie 
man den optimalen BAUD Wert für den I2C Takt berechnet für 
unterschiedliche Gegebenheiten. Dabei fiel mir auf, dass der Takt stark 
vom Pullup abhängig ist. Nur wie kann das sein? Für die Messung sollte 
doch die Form der Flanke keine Rolle spielen. Es zählt doch rein die 
Periodendauer. Egal ob Rechteck oder Sägezahn. Ist der Taktgenerator im 
Controller Last abhängig? Es gibt teilweise Unterschiede von 50kHz. Mir 
geht es um eine Erklärung für die Taktunterschiede je nach Pullup. Kann 
das jemand bitte erklären?
1
FMP ... Fast Mode Plus
2
3
Oszi Tastkopf 10:1
4
extern 3,3k Pullup
5
16MHz Quarz
6
setClock(Hz)
7
Soll  , BAUD,  FMP,     IST,   "richtigere" BAUD wäre
8
100kHz,  75    aus,     97kHz        73=99kHz       
9
200kHz,  34    aus,    192kHz        33=198kHz           
10
300kHz,  20,   aus,    291kHz        19=302kHz                   
11
400kHz,  14,   aus,    373kHz        13=391kHz               
12
500kHz,  11,   aus,    433kHz         9=483kHz, 8=515kHz
13
600kHz,   8,   ein,    517kHz         7=551kHz, 6=595kHz       
14
800kHz,   5,   ein,    641kHz         4=695kHz, 3=762kHz, 2=843kHz        
15
16
17
Oszi Tastkopf 10:1
18
extern 2,2k Pullup
19
16MHz Quarz
20
setClock(Hz)
21
Soll  , BAUD,  FMP,     IST,   "richtigere" BAUD wäre
22
100kHz,  75    aus,     97kHz         73
23
200kHz,  34    aus,    195kHz         33           
24
300kHz,  20,   aus,    298kHz         20            
25
400kHz,  14,   aus,    382kHz         13       
26
500kHz,  11,   aus,    444kHz          9   
27
600kHz,   8,   ein,    535kHz          7=571kHz, 6=617kHz
28
800kHz,   5,   ein,    666kHz          3
29
30
31
Oszi Tastkopf 10:1
32
extern 1,0k Pullup
33
16MHz Quarz
34
setClock(Hz)
35
Soll  , BAUD,  FMP,     IST,   "richtigere" BAUD wäre
36
100kHz,  75    aus,     98kHz         74=100kHz
37
200kHz,  34    aus,    197kHz         33=203kHz          
38
300kHz,  20,   aus,    302kHz         21=291kHz            
39
400kHz,  14,   aus,    391kHz         13=411kHz          
40
500kHz,  11,   aus,    457kHz         10=485kHz, 9=515kHz    
41
600kHz,   8,   ein,    552kHz          7=592kHz     
42
800kHz,   5,   ein,    695kHz          4=761kHz, 3=844kHz

von Lulinger (Gast)


Lesenswert?

Seite 423/425 im Datenblatt.

von Veit D. (devil-elec)


Lesenswert?

Hallo,

daraus entnehme ich das sich je nach I/O Last der erreichbare Low und 
High Pegel ändert. Gut. Aber was hat das mit der Periodendauer zu tun?

von Lulinger (Gast)


Lesenswert?

"The low (TLOW) and high (THIGH) times are determined by the Master Baud 
Rate (TWIn.MBAUD) register, while the
rise (TR) and fall (TOF) times are determined by the bus topology."

Im entsprechenden Bild sind die Zeiten eingezeichnet.
Daher, wenn sich die TR und TOF Zeiten ändern durch hohe PULL UP 
Widerstande dann läuft TLOW und THIGH erst später los.

Dadurch ergeben sich halt andere Periodenzeiten.

von Veit D. (devil-elec)


Lesenswert?

Hallo,

genau das ist ja das Problem bzw. Frage. Ich denke ich muss die Frage 
anders formulieren. Wie wird denn der SCL erzeugt? Wenn ich mir 
vorstelle ich programmiere einen Timer, dann macht der seinen Takt egal 
was für Last dranhängt. Maximal bricht die Spannung ein mit zu hoher 
Last aber der Takt bleibt konstant. Warum ist das bei SCL anders?

von Patrick L. (Firma: S-C-I DATA GbR) (pali64)


Lesenswert?

Veit D. schrieb:
> Warum ist das bei SCL anders?

Nur Bedingt, aber diverse I2C Bauteile unterstützen "Clock Stretching".
Dies bedeutet das die angesprochene Device den Clock auf "Low" hält bis 
er das letzte Bit verarbeitet hat.
Wen der Master dies unterstützt wartet er bis der Clock wieder auf 
"High" geht.

: Bearbeitet durch User
von Peter D. (peda)


Lesenswert?

Veit D. schrieb:
> Warum ist das bei SCL anders?

SCL ist bidirektional, d.h. der Master liest mit, ob vielleicht ein 
Slave noch anderweitig beschäftigt ist und den Clock streckt.
Die Leitungskapazität wird dadurch auch berücksichtigt.
Ein Slave zieht SCL auf low, bis er seinen Interrupt abgearbeitet hat. 
I2C benötigt daher kein Handshake.

von Veit D. (devil-elec)


Lesenswert?

Hallo,

ich schicke für meine Messungen derzeit nur sturr eine Adresse raus und 
frage nichts ab. Da ich keine Antwort auswerte und auch keine Daten vom 
Device anfordere dachte ich das sich dadurch nichts beeinflusst. Maximal 
würde ein ACK/NACK zurückkommen was ich wie gesagt nicht abfrage bzw. 
auswerte.

Wenn ich euch richtig verstehe kann auch dabei schon der Slave Einfluss 
auf SCL nehmen? Oder sollte hierbei noch nichts passieren?

Nochmal einen Schritt zurück. Ich habe eine Takt-Abhängigkeit vom Pullup 
festgestellt. Demnach muss diese Last die SCL Erzeugung beeinflussen. 
Oder bin ich auf dem Holzweg?

: Bearbeitet durch User
von HildeK (Gast)


Lesenswert?

So recht glauben kann ich deine Bilder mit 400kHz nicht ganz. Das mit 
2k2 PU erscheint mir die Steilheit der fallenden Flanke nicht ganz 
passend. Waren das jeweils die selben Bedingungen?

Messen müsstest du vom Beginn der fallenden Flanke bis zum Beginn der 
nächsten fallenden Flanke. Und da scheint mir bei 400KHz die Periode bei 
allen drei Bildern gleich zu sein.
Für die automatische Messung mit dem Skope spielt die Steilheit der 
Flanke u.U. schon eine Rolle auf Grund des flachen Verlaufs der 
ansteigenden Flanke. Ich würde selber die Zeiten jeweils zu Beginn der 
Flanken ermitteln und dann umrechnen.

Nebenbei: 1k PU an 5V ist meiner Erinnerung nach etwas zu viel Strom für 
die meisten I2C-Interfaces. Ich habe maximal 3mA in Erinnerung nach 
I2C-Spec.

von Veit D. (devil-elec)


Lesenswert?

Hallo,

das Oszi ist auf fallende Flanke eingestellt. Bildvertauschungen 
schließe ich eigentlich aus. Sollte es dem Oszi nicht egal sein wo der 
Trigger für seine Messung liegt? Es wird doch immer an der gleichen 
Stelle gemessen, damit sollte es egal sein wo wer wie misst.

Wegen 1k und 3mA. Es gibt noch den FastModePlus mit 20mA. Die 1k sind 
auch nur zum testen/messen, eigentlich hatte ich mich auf 3,3k und 
400kHz festgelegt.

von Lulinger (Gast)


Lesenswert?

Veit D. schrieb:
> Wenn ich euch richtig verstehe kann auch dabei schon der Slave Einfluss
> auf SCL nehmen? Oder sollte hierbei noch nichts passieren?

In deinem Fall nimmt der Slave keinen Einfluss sondern die langsam 
steigende Flanke.

Das streching geschieht indem es auf 0 gehalten wird vom Slave.
Und im Datenblatt steht THigh geht erst los wenn ein High erkannt wurde.

Je flacher deine Flanke desto später ein High.

von c-hater (Gast)


Lesenswert?

Veit D. schrieb:

> Wenn ich euch richtig verstehe kann auch dabei schon der Slave Einfluss
> auf SCL nehmen?

Ja, das ist sogar die kritischste Stelle, weil genau an dieser Stelle 
der Slave die meisten Entscheidungen auf einmal treffen muss. D.h.: hier 
denkt er am längsten darüber nach, was er zu tun hat.

Allerdings betrifft das praktisch wohl ausschließlich den Takt des 
ACK-Bits. Theoretisch ist es allerdings jedem Slave möglich, jeden Takt 
zu stretchen.

> Nochmal einen Schritt zurück. Ich habe eine Takt-Abhängigkeit vom Pullup
> festgestellt.

Ja, kann passieren. Wenn der Pullup zu groß ist, kann das aus Pullup und 
Leitungskapazität gebildete RC-Glied genauso wirksam werden wie 
Clock-Stretching. Weil halt der Master nicht sehen kann, warum noch 
nicht wieder der H-Pegel erreicht ist, der kann nur sehen, dass das 
nicht der Fall ist und wird dann warten, bis es der Fall ist, weil das 
der Standard halt so vorsieht.

von Peter D. (peda)


Lesenswert?

c-hater schrieb:
> Theoretisch ist es allerdings jedem Slave möglich, jeden Takt
> zu stretchen.

Der Philips P87C751 hatte ein I2C-Bitinterface, d.h. je Bit gibt es 
einen Interrupt mit Clock Stretching. Der Vorteil des Bitinterfaces war, 
daß es einwandfrei funktionierte, wenn man es sauber programmiert hat. 
Im Datenbuch gab es dazu ausführlich erklärten Assemblercode. Solche 
exzellenten Datenbücher wünschte ich mir heute auch noch.

Viele AT89C51 und AVR haben zwar ein komplexes I2C-Byteinterface, aber 
mit heftigen Bugs. Auf die buggy Statemaschine hat man keinen Zugriff. 
Wenn die abstürzt kann man es nur disablen, wieder enablen und 
hinterläßt alle Teilnehmer in einem undefinierten Zustand. Man muß 
danach also erstmal ein I2C-Recovery machen, mit bis zu 9 SCL-Pulsen, 
bis SDA = 1 ist und dann ein STOP senden.

https://www.robotroom.com/Atmel-AVR-TWI-I2C-Multi-Master-Problem.html

von Veit D. (devil-elec)


Lesenswert?

Hallo,

ich denke ich habe die Zusammenhänge jetzt verstanden. Alles hängt von 
allen ab. Gerade das mit dem High Pegel musste mir erst bewusst werden. 
Manchmal dauerts länger. ;-)
Danke an alle.

von Gerhard O. (gerhard_)


Lesenswert?

Peter D. schrieb:
> Auf die buggy Statemaschine hat man keinen Zugriff.

Wie kommt es, dass die häufigen Bugs des Siliziums durch die 
Simulationen und Testcases der Hersteller schlüpfen? Man sollte meinen 
das I2C Protokoll ist mittlerweile nach 40 Jahren so stabil und total 
dokumentiert, so dass die notwendigen internen State-Machines und HW 
dann genauso wie gewollt funktionieren.

Es ist gar nicht meine Absicht hier böswillig zu kritisieren. Ich 
wundere mich nur, dass das alles beim Chip Design immer so schwierig zu 
bewältigen ist. Mit Simulation muss das doch überschaubar bar sei - oder 
nicht? Die STM32F103 I2C FSM war ja auch voller Bugs. Man sollte meinen, 
dass viele uC-Bugs nach zig Jahren Entwicklung mittlerweile nahezu 
ausgestampft sind und dass dann auf erwiesene fehlerfreie Subsystems 
zurück gegriffen werden könnte. Die kopieren doch auch Vieles von 
benachbarten Designs - Oder Nicht?

von Peter D. (peda)


Lesenswert?

Gerhard O. schrieb:
> Ich
> wundere mich nur, dass das alles beim Chip Design immer so schwierig zu
> bewältigen ist.

Die alten Hasen gehen in Rente und die jungen Hüpfer von der Uni haben 
nicht mehr gelernt, wie man sorgfältig entwickelt und prüft. Bzw. sie 
überlassen alles der CAD-Software, wenn der Designcheck durchläuft, wird 
wohl alles stimmen. Die alten Hasen hatten diese Supertools noch nicht 
und mußten noch viel Papier, Stift und Brain1.0 benutzen.
Auch müssen heutzutage immer komplexere MCs in immer kürzerer Zeit auf 
den Markt geschmissen werden. Daher muß die Zuverlässigkeit darunter 
leiden.

von Veit D. (devil-elec)


Lesenswert?

Hallo,

das Problem kennt eigentlich jeder in klein wenn man eigene Boards 
entwickelt. Ich glaube nicht das bei jedem jedes erste Boarddesign 
perfekt ist. Und das ist Meilenweit entfernt von Chipdesign. In der 
Industrie auf Chipdesign bezogen ist es das Gleiche. Dann lautet die 
Frage wie schlimm sind die Fehler und wieviel Zeit kostet es diese 
auszumerzen. Lohnt sich das jetzt oder hat das Zeit.

Ich würde aber nicht soweit gehen und behaupten das die alten Hasen 
immer Fehlerfrei entwickelt haben. Je komplexer umso komplizierter. Das 
kann man gar nicht alles immer überblicken. Weil wenn die "alten Hasen" 
perfekt gearbeitet hätten, dann müßten alte CPUs und MCUs fehlerfrei 
sein. Dann müßte auch die I2C Einheit fehlerfrei sein. Das widerspricht 
sich dann doch irgendwie. Und ich glaube nicht das in den Designzentren 
die Dümmsten sitzen. Man denkt nur immer das früher alles besser war. 
Ich glaube der Eindruck täuscht.

von W.S. (Gast)


Lesenswert?

Gerhard O. schrieb:
> Die STM32F103 I2C FSM war ja auch voller Bugs.

An diesem Beispiel kannst du den 'Fortschritt' sehen: Frühere Designs 
hatten eine wahre Flut von Interrupts erzeugt, aber damit konnte man so 
lala leben. Es war bloß lästig.

Die neuen Entwickler-Hasen meinen, so etwas viel eleganter lösen zu 
können, aber sie sehen viele Dinge eben nicht, weil ihnen sowohl 
Erfahrung als auch Vorstellungskraft fehlt. Und dabei kommt ein I2C-Core 
bei heraus, der schlußendlich alles selbst erledigen will, aber dabei so 
gut wie unbenutzbar ist.

W.S.

von Stefan F. (Gast)


Lesenswert?

W.S. schrieb:
> so gut wie unbenutzbar ist

Finde ich (für den STM32F103) doch arg übertrieben. Es gibt eine 
application Note, die beschriebt wie man dessen I²C Port nutzen kann, 
und genau so funktioniert er auch tadellos.

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.