/* * Bit-Banged SPI routines */ #include "spi.h" void spiInit(void) { DDRB |= (1 << PB2); // SI output DDRB &= ~(1 << PB3); // SO input DDRB |= (1 << PB4); // SCLK output DDRB |= (1 << PB1); // CS output DDRB &= ~(1 << PB0); // GDO0 input SCK_off; MO_off; CS_on; } void spiWrite(uint8_t command) { SCK_off; //SCK start low MO_off; uint8_t n = 8; while (n--) { if (command & 0x80) { MO_on; } else { MO_off; } SCK_on; NOP(); SCK_off; command = command << 1; } MO_on; } uint8_t spiRead(void) { uint8_t result = 0; for (uint8_t i = 0; i < 8; i++) { if (MI_1) { result = (result << 1) | 0x01; } else { result = result << 1; } SCK_on; NOP(); SCK_off; NOP(); } return result; }