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.
 |