Forum: Mikrocontroller und Digitale Elektronik Atmega8 SPI läuft nicht


von Andreas M. (burns)


Angehängte Dateien:

Lesenswert?

Hallo,

ich habe einen ATMEGA8 und möchte über SPI zum meinen Schieberegistern 
kommunizieren. Leider scheint sich das Programm aufzuhängen.

Ich rufe im meiner Main-Funktion folgende Zeilen auf:

uart_puti(0x32);               // sende Zeichenfolge über 
Bluetoothemodul an Terminal
spi_tranceiver(0x0f);
PORTC|=(1<<PC0);
PORTC&=~(1<<PC0);
_delay_ms(1000);

Kommentiere ich den "spi_tranceiver..." aus kommt auf meinem Terminal 
das Signal vom Befehl "UART_puti" im 1 sek Takt auf dem Terminal.
Ist die SPI-Zeile nicht auskommentiert kommt nichts auf meinem Terminal 
an. Es scheint mit so als ob er in der spi_tranceiver Funktion hängen 
bleibt.

Die Befele für PC0 sind zum übernehmen der daten an den Schiebregistern 
die am SPI angeschlossen sind.

Kann mir hier jemand weiter helfen?

von Andreas M. (burns)


Angehängte Dateien:

Lesenswert?

Hallo,
hier noch mein Programm dazu

von Michael U. (amiga)


Lesenswert?

Hallo,

Du hast bedacht, daß SS (PB2) nur als Ausgang frei verwendet werden 
kann, wenn der SPI Master sein soll?
SS ist Slave Select des SPI und muß bei Eingang auf Low gezogen sein.

Gruß aus Berlin
Michael

von Andreas M. (burns)


Lesenswert?

Hallo,

laut meinem spi_init unterprogramm sollte er als SPI Master laufen.

SPCR |= (1<<SPE)|(1<<MSTR)|(1<<SPR0);

Meines erachtens ist (1<<MSTR) das bit für den Masterbetrieb.

von S. Landolt (Gast)


Lesenswert?

> Meines erachtens ist (1<<MSTR) das bit für den Masterbetrieb.

Schon, aber:

Datenblatt 'SS Pin Functionality':
If SS is configured as an input, it must be held high to ensure Master 
SPI operation...

von Michael U. (amiga)


Lesenswert?

Hallo,

soweit richtig. Es geht aber um den Pin SS (PB2), das gehört zur 
SPI-Hardware. Und wenn eben der SPI als Master gesetzt wird, kann dieser 
Pin entweder als Ausgang gesetzt werden und unabhängig genutzt werden 
oder er wird als Eingang gesetzt, dann ist er Slave Select für den SPI 
und gibt den Master erst bei High frei.
Habe gerade im Datenblatt gesehen, daß meine obige Angabe mit Low wohl 
falsch rum war...

Du hast den aber wohl anders genutzt und das klappt nicht.

Gruß aus Berlin
Michael

von S. Landolt (Gast)


Lesenswert?

> ... gibt den Master erst bei High frei

Genauer: schaltet um auf Slave.

"If SS is configured as an input and is driven low while MSTR is set, 
MSTR will be cleared..."

von Andreas M. (burns)


Lesenswert?

HAllo,

ich habe den SS auf High gesetz und dann ging es auch gleich.
Vielen Dank für die schnelle Hilfe

Eigentlich wollte ich an dem Ausgang die PWM nutzen. Da lese ich jetzt 
nochmal nach ob das gehen würde.

von S. Landolt (Gast)


Lesenswert?

> Eigentlich wollte ich an dem Ausgang die PWM nutzen.
Kein Problem, ist ja dann als Ausgang konfiguriert.

von Paul B. (paul_baumann)


Lesenswert?

S. Landolt schrieb:
> ...it must be held high to ensure Master
> SPI operation...

Deutsch: Es muß ein großer Held sein, der die SPI-Operation als Master 
sicherstellt.

MfG Paul

von Jim M. (turboj)


Lesenswert?

> main.cpp

Eine ISR in einer .cpp kann interessante Nebenwirkungen haben, denn 
gängige Compiler übersetzen das als C++. Keine Ahnung ob AVR das korrekt 
behandelt.

SPI Master hängt sich gerne mal auf wenn SS nicht als Ausgang definiert 
wurde. Das sehe ich auf den 1. Blick nicht.

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.