SPI , Problem

OP #3215544
Lesenswert?

Ich wollte 2 µC(ATmega 8, Atmega 328P) über SPI verbinden. Jedoch 
funktioniert es nicht so richtig. Da der Slave (ATmega 8) auf einem 
Myavr mk2 Board sitzt konnte ich in mit dem Mysmartusb debuggen. Wenn 
ich in aber mit dem Master verbinde funktioniert nichts mehr.

Hier die dafür verwendeten Funktionen:
1
void Masterinit( void )
2
{
3
  DDRB = (1<<PB5)|(1<<PB4)|(1<<PB2);//Set MOSI and SCK output all others are INPUT
4
  SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);//Enable SPI, Master, set clock rate fcl/16
5
}
6
void transmit( char data )
7
{
8
  PORTB = PORTB & 0xfe;
9
  SPDR = data; 
10
  while(!(SPSR & (1<<SPIF))); //Wait for transmission is complete
11
  PORTB = (1<<PB2);
12
}
#3215554
Lesenswert?

spess53 schrieb:
> Hi
>
>>  PORTB = PORTB & 0xfe;
>>  .....
>>  PORTB = (1<<PB2);
>
> Was soll das bezwecken?

Ich schätze mal, der Hinweis war etwas zu subtil.

0xFE ist NICHT der Pin PB2. (SS der SPI)

SChreibs halt so

   PORTB &= ~( 1 << PB2 );

dann passiert dir so ein Scheiss nicht. Immer diese unangebrachten 
brachial Binär und Hex Schreibweisen. Man handelt sich damit mehr Fehler 
ein als einem lieb ist.

Und wenn du es so machst
1
#define MASTER_SS  PB2
2

3
...
4
  PORTB &= ~( 1 << MASTER_SS );
5
  ...
6
  PORTB |= (1 << MASTER_SS );
7
...

dann kann es dir nicht mal mehr passieren, dass du im 0-Setzen und 
1-Setzen der SS-Leitung verschiedene Pins erwischt. Plus: man kann dann 
sogar im Code sehen und ablesen, dass es um die SS Leitung geht.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren