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
wird aber laut Datenblatt vom Adum bei 3.3V Operation verlangt. Siehe Datenblatt Seite 4 und 9.
>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.
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"
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.
Philipp schrieb: > ist ein 500 Ohm > Widerstand. "...ist ein 500Ohm Pull-up." muss das natürlich heißen!
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.