Forum

Einloggen | Registrieren | RSS  

spi

05.02.2013,
11:23
 

Atmega als SPI Slave (Elektronik)

Hallo, ich möchte mit einem Atmega als SPI Slave Daten von einem anderen
IC empfangen, der als Master läuft. Den Atmega habe ich wie folgt
konfiguriert:

SPI.c
#include <avr/io.h>
#include <avr/interrupt.h>
#include "uart.h"

unsigned char status;

void spi_slave_init (void) {
DDRB |= (1<<PB6); //MISO output
//SPI on + Interrupt, MSB first, Slave select, CLK idle low, sample rising edge
SPCR = (1<<SPE) | (1<<SPIE) | (0<<DORD) | (0<<MSTR) | (0<<CPOL) | (0<<CPHA);
status = SPSR; //Status löschen
}

char spi_slave_receive(void)
{uint8_t dummy;
/* Wait for reception complete */
while(!(SPSR & (1<<SPIF)));
dummy=SPDR;
/* Return Data Register */
return SPDR;
}


Allerdings bin ich beim Empfang nicht sicher, wie das richtig gemacht
wird.

SETREG_DATA // grün
SETRXTX // blau

SPDR=0x00;
byte2=spi_slave_receive();
if(byte2==0x13) uart_puts_P("byte2";); // Inhalt soll testweise per UART ausgegeben werden (code von Peter Fleury)
else uart_puts_P("xxx";);

_delay_ms(20);
CLRREG_DATA
CLRRXTX

Auf dem Bild im Anhang ist zu sehen, wie der Master-IC bei Aktivierung
der beiden Ports (grün & blau) den Clock wieder aktiviert und dann 24
Bit sendet. Ein SS vom Master aus gibt es nicht, deshalb habe ich den
Atmega SS dauerhaft auf GND gelegt.