Forum: Mikrocontroller und Digitale Elektronik SPI - ATMEGA32


von qwertz (Gast)


Lesenswert?

Hallo,

folgende Ausgangssituation:
- vorhanden: Oszi + Logicanalyser
- ATMEGA32 (Fuses auf Werkseinstellung)
- "funktionierende" Schaltung (LEDs blinken lassen geht)

folgendes Programm:
1
#define DDR_SPI DDRB
2
#define DD_MOSI PB5
3
#define DD_SCK PB7
4
5
void SPI_MasterInit(void)
6
{
7
/* Set MOSI and SCK output, all others input */
8
DDR_SPI = (1<<DD_MOSI)|(1<<DD_SCK);
9
/* Enable SPI, Master, set clock rate fck/16 */
10
SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);
11
}
12
13
void SPI_MasterTransmit(char cData)
14
{
15
/* Start transmission */
16
SPDR = cData;
17
/* Wait for transmission complete */
18
while(!(SPSR & (1<<SPIF)))
19
;
20
}
21
22
void main(void)
23
{
24
...
25
SPI_MasterInit();
26
SPI_MasterTransmit(0xA5);
27
SPI_MasterTransmit(0xAA);
28
SPI_MasterTransmit(0x55);
29
...
30
}

folgendes Problem:
Ich kann nur das erste Datenpaket übertragen. Beim zweiten Aufruf der 
Funktion SPI_MasterTransmit(...); bleibt das Programm bei while(!(SPSR & 
(1<<SPIF))) ; hängen?

Was mache ich falsch???
Vielen Dank für die Hilfe!

von Karl H. (kbuchegg)


Lesenswert?

qwertz schrieb:

> Was mache ich falsch???

Du hast den SS Pin nicht als Output konfiguriert. Daher arbeitet dein 
SPI nicht, das erste eingeschriebene Byte wird nie rausgetaktet, die SPI 
wird nicht frei und die while Schleife kriegt daher keine 'Freigabe'.

von holger (Gast)


Lesenswert?

>Was mache ich falsch???

Du setzt SS nicht auf Ausgang.

von Falk B. (falk)


Lesenswert?

Das SS Pin MUSS als Ausgang geschaltet werden, siehe Datenblatt.

von qwertz (Gast)


Lesenswert?

Vielen Dank!

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.