diff --git a/firmware/Makefile b/firmware/Makefile index 3d3b979..983e53d 100644 --- a/firmware/Makefile +++ b/firmware/Makefile @@ -1,7 +1,7 @@ DEFINES += -DF_CPU=16000000 -#CFLAGS += -save-temps +CFLAGS += -save-temps -OBJECTS = usbdrv/usbdrvasm.o usbdrv/usbdrv.o main.o display.o lcd/lcd.o +OBJECTS = usbdrv/usbdrvasm.o usbdrv/usbdrv.o main.o display.o lcd/lcd.o spi.o diff --git a/firmware/spi.c b/firmware/spi.c new file mode 100644 index 0000000..1892ee5 --- /dev/null +++ b/firmware/spi.c @@ -0,0 +1,45 @@ +#include +#include +#include + + +#include + + +void spi_init(){ + uint8_t spcr, spsr, d; + + /* calculate clock divisor, + * gcc with optimize will do that calculation compile-time. */ + uint8_t spi_clock_divisor(){ + double d; + d = F_CPU / SPI_BAUDRATE; + d = ceil((log(d)/log(2))*0.95); // clock needs dividing by 2^d + // the 0.95 to avoid ceil issues + return d-1; // the -1 because minimum divisor is /2 + } + + d = spi_clock_divisor(); + if(d>7){ +#warning "spi baudrate too slow, cannot be set" + d=7; + } + + spsr = 0; + spsr |= (d & 1) ? 0 : _BV(SPI2X); + spcr = 0 | _BV(SPIE) | _BV(SPE); + spcr |= (d & 2) ? _BV(SPR0) : 0; + spcr |= (d & 4) ? _BV(SPR1) : 0; + +#ifdef SPI_MASTER + spcr |= _BV(MSTR); +#endif + + SPCR = spcr; + SPSR = spsr; +} + + + + + diff --git a/firmware/spi.h b/firmware/spi.h new file mode 100644 index 0000000..aabdb6f --- /dev/null +++ b/firmware/spi.h @@ -0,0 +1,5 @@ + + + +#define SPI_BAUDRATE 1000000 +#define SPI_MASTER 1