Ich möchte I2C-Signale auf dem FPGA vom Cypress 2.0-Modul mit i2c-Pins wie unten verwenden. aber es funktioniert nicht gut. Geben Sie hier die Bildbeschreibung ein
Xilinx FPGA <--------------------> MCU-Modul (I2c)
.UCF
NET in_scl LOC = "A1";
NET in_sda LOC = "A2";
NET out_scl LOC = "C1";
NET out_sda LOC = "C2";
und in verilog wie unten bin ich implementiert.
module top();
inout wire in_sda;
inout wire in_scl;
inout wire out_sda;
inout wire out_scl;
assign out_sda = in_sda;
assign out_scl = in_scl;
endmodule
Können Sie mir helfen, was fehlt mir?
Bei der I2C-Kommunikation werden Open-Collector-Treiber verwendet. Das Protokoll hängt von der Ebene auf der Leitung ab, die das 'Draht-ODER' aller Treiber ist.
Dies bedeutet, dass an einer lokalen Schnittstelle ein Pin niedrig sein kann, weil er von einem Remote-Treiber auf niedrig gezogen wird, oder weil er von selbst auf niedrig gezogen wird.
Offensichtlich muss jeder Puffer, der sich zwischen dieser Schnittstelle und den Remote-Schnittstellen befindet, in der Lage sein, zu unterscheiden, warum die Leitung niedrig ist. Wenn es niedrig ist, weil eine Fernbedienung es niedrig zieht, muss es auch niedrig ziehen, um dies zu übertragen. Wenn es niedrig ist, weil der lokale Fahrer es niedrig zieht, darf es nicht, sonst würde die Leitung niedrig stecken bleiben und es würde nichts mehr passieren.
Verschiedene Strategien werden von Anbietern von (zum Beispiel) Optokopplern verwendet, die für I2C entwickelt wurden. Ihr Ausgang zieht auf einen anderen Pegel als die typische lokale Schnittstelle, und Spannungssensoren können unterscheiden, welcher Treiber ihn niedrig zieht. Aber es ist alles ziemlich flockig und hängt von der "typischen" guten Leistung des lokalen Fahrers ab.
Da ein I2C-Bus für die Busverbindung ausgelegt ist, besteht die bei weitem beste Möglichkeit, das FPGA mit dem Bus zu verbinden, darin, einen Eingang und einen O/C-Treiber für jeden der beiden Pins zu implementieren und mit den beiden I2C-Busleitungen zu verbinden. Dadurch bleibt die direkte Verbindung aller bereits im Bus befindlichen Artikel erhalten. Die minimale Programmierung, damit das FPGA den Busverkehr nicht stört, besteht darin, die O/C-Ausgänge nicht anzusteuern. Um am Busverkehr teilnehmen zu können, ist ein I2C-Protokollstack im FPGA erforderlich.
Eine robuste Möglichkeit, den Pfad durch das FPGA zu durchbrechen , besteht darin, zwei I2C-Stacks im FPGA zu implementieren, von denen einer in jede Richtung weist, um Nachrichten weiterzuleiten. Obwohl dies eine ziemlich schwere Option erscheinen mag, sind I2C-Schnittstellen als vorgefertigte IP für FPGAs verfügbar, und es eliminiert die Unzuverlässigkeit beim Versuch, ein dummes Pass-Through zu implementieren.
I2C verwendet Open-Drain/Collector-Ausgänge. Aus diesem Grund kann man nicht einfach einen typischen FPGA-Ausgang mit Push-Pull-Struktur verwenden.
Ich weiß nicht, ob das von Ihnen verwendete FPGA Open-Drain-Ausgänge bietet.
Auf jeden Fall sollte es möglich sein, sie mit der folgenden Struktur (von hier entnommen ) nachzuahmen, die mit diesem Code abgeleitet werden kann:
always @(ENABLE)
if (ENABLE)
DOUT = 1'bZ;
else
DOUT = 1'b0;
Natürlich funktioniert diese Lösung nur in eine Richtung, aber ich denke, das ist Ihnen bewusst.
pjc50
JoJI
Dmitri Grigorjew
Chris Stratton