Hallo Forengemeinde, ich habe gerade ein Problem mit dem I2C Bus :-(. Es geht um die Ansteuerung eines Display Controllers (UC1601s) mittels RL78 Controller von Renesas. Die I2C Busansteuerung habe ich per SW nachgebildet (Emulation der Open Drain Ausgänge mittels GPIO), d.h. die Peripherie verwende ich nicht. Das Display zeigt auch schon was sinnvolles an. Mein Problem ist nur, dass ich immer wieder mal NACKs vom Display Controller empfange. Wenn ich mir das Ganze auf dem Scope ansehe wird eine Sequenz von Bytes sauber übertragen, d.h. ich bekomme immer ein Ack nach dem 8. Bit. Dann kommt aber immer wieder mal ein ACK des Display Controllers schon beim 8. Datenbit wodurch ich dann in meiner Software beim 9. Bit ein NACK erkenne. Kann mir hier vielleicht einer weiterhelfen? Einen Screenshot habe ich angehängt. Danke schon mal im voraus! Viele Grüße...
Wo hast du die Signale denn gemessen? Am Controller oder am Display? Vermutlich am Controller... Sieht mir so aus, als ob das Display keine saubere Clock sieht, und sich deswegen "verzählt" (Doppeltrigger). Du könntest mal versuchen die Clockrate runterzusetzen (momentan hast du ja ca. 240KHz, gehe mal testweise auf 50 oder so), um zu gucken, ob das Problem dann verschwindet. Ausserdem die Signale mal direkt am Display messen, ob da auch noch saubere Pegel da sind - vielleicht hast du auch Serienwiderstände oder Ferrite drin (der etwas erhöhte Low-Pegel bei Antworten vom Display lässt darauf schließen), die die CLK am Display verhunzen...
Hi Joe, danke für Deine Antwort. Gemessen habe ich zwischen Controller und Steckverbinder zum Display, d.h. sehr nahe am Steckverbinder. Das Display selber ist über ein FPC mit der Leiterplatte verbunden. Direkt am Displaycontroller kann ich leider nicht messen (Chip on Glas und alles vergossen :-() Ich werde die Datenrate mal reduzieren. Ich hatte auch schon ein wenig die Versorgung in Verdacht da ich beim Schalten auf Low immer einen leichten Einbruch der VCC sehe. Einen anderen Versuch den ich machen wollte ist die VCC leicht zu erhöhen. Mal sehen was dann passiert. Von der Schaltung her verwende ich einen Pullup von 3k3 mit jew. 15pF von SDA/SCL auf Masse. Wie ist deine Meinung zu den Kondensatoren? Rein von der Buskapazität müsste es denke ich passen. Viele Grüße...
Gonzo schrieb: > Von der Schaltung her verwende ich einen Pullup von 3k3 mit jew. 15pF > von SDA/SCL auf Masse. Wie ist deine Meinung zu den Kondensatoren? Rein > von der Buskapazität müsste es denke ich passen. Ich habe noch nie Kondensatoren am I2C Bus gesehen. Damit vergrößert man doch nur die Buskapazität.
So richtig schlau werde ich aus Deinem Bild nicht. Mir erscheinen die SCL-Impulse zu kurz.
Habe jetzt mal die Frequenz sehr stark reduziert. Das Problem tritt immer noch auf. Was ich eben noch vergessen habe: Im LCD Controller ist denke ich noch ein Serienwiderstand drin. Deshalb geht der Pegel beim ACK nicht komplett auf GND runter. Im Anhang ist jetzt ein Bild mit reduzierter Frequenz.
Gonzo schrieb: > Von der Schaltung her verwende ich einen Pullup von 3k3 mit jew. 15pF > von SDA/SCL auf Masse. Wie ist deine Meinung zu den Kondensatoren? Raus damit. Versuche es auch mal mit 2.2K Pullups (Standard bei 3.3V). > Rein von der Buskapazität müsste es denke ich passen. Du erhöhst ja die Buskapazität, und das ist keinesfalls ein Vorteil. Im Gegenteil, es belastet die I2C Treiber zusätzlich. Gonzo schrieb: > Im LCD Controller ist denke ich noch > ein Serienwiderstand drin. Deshalb geht der Pegel beim ACK nicht > komplett auf GND runter. Ist ja momentan sogar ganz nützlich, um zu erkennen, welche Seite SDA auf low zieht. Und der low Pegel sieht auch in Ordnung aus. Nach wie vor glaube ich an eine schlechte Clock am LCD - oder ein Problem mit GND. Kannst du SCL hinter dem Serienwiderstand (auf der Display Seite) messen?
Gonzo schrieb: > Einen > anderen Versuch den ich machen wollte ist die VCC leicht zu erhöhen Würde ich nicht machen. Im Datenblatt des UC1601s steht folgendes: VIH Input logic LOW 0.2xVDD (max.) Das sind bei 3.3V 0.66V. Evtl. ist dein SCL low Signal am Display da schon knapp an der Grenze (durch den Serienwiderstand). Wo sitzen denn die Pull-Ups? An der Display-Seite oder der Controller-Seite der Serienwiderstände? Ausserdem: Gonzo schrieb: > Das > Display selber ist über ein FPC mit der Leiterplatte verbunden. Wie lange ist das FPC? Sind auf dem PCB andere Signale nahe und parallel zum SCL Trace verlegt? Evtl. streut dir ein anderes Signal in SCL ein. Du solltest irgendwie versuchen, am Displayende SCL vom FPC abzugreifen und am Oszi angucken.
Das FPC hat eine Länge von ca. 2cm. Direkt am Displaycontroller zu messen wird schwierig. Wie gesagt. Ist alles vergossen. Ich könnte mal versuchen durch das FPC zu stechen und dann zu messen. Ich habe aber inzwischen auch die Vermutung dass ich ein Verbindungsproblem habe und ich mir dadurch Takte einfange. Im FPC sind eigentlich keine Signale verlegt. Die Belegung ist: SCL, SDA, 3.3V, GND, VB1+, VB1-, VB0-, VB0+, VLCDOUT, VLCDIN Die Pullups sind auf der Leiterplatte relativ nahe am FPC Sockel (<5mm).
Hallo, ich habe exakt das selbe Problem mit einem EA DOGXL240N-7 und dem enthaltenen UC1611s Controller, den ich mit Hardware I²C von einem STM32F373CC aus ansteuere. Die Häufigkeit mit der dies auftritt erhöht sich wenn das Oszilloskop angeschlossen ist. An den I²C Leitungen sind keine Kapazitäten, nur 4.7kΩ Pullups, und sie sollten eigentlich gut gelayoutet sein (Layout ist nicht von mir). Auf dem Oszilloskop sieht es eigentlich gut aus, ist direkt am LCD-Modul gemessen. Was ich beobachten konnte: Der durch den Controller produzierte Low-Pegel enthält Störungen im Takt der Ladungspumpe. Meine "Lösung" ist bis jetzt den Controller per Reset-Leitung zurückzusetzen wenn dies auftritt. An einer richtigen Lösung wäre ich auch sehr interessiert...
Niklas Gürtler schrieb: > Die Häufigkeit mit der dies auftritt erhöht > sich wenn das Oszilloskop angeschlossen ist. Und das ist ein deutliches Zeichen dafür, dass mit der Signalqualität etwas nicht stimmt. Dein Fall könnte aber anders gelagert sein, als der von TO. Dein Timing ist gefährlich. Bei I2C sollte der Master niemals SDA gleichzeitig mit SCL ändern (was bei dir auf fallenden SCL Flanken passiert). Dadurch kannst du unabsichtlich START oder STOP conditions erzeugen... Immer SDA ändern -pause- SCL high -pause- SCL low -pause- SDA ändern etc.
Joe F. schrieb: > Bei I2C sollte der Master niemals SDA gleichzeitig mit SCL ändern (was > bei dir auf fallenden SCL Flanken passiert). > Dadurch kannst du unabsichtlich START oder STOP conditions erzeugen... > Immer SDA ändern -pause- SCL high -pause- SCL low -pause- SDA ändern > etc. Okay, das ist so die Standardeinstellung vom Hardware I²C. Laut Datenblatt des Controllers muss SDA mindestens 11ns nach der fallenden Flanke von SCL anliegen (hold time), und das ist bei mir mehr als erfüllt (sieht man auf obigem Oszillogramm nicht so gut). Wenn schon könnte man sich so eine Start Condition generieren (Stop Condition wäre steigende SCL Flanke), aber dafür müsste SDA vor SCL fallen, was aber nicht der Fall ist. PS: Bei Gelegenheit werde ich aber mal probieren ein längeres Delay einzustellen...
:
Bearbeitet durch User
Niklas Gürtler schrieb: > aber dafür müsste SDA vor SCL fallen, was aber > nicht der Fall ist. Wenn die Buskapazität von SCL einen Tick höher ist als die von SDA kann das durchaus passieren (SCL wird verzögert).
Hier gibt's übrigens einen weiteren Fall: Beitrag "DOG XL 240-7 antwortet ab und zu mit NAK?" Er hat es am Ende durch Fehlererkennung und Retry gelöst. Scheint wohl kein so toller Display Controller zu sein.
Gonzo schrieb: > Ich habe aber > inzwischen auch die Vermutung dass ich ein Verbindungsproblem habe und > ich mir dadurch Takte einfange. Im FPC sind eigentlich keine Signale > verlegt. Die Belegung ist: SCL, SDA, 3.3V, GND, VB1+, VB1-, VB0-, VB0+, > VLCDOUT, VLCDIN > > Die Pullups sind auf der Leiterplatte relativ nahe am FPC Sockel (<5mm). Und die Serienwiderstände, wo sind die? Zwischen RL78 und Pullups? Wenn ja: brücke die mal mit 0R. SCL Low muss auch am Display (deutlich) unter 0.6V bleiben. Füge auch mal noch zusätzliche Kondensatoren nahe am FPC Connector zwischen 3.3V und GND ein (4.7u, 100n).
:
Bearbeitet durch User
Moin, die Serienwiderstände sind denke ich im LCD Controller integriert. Ich gehe zumindest davon aus, da der ACK Pegel des Controllers nicht 100% auf Masse runter geht. Sonst sind keine Serienwiderstände verbaut. Am FPC Stecker befindet sich ein Kondensator mit 220nF. Ein weiterer 100nF und 2,2uF befindet sich im Bereich des Netzteils welches ca. 1cm weit weg ist. Vielen Dank nochmal für die Hilfe! Ich werde noch ein paar Versuche mit den Pullups und Kondensatoren machen. Was ich aber auf SW Seite noch machen muss ist eine saubere Verarbeitung der Fehler. Wahrscheinlich wie oben mit einem Retry im Fehlerfall. Viele Grüße...
Joe F. schrieb: > Versuche es auch mal mit 2.2K Pullups (Standard bei 3.3V). Ich wuerde eher versuchen die Pullups hochohmiger zu machen und die Geschwindigkeit zu senken. Wenn er die niederohmiger macht hat der Serienwiderstand ja noch mehr Spannungsabfall und sein Low geht weiter nach oben.
Funktioniert das Display denn überhaupt in einem anderen Umfeld? Die Ratschläge, die 15 pF als großes Übel auszumachen oder an ein paar Widerständen herumzuspielen, wirken doch sehr hilflos. Die Signale sehen für mich nicht so schlecht aus, als daß es nicht funktionieren sollte.
Gonzo schrieb: > Das FPC hat eine Länge von ca. 2cm. Christopher B. schrieb: > Ich wuerde eher versuchen die Pullups hochohmiger zu machen und die > Geschwindigkeit zu senken. Wenn er die niederohmiger macht hat der > Serienwiderstand ja noch mehr Spannungsabfall und sein Low geht weiter > nach oben. Full ACK. Bei solchen Längen, auch schon mal 10 bis 20cm hab ich 400kHz auch schon mit den internen Pullups zuverlässig hin bekommen. I2C Inputs haben eigentlich immer Schmitt-Charakteristik, da darf die High-Flanke auch mal krumm sein. Gonzo schrieb: > Die I2C Busansteuerung habe ich per SW nachgebildet > (Emulation der Open Drain Ausgänge mittels GPIO), d.h. die Peripherie > verwende ich nicht. Ich würde das Problem eher in der SW vermuten MfG Klaus
Guckt mal ins Datenblatt. Das Ding kann weit mehr als 400KHz, und das macht bei einem Displaycontroller ja auch Sinn. Zu lasch sollten die Pullups also nicht sein. Allerdings ist es eine gute Idee, zur Fehlereingrenzung mal probeweise z.B. 10K zu nehmen. Wenn dann das Problem weg ist, kann man darauf schließen, dass es am schlechten Low-Pegel liegt.
Joe F. schrieb: > Allerdings ist es eine gute Idee, zur Fehlereingrenzung mal probeweise > z.B. 10K zu nehmen. Gute Idee? Dürfen es auch 9,1 kOhm sein oder 10k8? Bei 1 MOhm ist das Problem auch weg, es taucht aber wahrscheinlich eines neues auf :-(
Gonzo schrieb: > Chip on Glas Die Dinger sind bekannt für Probleme. Die SDA/SCL-Leitungen auf dem Glas sind sehr hochohmig (~1k). Kann daher sein, daß der ACK-Level zu nahe an der Schaltschwelle liegt. Probier mal größere Pullups (4,7k oder 10k).
Moin moin, ich habe inzwischen noch ein wenig weiter am I²C Bus geforscht. Die Signale sahen eigentlich bis hinter den FPC Stecker ganz i.O. aus. Was mir aber noch aufgefallen ist war, dass ich auf der SDA Leitung mit jeder Schaltflanke der SCL Leitung einen Spike auf dem Signal hatte. Das Ganze sah von der Form her wie ein Differenzierglied aus. Meine Vermutung ist jetzt dass ich ein Übersprechen zwischen den beiden Signalleitungen SDA/SCL habe was dann am LCD Controller für die Fehler sorgt. Leider kann ich dort nicht direkt messen, versuche aber noch eine Möglichkeit zu finden das zu verifizieren. Was ich aber jetzt gemacht habe ist, die SCL-Leitung über eine Push-Pull Stufe zu betreiben. SDA ist weiterhin Open Drain. Seit dieser Änderung hatte ich jetzt kein einziges NACK mehr. Jetzt hätte ich noch eine Frage: Laut I2C Spec. kann ich das ja so machen wenn der LCD Controller den Clock nicht runter zieht (Clock Stretching). Hierzu kann ich nichts im Datenblatt des Controllers finden. Hat hier vielleicht einer eine Ahnung ob dieser Ultra Chip Controller ein Clock Stretching implementiert hat? Vielen Dank nochmal für eure Hilfe!
Gonzo schrieb: > dass ich auf der SDA Leitung mit > jeder Schaltflanke der SCL Leitung einen Spike auf dem Signal hatte. Das > Ganze sah von der Form her wie ein Differenzierglied aus Cross talk, also kapazitive Kopplung zwischen zwei Signalen. Das bekommt man noch "besser" hin, wenn man SDA und SCL als Paar führt und am besten noch verdrillt ;) Eigentlich sollte zwischen SCL und SDA eine Masseleitung oder ein passabler Abstand sein. Gonzo schrieb: > Was ich aber jetzt gemacht habe ist, die SCL-Leitung über eine Push-Pull > Stufe zu betreiben. Das verstärkt den Effekt noch, die Flanken werden steiler, das Übersprechen größer. Daran hats also nicht gelegen. Was mir beim allererste Scope-Bild auffällt ist, das die High-Periode von SCL ziemlich kurz ist. Könnte es sein, daß das jetzt besser geworden ist? Gonzo schrieb: > Laut I2C Spec. kann ich das ja so machen wenn der LCD Controller den > Clock nicht runter zieht (Clock Stretching) "Clock Stretching" findet auch ganz ohne Slave statt. Miss mal die Taktrate eines I2C HW-Masters ganz ohne Slave am Bus. Dann erhöhe mal die Kapazität an der SCL-Leitung auf die erlaubten 400pF und miss noch mal. Die Frequenz wird sinken, weil der Master das High auf SCL abwartet, bevor er den Timer für seine Highzeit startet. Den Effekt kann man verkleinern, wenn man die Pullups klein macht, aber nur soweit, daß man die max. 3mA für die I2C Treiber nicht verletzt. MfG Klaus
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.