Forum: Mikrocontroller und Digitale Elektronik SPI Code aus dem Datasheet


von Yücel A. (yuetzi)


Lesenswert?

Hallo,

ich hoffe sehr, jemand kann mir helfen. Ich möchte die SPI-Kommunikation 
einen µCs und eines CO-Prozessors abfangen. Dazu verwende ich meinen 
STK500 mit Atmega8515.

Auf S. 130 im Datasheet des 8515 steht

The following code examples show how to initialize the SPI as a Slave 
and how to perform a simple reception.

******************************
SPI_SlaveInit:
; Set MISO output, all others input
ldi r17,(1<<DD_MISO)
out DDR_SPI,r17
; Enable SPI
ldi r17,(1<<SPE)
out SPCR,r17
ret

SPI_SlaveReceive:
; Wait for reception complete
sbis SPSR,SPIF
rjmp SPI_SlaveReceive
; Read received data and return
in r16,SPDR
ret
*******************************

Frage:
1. Kann ich mit dem obigen Code nun wie gehofft, die Daten abfangen?
2. Wann kommt das Programm eigentlich von "SPI_SlaveInit" weg zu 
"SPI_SlaveReceive"? Der erste ret Befehl sorgt doch für eine Schleife 
mit einem Jump zu "SPI_SlaveInit", oder?

Ich danke im Voraus schon für eure Mühe...

von Michael U. (amiga)


Lesenswert?

Hallo,

das ist das Programmierbeispiel für einen SPI-Slave, ja.

Die erste Subroutine initialisiert die SPI HArdware, die zweite empfängt 
ein Byte vom SPI.

Wann die wo in Deinem Programm aufgerufen werden, muß Du ja entscheiden.

Initialisieren muß man die Hardware ja normalerweise nur einmal beim 
PowerOn-Reset,
wann was empfnagen werden osll und was mit den Daten passieren soll, 
mußt Du ja programmieren.
Die zweite Subroutine wartet, bis ein Byte im SPI angekommen ist und 
kehrt dann mit diesem Byte in r16 zurück. Mehr nicht.

Gruß aus Berlin
Michael

von Yücel A. (yuetzi)


Lesenswert?

HI!

Das heißt doch, so wie es drin steht, ist nichts mit dem Programm 
anzufangen, weil das erste ret doch für eine Endlosschleife sorgt, 
oder???

von Yücel A. (yuetzi)


Lesenswert?

HI!

Das heißt doch, so wie es drin steht, ist nichts mit dem Programm
anzufangen, weil das erste ret doch für eine Endlosschleife sorgt,
oder???

von Stefan_KM (Gast)


Lesenswert?

DU mußt aus DEINEM Programm heraus diese Funktion aufrufen. Nach 
Funktionsabarbeitung springt der Controller zurück, auf die Zeile nach 
dem Funktionsaufruf!!!!!!!!!

von Mi M. (mike123)


Lesenswert?

Hi,

poste doch mal dein komplettes Programm!

Falls du keins hast: Aktivier den SPI-Empfangsinterrupt

PSEUDOCODE:
-----------

isr SPI_SLAVE:
 Byte empfangen
 Flag setzen
 reti


main:

 Aufruf init_spi

nix:
 if Flag gesetzt
   mach was

 goto nix

von Yücel A. (yuetzi)


Lesenswert?

Danke, ich habs.
--------------------------------------------------------------------
Ich habe einen Traum:

Forenbeiträge in Audio aufgeben, damit die Betonungen auch so 
rüberkommen, wie man es will. :-)

Danke an euch..

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
Noch kein Account? Hier anmelden.