altos: Add one-byte SPI output routine for LPC and STM cores
authorKeith Packard <keithp@keithp.com>
Fri, 25 Mar 2016 01:25:33 +0000 (19:25 -0600)
committerKeith Packard <keithp@keithp.com>
Sat, 26 Mar 2016 23:07:20 +0000 (16:07 -0700)
This allows for SPI output at interrupt time, one byte at a time.

Signed-off-by: Keith Packard <keithp@keithp.com>
src/lpc/ao_arch_funcs.h
src/stm/ao_arch_funcs.h

index fbe641d87b9ee7ca53c16934e70a8ce6b35bc660..dbb415381ce28c980cf78f31da38ada52fad1f55 100644 (file)
@@ -227,6 +227,28 @@ ao_spi_duplex(const void *out, void *in, uint16_t len, uint8_t spi_index);
 void
 ao_spi_init(void);
 
+static inline void
+ao_spi_send_sync(const void *block, uint16_t len, uint8_t spi_index)
+{
+       ao_spi_send(block, len, spi_index);
+}
+
+static inline void ao_spi_send_byte(uint8_t byte, uint8_t spi_index)
+{
+       struct lpc_ssp  *lpc_ssp;
+       switch (spi_index) {
+       case 0:
+               lpc_ssp = &lpc_ssp0;
+               break;
+       case 1:
+               lpc_ssp = &lpc_ssp1;
+               break;
+       }
+       lpc_ssp->dr = byte;
+       while ((lpc_ssp->sr & (1 << LPC_SSP_SR_RNE)) == 0);
+       (void) lpc_ssp->dr;
+}
+
 #define ao_spi_init_cs(port, mask) do {                                        \
                uint8_t __bit__;                                        \
                for (__bit__ = 0; __bit__ < 32; __bit__++) {            \
index 6b38032cc352a296b75731095d2fe10b76297f44..087e00d91da77d13075a80fa98c9234884a04a02 100644 (file)
@@ -82,6 +82,34 @@ ao_spi_send_fixed(uint8_t value, uint16_t len, uint8_t spi_index);
 void
 ao_spi_send_sync(void *block, uint16_t len, uint8_t spi_index);
 
+static inline void
+ao_spi_send_byte(uint8_t byte, uint8_t spi_index)
+{
+       struct stm_spi  *stm_spi;
+
+       switch (AO_SPI_INDEX(spi_index)) {
+       case 0:
+               stm_spi = &stm_spi1;
+               break;
+       case 1:
+               stm_spi = &stm_spi2;
+               break;
+       }
+
+       stm_spi->cr2 = ((0 << STM_SPI_CR2_TXEIE) |
+                       (0 << STM_SPI_CR2_RXNEIE) |
+                       (0 << STM_SPI_CR2_ERRIE) |
+                       (0 << STM_SPI_CR2_SSOE) |
+                       (0 << STM_SPI_CR2_TXDMAEN) |
+                       (0 << STM_SPI_CR2_RXDMAEN));
+
+       /* Clear RXNE */
+       (void) stm_spi->dr;
+
+       while (!(stm_spi->sr & (1 << STM_SPI_SR_TXE)));
+       stm_spi->dr = byte;
+}
+
 void
 ao_spi_recv(void *block, uint16_t len, uint8_t spi_index);