www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik SPI Verständnisproblem


Autor: Florian Mauerhofer (----florian----)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Guten Abend.

Ich stehe vor folgendem Problem:

Es sollten 2 Atmega 8 mit SPI verbunden werden. Der Master sollte
eigentlich 8 bits an den Slave schicken, und der Slave sollte die bits
dann auf einem Port mit Leds ausgeben.

Genügt es da, einfach sck zusammenschließen, und mosi vom Master auf
miso vom Slave dranzuhängen?

Und wenn der Slave richtig konfiguriert ist, brauch ich dann nur:

in temp,spdr
out portd,temp

eingeben?

Ich habe da nämlich einpaar verwirende Sachen gelesen, da wo stand, das
der Slave irgendwelche Daten schicken muß, damit sie der Master auf den
Slave ausgibt. Ist da was wares dran? Oder hab ich da was falsch
verstanden?

Gruß Florian

Autor: Christian Fasthuber (fasti)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi!

Also SPI ist ein Ringbuffer, das heisst der Master muss 8 (Dummy-)Bits
an den Slave schicken, damit dieser ihm dann die gewünschten 8 Bits
schickt.
Der Slave kann von sich aus keine Bits schicken, er kann dem Master nur
durch einen Low pegel am MISO anzeigen, dass er Daten hätte oder aber
mittels eines zusätzlichen Pins. Der Master initiiert immer den
Datenverkehr, er legt den CS Pin auf low, damit der Slave weiss, dass
er gemeint ist. Danach taktet er 8 Bits aus seinem Puffer mittels SCK
und MOSI in den Slave und GLEICHZEITIG wird über MISO die 8 Bits vom
Slave empfangen.

mfg

Fasti

PS: Alle Angaben ohne Gewähr..... :-)

Autor: Florian Mauerhofer (----florian----)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Fasti.

Also bei mir geht ein Kabel von Mosi(Master) auf Miso(Slave) und SCK
sind zusammengeschlossen.

Der Master schickt jede Sekunde 2 verschiedene Bitmuster (zum testen).

Der Slave wird mit dem Programm im Anhang bespielt. Ist eigentlich
alles gleich konfiguriert als wie bei master außer mstr.

Also so funktioniert es leider nicht, was mache ich da falsch?

Gruß Florian

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du solltest SPDR nur einlesen, wenn neue Daten eingetroffen sind. Schau
mal ins Datenblatt auf Seite 125, 126 und 128. Das geht per Polling (S.
125) oder besser per Interrupt (siehe auch S. 44, 45).

...

