Daten über SPI senden/empfangen geht nicht

Gast #1201165
Lesenswert?

Hallo,

folgendes Problem:
ich habe zwei atmega48. Einen habe ich als SPI-Master, den anderen als 
Slave definiert.
Ich möchte nun Daten vom Master zum Slave schicken und umgehrt.

Dazu habe ich nun erstmal zu Testzwecken ein kleines Programm 
geschrieben.
Es wird das letzt empfangene Byte ins eeprom geschrieben. Was ich ja 
dann über das STK500 auslesen kann.

Es wird aber weder ein empfangenes Byte vom Master noch vom Slave ins 
eeprom geschrieben. Also wird wohl komischer Weise nix empfangen!

Die zwei Controller habe ich auf ein Steckboard miteinander verbunden.
Leider weiß ich schon langsam nicht mehr weiter, an was es liegen 
könnte. vielleicht kann mir hier jemand helfen!


Hier mal der Quellcode meines Programms:
#define F_CPU 8000000

#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <avr/eeprom.h>


#define  P_MOSI  PB3
#define  P_MISO  PB4
#define  P_SCK  PB5


/* Umschalter zwischen Master und Slave */
#define MASTER


uint8_t spi_putc(uint8_t byte)
{

  SPDR = byte;

  while(!(SPSR & (1<<SPIF)));

  return SPDR;
}




int main()
{

  uint8_t byte = 0;
  uint8_t eeAdr = 0x10;

#ifdef MASTER

  _delay_ms(1);

  /* Ausgänge festlegen */
  DDRB = ( 1 << P_MOSI) | (1 << P_SCK);

  /* Pull-Up MISO */
  PORTB = (1 << P_MISO);

  /* Master-Modus aktivieren, Prescaler 8 */
  SPCR =  (1 << MSTR) | (1 << SPR0);
  SPSR = ( 1 << SPI2X);

  /* SPI-BUS aktivieren */
  SPCR |= (1 << SPE);

  byte = SPDR;
  byte = SPSR;

  _delay_ms(1);

  /* Daten zum Slave senden */
  byte = spi_putc('B');
  byte = spi_putc('A');


#else

  /* Ausgang festlegen */
  DDRB = ( 1 << P_MISO);

  /* Pull-Up MOSI */
  PORTB |= (1 << P_MOSI);

  /* SPI-BUS aktivieren */
  SPCR = (1 << SPE);

  /* löschen */
  byte = SPDR;
  byte = SPSR;

  byte = spi_putc('C');
  byte = spi_putc('D');

#endif

  /* letztes Byte abspeichern */
  eeprom_write_byte(&eeAdr,byte);




  while (1) {

    _delay_ms(1);

  }

  return 0;
}
Gast #1201201
Lesenswert?

Hallo

ja, habe ich nun gemacht.
Habe mein Programm um folgende Zeilen im MASTER erzänzt

/* Ausgänge festlegen */
DDRB = ( 1 << P_MOSI) | (1 << P_SCK) | (1 << P_SS);
PORTB = (1 << P_MISO) | (1 << P_SS);

...

/* Daten senden */
PORTB &= ~(1 << P_SS);
byte = spi_putc('B');
byte = spi_putc('A');
PORTB |= (1 << P_SS);

funktioniert aber leider immer noch nicht!

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