X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2Fdrivers%2Fao_ms5607.c;h=f73b095622cd5a4eccf9f1d0b7e28a7ade50caf7;hb=HEAD;hp=288d14ed23d1b00f269055423d5c3aa7bdfb6bb0;hpb=ff7fa802f632700f73418246f1be5017ac0a09b4;p=fw%2Faltos diff --git a/src/drivers/ao_ms5607.c b/src/drivers/ao_ms5607.c index 288d14ed..4a9802d7 100644 --- a/src/drivers/ao_ms5607.c +++ b/src/drivers/ao_ms5607.c @@ -25,9 +25,7 @@ struct ao_ms5607_prom ao_ms5607_prom; static uint8_t ms5607_configured; -#ifndef AO_MS5607_SPI_SPEED -#define AO_MS5607_SPI_SPEED AO_SPI_SPEED_FAST -#endif +#define AO_MS5607_SPI_SPEED ao_spi_speed(AO_MS5607_SPI_INDEX, 20000000) static void ao_ms5607_start(void) { @@ -61,17 +59,17 @@ ao_ms5607_crc(uint8_t *prom) prom[15] = 0; for (cnt = 0; cnt < 16; cnt++) { - n_rem ^= *p++; + n_rem ^= (uint16_t) *p++; for (n_bit = 8; n_bit > 0; n_bit--) { if (n_rem & 0x8000) - n_rem = (n_rem << 1) ^ 0x3000; + n_rem = (uint16_t) ((n_rem << 1) ^ 0x3000U); else n_rem = (n_rem << 1); } } n_rem = (n_rem >> 12) & 0xf; prom[15] = crc_byte; - return n_rem; + return (uint8_t) n_rem; } static bool @@ -112,8 +110,14 @@ ao_ms5607_prom_read(struct ao_ms5607_prom *prom) r++; } - if (!ao_ms5607_prom_valid((uint8_t *) prom)) + + if (!ao_ms5607_prom_valid((uint8_t *) prom)) { +#if HAS_SENSOR_ERRORS + AO_SENSOR_ERROR(AO_DATA_MS5607); +#else ao_panic(AO_PANIC_SELF_TEST_MS5607); +#endif + } #if __BYTE_ORDER == __LITTLE_ENDIAN /* Byte swap */ @@ -144,43 +148,49 @@ static void ao_ms5607_isr(void) { ao_exti_disable(AO_MS5607_MISO_PORT, AO_MS5607_MISO_PIN); - ao_ms5607_done = 1; ao_wakeup((void *) &ao_ms5607_done); } static uint32_t ao_ms5607_get_sample(uint8_t cmd) { - uint8_t reply[3]; - uint8_t read; - - ao_ms5607_done = 0; + uint8_t reply[4]; ao_ms5607_start(); - ao_spi_send(&cmd, 1, AO_MS5607_SPI_INDEX); ao_exti_enable(AO_MS5607_MISO_PORT, AO_MS5607_MISO_PIN); + ao_spi_send(&cmd, 1, AO_MS5607_SPI_INDEX); + #if AO_MS5607_PRIVATE_PINS - ao_spi_put(AO_MS5607_SPI_INDEX); + ao_spi_put_pins(AO_MS5607_SPI_INDEX); #endif 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 !HAS_TASK +#define ao_sleep_for(a,t) ao_sleep(a) +#endif + while (!ao_gpio_get(AO_MS5607_MISO_PORT, AO_MS5607_MISO_PIN)) { + if (ao_sleep_for((void *) &ao_ms5607_done, AO_MS_TO_TICKS(10))) + break; + } + ao_exti_disable(AO_MS5607_MISO_PORT, AO_MS5607_MISO_PIN); ao_arch_release_interrupts(); #if AO_MS5607_PRIVATE_PINS - stm_gpio_set(AO_MS5607_CS_PORT, AO_MS5607_CS_PIN, 1); + ao_spi_clr_cs(AO_MS5607_CS_PORT, 1 << (AO_MS5607_CS_PIN)); #else ao_ms5607_stop(); #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 @@ -240,6 +250,9 @@ struct ao_task ao_ms5607_task; void ao_ms5607_info(void) { +#if !HAS_MS5607_TASK + ao_ms5607_setup(); +#endif printf ("ms5607 reserved: %u\n", ao_ms5607_prom.reserved); printf ("ms5607 sens: %u\n", ao_ms5607_prom.sens); printf ("ms5607 off: %u\n", ao_ms5607_prom.off); @@ -256,8 +269,6 @@ ao_ms5607_dump(void) struct ao_ms5607_value value; #if !HAS_MS5607_TASK - ao_ms5607_setup(); - ao_ms5607_info(); ao_ms5607_sample(&ao_ms5607_current); #endif ao_ms5607_convert(&ao_ms5607_current, &value);