Table 55. SPI Pin Overrides
Pin
Direction, Master SPI
Direction, Slave SPI
User Defined
Input
MISO
SCK
SS
Input
User Defined
User Defined
Input
Note:
See “Alternate Functions of Port B” on page 57 for a detailed description of how to define
the direction of the user defined SPI pins.
The following code examples show how to initialize the SPI as a master and how to per-
form a simple transmission. DDR_SPI in the examples must be replaced by the actual
Data Direction Register controlling the SPI pins. DD_MOSI, DD_MISO and DD_SCK
must be replaced by the actual data direction bits for these pins. For example if MOSI is
placed on pin PB5, replace DD_MOSI with DDB5 and DDR_SPI with DDRB.
Assembly Code Example(1)
SPI_MasterInit:
; Set MOSI and SCK output, all others input
ldi
out
r17,(1<<DD_MOSI)|(1<<DD_SCK)
DDR_SPI,r17
; Enable SPI, Master, set clock rate fck/16
ldi
out
ret
r17,(1<<SPE)|(1<<MSTR)|(1<<SPR0)
SPCR,r17
SPI_MasterTransmit:
; Start transmission of data (r16)
out
SPDR,r16
Wait_Transmit:
; Wait for transmission complete
sbis SPSR,SPIF
rjmp Wait_Transmit
ret
C Code Example(1)
void SPI_MasterInit(void)
{
/* Set MOSI and SCK output, all others input */
DDR_SPI = (1<<DD_MOSI)|(1<<DD_SCK);
/* Enable SPI, Master, set clock rate fck/16 */
SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);
}
void SPI_MasterTransmit(char cData)
{
/* Start transmission */
SPDR = cData;
/* Wait for transmission complete */
while(!(SPSR & (1<<SPIF)))
;
}
134
ATmega32(L)
2503J–AVR–10/06