1
0
Fork 0
mirror of https://github.com/betaflight/betaflight.git synced 2025-07-15 20:35:33 +03:00

Use Naze hardware revision when initialising bmp085. Cleanup bmp085

GPIO configuration for all targets.
This commit is contained in:
Dominic Clifton 2014-10-16 00:13:09 +01:00
parent 79917da85a
commit 2ed09b0b2f
9 changed files with 100 additions and 77 deletions

View file

@ -20,21 +20,20 @@
#include <platform.h> #include <platform.h>
#include "build_config.h"
#include "barometer.h" #include "barometer.h"
#include "gpio.h" #include "gpio.h"
#include "system.h" #include "system.h"
#include "bus_i2c.h" #include "bus_i2c.h"
#include "barometer_bmp085.h"
// BMP085, Standard address 0x77 // BMP085, Standard address 0x77
static bool convDone = false; static bool convDone = false;
static uint16_t convOverrun = 0; static uint16_t convOverrun = 0;
#ifdef BARO_GPIO
#define BARO_OFF digitalLo(BARO_GPIO, BARO_PIN);
#define BARO_ON digitalHi(BARO_GPIO, BARO_PIN);
#endif
// EXTI14 for BMP085 End of Conversion Interrupt // EXTI14 for BMP085 End of Conversion Interrupt
void EXTI15_10_IRQHandler(void) void EXTI15_10_IRQHandler(void)
{ {
@ -116,75 +115,73 @@ static int32_t bmp085_get_temperature(uint32_t ut);
static int32_t bmp085_get_pressure(uint32_t up); static int32_t bmp085_get_pressure(uint32_t up);
static void bmp085_calculate(int32_t *pressure, int32_t *temperature); static void bmp085_calculate(int32_t *pressure, int32_t *temperature);
#ifdef BARO_PIN #ifdef BARO_XCLR_PIN
#define BMP085_OFF digitalLo(BARO_GPIO, BARO_PIN); #define BMP085_OFF digitalLo(BARO_XCLR_GPIO, BARO_XCLR_PIN);
#define BMP085_ON digitalHi(BARO_GPIO, BARO_PIN); #define BMP085_ON digitalHi(BARO_XCLR_GPIO, BARO_XCLR_PIN);
#else #else
#define BMP085_OFF #define BMP085_OFF
#define BMP085_ON #define BMP085_ON
#endif #endif
void bmp085Disable(void) void bmp085InitXCLRGpio(const bmp085Config_t *config) {
{ gpio_config_t gpio;
if (hse_value != 12000000) {
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
// PC13 (BMP085's XCLR reset input, which we use to disable it). Only needed when running at 8MHz RCC_APB2PeriphClockCmd(config->gpioAPB2Peripherals, ENABLE);
gpio_config_t gpio;
gpio.pin = Pin_13; // PC13, PC14 (Barometer XCLR reset output, EOC input)
gpio.speed = Speed_2MHz; gpio.pin = config->xclrGpioPin;
gpio.mode = Mode_Out_PP; gpio.speed = Speed_2MHz;
gpioInit(GPIOC, &gpio); gpio.mode = Mode_Out_PP;
} gpioInit(config->xclrGpioPort, &gpio);
}
void bmp085Disable(const bmp085Config_t *config)
{
bmp085InitXCLRGpio(config);
BMP085_OFF; BMP085_OFF;
} }
bool bmp085Detect(baro_t *baro) bool bmp085Detect(const bmp085Config_t *config, baro_t *baro)
{ {
uint8_t data; uint8_t data;
// Not supported with this frequency
if (hse_value == 12000000)
return false;
if (bmp085InitDone) if (bmp085InitDone)
return true; return true;
#if defined(BARO) && defined(BARO_GPIO) #if defined(BARO) && defined(BARO_XCLR_GPIO) && defined(BARO_EOC_GPIO)
EXTI_InitTypeDef EXTI_InitStructure; if (config) {
NVIC_InitTypeDef NVIC_InitStructure; EXTI_InitTypeDef EXTI_InitStructure;
gpio_config_t gpio; NVIC_InitTypeDef NVIC_InitStructure;
gpio_config_t gpio;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); bmp085InitXCLRGpio(config);
// PC13, PC14 (Barometer XCLR reset output, EOC input) gpio.pin = config->eocGpioPin;
gpio.pin = Pin_13; gpio.mode = Mode_IN_FLOATING;
gpio.speed = Speed_2MHz; gpioInit(config->eocGpioPort, &gpio);
gpio.mode = Mode_Out_PP; BMP085_ON;
gpioInit(GPIOC, &gpio);
gpio.pin = Pin_14;
gpio.mode = Mode_IN_FLOATING;
gpioInit(GPIOC, &gpio);
BARO_ON;
// EXTI interrupt for barometer EOC // EXTI interrupt for barometer EOC
gpioExtiLineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource14); gpioExtiLineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource14);
EXTI_InitStructure.EXTI_Line = EXTI_Line14; EXTI_InitStructure.EXTI_Line = EXTI_Line14;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure); EXTI_Init(&EXTI_InitStructure);
// Enable and set EXTI10-15 Interrupt to the lowest priority // Enable and set EXTI10-15 Interrupt to the lowest priority
NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn; NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0F; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0F;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0F; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0F;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure); NVIC_Init(&NVIC_InitStructure);
}
delay(20); // datasheet says 10ms, we'll be careful and do 20. this is after ms5611 driver kills us, so longer the better. #else
UNUSED(config);
#endif #endif
delay(20); // datasheet says 10ms, we'll be careful and do 20.
i2cRead(BMP085_I2C_ADDR, BMP085_CHIP_ID__REG, 1, &data); /* read Chip Id */ i2cRead(BMP085_I2C_ADDR, BMP085_CHIP_ID__REG, 1, &data); /* read Chip Id */
bmp085.chip_id = BMP085_GET_BITSLICE(data, BMP085_CHIP_ID); bmp085.chip_id = BMP085_GET_BITSLICE(data, BMP085_CHIP_ID);
bmp085.oversampling_setting = 3; bmp085.oversampling_setting = 3;
@ -205,9 +202,8 @@ bool bmp085Detect(baro_t *baro)
return true; return true;
} }
#if defined(BARO) && defined(BARO_GPIO) BMP085_OFF;
BARO_OFF;
#endif
return false; return false;
} }

