mikrocontroller.net

Forum: FPGA, VHDL & Co. i2c slave zum testen


Autor: Arthur Neumann (nexus)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute.

Ich habe im Netz einen freien, für mich recht einfachen und gut 
implimentierten Code eines I2C_Slaves gefunden. In der Simulation lief 
alles einwandfrei.

Nun habe ich diesen auf einem Virtex4(XC4VFX12) implementiert und 
versuche jetzt mit meinem Master mehr als ein Byte zu senden und zu 
empfangen. Das Senden läuft tadellos. Leider empfängt der Master nur 1 
Byte und danach nur noch ('FFFFFF'). Ich kann nicht erkennen wo der 
Fehler liegen könnte, da der master mit anderen Slaves bis jetzt 
funktioniert hat.

Kann eventuell wer einen Blick auf den Code werfen oder diesen sogar mal 
testen. Für jeden Hilfe bin ich sehr dankbar.


MfG

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
  -- check for edges (this concept is used to filter spikes)
  sda_falling_edge <= true when sda_sampled = b"1100" else false;
  sda_rising_edge <= true when sda_sampled = b"0011" else false;
  scl_falling_edge <= true when scl_sampled = b"1100" else false;
  scl_rising_edge <= true when scl_sampled = b"0011" else false;
Das ist in der Theorie schön entprellt, in der Praxis aber ein 
zweischneidiges Schwert. Was ist, wenn du z.B. folgende Signalfolge am 
sda-Pin hast (z.B. ein kleiner Umschalt-Spike):
111111111010000000000101111111
Dann wirst du niemals eine sda_falling_edge oder eine 
sda_rising_edge erkennen  :-o
Und der Witz dabei es funktioniert eigentlich. Nur ab und zu gehts 
schief.

Besser ist es in der Art:
  -- check for edges (this concept is used to filter spikes)
  sda_falling_edge <= true when sda_sampled = b"1110" else false;
  sda_rising_edge <= true when sda_sampled = b"0111" else false;
  scl_falling_edge <= true when scl_sampled = b"1110" else false;
  scl_rising_edge <= true when scl_sampled = b"0111" else false;

Autor: Arthur Neumann (nexus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok, danke schon mal für diesen Tip, habs intigriert.

Nur hat das, glaube ich, nicht viel mit meinem Hauptproblem zu tun. Denn 
ich kann ja Daten hin und her verschicken nur halt auf dem Weg vom Slave 
zum Master nicht mehr als 1 Byte. Hast du den Code eventuell schon 
simuliert oder sogar auf einem realen Board implementiert und ein 
anderes Ergebnis erhalten?

MfG

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Nur hat das, glaube ich, nicht viel mit meinem Hauptproblem zu tun.
Nein, das glaube ich auch nicht.

Aber wenn ich beim bloßen Drüberschauen schon sowas sehe,
ist das für mich ein Grund, das ganze Design zu hinterfragen :-/

> Hast du den Code eventuell schon simuliert ...
Nein, ich habe leider gerade keine Zeit dafür.

Autor: Arndt Bußmann (Firma: Helion GmbH) (bussmann)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ganz wichtig, die SDA Leitung (und eigentlich auch die Clockleitung) 
muss als Opendrain mit Pullup am FPGA ausgeführt sein. Ist ein häufiger 
Fehler, dass kein Opendrain benutzt wird.

Viele Grüße
Arndt

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> die SDA Leitung (und eigentlich auch die Clockleitung)
> muss als Opendrain mit Pullup am FPGA ausgeführt
Die SDA-Leitung ist Open-Drain:
  sda <= sda_out when sda_out = '0' else 'Z';
Die SCL-Leitung muß nur dann Open-Drain sein, wenn der Slave den Master 
ausbremsen will (was aber angesichts der kursierenden zwielichtigen 
selbstprogrammierten Software-Master keine gute Idee ist).


Sowas:
   sda_in <= '1' when sda /= '0' else '0';
schreibt sich so kürzer:
   sda_in <= sda;
Was allerdings meine Zweifel an der Qualität dieses Codes nur bestärkt 
;-)

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.