Forum: Analoge Elektronik und Schaltungstechnik I2C Spannungspegel Problem


von Philipp (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

ich habe ein kleines Problem mit einer I2C Schnittstelle und hoffe das 
ihr mir dabei helfen könnt.

Ich bin gerade dabei zwei Platinen zu verbinden. Die Platinen haben 
jeweils unterschiedliche Bausteine für die I2C Schnittstelle (siehe 
angehängter Schaltplan). FPGA 1 ist der Master FPGA 2 der Slave.

Wenn ich Daten von Master zu Slave schicke funktioniert die Verbindung. 
Allerdings ist der Slave nicht in der Lage die Signale auf Low zu 
ziehen.

Meine Messung hat ergeben, dass der LTC chip erst dann ein Low Signal 
durchgibt wenn das Signal auf unter 450-500mV (leichte Variation je nach 
Signal) gezogen wird.

Der I2C Chip auf der Slave Seite zieht das Signal jedoch nur auf 
~500-600mV herunter. Daher kommt bei FPGA 1, dem Master, kein Low Signal 
an. Auf dem angehängten Bild kann man die Aufzeichnung des SCL Signales 
sehen. Beide Aufzeichnungen wurden auf der linken Platine gemacht, eine 
vor und eine nach dem LTC chip. Wie man sieht reicht das vom Slave auf 
600mV herunter gezogene Signal nicht aus für den LTC und er lässt dieses 
nicht durch.

Daher nun meine Frage an euch. Könnt ihr mir sagen wie ich, am besten 
natürlich auf einfachem Wege, diese 600mV auf ~300-400mV (Wert aus der 
Luft gegriffen) verringern kann?

Die Chips auf den Platinen kann ich nicht wechseln, aber es ist denkbar 
eine Miniplatine zwischen den beiden Platinen unter zu bringen.


Anbei Links zu den Datenblättern der beiden Chips:
Adum:
http://www.analog.com/static/imported-files/data_sheets/ADUM1250_1251.pdf
LTC:
http://pdf1.alldatasheet.com/datasheet-pdf/view/104950/LINER/LTC4300A-3IMS8.html


Vielen Dank schonmal :)

Philipp

von holger (Gast)


Lesenswert?

120Ohm als Pullup für I2C ist irgendwie ein bisschen wenig.

von Philipp (Gast)


Lesenswert?

wird aber laut Datenblatt vom Adum bei 3.3V Operation verlangt. Siehe 
Datenblatt Seite 4 und 9.

von holger (Gast)


Lesenswert?

>wird aber laut Datenblatt vom Adum bei 3.3V Operation verlangt. Siehe
>Datenblatt Seite 4 und 9.

Das sieht für mich nicht unbedingt nach einem muss aus.
Und dein I2C Slave kriegt bei den lockeren 30mA ja auch
die Leitungen nicht mehr richtig auf low gezogen.

Mach da mal 1k dran.

von Achim S. (Gast)


Lesenswert?

Philipp schrieb:
> wird aber laut Datenblatt vom Adum bei 3.3V Operation verlangt. Siehe
> Datenblatt Seite 4 und 9.

das sind die Testbedingungen. Das heißt nicht, dass du auch 120Ohm und 
400pF Lastkapazität dranhängen musst.

Aus der AN-913 zu dem Baustein:
"The pull-up resistors are those associated with any I2C interface. 
Guidelines for the selection of resistor values are provided within the 
I2C specification"

von Philipp (Gast)


Lesenswert?

Vielen Dank für den Input und die Hilfestellung!
Inzwischen habe ich das Problem gelöst. Zum einen hatte ich ein 
veraltetes Schaltbild, in der neueren Version ist der Adum gar nicht 
mehr verbaut und zwischen LTC und FPGA 2 (Slave) ist ein 500 Ohm 
Widerstand.

Was aber das wirkliche Problem war, war der IO Port in VHDL der auf dem 
FPGA 1 (Master) implementiert war.
Meiner Meinung nach konnte der Port mit
1
  scl <= scl_clk WHEN scl_ena = '1' ELSE 'Z';
2
 sda <= '0' WHEN sda_ena_n = '0' ELSE 'Z';
implizit implementiert werden. Allerdings hat sich nach einem Blick auf 
das RTL gezeigt, dass der IO-Buffer nicht wirklich implementiert war. 
Erst als ich explizit den IO Buffer verwendet hatte mit
1
 IOBUF_inst_for_SCL : IOBUF
2
   generic map (
3
      CAPACITANCE => "DONT_CARE", -- "LOW", "NORMAL", "DONT_CARE" 
4
      DRIVE => 12,
5
      IOSTANDARD => "DEFAULT",
6
      SLEW => "SLOW")
7
   port map (
8
      O => scl_in,     -- Buffer output
9
      IO => SCL,   -- Buffer inout port (connect directly to top-level port)
10
      I => scl_clk,     -- Buffer input
11
      T => en_scl_iobuf      -- 3-state enable input 
12
   );
13
  
14
   IOBUF_inst_for_SDA : IOBUF
15
   generic map (
16
      CAPACITANCE => "DONT_CARE", -- "LOW", "NORMAL", "DONT_CARE" 
17
      DRIVE => 12,
18
      IOSTANDARD => "DEFAULT",
19
      SLEW => "SLOW")
20
   port map (
21
      O => sda_in,     -- Buffer output
22
      IO => SDA,   -- Buffer inout port (connect directly to top-level port)
23
      I => '0',     -- Buffer input
24
      T => en_sda_iobuf      -- 3-state enable input 
25
   );
lief das Program tadellos.

von Philipp (Gast)


Lesenswert?

Philipp schrieb:
> ist ein 500 Ohm
> Widerstand.

"...ist ein 500Ohm Pull-up." muss das natürlich heißen!

von Besserwisser (Gast)


Lesenswert?

BTW: Ich sehe bei der Übertragung keine Startbedingung???

von Philipp (Gast)


Lesenswert?

Du meinst im Code?
Das was ich oben gezeigt habe war nur ein kleiner Ausschnitt. Den rest 
kannst du hier einsehen: 
http://eewiki.net/pages/viewpage.action?pageId=10125324

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.