mikrocontroller.net

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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Donni D. (donnidonis)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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...

: Bearbeitet durch User
Autor: Markus F. (mfro)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Sigi (Gast)
Datum:

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

Autor: Markus F. (mfro)
Datum:

Bewertung
0 lesenswert
nicht 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 ...

Autor: Donni D. (donnidonis)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Duke Scarring (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Tobias B. (Firma: www.elpra.de) (ttobsen)
Datum:

Bewertung
0 lesenswert
nicht 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. :(

Autor: Donni D. (donnidonis)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Duke Scarring (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
...
    port
    (
        ...
        scl  : inout std_logic;
        sda  : inout std_logic;
        ...
    );

begin

    ...
    i2ci.scl  <= scl;
    scl       <= i2co.scl when i2co.scloen = '0' else 'Z';

    i2ci.sda  <= sda;
    sda       <= i2co.sda when i2co.sdaoen = '0' else 'Z';
    ...
Du musst noch auf die richtige Polarität von SDA_oe und SCL_oe achten.

Duke

Autor: Artix (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Duke Scarring (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.