diff --git a/flight/Modules/Attitude/revolution/attitude.c b/flight/Modules/Attitude/revolution/attitude.c index 991ac7a0e..2c4d6d606 100644 --- a/flight/Modules/Attitude/revolution/attitude.c +++ b/flight/Modules/Attitude/revolution/attitude.c @@ -141,7 +141,7 @@ MODULE_INITCALL(AttitudeInitialize, AttitudeStart) int32_t accel_test; int32_t gyro_test; int32_t mag_test; -int32_t pressure_test; +//int32_t pressure_test; /** * Module thread, should not return. @@ -155,12 +155,12 @@ static void AttitudeTask(void *parameters) settingsUpdatedCb(AttitudeSettingsHandle()); accel_test = PIOS_BMA180_Test(); - gyro_test = PIOS_MPU6050_Test(); + gyro_test = PIOS_MPU6000_Test(); mag_test = PIOS_HMC5883_Test(); - pressure_test = PIOS_BMP085_Test(); +// pressure_test = PIOS_BMP085_Test(); // Kick of pressure conversions - PIOS_BMP085_StartADC(TemperatureConv); +// PIOS_BMP085_StartADC(TemperatureConv); // Main task loop while (1) { @@ -209,7 +209,7 @@ static void AttitudeTask(void *parameters) uint32_t accel_samples; uint32_t gyro_samples; struct pios_bma180_data accel; -struct pios_mpu6050_data gyro; +struct pios_mpu6000_data gyro; AttitudeRawData raw; int32_t accel_accum[3] = {0, 0, 0}; int32_t gyro_accum[3] = {0,0,0}; @@ -256,7 +256,7 @@ static int8_t updateSensors(AttitudeRawData * attitudeRaw) // Make sure we get one sample count = 0; - while((read_good = PIOS_MPU6050_ReadFifo(&gyro)) != 0); + while((read_good = PIOS_MPU6000_ReadFifo(&gyro)) != 0); while(read_good == 0) { count++; @@ -264,11 +264,11 @@ static int8_t updateSensors(AttitudeRawData * attitudeRaw) gyro_accum[1] += gyro.gyro_y; gyro_accum[2] += gyro.gyro_z; - read_good = PIOS_MPU6050_ReadFifo(&gyro); + read_good = PIOS_MPU6000_ReadFifo(&gyro); } gyro_samples = count; - scaling = PIOS_MPU6050_GetScale() / gyro_samples; + scaling = PIOS_MPU6000_GetScale() / gyro_samples; attitudeRaw->gyros[ATTITUDERAW_GYROS_X] = -((float) gyro_accum[1]) * scaling; attitudeRaw->gyros[ATTITUDERAW_GYROS_Y] = -((float) gyro_accum[0]) * scaling; attitudeRaw->gyros[ATTITUDERAW_GYROS_Z] = -((float) gyro_accum[2]) * scaling; @@ -300,7 +300,7 @@ static int8_t updateSensors(AttitudeRawData * attitudeRaw) } AttitudeRawSet(&raw); - + /* int32_t retval = PIOS_BMP085_ReadADC(); if (retval == 0) { // Conversion completed static uint32_t baro_conversions; @@ -322,7 +322,7 @@ static int8_t updateSensors(AttitudeRawData * attitudeRaw) BaroAltitudeSet(&data); } - } + }*/ return 0; } diff --git a/flight/PiOS/Boards/STM32F4xx_Revolution.h b/flight/PiOS/Boards/STM32F4xx_Revolution.h index 6c769643b..2b9509571 100644 --- a/flight/PiOS/Boards/STM32F4xx_Revolution.h +++ b/flight/PiOS/Boards/STM32F4xx_Revolution.h @@ -109,10 +109,8 @@ TIM8 | | | | // See also pios_board.c //------------------------ #define PIOS_I2C_MAX_DEVS 3 -extern uint32_t pios_i2c_pres_mag_adapter_id; -#define PIOS_I2C_MAIN_ADAPTER (pios_i2c_pres_mag_adapter_id) -extern uint32_t pios_i2c_gyro_adapter_id; -#define PIOS_I2C_GYRO_ADAPTER (pios_i2c_gyro_adapter_id) +extern uint32_t pios_i2c_mag_adapter_id; +#define PIOS_I2C_MAIN_ADAPTER (pios_i2c_mag_adapter_id) //------------------------- // PIOS_USART diff --git a/flight/PiOS/STM32F4xx/pios_mpu6050.c b/flight/PiOS/STM32F4xx/pios_mpu6050.c index 36fce1bc9..3af0cc0ae 100644 --- a/flight/PiOS/STM32F4xx/pios_mpu6050.c +++ b/flight/PiOS/STM32F4xx/pios_mpu6050.c @@ -341,6 +341,7 @@ void PIOS_MPU6050_IRQHandler(void) PIOS_MPU6050_Read_Callback(PIOS_MPU6050_FIFO_REG, mpu6050_read_buffer, sizeof(mpu6050_read_buffer), MPU6050_callback); } +#if defined(PIOS_INCLUDE_MPU6050) /** * The physical IRQ handler * Soon this will be generic in pios_exti and the BMA180 will register @@ -354,6 +355,7 @@ void EXTI1_IRQHandler(void) EXTI_ClearITPendingBit(EXTI_Line1); } } +#endif #endif diff --git a/flight/PiOS/pios.h b/flight/PiOS/pios.h index 6230e39e5..18c2eb7f2 100644 --- a/flight/PiOS/pios.h +++ b/flight/PiOS/pios.h @@ -122,6 +122,9 @@ #if defined(PIOS_INCLUDE_MPU6050) #include #endif +#if defined(PIOS_INCLUDE_MPU6000) +#include +#endif #include #if defined(PIOS_INCLUDE_ADXL345) diff --git a/flight/Project/OpenPilotOSX/OpenPilotOSX.xcodeproj/project.pbxproj b/flight/Project/OpenPilotOSX/OpenPilotOSX.xcodeproj/project.pbxproj index cd5b09958..47c6183d5 100644 --- a/flight/Project/OpenPilotOSX/OpenPilotOSX.xcodeproj/project.pbxproj +++ b/flight/Project/OpenPilotOSX/OpenPilotOSX.xcodeproj/project.pbxproj @@ -77,6 +77,8 @@ 652C856A132B6EA600BFCC70 /* sonaraltitude.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = sonaraltitude.xml; sourceTree = ""; }; 65322D3B122841F60046CD7C /* gpstime.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = gpstime.xml; sourceTree = ""; }; 65345C871288668B00A5E4E8 /* guidancesettings.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = guidancesettings.xml; sourceTree = ""; }; + 6534B5571474F78B003DF47C /* pios_mpu6000.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pios_mpu6000.h; sourceTree = ""; }; + 6534B5581474F7B1003DF47C /* pios_mpu6000.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = pios_mpu6000.c; sourceTree = ""; }; 6536D47B1307962C0042A298 /* stabilizationdesired.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = stabilizationdesired.xml; sourceTree = ""; }; 6536D4881307AB950042A298 /* UAVObjects.inc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.pascal; path = UAVObjects.inc; sourceTree = ""; }; 65408AA812BB1648004DACC5 /* i2cstats.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = i2cstats.xml; sourceTree = ""; }; @@ -3874,6 +3876,7 @@ 65904ECF14613B6100FD9482 /* pios_imu3000.c */, 65904ED014613B6100FD9482 /* pios_irq.c */, 65904ED114613B6100FD9482 /* pios_led.c */, + 6534B5581474F7B1003DF47C /* pios_mpu6000.c */, 65FA9B7A14709E700019A260 /* pios_mpu6050.c */, 65904ED214613B6100FD9482 /* pios_ppm.c */, 65904ED314613B6100FD9482 /* pios_servo.c */, @@ -8533,6 +8536,7 @@ 65FA9B8014709E9E0019A260 /* pios_initcall.h */, 65E8F04411EFF25C00BBF654 /* pios_irq.h */, 65E8F04511EFF25C00BBF654 /* pios_led.h */, + 6534B5571474F78B003DF47C /* pios_mpu6000.h */, 65FA9B8114709E9E0019A260 /* pios_mpu6050.h */, 65E8F04611EFF25C00BBF654 /* pios_opahrs.h */, 65E8F04711EFF25C00BBF654 /* pios_opahrs_proto.h */, diff --git a/flight/Revolution/Makefile b/flight/Revolution/Makefile index 61e5a9de7..b3df5b711 100644 --- a/flight/Revolution/Makefile +++ b/flight/Revolution/Makefile @@ -49,8 +49,7 @@ endif FLASH_TOOL = OPENOCD # List of modules to include -MODULES = Actuator Telemetry ManualControl Stabilization -# Attitude/revolution +MODULES = Actuator Telemetry ManualControl Stabilization Attitude/revolution PYMODULES = #FlightPlan diff --git a/flight/Revolution/System/inc/pios_config.h b/flight/Revolution/System/inc/pios_config.h index f89ac2316..4c55662da 100644 --- a/flight/Revolution/System/inc/pios_config.h +++ b/flight/Revolution/System/inc/pios_config.h @@ -55,9 +55,7 @@ #define PIOS_INCLUDE_BMA180 #define PIOS_INCLUDE_HMC5883 -#define PIOS_INCLUDE_BMP085 -//#define PIOS_INCLUDE_IMU3000 -#define PIOS_INCLUDE_MPU6050 +#define PIOS_INCLUDE_MPU6000 //#define PIOS_INCLUDE_HCSR04 #define PIOS_INCLUDE_COM diff --git a/flight/Revolution/System/pios_board.c b/flight/Revolution/System/pios_board.c index e49abe6d8..da8a39a60 100644 --- a/flight/Revolution/System/pios_board.c +++ b/flight/Revolution/System/pios_board.c @@ -1,15 +1,13 @@ /** ****************************************************************************** - * @addtogroup PIOS PIOS Core hardware abstraction layer + * @addtogroup Revolution Revolution configuration files * @{ - * @addtogroup PIOS_HMC5883 HMC5883 Functions - * @brief Deals with the hardware interface to the magnetometers + * @brief Configures the revolution board * @{ * * @file pios_board.c - * @author David "Buzz" Carlson (buzz@chebuzz.com) - * The OpenPilot Team, http://www.openpilot.org Copyright (C) 2011. - * @brief Defines board specific static initializers for hardware for the INS board. + * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2011. + * @brief Defines board specific static initializers for hardware for the Revolution board. * @see The GNU Public License (GPL) Version 3 * *****************************************************************************/ @@ -39,129 +37,6 @@ #include #include "manualcontrolsettings.h" -/* SPI2 Interface - * - Used for mainboard communications - * - * NOTE: Leave this declared as const data so that it ends up in the - * .rodata section (ie. Flash) rather than in the .bss section (RAM). - */ -void PIOS_SPI_op_irq_handler(void); -void DMA1_Stream3_IRQHandler(void) __attribute__((alias("PIOS_SPI_op_irq_handler"))); -void DMA1_Stream4_IRQHandler(void) __attribute__((alias("PIOS_SPI_op_irq_handler"))); -static const struct pios_spi_cfg pios_spi_op_cfg = { - .regs = SPI2, - .remap = GPIO_AF_SPI2, - .init = { - .SPI_Mode = SPI_Mode_Slave, - .SPI_Direction = SPI_Direction_2Lines_FullDuplex, - .SPI_DataSize = SPI_DataSize_8b, - .SPI_NSS = SPI_NSS_Hard, - .SPI_FirstBit = SPI_FirstBit_MSB, - .SPI_CRCPolynomial = 7, - .SPI_CPOL = SPI_CPOL_High, - .SPI_CPHA = SPI_CPHA_2Edge, - }, - .use_crc = true, - .dma = { - .irq = { - // Note this is the stream ID that triggers interrupts (in this case RX) - .flags = (DMA_IT_TCIF3 | DMA_IT_TEIF3 | DMA_IT_HTIF3), - .init = { - .NVIC_IRQChannel = DMA1_Stream3_IRQn, - .NVIC_IRQChannelPreemptionPriority = PIOS_IRQ_PRIO_HIGH, - .NVIC_IRQChannelSubPriority = 0, - .NVIC_IRQChannelCmd = ENABLE, - }, - }, - - .rx = { - .channel = DMA1_Stream3, - .init = { - .DMA_Channel = DMA_Channel_0, - .DMA_PeripheralBaseAddr = (uint32_t) & (SPI2->DR), - .DMA_DIR = DMA_DIR_PeripheralToMemory, - .DMA_PeripheralInc = DMA_PeripheralInc_Disable, - .DMA_MemoryInc = DMA_MemoryInc_Enable, - .DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte, - .DMA_MemoryDataSize = DMA_MemoryDataSize_Byte, - .DMA_Mode = DMA_Mode_Normal, - .DMA_Priority = DMA_Priority_Medium, - //TODO: Enable FIFO - .DMA_FIFOMode = DMA_FIFOMode_Disable, - .DMA_FIFOThreshold = DMA_FIFOThreshold_Full, - .DMA_MemoryBurst = DMA_MemoryBurst_Single, - .DMA_PeripheralBurst = DMA_PeripheralBurst_Single, - }, - }, - .tx = { - .channel = DMA1_Stream4, - .init = { - .DMA_Channel = DMA_Channel_0, - .DMA_PeripheralBaseAddr = (uint32_t) & (SPI2->DR), - .DMA_DIR = DMA_DIR_MemoryToPeripheral, - .DMA_PeripheralInc = DMA_PeripheralInc_Disable, - .DMA_MemoryInc = DMA_MemoryInc_Enable, - .DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte, - .DMA_MemoryDataSize = DMA_MemoryDataSize_Byte, - .DMA_Mode = DMA_Mode_Normal, - .DMA_Priority = DMA_Priority_Medium, - .DMA_FIFOMode = DMA_FIFOMode_Disable, - .DMA_FIFOThreshold = DMA_FIFOThreshold_Full, - .DMA_MemoryBurst = DMA_MemoryBurst_Single, - .DMA_PeripheralBurst = DMA_PeripheralBurst_Single, - }, - }, - }, - .sclk = { - .gpio = GPIOB, - .init = { - .GPIO_Pin = GPIO_Pin_13, - .GPIO_Speed = GPIO_Speed_100MHz, - .GPIO_Mode = GPIO_Mode_AF, - .GPIO_OType = GPIO_OType_PP, - .GPIO_PuPd = GPIO_PuPd_NOPULL - }, - }, - .miso = { - .gpio = GPIOB, - .init = { - .GPIO_Pin = GPIO_Pin_14, - .GPIO_Speed = GPIO_Speed_50MHz, - .GPIO_Mode = GPIO_Mode_AF, - .GPIO_OType = GPIO_OType_PP, - .GPIO_PuPd = GPIO_PuPd_NOPULL - }, - }, - .mosi = { - .gpio = GPIOB, - .init = { - .GPIO_Pin = GPIO_Pin_15, - .GPIO_Speed = GPIO_Speed_50MHz, - .GPIO_Mode = GPIO_Mode_AF, - .GPIO_OType = GPIO_OType_PP, - .GPIO_PuPd = GPIO_PuPd_NOPULL - }, - }, - .slave_count = 1, - .ssel = { { - .gpio = GPIOB, - .init = { - .GPIO_Pin = GPIO_Pin_12, - .GPIO_Speed = GPIO_Speed_50MHz, - .GPIO_Mode = GPIO_Mode_IN, - .GPIO_OType = GPIO_OType_PP, - .GPIO_PuPd = GPIO_PuPd_UP - }, - } }, -}; - -uint32_t pios_spi_op_id; -void PIOS_SPI_op_irq_handler(void) -{ - /* Call into the generic code to handle the IRQ for this specific device */ - PIOS_SPI_IRQ_Handler(pios_spi_op_id); -} - /* SPI1 Interface * - Used for BMA180 accelerometer */ @@ -281,6 +156,128 @@ void PIOS_SPI_accel_irq_handler(void) PIOS_SPI_IRQ_Handler(pios_spi_accel_id); } + +/* SPI2 Interface + * - Used for gyro communications + */ +void PIOS_SPI_GYRO_irq_handler(void); +void DMA1_Stream3_IRQHandler(void) __attribute__((alias("PIOS_SPI_gyro_irq_handler"))); +void DMA1_Stream4_IRQHandler(void) __attribute__((alias("PIOS_SPI_gyro_irq_handler"))); +static const struct pios_spi_cfg pios_spi_gyro_cfg = { + .regs = SPI2, + .remap = GPIO_AF_SPI2, + .init = { + .SPI_Mode = SPI_Mode_Master, + .SPI_Direction = SPI_Direction_2Lines_FullDuplex, + .SPI_DataSize = SPI_DataSize_8b, + .SPI_NSS = SPI_NSS_Soft, + .SPI_FirstBit = SPI_FirstBit_MSB, + .SPI_CRCPolynomial = 7, + .SPI_CPOL = SPI_CPOL_High, + .SPI_CPHA = SPI_CPHA_2Edge, +// .SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4, + }, + .use_crc = false, + .dma = { + .irq = { + // Note this is the stream ID that triggers interrupts (in this case RX) + .flags = (DMA_IT_TCIF3 | DMA_IT_TEIF3 | DMA_IT_HTIF3), + .init = { + .NVIC_IRQChannel = DMA1_Stream3_IRQn, + .NVIC_IRQChannelPreemptionPriority = PIOS_IRQ_PRIO_HIGH, + .NVIC_IRQChannelSubPriority = 0, + .NVIC_IRQChannelCmd = ENABLE, + }, + }, + + .rx = { + .channel = DMA1_Stream3, + .init = { + .DMA_Channel = DMA_Channel_0, + .DMA_PeripheralBaseAddr = (uint32_t) & (SPI2->DR), + .DMA_DIR = DMA_DIR_PeripheralToMemory, + .DMA_PeripheralInc = DMA_PeripheralInc_Disable, + .DMA_MemoryInc = DMA_MemoryInc_Enable, + .DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte, + .DMA_MemoryDataSize = DMA_MemoryDataSize_Byte, + .DMA_Mode = DMA_Mode_Normal, + .DMA_Priority = DMA_Priority_Medium, + //TODO: Enable FIFO + .DMA_FIFOMode = DMA_FIFOMode_Disable, + .DMA_FIFOThreshold = DMA_FIFOThreshold_Full, + .DMA_MemoryBurst = DMA_MemoryBurst_Single, + .DMA_PeripheralBurst = DMA_PeripheralBurst_Single, + }, + }, + .tx = { + .channel = DMA1_Stream4, + .init = { + .DMA_Channel = DMA_Channel_0, + .DMA_PeripheralBaseAddr = (uint32_t) & (SPI2->DR), + .DMA_DIR = DMA_DIR_MemoryToPeripheral, + .DMA_PeripheralInc = DMA_PeripheralInc_Disable, + .DMA_MemoryInc = DMA_MemoryInc_Enable, + .DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte, + .DMA_MemoryDataSize = DMA_MemoryDataSize_Byte, + .DMA_Mode = DMA_Mode_Normal, + .DMA_Priority = DMA_Priority_Medium, + .DMA_FIFOMode = DMA_FIFOMode_Disable, + .DMA_FIFOThreshold = DMA_FIFOThreshold_Full, + .DMA_MemoryBurst = DMA_MemoryBurst_Single, + .DMA_PeripheralBurst = DMA_PeripheralBurst_Single, + }, + }, + }, + .sclk = { + .gpio = GPIOB, + .init = { + .GPIO_Pin = GPIO_Pin_13, + .GPIO_Speed = GPIO_Speed_100MHz, + .GPIO_Mode = GPIO_Mode_AF, + .GPIO_OType = GPIO_OType_PP, + .GPIO_PuPd = GPIO_PuPd_NOPULL + }, + }, + .miso = { + .gpio = GPIOB, + .init = { + .GPIO_Pin = GPIO_Pin_14, + .GPIO_Speed = GPIO_Speed_50MHz, + .GPIO_Mode = GPIO_Mode_AF, + .GPIO_OType = GPIO_OType_PP, + .GPIO_PuPd = GPIO_PuPd_NOPULL + }, + }, + .mosi = { + .gpio = GPIOB, + .init = { + .GPIO_Pin = GPIO_Pin_15, + .GPIO_Speed = GPIO_Speed_50MHz, + .GPIO_Mode = GPIO_Mode_AF, + .GPIO_OType = GPIO_OType_PP, + .GPIO_PuPd = GPIO_PuPd_NOPULL + }, + }, + .slave_count = 1, + .ssel = { { + .gpio = GPIOB, + .init = { + .GPIO_Pin = GPIO_Pin_12, + .GPIO_Speed = GPIO_Speed_50MHz, + .GPIO_Mode = GPIO_Mode_OUT, + .GPIO_OType = GPIO_OType_PP, + .GPIO_PuPd = GPIO_PuPd_UP + }, + } }, +}; + +uint32_t pios_spi_gyro_id; +void PIOS_SPI_gyro_irq_handler(void) +{ + /* Call into the generic code to handle the IRQ for this specific device */ + PIOS_SPI_IRQ_Handler(pios_spi_gyro_id); +} + #endif /* PIOS_INCLUDE_SPI */ @@ -459,14 +456,14 @@ static const struct pios_usart_cfg pios_usart_telem_main_cfg = { /* * I2C Adapters */ -void PIOS_I2C_pres_mag_adapter_ev_irq_handler(void); -void PIOS_I2C_pres_mag_adapter_er_irq_handler(void); +void PIOS_I2C_mag_adapter_ev_irq_handler(void); +void PIOS_I2C_mag_adapter_er_irq_handler(void); void I2C1_EV_IRQHandler() -__attribute__ ((alias("PIOS_I2C_pres_mag_adapter_ev_irq_handler"))); +__attribute__ ((alias("PIOS_I2C_mag_adapter_ev_irq_handler"))); void I2C1_ER_IRQHandler() -__attribute__ ((alias("PIOS_I2C_pres_mag_adapter_er_irq_handler"))); +__attribute__ ((alias("PIOS_I2C_mag_adapter_er_irq_handler"))); -static const struct pios_i2c_adapter_cfg pios_i2c_pres_mag_adapter_cfg = { +static const struct pios_i2c_adapter_cfg pios_i2c_mag_adapter_cfg = { .regs = I2C1, .remap = GPIO_AF_I2C1, .init = { @@ -518,26 +515,26 @@ static const struct pios_i2c_adapter_cfg pios_i2c_pres_mag_adapter_cfg = { }, }; -uint32_t pios_i2c_pres_mag_adapter_id; -void PIOS_I2C_pres_mag_adapter_ev_irq_handler(void) +uint32_t pios_i2c_mag_adapter_id; +void PIOS_I2C_mag_adapter_ev_irq_handler(void) { /* Call into the generic code to handle the IRQ for this specific device */ - PIOS_I2C_EV_IRQ_Handler(pios_i2c_pres_mag_adapter_id); + PIOS_I2C_EV_IRQ_Handler(pios_i2c_mag_adapter_id); } -void PIOS_I2C_pres_mag_adapter_er_irq_handler(void) +void PIOS_I2C_mag_adapter_er_irq_handler(void) { /* Call into the generic code to handle the IRQ for this specific device */ - PIOS_I2C_ER_IRQ_Handler(pios_i2c_pres_mag_adapter_id); + PIOS_I2C_ER_IRQ_Handler(pios_i2c_mag_adapter_id); } -void PIOS_I2C_gyro_adapter_ev_irq_handler(void); -void PIOS_I2C_gyro_adapter_er_irq_handler(void); -void I2C2_EV_IRQHandler() __attribute__ ((alias ("PIOS_I2C_gyro_adapter_ev_irq_handler"))); -void I2C2_ER_IRQHandler() __attribute__ ((alias ("PIOS_I2C_gyro_adapter_er_irq_handler"))); +void PIOS_I2C_flexiport_adapter_ev_irq_handler(void); +void PIOS_I2C_flexiport_adapter_er_irq_handler(void); +void I2C2_EV_IRQHandler() __attribute__ ((alias ("PIOS_I2C_flexiport_adapter_ev_irq_handler"))); +void I2C2_ER_IRQHandler() __attribute__ ((alias ("PIOS_I2C_flexiport_adapter_er_irq_handler"))); -static const struct pios_i2c_adapter_cfg pios_i2c_gyro_adapter_cfg = { +static const struct pios_i2c_adapter_cfg pios_i2c_flexiport_adapter_cfg = { .regs = I2C2, .remap = GPIO_AF_I2C2, .init = { @@ -589,19 +586,89 @@ static const struct pios_i2c_adapter_cfg pios_i2c_gyro_adapter_cfg = { }, }; -uint32_t pios_i2c_gyro_adapter_id; -void PIOS_I2C_gyro_adapter_ev_irq_handler(void) +uint32_t pios_i2c_flexiport_adapter_id; +void PIOS_I2C_flexiport_adapter_ev_irq_handler(void) { /* Call into the generic code to handle the IRQ for this specific device */ - PIOS_I2C_EV_IRQ_Handler(pios_i2c_gyro_adapter_id); + PIOS_I2C_EV_IRQ_Handler(pios_i2c_flexiport_adapter_id); } -void PIOS_I2C_gyro_adapter_er_irq_handler(void) +void PIOS_I2C_flexiport_adapter_er_irq_handler(void) { /* Call into the generic code to handle the IRQ for this specific device */ - PIOS_I2C_ER_IRQ_Handler(pios_i2c_gyro_adapter_id); + PIOS_I2C_ER_IRQ_Handler(pios_i2c_flexiport_adapter_id); } + +void PIOS_I2C_pressure_adapter_ev_irq_handler(void); +void PIOS_I2C_pressure_adapter_er_irq_handler(void); +void I2C3_EV_IRQHandler() __attribute__ ((alias ("PIOS_I2C_pressure_adapter_ev_irq_handler"))); +void I2C3_ER_IRQHandler() __attribute__ ((alias ("PIOS_I2C_pressure_adapter_er_irq_handler"))); + +static const struct pios_i2c_adapter_cfg pios_i2c_pressure_adapter_cfg = { + .regs = I2C3, + .remap = GPIO_AF_I2C3, + .init = { + .I2C_Mode = I2C_Mode_I2C, + .I2C_OwnAddress1 = 0, + .I2C_Ack = I2C_Ack_Enable, + .I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit, + .I2C_DutyCycle = I2C_DutyCycle_2, + .I2C_ClockSpeed = 400000, /* bits/s */ + }, + .transfer_timeout_ms = 50, + .scl = { + .gpio = GPIOA, + .init = { + .GPIO_Pin = GPIO_Pin_8, + .GPIO_Mode = GPIO_Mode_AF, + .GPIO_Speed = GPIO_Speed_50MHz, + .GPIO_OType = GPIO_OType_OD, + .GPIO_PuPd = GPIO_PuPd_NOPULL, + }, + }, + .sda = { + .gpio = GPIOC, + .init = { + .GPIO_Pin = GPIO_Pin_9, + .GPIO_Mode = GPIO_Mode_AF, + .GPIO_Speed = GPIO_Speed_50MHz, + .GPIO_OType = GPIO_OType_OD, + .GPIO_PuPd = GPIO_PuPd_NOPULL, + }, + }, + .event = { + .flags = 0, /* FIXME: check this */ + .init = { + .NVIC_IRQChannel = I2C2_EV_IRQn, + .NVIC_IRQChannelPreemptionPriority = PIOS_IRQ_PRIO_HIGHEST, + .NVIC_IRQChannelSubPriority = 0, + .NVIC_IRQChannelCmd = ENABLE, + }, + }, + .error = { + .flags = 0, /* FIXME: check this */ + .init = { + .NVIC_IRQChannel = I2C2_ER_IRQn, + .NVIC_IRQChannelPreemptionPriority = PIOS_IRQ_PRIO_HIGHEST, + .NVIC_IRQChannelSubPriority = 0, + .NVIC_IRQChannelCmd = ENABLE, + }, + }, +}; + +uint32_t pios_i2c_pressure_adapter_id; +void PIOS_I2C_pressure_adapter_ev_irq_handler(void) +{ + /* Call into the generic code to handle the IRQ for this specific device */ + PIOS_I2C_EV_IRQ_Handler(pios_i2c_pressure_adapter_id); +} + +void PIOS_I2C_pressure_adapter_er_irq_handler(void) +{ + /* Call into the generic code to handle the IRQ for this specific device */ + PIOS_I2C_ER_IRQ_Handler(pios_i2c_pressure_adapter_id); +} #endif /* PIOS_INCLUDE_I2C */ #if defined(PIOS_INCLUDE_RCVR) @@ -630,7 +697,7 @@ static const struct pios_hmc5883_cfg pios_hmc5883_cfg = { .drdy = { .gpio = GPIOB, .init = { - .GPIO_Pin = GPIO_Pin_8, + .GPIO_Pin = GPIO_Pin_5, .GPIO_Speed = GPIO_Speed_100MHz, .GPIO_Mode = GPIO_Mode_IN, .GPIO_OType = GPIO_OType_OD, @@ -638,10 +705,10 @@ static const struct pios_hmc5883_cfg pios_hmc5883_cfg = { }, }, .eoc_exti = { - .pin_source = EXTI_PinSource8, + .pin_source = EXTI_PinSource5, .port_source = EXTI_PortSourceGPIOB, .init = { - .EXTI_Line = EXTI_Line8, // matches above GPIO pin + .EXTI_Line = EXTI_Line5, // matches above GPIO pin .EXTI_Mode = EXTI_Mode_Interrupt, .EXTI_Trigger = EXTI_Trigger_Rising, .EXTI_LineCmd = ENABLE, @@ -694,12 +761,12 @@ static const struct pios_bma180_cfg pios_bma180_cfg = { }, }; -#include "pios_mpu6050.h" -static const struct pios_mpu6050_cfg pios_mpu6050_cfg = { +#include "pios_mpu6000.h" +static const struct pios_mpu6000_cfg pios_mpu6000_cfg = { .drdy = { - .gpio = GPIOB, + .gpio = GPIOD, .init = { - .GPIO_Pin = GPIO_Pin_1, + .GPIO_Pin = GPIO_Pin_8, .GPIO_Speed = GPIO_Speed_100MHz, .GPIO_Mode = GPIO_Mode_IN, .GPIO_OType = GPIO_OType_OD, @@ -707,10 +774,10 @@ static const struct pios_mpu6050_cfg pios_mpu6050_cfg = { }, }, .eoc_exti = { - .pin_source = EXTI_PinSource1, - .port_source = EXTI_PortSourceGPIOB, + .pin_source = EXTI_PinSource8, + .port_source = EXTI_PortSourceGPIOD, .init = { - .EXTI_Line = EXTI_Line1, // matches above GPIO pin + .EXTI_Line = EXTI_Line8, // matches above GPIO pin .EXTI_Mode = EXTI_Mode_Interrupt, .EXTI_Trigger = EXTI_Trigger_Rising, .EXTI_LineCmd = ENABLE, @@ -718,72 +785,33 @@ static const struct pios_mpu6050_cfg pios_mpu6050_cfg = { }, .eoc_irq = { .init = { - .NVIC_IRQChannel = EXTI1_IRQn, + .NVIC_IRQChannel = EXTI9_5_IRQn, .NVIC_IRQChannelPreemptionPriority = PIOS_IRQ_PRIO_HIGH, .NVIC_IRQChannelSubPriority = 0, .NVIC_IRQChannelCmd = ENABLE, }, }, - .Fifo_store = PIOS_MPU6050_FIFO_TEMP_OUT | PIOS_MPU6050_FIFO_GYRO_X_OUT | PIOS_MPU6050_FIFO_GYRO_Y_OUT | PIOS_MPU6050_FIFO_GYRO_Z_OUT, + .Fifo_store = PIOS_MPU6000_FIFO_TEMP_OUT | PIOS_MPU6000_FIFO_GYRO_X_OUT | PIOS_MPU6000_FIFO_GYRO_Y_OUT | PIOS_MPU6000_FIFO_GYRO_Z_OUT, // Clock at 8 khz, downsampled by 8 for 1khz .Smpl_rate_div = 7, - .interrupt_cfg = PIOS_MPU6050_INT_CLR_ANYRD, - .interrupt_en = PIOS_MPU6050_INTEN_DATA_RDY, - .User_ctl = PIOS_MPU6050_USERCTL_FIFO_EN, - .Pwr_mgmt_clk = PIOS_MPU6050_PWRMGMT_PLL_X_CLK, - .gyro_range = PIOS_MPU6050_SCALE_500_DEG, - .filter = PIOS_MPU6050_LOWPASS_256_HZ - + .interrupt_cfg = PIOS_MPU6000_INT_CLR_ANYRD, + .interrupt_en = PIOS_MPU6000_INTEN_DATA_RDY, + .User_ctl = PIOS_MPU6000_USERCTL_FIFO_EN, + .Pwr_mgmt_clk = PIOS_MPU6000_PWRMGMT_PLL_X_CLK, + .gyro_range = PIOS_MPU6000_SCALE_500_DEG, + .filter = PIOS_MPU6000_LOWPASS_256_HZ }; -#include "pios_bmp085.h" -static const struct pios_bmp085_cfg pios_bmp085_cfg = { - .drdy = { - .gpio = GPIOC, - .init = { - .GPIO_Pin = GPIO_Pin_2, - .GPIO_Speed = GPIO_Speed_100MHz, - .GPIO_Mode = GPIO_Mode_IN, - .GPIO_OType = GPIO_OType_OD, - .GPIO_PuPd = GPIO_PuPd_NOPULL, - }, - }, - .eoc_exti = { - .pin_source = EXTI_PinSource2, - .port_source = EXTI_PortSourceGPIOC, - .init = { - .EXTI_Line = EXTI_Line2, // matches above GPIO pin - .EXTI_Mode = EXTI_Mode_Interrupt, - .EXTI_Trigger = EXTI_Trigger_Rising, - .EXTI_LineCmd = ENABLE, - }, - }, - .eoc_irq = { - .init = { - .NVIC_IRQChannel = EXTI2_IRQn, - .NVIC_IRQChannelPreemptionPriority = PIOS_IRQ_PRIO_LOW, - .NVIC_IRQChannelSubPriority = 0, - .NVIC_IRQChannelCmd = ENABLE, - }, - }, - .xclr = { - .gpio = GPIOC, - .init = { - .GPIO_Pin = GPIO_Pin_1, - .GPIO_Speed = GPIO_Speed_100MHz, - .GPIO_Mode = GPIO_Mode_OUT, - .GPIO_OType = GPIO_OType_PP, - .GPIO_PuPd = GPIO_PuPd_NOPULL, - }, - }, - .oversampling = 3, -}; /** * PIOS_Board_Init() * initializes all the core subsystems on this specific hardware * called from System/openpilot.c */ +int32_t test_val; +uint8_t buf[2]; +uint8_t rec[2]; +struct pios_mpu6000_data test_gyro_data; void PIOS_Board_Init(void) { /* Brings up System using CMSIS functions, enables the LEDs. */ PIOS_SYS_Init(); @@ -856,11 +884,11 @@ void PIOS_Board_Init(void) { #endif /* PIOS_INCLUDE_COM */ - if (PIOS_I2C_Init(&pios_i2c_pres_mag_adapter_id, &pios_i2c_pres_mag_adapter_cfg)) { + if (PIOS_I2C_Init(&pios_i2c_mag_adapter_id, &pios_i2c_mag_adapter_cfg)) { PIOS_DEBUG_Assert(0); } - if (PIOS_I2C_Init(&pios_i2c_gyro_adapter_id, &pios_i2c_gyro_adapter_cfg)) { + if (PIOS_I2C_Init(&pios_i2c_pressure_adapter_id, &pios_i2c_pressure_adapter_cfg)) { PIOS_DEBUG_Assert(0); } /* Set up the SPI interface to the accelerometer*/ @@ -868,15 +896,29 @@ void PIOS_Board_Init(void) { PIOS_DEBUG_Assert(0); } - uint32_t test_val = PIOS_MPU6050_Test(); + /* Set up the SPI interface to the gyro */ + if (PIOS_SPI_Init(&pios_spi_gyro_id, &pios_spi_gyro_cfg)) { + PIOS_DEBUG_Assert(0); + } + + + PIOS_HMC5883_Init(&pios_hmc5883_cfg); + + PIOS_MPU6000_Attach(pios_spi_gyro_id); + PIOS_MPU6000_Init(&pios_mpu6000_cfg); PIOS_BMA180_Attach(pios_spi_accel_id); PIOS_BMA180_Init(&pios_bma180_cfg); + +/* + test_val = PIOS_HMC5883_Test(); + */ + +/* PIOS_MPU6050_Init(&pios_mpu6050_cfg); PIOS_BMP085_Init(&pios_bmp085_cfg); - PIOS_HMC5883_Init(&pios_hmc5883_cfg); - - test_val ++; + */ +// test_val = PIOS_BMA180_Test(); }