mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Problem mit SPI-Datenübertragung zwischen Master und Slave


Autor: H. G. (ledi)
Datum:

Bewertung
0 lesenswert
nicht 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:
#include <avr/io.h>
#include <util/delay.h>

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

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

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

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

void SPI_Master_Transmit(char cData)
{
  PORTD &= ~(1<<PD3);        // SS = low
  SPDR = cData;          // Start transmission
  while (!(SPSR & (1<<SPIF)));  // Wait for transmission complete
  PORTD |= (1<<PD3);        // SS = high
}

void main(void)
{              
  SPI_Master_Init();

    while(1)
    {
    SPI_Master_Transmit(0b11010010);
    _delay_ms(500);         // delaytime between next transmission  
    SPI_Master_Transmit(0b00000001); 
    _delay_ms(500);
    }
}

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



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

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

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

unsigned char SPI_Slave_Receive()
{
  while (!(SPSR & (1<<SPIF)));  // Wait for transmission complete
  return SPDR;
}

void main(void)
{          
  DDRC = 0xFF;
      
  SPI_Slave_Init();

    while(1)
    {
    SPI_Slave_Receive();
    PORTC = SPI_Slave_Receive();
    _delay_us(50);     // delaytime between next transmission   
    }
}

Autor: Rainer Unsinn (r-u)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wofür ist diese Zeile in Spi_slave_receive:

  SPCR |=  (1<<SPR1);  // CLK / 64 = 125kHz

?

Autor: H. G. (ledi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Rainer Unsinn schrieb:
> wofür ist diese Zeile in Spi_slave_receive:
>
>   SPCR |=  (1<<SPR1);  // CLK / 64 = 125kHz
>
> ?

Hat in dem Fall keine Bedeutung (da Slave).
In meiner Software ist die Zeile auch auskommentiert.

Autor: Rainer Unsinn (r-u)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
und - willst Du nur jedes zweite Zeichen an PortC ausgeben?

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

Autor: H. G. (ledi)
Datum:

Bewertung
0 lesenswert
nicht 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.
while(1)
    {
    SPI_Master_Transmit(0b11010010);
    _delay_ms(500);  // delaytime between next transmission  
    SPI_Master_Transmit(0b00000001); 
    _delay_ms(500);  // delaytime between next transmission
    }

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

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.