diff --git a/src/main/drivers/barometer/barometer_ms5611.c b/src/main/drivers/barometer/barometer_ms5611.c
index 97881c7dbc..00766cb1c9 100644
--- a/src/main/drivers/barometer/barometer_ms5611.c
+++ b/src/main/drivers/barometer/barometer_ms5611.c
@@ -24,10 +24,10 @@
#include "barometer.h"
#include "barometer_ms5611.h"
-#include "barometer_spi_ms5611.h"
#include "drivers/bus_i2c.h"
-#include "drivers/gpio.h"
+#include "drivers/bus_spi.h"
+#include "drivers/io.h"
#include "drivers/time.h"
#define CMD_RESET 0x1E // ADC reset command
@@ -57,6 +57,7 @@ STATIC_UNIT_TESTED uint32_t ms5611_ut; // static result of temperature measurem
STATIC_UNIT_TESTED uint32_t ms5611_up; // static result of pressure measurement
STATIC_UNIT_TESTED uint16_t ms5611_c[PROM_NB]; // on-chip ROM
static uint8_t ms5611_osr = CMD_ADC_4096;
+static bool ms5611InitDone = false;
bool ms5611ReadCommand(busDevice_t *pBusdev, uint8_t cmd, uint8_t len, uint8_t *data)
{
@@ -86,32 +87,67 @@ bool ms5611WriteCommand(busDevice_t *pBusdev, uint8_t cmd, uint8_t byte)
return false;
}
+void ms5611BusInit(busDevice_t *pBusdev)
+{
+#ifdef USE_BARO_SPI_MS5611
+ if (pBusdev->bustype == BUSTYPE_SPI) {
+ IOInit(pBusdev->busdev_u.spi.csnPin, OWNER_BARO_CS, 0);
+ IOConfigGPIO(pBusdev->busdev_u.spi.csnPin, IOCFG_OUT_PP);
+
+#define DISABLE_MS5611 IOHi(pBusdev->busdev_u.spi.csnPin)
+ DISABLE_MS5611;
+
+ spiSetDivisor(pBusdev->busdev_u.spi.csnPin, SPI_CLOCK_STANDARD);
+ }
+#else
+ UNUSED(pBusdev);
+#endif
+}
+
+void ms5611BusDeinit(busDevice_t *pBusdev)
+{
+#ifdef USE_BARO_SPI_MS5611
+ if (pBusdev->bustype == BUSTYPE_SPI) {
+ IOConfigGPIO(pBusdev->busdev_u.spi.csnPin, IOCFG_IPU);
+ IORelease(pBusdev->busdev_u.spi.csnPin);
+ IOInit(pBusdev->busdev_u.spi.csnPin, OWNER_SPI_PREINIT, 0);
+ }
+#else
+ UNUSED(pBusdev);
+#endif
+}
+
bool ms5611Detect(baroDev_t *baro)
{
uint8_t sig;
int i;
+ if (ms5611InitDone) {
+ return true;
+ }
+
delay(10); // No idea how long the chip takes to power-up, but let's make it 10ms
busDevice_t *pBusdev = &baro->busdev;
-#ifdef USE_BARO_SPI_MS5611
- ms5611SpiInit();
- ms5611SpiReadCommand(CMD_PROM_RD, 1, &sig);
- if (sig == 0xFF)
- return false;
-#else
- if (!ms5611ReadCommand(pBusdev, CMD_PROM_RD, 1, &sig))
+ ms5611BusInit(pBusdev);
+
+ if (!ms5611ReadCommand(pBusdev, CMD_PROM_RD, 1, &sig) || sig == 0xFF) {
+ ms5611BusDeinit(pBusdev);
return false;
-#endif
+ }
ms5611_reset(pBusdev);
+
// read all coefficients
for (i = 0; i < PROM_NB; i++)
ms5611_c[i] = ms5611_prom(pBusdev, i);
+
// check crc, bail out if wrong - we are probably talking to BMP085 w/o XCLR line!
- if (ms5611_crc(ms5611_c) != 0)
+ if (ms5611_crc(ms5611_c) != 0) {
+ ms5611BusDeinit(pBusdev);
return false;
+ }
// TODO prom + CRC
baro->ut_delay = 10000;
@@ -122,27 +158,24 @@ bool ms5611Detect(baroDev_t *baro)
baro->get_up = ms5611_get_up;
baro->calculate = ms5611_calculate;
+ ms5611InitDone = true;
+
return true;
}
static void ms5611_reset(busDevice_t *pBusdev)
{
-#ifdef USE_BARO_SPI_MS5611
- ms5611SpiWriteCommand(CMD_RESET, 1);
-#else
ms5611WriteCommand(pBusdev, CMD_RESET, 1);
-#endif
+
delayMicroseconds(2800);
}
static uint16_t ms5611_prom(busDevice_t *pBusdev, int8_t coef_num)
{
uint8_t rxbuf[2] = { 0, 0 };
-#ifdef USE_BARO_SPI_MS5611
- ms5611SpiReadCommand(CMD_PROM_RD + coef_num * 2, 2, rxbuf); // send PROM READ command
-#else
+
ms5611ReadCommand(pBusdev, CMD_PROM_RD + coef_num * 2, 2, rxbuf); // send PROM READ command
-#endif
+
return rxbuf[0] << 8 | rxbuf[1];
}
@@ -178,40 +211,26 @@ STATIC_UNIT_TESTED int8_t ms5611_crc(uint16_t *prom)
static uint32_t ms5611_read_adc(busDevice_t *pBusdev)
{
-(void)pBusdev;
uint8_t rxbuf[3];
-#ifdef USE_BARO_SPI_MS5611
- ms5611SpiReadCommand(CMD_ADC_READ, 3, rxbuf); // read ADC
-#else
+
ms5611ReadCommand(pBusdev, CMD_ADC_READ, 3, rxbuf); // read ADC
-#endif
+
return (rxbuf[0] << 16) | (rxbuf[1] << 8) | rxbuf[2];
}
static void ms5611_start_ut(baroDev_t *baro)
{
-(void)baro;
-#ifdef USE_BARO_SPI_MS5611
- ms5611SpiWriteCommand(CMD_ADC_CONV + CMD_ADC_D2 + ms5611_osr, 1); // D2 (temperature) conversion start!
-#else
ms5611WriteCommand(&baro->busdev, CMD_ADC_CONV + CMD_ADC_D2 + ms5611_osr, 1); // D2 (temperature) conversion start!
-#endif
}
static void ms5611_get_ut(baroDev_t *baro)
{
-(void)baro;
ms5611_ut = ms5611_read_adc(&baro->busdev);
}
static void ms5611_start_up(baroDev_t *baro)
{
-(void)baro;
-#ifdef USE_BARO_SPI_MS5611
- ms5611SpiWriteCommand(CMD_ADC_CONV + CMD_ADC_D2 + ms5611_osr, 1); // D2 (temperature) conversion start!
-#else
ms5611WriteCommand(&baro->busdev, CMD_ADC_CONV + CMD_ADC_D1 + ms5611_osr, 1); // D1 (pressure) conversion start!
-#endif
}
static void ms5611_get_up(baroDev_t *baro)
diff --git a/src/main/drivers/barometer/barometer_spi_ms5611.c b/src/main/drivers/barometer/barometer_spi_ms5611.c
deleted file mode 100755
index cb9d27097d..0000000000
--- a/src/main/drivers/barometer/barometer_spi_ms5611.c
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * This file is part of INAV.
- *
- * INAV is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * INAV is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with INAV. If not, see .
- */
-
-#include
-#include
-
-#include
-
-#include "drivers/io.h"
-#include "drivers/bus_spi.h"
-
-#include "barometer.h"
-#include "barometer_ms5611.h"
-
-#ifdef USE_BARO_SPI_MS5611
-
-#define DISABLE_MS5611 IOHi(ms5611CsPin)
-#define ENABLE_MS5611 IOLo(ms5611CsPin)
-
-static IO_t ms5611CsPin = IO_NONE;
-
-bool ms5611SpiWriteCommand(uint8_t reg, uint8_t data)
-{
- ENABLE_MS5611;
- spiTransferByte(MS5611_SPI_INSTANCE, reg & 0x7F);
- spiTransferByte(MS5611_SPI_INSTANCE, data);
- DISABLE_MS5611;
-
- return true;
-}
-
-bool ms5611SpiReadCommand(uint8_t reg, uint8_t length, uint8_t *data)
-{
- ENABLE_MS5611;
- spiTransferByte(MS5611_SPI_INSTANCE, reg | 0x80);
- spiTransfer(MS5611_SPI_INSTANCE, data, NULL, length);
- DISABLE_MS5611;
-
- return true;
-}
-
-void ms5611SpiInit(void)
-{
- static bool hardwareInitialised = false;
-
- if (hardwareInitialised) {
- return;
- }
-
- ms5611CsPin = IOGetByTag(IO_TAG(MS5611_CS_PIN));
- IOInit(ms5611CsPin, OWNER_BARO_CS, 0);
- IOConfigGPIO(ms5611CsPin, IOCFG_OUT_PP);
-
- DISABLE_MS5611;
-
- spiSetDivisor(MS5611_SPI_INSTANCE, SPI_CLOCK_STANDARD);
-
- hardwareInitialised = true;
-}
-#endif
diff --git a/src/main/drivers/barometer/barometer_spi_ms5611.h b/src/main/drivers/barometer/barometer_spi_ms5611.h
deleted file mode 100755
index 6404f3d0c5..0000000000
--- a/src/main/drivers/barometer/barometer_spi_ms5611.h
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * This file is part of INAV.
- *
- * INAV is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * INAV is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with INAV. If not, see .
- */
-
-#pragma once
-
-void ms5611SpiInit(void);
-bool ms5611SpiReadCommand(uint8_t reg, uint8_t length, uint8_t *data);
-bool ms5611SpiWriteCommand(uint8_t reg, uint8_t data);
diff --git a/src/main/target/ALIENFLIGHTNGF7/target.mk b/src/main/target/ALIENFLIGHTNGF7/target.mk
index b2864621e1..8754d6c5ff 100644
--- a/src/main/target/ALIENFLIGHTNGF7/target.mk
+++ b/src/main/target/ALIENFLIGHTNGF7/target.mk
@@ -6,7 +6,6 @@ TARGET_SRC = \
drivers/accgyro/accgyro_spi_mpu6500.c \
drivers/barometer/barometer_bmp280.c \
drivers/barometer/barometer_ms5611.c \
- drivers/barometer/barometer_spi_ms5611.c \
drivers/compass/compass_ak8963.c \
drivers/compass/compass_hmc5883l.c \
drivers/compass/compass_spi_hmc5883l.c