[erledigt] I²C-Taktfrage

Hallo allerseits!

Ich frage mich gerade, wo hier der „Fehler“ steckt.

Der I²C-Bus, an dem mein OLED-Display hängt, wird AFAIK mit 400 kHz getaktet. In der passenden (?) Tabelle in der Wikipedia wird die zweitlangsamste I²C-Geschwindigkeit mit 0,4 MBit angegeben. Wird pro Takt nur ein Bit übertragen?

So oder so finde ich seltsam, dass das zu übertragende Bild nur 1 kB benötigt (128x64 Pixel monochrom), was 8192 Bits entspricht (oder nicht?!) und das Display bei 400 kBit/s 50 Bilder pro Sekunde zeigen können sollte, de facto aber 38 ms (mit millis() gemessen) für die Übertragung benötigt, was etwas über 25 Bilder pro Sekunde entspricht. Ist der Overhead bei der Übertragung so hoch (=das Protokoll so „schlecht“)?!

Wer mag mein Neuron erleuchten?

Gruß

Gregor

Hallo,

mit jeden Takt wird ein Bit übertragen. Das geht auch nicht anders bei seriellen Verbindungen. SATA arbeitet auch so. Nur viel schneller. Gib mal in der Suchmachine ein i2c protokoll. Infos ohne Ende. Zum Bild fps kann ich nichts sagen. Vielleicht rechnet das Display die Daten nochmal um was Zeit benötigt.

I2C hat einfach den Nachteil, dass es im Vergleich zum SPI sehr langsam ist. Denn hier werden beide Systeme nicht über den Takt richtig synchronisiert.

Für die Ansteuerung des Displays brauchst du mehr 128x64 (1kB). Ich kenne dein Expander IC auf dem Display nicht. Aber bei diversen SPI Panels ist es auch so, dass die Ansteuerung aus einem Frame besteht, der zB. so aussieht Schreibe/Lese; Zeile; Reihe; Wert. Nur mal so als Beispiel gedacht, idR ist der Frame sogar noch größer. Somit bräuchtest du bereits 4 Byte für einen Pixel.

Doc_Arduino: mit jeden Takt wird ein Bit übertragen. Das geht auch nicht anders bei seriellen Verbindungen.

Wieso soll das nicht anders gehen? Wenn ich auf positive oder negative Halbwelle teste, kann ich 800 Zeitabschnitte unterscheiden. Oder denke ich fashc?

Gruß

Gregor

sschultewolter: I2C hat einfach den Nachteil, dass es im Vergleich zum SPI sehr langsam ist. Denn hier werden beide Systeme nicht über den Takt richtig synchronisiert.

Was meinst Du mit „richtig“? Und wie schnell ist SPI (in der Wikipedia steht da nichts zu)?

sschultewolter: Für die Ansteuerung des Displays brauchst du mehr 128x64 (1kB). Ich kenne dein Expander IC auf dem Display nicht. Aber bei diversen SPI Panels ist es auch so, dass die Ansteuerung aus einem Frame besteht, der zB. so aussieht Schreibe/Lese; Zeile; Reihe; Wert. Nur mal so als Beispiel gedacht, idR ist der Frame sogar noch größer. Somit bräuchtest du bereits 4 Byte für einen Pixel.

Verstehe ich Dich vielleicht falsch? Mein Display hat 128 x 64 Pixel, die ich sozusagen „am Block“ übertrage, als Block von 1 kB. Da sind keinerlei Adressdaten nötig.

Gruß

Gregor

gregorss: Wieso soll das nicht anders gehen? Wenn ich auf positive oder negative Halbwelle teste, kann ich 800 Zeitabschnitte unterscheiden. Oder denke ich fashc?

Gruß

Gregor

Da ist es einfacher den doppelten Takt zu nehmen weil es leichter ist auf eine Flanke zu reagieren als auf beide.

Wenn man beim Takt auf beide Flanken triggert, heißt das aber, daß die Daten mit doppelter Frequenz verschickt werden müssen. Da ist es einfacher beides doppelt so schnell zu machen.

Die max Frequenz hängt vor allem von der Zeit ab, die der Pullupwiderstand braucht die Leitung auf +Versorgungsspannung zu laden (HIGH) damit ein Ausgang falls notwendig auf LOW ziehen kann. Diese "Latenzzeit" hängt vom typ Kabel/Verbindung und dessen länge ab (Kapazität gegen Masse) und vom Strom den die Eingänge der I2C Bausteine brauchen (es fließt ein kleiner Strom in den Eingang hinein).

Du mußt dir mal das Protokoll des I2C Busses anschauen. * Zuerst kommt die Adresse das Bausteins mit dem der Master sprechen will. Darin ist 1 Bit zum lesen bzw schreiben. (7+1 bit) * dann eine Startadresse eines Registers oder des Speichers (wahrscheinlich 2 byte) * ein oder mehrere Datenbyte

Google mal nach dem Controller des OLED-Displays Im Datenblatt steht wie das Protokoll sein muß. Wahrscheinlich können mehrere Byte auf einmal übertragen werden ohne die I2C Adresse wieder zu übermitteln.

Daraus ergibt sich dann die 38mS für 1024 byte Daten.

SPI adressiert den Baustein über eine Enable-Leitung. Darum braucht es schon mal keine Bausteinadresse. Dann kann er je nach IC auch mit vollem Prozessortakt laufen. Praktisch bei Arduino glaube ich mich zu erinnern läuft er mit 1/4 Takt also 4MHz

Grüße Uwe

uwefed: ...

Danke! Mir will noch nicht einleuchten, was Du über die Flanken gesagt hast, aber vielleicht hilft es, wenn ich bei meiner Zigarette darüber nachdenke :-)

Gruß

Gregor

Ich habe eine Taktleitung und eine Datenleitung.
Master sendet: Die Datenleitung nimmt den Zustand an um ein LOW oder HIGH zu übertragen und dann wird beim L-H Übergang des Taktes die Daten beim Slave übernommen. Die Datenleitung hat dann bis zur nächsten Flanke Zeit den Logikpegel einzunehmen der notwendig ist das nächste Bit zu übertragen.

Wenn ich jezt bei beiden Flanken Daten übernehme heißt das, daß während eines Clock-Taktes die Datenleitung potenziell 2 mal den Pegel wechseln muß (zB wenn 01010101 übertragen werden muß).

Wenn Du nur am abend beim Nachhausekommen den Postkasten kontrollierst dann machst du das ein mal pro Tag.
Wenn Du am maorgen beim Verlassen des Hauses und am Abend bein Heimkommen kontrollierst dan mkontrollierst Du das Postfach 2 mal am Tag also mit doppelter Frequenz.

Grüße Uwe

uwefed: Die Datenleitung hat dann bis zur nächsten Flanke Zeit ...

Verstanden (glaube ich vermutlich). Ich dachte an zwei Flanken (hoch und runter), Du sprichst von einer Flanke.

Hmpf. Scheiß Technik :-)

Gruß

Gregor

Es wird nur eine Flanke des Takts verwendet (hoch bzw L-H Übergan). habs nochmal verbessert:

Master sendet: Die Datenleitung nimmt den Zustand an um ein LOW oder HIGH zu übertragen und dann wird beim L-H Übergang des Taktes die Daten beim Slave übernommen. Die Datenleitung hat dann bis zur nächsten L-H Flanke Zeit, den Logikpegel einzunehmen der notwendig ist, das nächste Bit zu übertragen.

Grüße Uwe