Hey Leute,
hat von euch schon einmal den "Intel FPGA Avalon I2C (Master) Core" in
QSYS in Verbindung mit dem NIOS2 Prozessor genutzt?
Hier der Link zum IP-Core:
https://www.altera.com/documentation/sfo1400787952932.html#tkx1476291674786
Habe mir ein kleines System erstellt mit dem Prozessor, JTAG UART,
On-Chip Memory (RAM) und eben dem I2C Master Core. Alles verbunden, kann
den Core auch konfigurieren, Statusbits etc. setzen. Wenn ich dann in
das TFR_CMD Register schreibe um ein Command zu senden passiert leider
nichts. Habe das SCL und SDA Signal an 2 GPIOs von einem DE0-Nano
ausgegeben.
Ich denke es liegt an meinem einbinden der I2C Signale. Die Komponente
hat die Signale SCL, SDA, SCL_oe und SDA_oe (oe = Output enable). In der
Doku steht, die Signale sollen über ein Open Drain Buffer angeschlossen
werden:
https://www.altera.com/documentation/sfo1400787952932.html#gmk1476294215146
Wie ich den Open Drain Buffer gelöst habe seht ihr im Anhang, ich denke
mal da habe ich einen Denkfehler. Vielleicht hat von euch jemand eine
Bessere Lösung? Bin gerade leider nicht am richtigen PC und kann die
gesamte NIOS Komponente im VHDL zeigen, aber ich hoffe die Idee meiner
Lösung wird klar.
Besten Dank und Grüße
PS.: Laden der Altera-Seiten kann dauern...
Donni D. schrieb:> passiert leider nichts
Was sollte denn deiner Meinung nach passieren?
i2c ist open drain, d.h. die Teilnehmer können die Bus-Signale aktiv nur
in eine Richtung (low) ziehen, die '1' muss "von alleine" kommen.
Du wirst an den Pins also nur dann was sehen, wenn Pull-Ups dran sind.
Sind welche dran?
Sigi schrieb:> Pullups sollte eiglich jeder aktuelle FPGA intern> haben, bei Altera lassen die sich einfach per> Constraints aktivieren.
Natürlich. Aber man muss es auch machen ...
Interne PullUps sind aktiviert. Habe vorerst auch mal die Output Enable
Signale angeschaut. Da hat sich leider nichts getan. Habe jetzt einen
score von OpenCores, der funktioniert wie er soll. Auch die C
Programmierung ist um einiges einfacher. Gibt für den Altera Core leider
nirgends ein Beispiel wie man es richtig macht.
Falls jemand mal ein funktionierendes Design hat würde ich mich aber
über eine Antwort freuen.
Donni D. schrieb:> mal ein funktionierendes Design hat
Damals (tm) hab ich mir den I2C-Core von open cores genommen. War zwar
nicht so elegant zu parametrieren wie die TWI-Schnittstelle vom AVR,
aber mit Simulation und Oszilloskop relativ schnell zum Spielen zu
bringen...
Duke
Donni D. schrieb:> Interne PullUps sind aktiviert.
Vorsicht bei den internen PullUps! Unter Umständen sind die sehr
hochohmig. Zumindest ist dies bei Xilinx so, und hängt natürlich auch ab
vom "Drive Strength" Attribut am Ausgangstreiber, jedoch meine ich war
selbst beim größten drive der äquivalente PullU Widerstand weit größer
als die I2C Spezifikation vorsieht. Je nach Kapazität auf den Leitungen
und Busfrequenz schafft es der Ausgangstreiber nicht die Leitung korrekt
runter zuziehen.
Ich hatte schon Designs die aus diesem Grund gescheitert sind. :(
Das der Bus funktioniert weiß ich nun, denn mit dem IP Core von
OpenCores geht ja alles. Der hat als Verbindung direkt zwei inout
Signale.
Problematisch ist es jetzt nur bei dem von Intel direkt, der hat zwei
Inputs, SDA und SCL, sowie zwei Outputs SDA_oe und SCL_oe. Wie ich diese
nun mit einem OpenDrain Buffer verbinden soll ist mir etwas schleierhaft
(siehe Eingangspost VHDL Datei). Weiterhin bin ich mir unschlüssig wie
ich das Teil in C programmiere. Habe dauerhaft interrupts bekommen
obwohl ich nichts gesendet habe, empfangen ging auch nicht...
Deshalb frage ich nach einem komplett Beispiel.
Aber schon einmal danke für die Antworten. Grüße
Donni D. schrieb:> Problematisch ist es jetzt nur bei dem von Intel direkt, der hat zwei> Inputs, SDA und SCL, sowie zwei Outputs SDA_oe und SCL_oe. Wie ich diese> nun mit einem OpenDrain Buffer verbinden soll ist mir etwas schleierhaft> (siehe Eingangspost VHDL Datei)
Bei mir sehen die Ausgangstreiber so aus:
1
...
2
port
3
(
4
...
5
scl:inoutstd_logic;
6
sda:inoutstd_logic;
7
...
8
);
9
10
begin
11
12
...
13
i2ci.scl<=scl;
14
scl<=i2co.sclwheni2co.scloen='0'else'Z';
15
16
i2ci.sda<=sda;
17
sda<=i2co.sdawheni2co.sdaoen='0'else'Z';
18
...
Du musst noch auf die richtige Polarität von SDA_oe und SCL_oe achten.
Duke
Wären die internen pull up Widerstände klein genug, um ein ausreichendes
Signal zu erzeugen, wenn der Chip direkt am FPGA hängt und wenn es nur
einer ist?
Artix schrieb:> Wären die internen pull up Widerstände klein genug, um ein ausreichendes> Signal zu erzeugen, wenn der Chip direkt am FPGA hängt und wenn es nur> einer ist?
Da wäre ich skeptisch. Die internen Pull-Ups sind m.E. als Stromquellen
realisiert und liegen i.d.R. größenordnungsmäßig gefühlt so bei 50 bis
100 kOhm. Was sagt denn das Datenblatt? Und von welcehm FPGA reden wir
hier?
Duke