From 3bcb94442a3733d39a5227a0c62cd236dd99c046 Mon Sep 17 00:00:00 2001 From: Nicolas Schodet Date: Sat, 25 Apr 2009 13:25:02 +0200 Subject: * digital/avr/modules/spi: - added comment about GPIO settings. - added uninit. --- digital/avr/modules/spi/spi.h | 4 ++++ digital/avr/modules/spi/spi_hard.avr.c | 24 ++++++++++++++++++++++++ digital/avr/modules/spi/spi_hard.h | 4 ++++ digital/avr/modules/spi/spi_soft.avr.c | 10 ++++++++++ digital/avr/modules/spi/spi_soft.h | 4 ++++ 5 files changed, 46 insertions(+) diff --git a/digital/avr/modules/spi/spi.h b/digital/avr/modules/spi/spi.h index 834e9ea5..d262e5a3 100644 --- a/digital/avr/modules/spi/spi.h +++ b/digital/avr/modules/spi/spi.h @@ -79,22 +79,26 @@ /* Map names to drivers. */ #if SPI0_DRIVER == SPI_DRIVER_HARD # define spi_init spi_hard_init +# define spi_uninit spi_hard_uninit # define spi_send spi_hard_send # define spi_recv spi_hard_recv # define spi_send_and_recv spi_hard_send_and_recv #elif SPI0_DRIVER == SPI_DRIVER_SOFT # define spi_init spi_soft_init +# define spi_uninit spi_soft_uninit # define spi_send spi_soft_send # define spi_recv spi_soft_recv # define spi_send_and_recv spi_soft_send_and_recv #endif #if SPI1_DRIVER == SPI_DRIVER_HARD # define spi1_init spi_hard_init +# define spi1_uninit spi_hard_uninit # define spi1_send spi_hard_send # define spi1_recv spi_hard_recv # define spi1_send_and_recv spi_hard_send_and_recv #elif SPI1_DRIVER == SPI_DRIVER_SOFT # define spi1_init spi_soft_init +# define spi1_uninit spi_soft_uninit # define spi1_send spi_soft_send # define spi1_recv spi_soft_recv # define spi1_send_and_recv spi_soft_send_and_recv diff --git a/digital/avr/modules/spi/spi_hard.avr.c b/digital/avr/modules/spi/spi_hard.avr.c index 15282dde..f875039d 100644 --- a/digital/avr/modules/spi/spi_hard.avr.c +++ b/digital/avr/modules/spi/spi_hard.avr.c @@ -46,6 +46,13 @@ # error "spi: not implemented on this chip" #endif +/** WARNING: there is some assertions in GPIO settings which should be + * verified: + * - does SCK initial value match selected mode? + * - should a pull-up be used on inputs? + * - can SS be reset as an input on uninit? + */ + void spi_hard_init_ (uint8_t spcr, uint8_t spi2x) { @@ -83,6 +90,23 @@ spi_hard_init_ (uint8_t spcr, uint8_t spi2x) } } +void +spi_hard_uninit (void) +{ + /* Reset MISO now for slave mode (see above, no effect in master mode). */ + IO_DDR (SPI_MISO_IO) &= ~IO_BV (SPI_MISO_IO); + IO_PORT (SPI_MISO_IO) &= ~IO_BV (SPI_MISO_IO); + /* Disable SPI. */ + SPCR = 0; + /* Reset GPIO configuration. */ + IO_DDR (SPI_SS_IO) &= ~IO_BV (SPI_SS_IO); + IO_PORT (SPI_SS_IO) &= ~IO_BV (SPI_SS_IO); + IO_DDR (SPI_MOSI_IO) &= ~IO_BV (SPI_MOSI_IO); + IO_PORT (SPI_MOSI_IO) &= ~IO_BV (SPI_MOSI_IO); + IO_DDR (SPI_SCK_IO) &= ~IO_BV (SPI_SCK_IO); + IO_PORT (SPI_SCK_IO) &= ~IO_BV (SPI_SCK_IO); +} + void spi_hard_send (uint8_t data) { diff --git a/digital/avr/modules/spi/spi_hard.h b/digital/avr/modules/spi/spi_hard.h index 6e09f415..eff9e5b9 100644 --- a/digital/avr/modules/spi/spi_hard.h +++ b/digital/avr/modules/spi/spi_hard.h @@ -48,6 +48,10 @@ enum spi_fosc_t void spi_hard_init_ (uint8_t spcr, uint8_t spi2x); +/** Uninitialise SPI driver, release GPIO (SS too!). */ +void +spi_hard_uninit (void); + /** Send data. */ void spi_hard_send (uint8_t data); diff --git a/digital/avr/modules/spi/spi_soft.avr.c b/digital/avr/modules/spi/spi_soft.avr.c index d73b4de8..c16c732c 100644 --- a/digital/avr/modules/spi/spi_soft.avr.c +++ b/digital/avr/modules/spi/spi_soft.avr.c @@ -58,6 +58,16 @@ spi_soft_init_ (uint8_t speed) spi_speed = speed; } +void +spi_soft_uninit (void) +{ + /* Reset GPIO configuration. */ + IO_PORT (SPI_MISO_IO) &= ~IO_BV (SPI_MISO_IO); + IO_DDR (SPI_MOSI_IO) &= ~IO_BV (SPI_MOSI_IO); + IO_PORT (SPI_MOSI_IO) &= ~IO_BV (SPI_MOSI_IO); + IO_DDR (SPI_SCK_IO) &= ~IO_BV (SPI_SCK_IO); +} + void spi_soft_send (uint8_t data) { diff --git a/digital/avr/modules/spi/spi_soft.h b/digital/avr/modules/spi/spi_soft.h index 8d4de289..2516bcf4 100644 --- a/digital/avr/modules/spi/spi_soft.h +++ b/digital/avr/modules/spi/spi_soft.h @@ -47,6 +47,10 @@ void spi_soft_init_ (uint8_t speed); +/** Uninitialise SPI driver. */ +void +spi_soft_uninit (void); + /** Send data. */ void spi_soft_send (uint8_t data); -- cgit v1.2.3