summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKeith Packard <keithp@keithp.com>2012-08-05 12:17:25 -0700
committerKeith Packard <keithp@keithp.com>2012-08-05 12:17:25 -0700
commit0f82021186565fda10df7893b95deae4a1f32778 (patch)
treec0298ecdcb60a41a8a4246d4fd73a735b4212019
parent39594fdb3e30a1a25dd894c217e3d9d773bab972 (diff)
src/cc1111: Enable SPI slave mode
This is untested... Signed-off-by: Keith Packard <keithp@keithp.com>
-rw-r--r--src/cc1111/ao_spi.c25
1 files changed, 21 insertions, 4 deletions
diff --git a/src/cc1111/ao_spi.c b/src/cc1111/ao_spi.c
index 1bf5e155..88cff9dd 100644
--- a/src/cc1111/ao_spi.c
+++ b/src/cc1111/ao_spi.c
@@ -40,6 +40,7 @@ static __xdata uint8_t ao_spi_const;
void
ao_spi_send_bus(void __xdata *block, uint16_t len) __reentrant
{
+#if !AO_SPI_SLAVE
ao_dma_set_transfer(ao_spi_dma_in_id,
&U0DBUFXADDR,
&ao_spi_const,
@@ -50,7 +51,7 @@ ao_spi_send_bus(void __xdata *block, uint16_t len) __reentrant
DMA_CFG1_SRCINC_0 |
DMA_CFG1_DESTINC_0 |
DMA_CFG1_PRIORITY_NORMAL);
-
+#endif
ao_dma_set_transfer(ao_spi_dma_out_id,
block,
&U0DBUFXADDR,
@@ -62,11 +63,18 @@ ao_spi_send_bus(void __xdata *block, uint16_t len) __reentrant
DMA_CFG1_DESTINC_0 |
DMA_CFG1_PRIORITY_NORMAL);
+#if !AO_SPI_SLAVE
ao_dma_start(ao_spi_dma_in_id);
+#endif
ao_dma_start(ao_spi_dma_out_id);
ao_dma_trigger(ao_spi_dma_out_id);
+#if AO_SPI_SLAVE
+ __critical while (!ao_spi_dma_out_done)
+ ao_sleep(&ao_spi_dma_out_done);
+#else
__critical while (!ao_spi_dma_in_done)
ao_sleep(&ao_spi_dma_in_done);
+#endif
}
/* Receive bytes over SPI.
@@ -115,10 +123,19 @@ ao_spi_recv_bus(void __xdata *block, uint16_t len) __reentrant
* MO P1_5
* MI P1_4
* CLK P1_3
+ * CSS P1_2
*
- * Chip select is the responsibility of the caller
+ * Chip select is the responsibility of the caller in master mode
*/
+#if AO_SPI_SLAVE
+#define CSS (1 << 2)
+#define UxCSR_DIRECTION UxCSR_SLAVE
+#else
+#define CSS 0
+#define UxCSR_DIRECTION UxCSR_MASTER
+#endif
+
void
ao_spi_init(void)
{
@@ -131,7 +148,7 @@ ao_spi_init(void)
P2SEL = (P2SEL & ~P2SEL_PRI3P1_MASK) | P2SEL_PRI3P1_USART0;
/* Make the SPI pins be controlled by the USART peripheral */
- P1SEL |= ((1 << 5) | (1 << 4) | (1 << 3));
+ P1SEL |= ((1 << 5) | (1 << 4) | (1 << 3) | CSS);
/* Set up OUT DMA */
ao_spi_dma_out_id = ao_dma_alloc(&ao_spi_dma_out_done);
@@ -143,7 +160,7 @@ ao_spi_init(void)
*
* SPI master mode
*/
- U0CSR = (UxCSR_MODE_SPI | UxCSR_RE | UxCSR_MASTER);
+ U0CSR = (UxCSR_MODE_SPI | UxCSR_RE | UxCSR_DIRECTION);
/* Set the baud rate and signal parameters
*