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?
Pullups sollte eiglich jeder aktuelle FPGA intern haben, bei Altera lassen die sich einfach per Constraints aktivieren.
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 : 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
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
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.