View file

@ -17,5 +17,13 @@
#pragma once #pragma once
bool bmp085Detect(baro_t *baro); typedef struct bmp085Config_s {
void bmp085Disable(void); uint32_t gpioAPB2Peripherals;
uint16_t xclrGpioPin;
GPIO_TypeDef *xclrGpioPort;
uint16_t eocGpioPin;
GPIO_TypeDef *eocGpioPort;
} bmp085Config_t;
bool bmp085Detect(const bmp085Config_t *config, baro_t *baro);
void bmp085Disable(const bmp085Config_t *config);

View file

@ -20,6 +20,8 @@
#include <platform.h> #include <platform.h>
#include "build_config.h"
#include "gpio.h" #include "gpio.h"
#include "bus_spi.h" #include "bus_spi.h"
@ -133,6 +135,10 @@ void initSpi2(void)
bool spiInit(SPI_TypeDef *instance) bool spiInit(SPI_TypeDef *instance)
{ {
#if (!(defined(USE_SPI_DEVICE_1) && defined(USE_SPI_DEVICE_2)))
UNUSED(instance);
#endif
#ifdef USE_SPI_DEVICE_1 #ifdef USE_SPI_DEVICE_1
if (instance == SPI1) { if (instance == SPI1) {
initSpi1(); initSpi1();

View file

@ -323,20 +323,40 @@ retry:
static void detectBaro() static void detectBaro()
{ {
#ifdef BARO
#ifdef USE_BARO_BMP085
bmp085Disable();
#endif
#ifdef USE_BARO_MS5611
// Detect what pressure sensors are available. baro->update() is set to sensor-specific update function // Detect what pressure sensors are available. baro->update() is set to sensor-specific update function
#ifdef BARO
#ifdef USE_BARO_BMP085
const bmp085Config_t *bmp085Config = NULL;
#if defined(BARO_XCLR_GPIO) && defined(BARO_EOC_GPIO)
static const bmp085Config_t defaultBMP085Config = {
.gpioAPB2Peripherals = BARO_APB2_PERIPHERALS,
.xclrGpioPin = BARO_XCLR_PIN,
.xclrGpioPort = BARO_XCLR_GPIO,
.eocGpioPin = BARO_EOC_PIN,
.eocGpioPort = BARO_EOC_GPIO
};
bmp085Config = &defaultBMP085Config;
#endif
#ifdef NAZE
if (hardwareRevision == NAZE32) {
bmp085Disable(bmp085Config);
}
#endif
#endif
#ifdef USE_BARO_MS5611
if (ms5611Detect(&baro)) { if (ms5611Detect(&baro)) {
return; return;
} }
#endif #endif
#ifdef USE_BARO_BMP085 #ifdef USE_BARO_BMP085
// ms5611 disables BMP085, and tries to initialize + check PROM crc. if this works, we have a baro if (bmp085Detect(bmp085Config, &baro)) {
if (bmp085Detect(&baro)) {
return; return;
} }
#endif #endif

View file

@ -31,9 +31,6 @@
#define BEEP_PERIPHERAL RCC_AHBPeriph_GPIOE #define BEEP_PERIPHERAL RCC_AHBPeriph_GPIOE
#define BEEPER_INVERTED #define BEEPER_INVERTED
#define BARO_GPIO GPIOC
#define BARO_PIN Pin_13
#define GYRO #define GYRO
#define USE_GYRO_L3GD20 #define USE_GYRO_L3GD20

View file

@ -17,9 +17,6 @@
#pragma once #pragma once
#define BARO_GPIO GPIOC
#define BARO_PIN Pin_13
#define MPU6000_CS_GPIO GPIOB #define MPU6000_CS_GPIO GPIOB
#define MPU6000_CS_PIN GPIO_Pin_12 #define MPU6000_CS_PIN GPIO_Pin_12
#define MPU6000_SPI_INSTANCE SPI2 #define MPU6000_SPI_INSTANCE SPI2

View file

@ -33,8 +33,6 @@
#define BEEPER_INVERTED #define BEEPER_INVERTED
#define BARO_GPIO GPIOC
#define BARO_PIN Pin_13
#define GYRO #define GYRO
#define ACC #define ACC

View file

@ -29,8 +29,11 @@
#define BEEP_PIN Pin_12 // PA12 (Beeper) #define BEEP_PIN Pin_12 // PA12 (Beeper)
#define BEEP_PERIPHERAL RCC_APB2Periph_GPIOA #define BEEP_PERIPHERAL RCC_APB2Periph_GPIOA
#define BARO_GPIO GPIOC #define BARO_XCLR_GPIO GPIOC
#define BARO_PIN Pin_13 #define BARO_XCLR_PIN Pin_13
#define BARO_EOC_GPIO GPIOC
#define BARO_EOC_PIN Pin_14
#define BARO_APB2_PERIPHERALS RCC_APB2Periph_GPIOC
#define INVERTER_PIN Pin_2 // PB2 (BOOT1) abused as inverter select GPIO #define INVERTER_PIN Pin_2 // PB2 (BOOT1) abused as inverter select GPIO
#define INVERTER_GPIO GPIOB #define INVERTER_GPIO GPIOB

View file

@ -33,8 +33,6 @@
#define BEEPER_INVERTED #define BEEPER_INVERTED
#define BARO_GPIO GPIOC
#define BARO_PIN Pin_13
#define GYRO #define GYRO
#define USE_GYRO_L3GD20 #define USE_GYRO_L3GD20