mikrocontroller.net

Forum: FPGA, VHDL & Co. SPI und Spartan3


Autor: Alex (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,

ich bin gerade am verzweifeln. Ihr seit meine letze Chance. Ich
versuche seit Tagen ein SPI-Programm zu schreiben und das in meinen
FPGA (Spartan 3 SC3S200) zu laden. Ich schaffe es jedoch nicht, einen
SPI-Clk zu erzeugen, bei dem ich softwareseitig die Frequenz und die
Anzahl der Clockpulse steuern kann.

Vielleicht hat ja jmd. da schon Erfahrung. Ich habe meinen Code als
Anhang beigefügt. Bitte lacht euch darüber nicht tot, bin noch ein
blutiger VHDL-Anfänger.


Über jede Art der Hilfe bin ich sehr dankbar!

Dank euch im Vorraus.

Gruß
Alex

Autor: Dirk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

SPI Master only, slave only oder beides ? Im Logic Analyzer bauen
Thread war Joerg so nett ein SPI Slave only upzuloaden. Dieser
funktioniert sehr gut ein paar ueberschuessige Sachen kann man da noch
entfernen.

Moechtest du ein Master/Slave solltest du dir mal bei Xillinx die
verschiedenen Appnote's anschaun. Diese Appnote's und der fertige
Code ist sehr gut beschrieben.

Gruß,
Dirk

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Dirk,

ich möchte über einen spi-fähigen ADC Werte einlesen, verarbeiten und
dann wieder über einen spi-fähigen DAC ausgeben. D. h. ich bräuchte
einen MASTER-Code.

Aber ich seh mir trotzem den "Logic Analyzer bauen"-Thread an. Ich
glaube, ich bin noch zu sehr auf Microcontroller-Programmierung
eingestellt.

Danke dir!

Über weitere Antworten würde ich mich dennoch nicht beklagen!


MfG,

Alex

Autor: Dirk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

dann kann ich Dir nur die Appnote's von Xillinx empfehlen als
Anfaenger hast du dir ein harten Brocken ausgesucht.

Gruß,
Dirk

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

hasst du dir mal meinen Quellcode angesehen, ob das prinzipiell so
funktionieren kann, oder ob ich komplett daneben liege. Die
AD7799Communication.vhd sollte (ähnlich einer C-Datei) das komplette
SPI-Management für den ADC übernehmen. Die Funktionen und Prozeduren
dort sollen dann im Main.vhd aufgerufen werden.

Gruß
Alex

Autor: Jörn (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Anbei mein komplettes SPI Design.

Gruß Jörn

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Jörn,

vielen, vielen Dank! Habs mir gerade runtergeladen und werde es mir
vielleicht heute noch ansehen.

Ich geb dir dann Bescheid, wie's gelaufen ist!


Gruß
Alex

Autor: Dirk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

ich denke ich spreche hier fuer einige mehr Vielen Dank Joerg. Ich
hoffe du bist nochmal so nett und setzt es in die Codesammlung mit
einer kurzen Beschreibung der Feature's.

Gruß,
Dirk

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Jörn,

danke nochmal! Das ist ein ziemlich mächtiges Tool, das du da
gepublished hast. Respekt!

Da ich noch Anfänger bin, ist das vielleicht zu mächtig für mich.
Nachdem ich mich einige Zeit mit deinem Design auseinandergesetzt habe,
bin ich zu dem Ergebnis gekommen, dass ich maximal eine Ahnung einer
Idee habe, wie dein Modul funktioniert.

Mir reicht ein ganz einfaches Design, das aus Clockerzeugung (z. B.
100k aus 50 MHz System-Clock), Senden und Empfangen eines Bytes
besteht. Ich brauche vorerst (in meiner Softwareversion 0.0) kein
SlaveSelect, keine extra Clockeinstellung, kein CPOL und CPHA, ... .

Vielleicht kannst du mir einfach noch einen Tipp geben, z. B. was ich
von deinem Design weglassen kann oder wie ich mein Design (aus dem
ersten Beitrag dieses Threads) umbauen kann.

Ich möchte das Ganze verstehen lernen und mich weiter in VHDL
einarbeiten, denn ich glaube ich kann die Programmierweise von VHDL
noch nicht vollständig von C unterscheiden.

Vielen Dank!

Gruß
Alex

Autor: Jörn (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Axel,

da du nur einen Master brauchst, kannst den kompletten Slaveteil
rausnehmen. Den Interfaceteil wirst du wahrscheinlich auch nicht
brauchen. Der war den externen Adress- und Datenbus eines ARM-Systems.
Die FSM wird sich auch noch etwas vereinfachen und das Registerfest
wird auch überflüssig sein.

Wieviel Bit sollen übertragen werden?

Gruß Jörn

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Jörn,

danke für den Tipp. Werde gleich mal rausschmeißen, was du mir eben
genannt hast.

Ich will zunächst einen AD7799 (Analog Devices ADC) mit 24 Bit
ansprechen und auslesen. Laut DB wären also zwischen 8 und 24 Bit
auszulesen bzw. zu schreiben.

Gruß
Alex

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Jörn,

hab jetzt den slave-Teil, den tristate_interface-Teil und den
spitegister-Teil sowie die slave-TestBench rausgenommen. Ich hoffe ich
hab nicht zu wenig und zu viel gelöscht.

Werde mir den Rest noch ansehen und hoffe dann voll durchstarten zu
können.

Besten Dank!

Gruß
Alex

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Jörn,

ich hab jetzt einige Tage versucht, dein Design zu verstehen. Ich bin
wohl doch noch ein größerer Anfänger als ich gehofft habe.

Zuerst habe ich mir spi_clock_1 angesehen, das verstehe ich schon im
Großen und Ganzen. Aber was genau ist

   mask_clk0, mask_clk1 und was liefern sck_int_re/fe und sck_re/fe?

Wo ist der Unterschied bei den einzelnen Clock ausgängen (sck_re/fe und
sck_int_re/fe und sck_out)? Welchen Clock nimmst du für was?

Leider habe ich noch mehr Fragen!

Was macht spi_sm?



Was besagt die Zeile

     data_int <= (others => '0');

in output_sr?



Was sind wordlength, DORD und load



PS: SPI bzw. VHDL entwickelt sich immer mehr zum Alptraum für mich


Wenn du mir nochmal helfen könntest, wäre ich dir sehr dankbar!


Gruß
Alex

Autor: Dirk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

Wordlength wird wohl die SPI Bandbreite sein. Beim Avr sind es 8Bit bei
Arm's zum Beispiel 16 Bit.

Dord bedeutet ob die daten msb o. lsb uebertragen werden.

Gruß,

Dirk

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Dirk,

danke, jetzt kann ich wieder 2 Fragen auf meiner Liste streichen.
Danke


Gruß
Alex

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nachtrag!

Hallo Dirk.

Das mit wordlength glabue ich hab ich noch nicht ganz kappiert. Der
SPI-Bus hat doch immer 4 Leitungen, oder?


Gruß
Alex

Autor: Dirk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

ich glaube du solltest dir mal bei xillinx endlich die appnotes
reinziehen.

Ich meine mit Wordlength die Packetgroesse die mittels SPI uebertragen
werden.

Dirk

Autor: Jörn (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Axel,

mask_clk0, mask_clk1 sind Enable Signale für SCK, der freilaufend ist.
Mittels den Signale wird er auf der SCK freigegeben.

sck_int_re/fe und sck_re/fe liefern die Flankensignale, da diese für
die das Schieben der Daten und Übernehmen der Daten auf der MISO
wichtig sind.

sck_re/fe und sck_int_re/fe und sck_out) muss ich selbst nochmal
nachschauen.

spi_sm ist die Ablaufsteuerung für eine SPI Übertragung.


data_int <= (others => '0'); setzt den das Signal data_int auf 0;
Zum Beispiel für ein 8 Bit Signal kann man auch schreiben
data_int <="00000000";
Mit den (others=>'0') hat man den Vorteil, dass man sich nicht darum
kümmern muss, ob die Anzahl der Null korrekt ist. Sehr vorteilhaft,
wenn die Busbreit mit einem Generic übergeben wird.

Was sind wordlength, DORD und load

Wordlength = Anzahl der Bits, die mit einer SPI Übertragung gesendet
werden.
DORD: Datenreihenfolge MSB oder LSB zuerst.
Load: Lädt die zu senden Daten in das TX-Schieberegister

Gruß Jörn

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Jörn,

danke, hab soweit alles kappiert (glaube ich zumindest im Momnent). Das
mit sck_re/fe und sck_int_re/fe klingt logisch, wenn ich mir deinen Code
ansehe.

Ich glaub ich hab selbst noch rausbekommen, was sck_out ist. Das dürfte
der SPI-Clock (auf der Clock-Leitung) sein.


Nochmals besten Dank.


Gruß
Alex

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Jörn,

kann es sein, dass kein Unterschied zw. sck_int_re/fe und sck_re/fe
besteht. Du benutzt sck_int_re/fe nur für das Senden und sck_re/fe für
das Empfangen vom Bus, oder liege ich da falsch?


Gruß
Alex

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.