I2C: SDA auf 2 V statt 0 V

Jun 23, 2004 13 Replies

Hallo ng,



In meinem I2C-Netz (1 x Master: PIC18F252, 2 x Slave: PIC18F452) tritt folgendes Problem auf: Die Slaves können die Datenleitung nicht auf Null, sondern nur auf etwa 2 V ziehen. Prinzipiell funktioniert die Kommunikation, ich möchte jedoch saubere Signale haben.



Hier meine Schaltung (jeweils für SDA/SCL):



o +5V | _____R 1k_____ Slave 1 R 1k8 | | | Master _x_______x____R 1k_____ Slave 2



Danke für eure Hilfe.



Viele Grüße, Marko


Marko Aschoff schrieb:

Dass die Slaves die Leitung nur bis 1,8V runterziehen können ist ja wohl klar, man Spannungsteiler. Wenn du die Ausgänge vor Kollision schützen möchtest, dann muss da sowohl beim Master wie bei den Slaves eine Diode parallel mit einem Widerstand rein, der Pullup bleibt.

Gruß Dieter

Pullup auf 47 kOhm vergrössern.

Robert

Am Wed, 23 Jun 2004 09:33:45 +0200 hat Marko Aschoff geschrieben:

Den Pullup kannst du etwas größer amchen (3k3) aber die 1k Widerstände sind seltsam. Normal verwendet I2C Open Collector Ausgänge, damit sind keine gefährlichen Kollisionen möglich (nur die dominanten/rezessiven Bits). Das macht man meist, indem man den sendenden port auf Low schaltet und die Datenbits per Datenrichtignsregister ausgibt. D.h. L = Output, für H schaltest du auf Input = Hochohmig. Damit simulierst du einen Open Coll./Drain Ausgang. Sollte das mit dem µC nicht möglich sein, dann kann man Dioden in Serie (A an Bus, K an Slave) schalten, die man für die Eingangssignale mit Widerständen (1k..10k) überbrückt.

Martin

Laut AN736 S.14

formatting link

sind die Serienwiderstände für die I/O Isolation auf den Leitungen (Hotplug der Slaves). Eine Größenangabe fehlte jedoch, also habe ich einfach mal 1k genommen.

Welcher Typ sollte dann eingesetzt werden?

Marko Aschoff schrieb:

Ach je, I2C ist ja eigentlich nicht für hot plugging gedacht, aber 1k ist bedeutend zuviel. Nimm 100R.

Für den Zweck ist folgendes erprobt:

1N4148 .--->|--. ___ | ___ | Bus-|___|--o-|___|-o--Slave/ 100R 470R Master created by Andy´s ASCII-Circuit v1.24.140803 Beta
formatting link

Die 1N4148 kann man für verbesserten Störabstand durch BAT41 o.ä. ersetzen, Pullup am Bus sollte >= 1k sein.

Gruß Dieter

Dieter Wiedmann schrieb:

Was ist in diesem Kontext eigentlich unter I/O Isolation zu verstehen?

Marko Aschoff schrieb:

Die Widerstände sollen einen übermäßigen Strom (durch ESD) verhindern.

BTW: Hast du eigentlich die Contact-Sequence beachtet?

Gruß Dieter

Ja habe ich beachtet. Welcher Strom wird denn hier begrenzt, der vom Salve auf den Bus oder umgekehrt?

Grüße, Marko

Marko Aschoff schrieb:

Der von deinen geladenen Griffeln auf den Slave.

Gruß Dieter

Warum kommt mir das nur so bekannt vor, das versuchen manche Kunden auch immer :-).

Dein Problem sind die Serienwiderstände, die zusammen mit den Pullups einen Spannungsteiler bilden, so daß Du die Leitung nicht richtig auf 0V ziehen kannst.

Serienwiderständen sind bei I2C ganz übel und 1k deutlich zuviel.

cu, Marco

E-Mail: mb-news-blinuxhaven.de Deutsches Linux HOWTO Projekt: http://www.linuxhaven.de

Das dürfte dann aber das Senden mit 400 kHz ziemlich schwierig machen, da die Flanken dann nicht steil genug sind.

cu, Marco

E-Mail: mb-news-blinuxhaven.de Deutsches Linux HOWTO Projekt: http://www.linuxhaven.de

Serienwiderstände und Kapazitäten sind die Probleme bei I2C.

Serienwiderstände würde ich in der Regel eher mehr oder wenig wegoptimieren. Wir setzen dafür, wenn ich mich richtig erinnere, was um 100 Ohm ein.

Zum Schutz verwendet man besser Schutzdioden mit niedriger Kapazität.

I2C kann kein Hotplugging.

cu, Marco

E-Mail: mb-news-blinuxhaven.de Deutsches Linux HOWTO Projekt: http://www.linuxhaven.de

Dafür verwendet man aber besser Schutzdioden parallel zum Eingang.

cu, Marco

E-Mail: mb-news-blinuxhaven.de Deutsches Linux HOWTO Projekt: http://www.linuxhaven.de

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required