www.mikrocontroller.net

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


Autor: Andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;
}

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Setz den Slaveselect Pin beim Master auf high oder auf Ausgang.

Autor: Andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

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.