beautypg.com

Spi slave operation example, Atmega169v/l – Rainbow Electronics Atmega169L User Manual

Page 180

background image

180

ATmega169V/L

2514A–AVR–08/02

The following code demonstrates how to use the USI module as a SPI Master with max-
imum speed (fsck = fck/2):

SPITransfer_Fast:

out

USIDR,r16

ldi

r16,(1<

ldi

r17,(1<

out

USICR,r16 ; MSB

out

USICR,r17

out

USICR,r16

out

USICR,r17

out

USICR,r16

out

USICR,r17

out

USICR,r16

out

USICR,r17

out

USICR,r16

out

USICR,r17

out

USICR,r16

out

USICR,r17

out

USICR,r16

out

USICR,r17

out

USICR,r16 ; LSB

out

USICR,r17

in

r16,USIDR

ret

SPI Slave Operation Example

The following code demonstrates how to use the USI module as a SPI Slave:

init:

ldi

r16,(1<

out

USICR,r16

...

SlaveSPITransfer:

out

USIDR,r16

ldi

r16,(1<

out

USISR,r16

SlaveSPITransfer_loop:

sbis

USISR,USIOIF

rjmp

SlaveSPITransfer_loop

in

r16,USIDR

ret

The code is size optimized using only eight instructions (+ ret). The code example
assumes that the DO is configured as output and USCK pin is configured as input in the
DDR Register. The value stored in register r16 prior to the function is called is trans-
ferred to the master device, and when the transfer is completed the data received from
the Master is stored back into the r16 Register.