mikrocontroller.net

Forum: Compiler & IDEs SPI Slave Problem


Autor: Alex F. (alex86)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

mein Atmega64 bekommt über SPI im Slavebetrieb von einer Komponente im 
Roboter
4 Init Bytes gesendet. Wenn diese 4 Bytes gesendet werden, zieht sie die 
Handshakeleitung runter. Dies symbolisiert dem Atmel, dass er nun Daten 
empfangen muss. Diese Leitung liegt bei mir auf INT6 (Interrupt wird 
ausgelöst, MCU ist im Slave). Ich rufe die Daten solange ab, bis sie 
stimmen. Doch leider werden diese erst beim 10 Interrupt-Aufruf richtig 
erkannt. Die Einstellungen CPOL und CPHA stimmen. Der SS Pin ist auch 
die ganze Zeit auf Low. Woran könnte das liegen? Ich habe schon alles 
ausprobiert. Wenn die Interrupts ausgeführt werden, passiert in der 
Warteschleife (siehe Code) nichts, sprich anscheinend springt er nie 
richtig zurück in die Main.
Wär echt klasse, wenn ihr mir kurz helfen könnt. Ist natürlich wie immer 
sehr wichtig:)

danke
Alex

Autor: fieser, klugscheissender Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Wenn diese 4 Bytes gesendet werden, zieht sie die Handshakeleitung >runter.
ja, so funktioniert SPI.

>Diese Leitung liegt bei mir auf INT6 (Interrupt wird
>ausgelöst, MCU ist im Slave

Die Slaveselect-Leitung liegt auf INT6? Warum?
Wenn die SPI im Slave-Mode initialisiert wurde, wird der ganze Spaß über 
/SS (PB0) gesteuert. Solbald ein komplettes Byte empfangen wurde, wird 
das SPIF im SPSR gesetzt.
Das löst entweder einen Interrupt aus und verzeigt in die entsprechende 
ISR, oder kann einfach abgefragt (Polling-Betrieb) werden.
Man braucht also keine extra Interrupt-Leitungen dafür.

Da ich ein grundsätzliches Verständnisproblem deinerseits sehe, hab ich 
keinen genaueren Blick auf dein Code geworfen.
für dich sollten die Seite 162ff im Datenblatt interessant sein...

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Guck dir auch mal das Timing komplett an.  Wir haben hier auch mal
mit einem AVR als Slave experimentiert, da merkt man richtig, dass
SPI-Slave nicht für Controller gemacht ist, sondern für Hardware-
Schieberegister.  Mit vollem Takt kannst du das praktisch komplett
vergessen, es sei denn, du weißt ganz genau, wann dein Master dir
den SPI-Transfer aufdrängeln wird (und kannst da entsprechend
darauf warten).  Anders als z. B. bei I²C hat der Slave bei SPI
keine Möglichkeit, dem Master zu signalisieren, dass er jetzt gerade
noch nicht bereit ist.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jörg hat recht, SPI-Slave möchte man nicht wirklich benutzen.

Du brauchst schon ne Handshakeleitung, allerdings in umgekehrter 
Richtung.

Der Master setzt /SS = 0 und schickt das erste Byte.
Dann macht der Slave ne Flanke auf der Handshakeleitung, daß er bereit 
fürs nächste Byte ist.
Und erst dann darf der Master weiter senden - warten - senden - warten - 
...
Alles andere ist Käse.


Peter

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.