Daten über SPI senden/empfangen geht nicht

Gast #1201165
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
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

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.