altos/stm: Add better byte-level SPI api
[fw/altos] / src / stm / ao_arch_funcs.h
index 8393898de33d47b0272574eb3e8e591048ad41a9..a796891d53b24b9fe4b40179ecee94543029a0eb 100644 (file)
@@ -82,6 +82,12 @@ ao_spi_send_fixed(uint8_t value, uint16_t len, uint8_t spi_index);
 void
 ao_spi_send_sync(const void *block, uint16_t len, uint8_t spi_index);
 
+void
+ao_spi_start_bytes(uint8_t spi_index);
+
+void
+ao_spi_stop_bytes(uint8_t spi_index);
+
 static inline void
 ao_spi_send_byte(uint8_t byte, uint8_t spi_index)
 {
@@ -96,18 +102,34 @@ ao_spi_send_byte(uint8_t byte, uint8_t spi_index)
                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 */
+       while (!(stm_spi->sr & (1 << STM_SPI_SR_TXE)))
+               ;
+       stm_spi->dr = byte;
+       while (!(stm_spi->sr & (1 << STM_SPI_SR_RXNE)))
+               ;
        (void) stm_spi->dr;
+}
 
-       while (!(stm_spi->sr & (1 << STM_SPI_SR_TXE)));
-       stm_spi->dr = byte;
+static inline uint8_t
+ao_spi_recv_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;
+       }
+
+       while (!(stm_spi->sr & (1 << STM_SPI_SR_TXE)))
+               ;
+       stm_spi->dr = 0xff;
+       while (!(stm_spi->sr & (1 << STM_SPI_SR_RXNE)))
+               ;
+       return stm_spi->dr;
 }
 
 void