Genau.
Ein minimalbeispiel:
#define CLOCK 13
#define LATCH 10
#define DATA_IN 12
#define DATA_OUT 11
void setup(void) {
pinMode(LATCH,OUTPUT); // CS/LATCH _muss_ als output definiert sein, bevor das spi modul als master aktiviert wird.
pinMode(DATA_OUT,OUTPUT);
pinMode(CLOCK,OUTPUT);
pinMode(DATA_IN,INPUT);
setup_hardware_spi();
}
void loop(void) {
digitalWrite(LATCH,LOW);
spi_transfer(255);
// usw.
digitalWrite(LATCH,HIGH);
}
void setup_hardware_spi(void)
{
byte clr;
/* enable SPI as master */
SPCR |= (_BV(SPE) | _BV(MSTR));
/* clear registers */
clr = SPSR;
clr = SPDR;
/* set prescaler to fosc/2 */
SPCR &= ~(_BV(SPR1) | _BV(SPR0));
SPSR |= _BV(SPI2X);
/* LSB first */
SPCR |= _BV(DORD); // comment for MSB first
}
byte spi_transfer(byte data)
{
SPDR = data; // Start the transmission
while (!(SPSR & _BV(SPIF))) {}; // Wait for the end of the transmission
return SPDR;
}