Problem mit SPI-Datenübertragung zwischen Master und Slave

OP #1858894
Lesenswert?
• ▲
▼
Ich habe 2 Boards (Controller = ATMEL AT90PWM316) miteinander über die 
ISP-Schnittstelle verbunden und möchte vom Master Daten an den Slave 
senden und diese dort am PORTC ausgeben.

CLK, SS und MOSI habe ich mit dem Oszi am Master gemessen. Hier ist 
alles OK!

Mein Problem ist, dass ich die Übertragung am PORTC nur empfange, wenn 
ich das Programm Schritt für Schritt im Debugger durchsteppe.


Hier mein C-Code für den Master:
1
#include <avr/io.h>
2
#include <util/delay.h>
3

4
void SPI_Master_Init(void)
5
{
6
  SPCR &=  ~(1<<DORD);  // Send MSB first
7
  SPCR |=  (1<<MSTR);  // Controller = Master
8
  SPCR &=  ~(1<<CPOL);  // CLK positiv phase
9
  SPCR |=  (1<<CPHA);  // Sampling data @ rising edge
10
  SPCR |=  (1<<SPR1);  // CLK / 64 = 125kHz
11

12
  DDRB |=  (1<<PB1);  // Set MOSI output
13
  DDRB |=  (1<<PB7);  // Set SCK output
14

15
  DDRD |=  (1<<PD3);  // Set SS output 
16

17
  SPCR |=  (1<<SPE);  // SPI enable
18
}
19

20
void SPI_Master_Transmit(char cData)
21
{
22
  PORTD &= ~(1<<PD3);        // SS = low
23
  SPDR = cData;          // Start transmission
24
  while (!(SPSR & (1<<SPIF)));  // Wait for transmission complete
25
  PORTD |= (1<<PD3);        // SS = high
26
}
27

28
void main(void)
29
{              
30
  SPI_Master_Init();
31

32
    while(1)
33
    {
34
    SPI_Master_Transmit(0b11010010);
35
    _delay_ms(500);         // delaytime between next transmission  
36
    SPI_Master_Transmit(0b00000001); 
37
    _delay_ms(500);
38
    }
39
}

Hier mein C-Code für den Slave:
1
#include <avr/io.h>
2
#include <util/delay.h>
3

4

5

6
void SPI_Slave_Init(void)
7
{
8
  SPCR &=  ~(1<<DORD);  // Send MSB first
9
  SPCR &=  ~(1<<MSTR);  // Controller = Slave
10
  SPCR &=  ~(1<<CPOL);  // CLK positiv phase
11
  SPCR |=  (1<<CPHA);  // Sampling data @ rising edge
12
  SPCR |=  (1<<SPR1);  // CLK / 64 = 125kHz
13

14
  DDRB |=  (1<<PB0);  // Set MISO output
15
  DDRB &= ~(1<<PB1);  // Set MOSI input
16
  DDRB &=  ~(1<<PB7);  // Set SCK input
17

18
  SPCR |=  (1<<SPE);  // SPI enable
19
}
20

21
unsigned char SPI_Slave_Receive()
22
{
23
  while (!(SPSR & (1<<SPIF)));  // Wait for transmission complete
24
  return SPDR;
25
}
26

27
void main(void)
28
{          
29
  DDRC = 0xFF;
30
      
31
  SPI_Slave_Init();
32

33
    while(1)
34
    {
35
    SPI_Slave_Receive();
36
    PORTC = SPI_Slave_Receive();
37
    _delay_us(50);     // delaytime between next transmission   
38
    }
39
}
OP #1859781
Lesenswert?
• ▲
▼
Rainer Unsinn schrieb:
> und - willst Du nur jedes zweite Zeichen an PortC ausgeben?

abwechselnd soll nach je 500ms am PORTC
 11010010
und
 00000001
ausgegeben werden.
1
while(1)
2
    {
3
    SPI_Master_Transmit(0b11010010);
4
    _delay_ms(500);  // delaytime between next transmission  
5
    SPI_Master_Transmit(0b00000001); 
6
    _delay_ms(500);  // delaytime between next transmission
7
    }

> und - wofür wartest Du die 50 Mikrosekunden? _delay_us(50);

das ist für nix. Das habe ich auch auskommentiert.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.