summaryrefslogtreecommitdiffhomepage
path: root/digital
diff options
context:
space:
mode:
authorNicolas Schodet2009-04-25 13:25:02 +0200
committerNicolas Schodet2009-04-25 13:25:02 +0200
commit3bcb94442a3733d39a5227a0c62cd236dd99c046 (patch)
treef8522b9722a0b643192fc60f7aaf9c2bc3ed18c3 /digital
parenta21c122435b22457399624a60dbca442d0c3588e (diff)
* digital/avr/modules/spi:
- added comment about GPIO settings. - added uninit.
Diffstat (limited to 'digital')
-rw-r--r--digital/avr/modules/spi/spi.h4
-rw-r--r--digital/avr/modules/spi/spi_hard.avr.c24
-rw-r--r--digital/avr/modules/spi/spi_hard.h4
-rw-r--r--digital/avr/modules/spi/spi_soft.avr.c10
-rw-r--r--digital/avr/modules/spi/spi_soft.h4
5 files changed, 46 insertions, 0 deletions
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)
{
@@ -84,6 +91,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)
{
spi_hard_send_and_recv (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
@@ -59,6 +59,16 @@ spi_soft_init_ (uint8_t 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)
{
spi_soft_send_and_recv (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);