src/cc1111: Enable SPI slave mode
authorKeith Packard <keithp@keithp.com>
Sun, 5 Aug 2012 19:17:25 +0000 (12:17 -0700)
committerKeith Packard <keithp@keithp.com>
Sun, 5 Aug 2012 19:17:25 +0000 (12:17 -0700)
This is untested...

Signed-off-by: Keith Packard <keithp@keithp.com>
src/cc1111/ao_spi.c

index 1bf5e1551b0c7a9013c009880f3326e875e3dfe4..88cff9dd11815a7a02ef107c499959e6e927d6a2 100644 (file)
@@ -40,6 +40,7 @@ static __xdata uint8_t ao_spi_const;
 void
 ao_spi_send_bus(void __xdata *block, uint16_t len) __reentrant
 {
 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,
        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);
                            DMA_CFG1_SRCINC_0 |
                            DMA_CFG1_DESTINC_0 |
                            DMA_CFG1_PRIORITY_NORMAL);
-
+#endif
        ao_dma_set_transfer(ao_spi_dma_out_id,
                            block,
                            &U0DBUFXADDR,
        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);
 
                            DMA_CFG1_DESTINC_0 |
                            DMA_CFG1_PRIORITY_NORMAL);
 
+#if !AO_SPI_SLAVE
        ao_dma_start(ao_spi_dma_in_id);
        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);
        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);
        __critical while (!ao_spi_dma_in_done)
                ao_sleep(&ao_spi_dma_in_done);
+#endif
 }
 
 /* Receive bytes over SPI.
 }
 
 /* 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
  *     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)
 {
 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 */
        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);
 
        /* 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
         */
         *
         * 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
         *
 
        /* Set the baud rate and signal parameters
         *