Forum: Mikrocontroller und Digitale Elektronik Daten über SPI senden/empfangen geht nicht


von Andi (Gast)


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;
}

von Benedikt K. (benedikt)


Lesenswert?

Setz den Slaveselect Pin beim Master auf high oder auf Ausgang.

von Andi (Gast)


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!

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.