/* * fw/spi.c - SPI I/O * * Written 2012 by Werner Almesberger * Copyright 2012 Werner Almesberger * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. */ #include #include #include "io.h" #include "spi.h" #define nSS B, 2 #define MOSI B, 3 #define MISO B, 4 #define SCLK B, 8 /* * According to simulation, signals from MCU to transceiver should already * suffer severe degradation * at fosc/4 = 2 MHz due to parasitic capacitance * (assumed to be 10 pF) and the series resistors (10 kOhm) of the voltage * dividers. * * fosc/2 = 4 MHz looks horrible in simulation and does not work reliably in * practice either. */ void spi_init(void) { /* SPI mode 0, MSB first, fosc/4 */ SPCR = 1 << SPE | /* enable SPI */ 1 << MSTR; /* master */ // SPSR = 1 << SPI2X; /* enable for fosc/2 */ } void spi_begin(void) { CLR(nSS); } uint8_t spi_io(uint8_t v) { SPDR = v; while (!(SPSR & (1 << SPIF))); return SPDR; } void spi_end(void) { SET(nSS); }