Autor: Dirk Doerr (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich würde mal MOSI mit MOSI verbinden und nicht MOSI mit MISO

Wenn Du eine Antwort willst mußt Du auch noch MISO mit MISO verbinden



Master --MOSI-->------MOSI--Slave
  |                          |
  |______MISO--<------MISO___|


Schau Dir doch mal das Datenblatt an. (Bild: SPI Master-Slave
interconnection im SPI Kapitel)

Autor: Florian Mauerhofer (----florian----)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Auwe, das ist natürlich ein schwerer Fehler... Habe jetzt folgendes mit
interrupt gemacht, aber es funzt leider immer noch nicht.

Ist da noch ein Fehler drin?

Gruß Florian

Autor: Kai Riek (kairiek)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lass den Interrupt einfach weg. Ich würde in diesem einfachen Fall, wie
Hannes vorgeschlagen hat, einfach das Interrupt Flag pollen. Das machst
du ja mit dem sbis Befehl. Natürlich solltest du das Bit auch wieder
zurücksetzen, sonst gehts auch nicht.

MFG

Kai

Autor: Dirk Doerr (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mal noch eine Anmerkung:
Hast Du eigentlich an den ChipSelect bzw. SlaveSelect Pin gedacht?

Der muß vom Master vor dem Datentransfer auf low gesetzt werden und
danach wieder auf high.

Solange der Pin auf high liegt wird der SPI im Slave nichts empfangen.

Gruß

      Dirk

Autor: Florian Mauerhofer (----florian----)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank für die vielen antworten.

Das mit SS wußte ich schon, habe es aber einfach beim Slave auf GND
gelegt. Wäre das grundsätzlich falsch?

Oder kann ich es einfach mit dem Master verbinden? Also ich meine,
zieht der Master beim senden die SS Leitung automatisch auf low?

Grundsetztlich funktioniert bei mir der Aufbau, aber er zeigt nur
einmal die eine Ledkombination an, und die zweite. Danach ist aus.

Würde es gerne mit Interrupt machen, doch irgendwas fuxt da noch.

Gruß Florian

Autor: Fasti (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi!

Du musst den SS Pin selbst hoch und runter ziehen! Wenn du den Slave SS
Pin permanent auf Ground legst weiss der nie, wann die Übertragung zu
Ende ist! Also einen Pin vom Master auf den SS Pin am Slave! Dieser ist
immer high! Wenn du eine Übertragung startest dann legst du denn Pin
vorher auf low, dann schreibst du in dein SPDR Register, daraufhin
startet der AVR bei Hardware-SPI automatisch die Übertragung. Danach
einfach den SS Pin wieder high setzen, damit weiss der Slave, dass die
Übertragung zu Ende ist. Auf diesem Weg kann man auch 16 Bit und mehr
breite Daten auslesen, weil man den SS Pin immer erst nach Ende der
Übetragung wieder high setzt.

mfg

Fasti

Autor: Florian Mauerhofer (----florian----)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo nochmal.

Es tut mir leid, aber ich komme mit dieser einfachen Aufgabe nicht
klar. Ich habe die Schaltung so wie im Anhang aufgebaut doch es
funktioniert nicht.

Er sendet zwar einmal die Daten rüber, und die Leds zeigen dann das
richtige an, aber danach passiert nichts mehr.

Beide laufen mit 1 MhZ intern.

Könntet ihr mal bitte einen Blick drauf werfen, ob ihr da irgnedwo
einen Fehler endeckt?

Das wäre wirklich toll, weil ich weiß wirklich nichtmehr weiter...

Im nächstem Anhang wären dann noch die Programme für den Master und den
Slave.

Ach ja, beim Master ist die Pause eine Sekunde lang.

Vielen Dank

Gruß Florian

Autor: Florian Mauerhofer (----florian----)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Und hier noch die Programme...

Autor: Steff (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
warum geht bei dir eigentlich der AGND und der C2 auf +5V Versorgung und
nicht auf GND ?

Gruß

Autor: Florian Mauerhofer (----florian----)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ups, falsch gezeichnet. Danke für den Tip. Aufgebaut habe ich es
natürlich richtig


Gruß Florian

Autor: Florian Mauerhofer (----florian----)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi.

Hätte sonst keiner mehr eine Idee, was da falsch sein könnte?

Gruß Florian

Autor: 789 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hab Dein Programm mal grob überflogen. So wie es aussieht hast Du
einen SPI-Interrupt-Handler in dem eine Endlosschleife auf das SPI-Flag
testet. Sowas macht man doch nicht! ;-)

(Ich hab jetzt nich nachgeschlagen wann genau das Flag gelöscht wird.
Es könnte sein, dass trotzdem alles funktioniert.)

Autor: Thomas Finke (thomas-hn) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn ich es richtig weiß wird das Interrupt-Flag automatisch gelöscht
sobald der Interrupt aufgerufen wird. Also entweder über den
Interrupthandler arbeiten oder im "normalen" Programmablauf das Flag
von Hand abfragen. Beides zusammen wird wohl nicht gehen.

Gruß,

Thomas

Autor: Florian Mauerhofer (----florian----)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hab ich da jetzt etwas falsch gemacht, oder nicht?

Gruß Florian

Autor: Fasti (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi!

Also wenn ich das Datenblatt richtig verstanden habe, dann kann MOSI
auf MOSI gar nicht funktionieren. Du musst MOSI beim Master auf MISO
beim Slave geben. (Die Namen der Pins sind da schon sehr
aussagekräftig: MOSI  Master Out Slave In und MISO Master In Slave
Out).
Erst dann kann eine Kommunikation stattfinden. Schliesslich wird ja
gleichzeitig gesendet und empfangen.

mfg

Fasti

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Also wenn ich das Datenblatt richtig verstanden habe, dann kann MOSI
> auf MOSI gar nicht funktionieren. Du musst MOSI beim Master auf MISO
> beim Slave geben. (Die Namen der Pins sind da schon sehr
> aussagekräftig: MOSI  Master Out Slave In und MISO Master In Slave
> Out).

Das wäre aber unlogisch...

Signal   Master   Richtung   Slave
----------------------------------
MOSI     Out      ------->   In
MISO     In       <-------   Out

...

Autor: Thomas Finke (thomas-hn) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich bin momentan vom Studium aus im Praxissemester bei Atmel in der
Entwicklung ;-)
Und MISO kommt definitiv auf MISO und MOSI auf MOSI.
Denn in jedem Gerät wird mit einem Flag eingestellt ob es Master oder
Slave ist und somit werden die Eingänge von der Richtung korrekt
geschaltet wenn MISO mit MISO und MOSI mit MOSI verbunden wird
(vorausgesetzt es wird der eine Teilnehmer als Master und der andere
als Slave konfiguriert ;-)
Weiterhin muss man die SCK von beiden Teilnehmern miteinander verbinden
und dann kann man noch die /SS-Leitungen von beiden Teilnehmern
miteinander verbinden, denn diese ist beim Slave automatisch Eingang
und muss auf Low-Pegel liegen, damit der Slave arbeitet. Beim Master
ist die /SS-Leitung AFAIK auch ein Eingang, kann aber über das DDRx auf
Ausgang geschaltet werden und kann somit den Slave steuern.
Ich habe die /SS-Leitung vom Master schon dazu verwendet beim
Einschalten einmalig das SPI-Schieberegister vom Slave zurückzusetzen,
bevor die Datenübertragung beginnt...sonst kann es vorkommen, dass ein
Versatz in den Daten vorliegt.

Es gibt auch noch einige Atmel-Application Notes dazu, z.B.
http://www.atmel.com/dyn/resources/prod_documents/...


Gruß,

Thomas

Autor: Thomas Finke (thomas-hn) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nachtrag zu MISO, MOSI:

Das MOSI heißt ja MASTER OUT, SLAVE IN. Da durch die Konfiguration der
Register beide ICs wissen ob sie jeweils Master oder Slave sind
schalten sie ihre Schieberegisteranschlüsse auch passend auf MISO oder
MOSI.

Somit sendet der Master bei MOSI (MASTER OUT, slave in) seine Daten und
der Slave empfängt auf MOSI (master out, SLAVE IN) die Daten.
Genau umgekehrt ist es dann bei MISO.

Thomas

Autor: Fasti (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi!

Upsi, sollte vorher nochmal lesen..... peinlich
natürlich gehört MOSI auf MOSI und MISO auf MISO, argh
tut mir leid....
Bei meinen Boards hab ichs richtig weil es funktioniert bei mir....
mhm, nächstes mal nochmal nachschaun ;-)

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]
  • [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.