Forum: Mikrocontroller und Digitale Elektronik SPI ATmega16


von Peet (Gast)


Lesenswert?

Hallo zusammen

Ich habe ein Problem mit dem SPI meines mega16. Schlussendlich bin ich 
soweit, dass ich den code vom Datenblatt kopiert habe und auch das 
funktioniert nicht.
Wenn ich den SPI initialisiere und dann ein Byte ins SPDR schreibe, dann 
sollte ja das Byte gesendet werden. Ich sehe aber nichts mit meinem 
analogen KO, auch wenn ich dass in einer Endlosschlaufe mache.
Wenn ich dann auf das SPIF Flag im SPSR warte, dann wird das nie 
gesetzt.

ss habe ich probehalber jetzt weggelassen und testweise sogar MISO und 
MOSI des mega16 verbunden. So sollte doch das geschriebene Byte direkt 
wieder eingelsesn werden!

Programmiere jetzt mit dem AVR-Studio5 und habe alle codeoptimierungen 
ausgeschalten!

Hoffe einer kann mir helfen.
Peet

Anbei noch der Code:

1
#include <avr/io.h>
2
3
void SPI_MasterInit(void)
4
{
5
  int dummy;
6
  /* Set MOSI and SCK output, all others input */
7
  DDRB = 0x00;
8
  DDRB = (1<<5)|(1<<7);
9
  /* Enable SPI, Master, set clock rate fck/16 */
10
  SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);
11
  dummy   = SPSR;                   // clear SPIF bit in SPSR
12
    dummy   = SPDR;
13
}
14
15
void SPI_MasterTransmit(char cData)
16
{
17
  /* Start transmission */
18
  SPDR = cData;
19
  /* Wait for transmission complete */
20
  while(!(SPSR & (1<<SPIF)));
21
}
22
23
24
int main(void)
25
{
26
  SPI_MasterInit();
27
  
28
    while(1)
29
    {
30
    SPI_MasterTransmit('AA');
31
    }
32
}

von Oliver J. (skriptkiddy)


Lesenswert?

Setz mal SS auf Output. Warum steht im Kapitel SPI im Datenblatt.

Gruß Oliver

Edit:

Peet schrieb:
> SPI_MasterTransmit('AA');

Seit wann besteht ein Character aus zwei Zeichen? Das ist Murks. Der 
Compiler sollte dir das aber schon mitgeteilt haben.

von Peet (Gast)


Lesenswert?

Tja das war dann wohl das Problem. schäm

in der schaltung benutze ich ein andere pin als ss. also dachte ich mir, 
dass das keine rolle spielen sollte!

Nochmals vielen Dank!

von Peet (Gast)


Lesenswert?

Edit: Ja klar, da hast du recht. sollte eigentlich 0xAA sein, um bei 
meinem KO einen möglichst regelmässigen wechsel der Pegel zu erkennen

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.