The following code examples show how to initialize the SPI as a Slave and how to perform a simple reception.
Assembly Code Example(1)
SPI_SlaveInit:
; Set MISO output, all others input
ldi
out
r17,(1<<DD_MISO)
DDR_SPI,r17
; Enable SPI
ldi
out
ret
r17,(1<<SPE)
SPCR,r17
SPI_SlaveReceive:
; Wait for reception complete
sbis
rjmp
SPSR,SPIF
SPI_SlaveReceive
; Read received data and return
in
r16,SPDR
ret
C Code Example(1)
void SPI_SlaveInit(void)
{
/* Set MISO output, all others input */
DDR_SPI = (1<<DD_MISO);
/* Enable SPI */
SPCR = (1<<SPE);
}
char SPI_SlaveReceive(void)
{
/* Wait for reception complete */
while(!(SPSR & (1<<SPIF)))
;
/* Return data register */
return SPDR;
}
Note:
1. The example code assumes that the part specific header file is included.
136
ATmega16/32/64/M1/C1 [DATASHEET]
7647O–AVR–01/15