altos: Add timeout for MS5607 ADC conversion
[fw/altos] / src / drivers / ao_ms5607.c
index 46da4e837fa1e1afa3a5cbdd688d95e60a358b02..895e1d3492173815ef2100e94a3be32cb5007795 100644 (file)
@@ -154,8 +154,7 @@ ao_ms5607_isr(void)
 
 static uint32_t
 ao_ms5607_get_sample(uint8_t cmd) {
-       uint8_t reply[3];
-       uint8_t read;
+       uint8_t reply[4];
 
        ao_ms5607_done = 0;
 
@@ -170,7 +169,10 @@ ao_ms5607_get_sample(uint8_t cmd) {
        ao_arch_block_interrupts();
        while (!ao_gpio_get(AO_MS5607_MISO_PORT, AO_MS5607_MISO_PIN) &&
               !ao_ms5607_done)
-               ao_sleep((void *) &ao_ms5607_done);
+       {
+               if (ao_sleep_for((void *) &ao_ms5607_done, AO_MS_TO_TICKS(10)))
+                       break;
+       }
        ao_arch_release_interrupts();
 #if AO_MS5607_PRIVATE_PINS
        ao_gpio_set(AO_MS5607_CS_PORT, AO_MS5607_CS_PIN, 1);
@@ -179,12 +181,16 @@ ao_ms5607_get_sample(uint8_t cmd) {
 #endif
 
        ao_ms5607_start();
-       read = AO_MS5607_ADC_READ;
-       ao_spi_send(&read, 1, AO_MS5607_SPI_INDEX);
-       ao_spi_recv(&reply, 3, AO_MS5607_SPI_INDEX);
+       reply[0] = AO_MS5607_ADC_READ;
+#if defined(AO_SPI_DUPLEX) && AO_SPI_DUPLEX == 0
+       ao_spi_send(reply, 1, AO_MS5607_SPI_INDEX);
+       ao_spi_recv(reply+1, 3, AO_MS5607_SPI_INDEX);
+#else
+       ao_spi_duplex(&reply, &reply, 4, AO_MS5607_SPI_INDEX);
+#endif
        ao_ms5607_stop();
 
-       return ((uint32_t) reply[0] << 16) | ((uint32_t) reply[1] << 8) | (uint32_t) reply[2];
+       return ((uint32_t) reply[1] << 16) | ((uint32_t) reply[2] << 8) | (uint32_t) reply[3];
 }
 
 #ifndef AO_MS5607_BARO_OVERSAMPLE