Forum: FPGA, VHDL & Co. Intel(Altera) I2C Master IP Core


von Donni D. (Gast)


Angehängte Dateien:

Lesenswert?

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...

von Markus F. (mfro)


Lesenswert?

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?

von Sigi (Gast)


Lesenswert?

Pullups sollte eiglich jeder aktuelle FPGA intern
haben, bei Altera lassen die sich einfach per
Constraints aktivieren.

von Markus F. (mfro)


Lesenswert?

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 ...

von Donni D. (Gast)


Lesenswert?

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.

von Duke Scarring (Gast)


Lesenswert?

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

von Tobias B. (Firma: www.elpra.de) (ttobsen) Benutzerseite


Lesenswert?

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. :(

von Donni D. (Gast)


Lesenswert?

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

von Duke Scarring (Gast)


Lesenswert?

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  : inout std_logic;
6
        sda  : inout std_logic;
7
        ...
8
    );
9
10
begin
11
12
    ...
13
    i2ci.scl  <= scl;
14
    scl       <= i2co.scl when i2co.scloen = '0' else 'Z';
15
16
    i2ci.sda  <= sda;
17
    sda       <= i2co.sda when i2co.sdaoen = '0' else 'Z';
18
    ...
Du musst noch auf die richtige Polarität von SDA_oe und SCL_oe achten.

Duke

von Artix (Gast)


Lesenswert?

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?

von Duke Scarring (Gast)


Lesenswert?

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

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.