void hw_fem_set_rx_bypass_ftdf(bool enable) { #if defined(dg_configFEM_SKY66112_11_CPS_PORT) && defined(dg_configFEM_SKY66112_11_CPS_PIN) GLOBAL_INT_DISABLE(); fem_config.rx_bypass_ftdf = enable; if (fem_config.started) { set_bypass(); } GLOBAL_INT_RESTORE(); #endif }
void hw_fem_start(void) { GLOBAL_INT_DISABLE(); fem_config.started = true; uint8_t set_delay; uint8_t reset_delay; uint16_t rf_port_en; /****************************************************** * Setup GPIOs */ /* CSD GPIO Config */ #if defined(dg_configFEM_SKY66112_11_CSD_PORT) && defined(dg_configFEM_SKY66112_11_CSD_PIN) # if dg_configFEM_SKY66112_11_CSD_USE_DCF == 0 /* Manually set CSD (Enable FEM) */ hw_gpio_configure_pin(dg_configFEM_SKY66112_11_CSD_PORT, dg_configFEM_SKY66112_11_CSD_PIN, HW_GPIO_MODE_OUTPUT, HW_GPIO_FUNC_GPIO, true); # else /* Use DCF for CSD */ hw_gpio_set_pin_function(dg_configFEM_SKY66112_11_CSD_PORT, dg_configFEM_SKY66112_11_CSD_PIN, HW_GPIO_MODE_OUTPUT, HW_GPIO_FUNC_PORT2_DCF); # endif #endif /* Timer 27 GPIO (DCF Port 0). Used for TX EN */ hw_gpio_set_pin_function(dg_configFEM_SKY66112_11_CTX_PORT, dg_configFEM_SKY66112_11_CTX_PIN, HW_GPIO_MODE_OUTPUT, HW_GPIO_FUNC_PORT0_DCF); /* Timer 28 (DCF Port 1). Used for RX EN */ hw_gpio_set_pin_function(dg_configFEM_SKY66112_11_CRX_PORT, dg_configFEM_SKY66112_11_CRX_PIN, HW_GPIO_MODE_OUTPUT, HW_GPIO_FUNC_PORT1_DCF); /* Antenna selection */ #if defined(dg_configFEM_SKY66112_11_ANTSEL_PORT) && defined(dg_configFEM_SKY66112_11_ANTSEL_PIN) hw_gpio_configure_pin(dg_configFEM_SKY66112_11_ANTSEL_PORT, dg_configFEM_SKY66112_11_ANTSEL_PIN, HW_GPIO_MODE_OUTPUT, HW_GPIO_FUNC_GPIO, fem_config.antsel); #endif /****************************************************** * Setup RF_ANT_TRIM GPIOs */ /* RF_ANT_TRIM_0 Config */ #if defined(dg_configFEM_SKY66112_11_ANT_TRIM_0_PORT) && defined(dg_configFEM_SKY66112_11_ANT_TRIM_0_PIN) hw_gpio_set_pin_function(dg_configFEM_SKY66112_11_ANT_TRIM_0_PORT, dg_configFEM_SKY66112_11_ANT_TRIM_0_PIN, HW_GPIO_MODE_OUTPUT, HW_GPIO_FUNC_RF_ANT_TRIM0); #endif /* RF_ANT_TRIM_1 Config */ #if defined(dg_configFEM_SKY66112_11_ANT_TRIM_1_PORT) && defined(dg_configFEM_SKY66112_11_ANT_TRIM_1_PIN) hw_gpio_set_pin_function(dg_configFEM_SKY66112_11_ANT_TRIM_1_PORT, dg_configFEM_SKY66112_11_ANT_TRIM_1_PIN, HW_GPIO_MODE_OUTPUT, HW_GPIO_FUNC_RF_ANT_TRIM1); #endif /* RF_ANT_TRIM_2 Config */ #if defined(dg_configFEM_SKY66112_11_ANT_TRIM_2_PORT) && defined(dg_configFEM_SKY66112_11_ANT_TRIM_2_PIN) hw_gpio_set_pin_function(dg_configFEM_SKY66112_11_ANT_TRIM_2_PORT, dg_configFEM_SKY66112_11_ANT_TRIM_2_PIN, HW_GPIO_MODE_OUTPUT, HW_GPIO_FUNC_RF_ANT_TRIM2); #endif /****************************************************** * Setup DCFs */ /* assign values to the timer registers for CTX/CRX (in usec) */ REG_SETF(RFCU_POWER, RF_CNTRL_TIMER_27_REG, SET_OFFSET, dg_configFEM_SKY66112_11_TXSET_DCF); REG_SETF(RFCU_POWER, RF_CNTRL_TIMER_27_REG, RESET_OFFSET, dg_configFEM_SKY66112_11_TXRESET_DCF); REG_SETF(RFCU_POWER, RF_CNTRL_TIMER_28_REG, SET_OFFSET, dg_configFEM_SKY66112_11_RXSET_DCF); REG_SETF(RFCU_POWER, RF_CNTRL_TIMER_28_REG, RESET_OFFSET, dg_configFEM_SKY66112_11_RXRESET_DCF); rf_port_en = 0x6; /* Start with Port 0: TX, Port 1: RX */ /* Compute set/reset delays to use for CSD, CPS, CHL DCFs: For setting delay, * smaller of TXSET, RXSET, and for resetting delay, larger of TXSET, RXSET */ #if dg_configFEM_SKY66112_11_RXSET_DCF > dg_configFEM_SKY66112_11_TXSET_DCF set_delay = dg_configFEM_SKY66112_11_TXSET_DCF; #else set_delay = dg_configFEM_SKY66112_11_RXSET_DCF; #endif #if dg_configFEM_SKY66112_11_RXRESET_DCF > dg_configFEM_SKY66112_11_TXRESET_DCF reset_delay = dg_configFEM_SKY66112_11_RXRESET_DCF; #else reset_delay = dg_configFEM_SKY66112_11_TXRESET_DCF; #endif /* CSD DCF (if enabled) configuration */ #if defined(dg_configFEM_SKY66112_11_CSD_PORT) && defined(dg_configFEM_SKY66112_11_CSD_PIN) # if dg_configFEM_SKY66112_11_CSD_USE_DCF != 0 REG_SETF(RFCU_POWER, RF_CNTRL_TIMER_29_REG, SET_OFFSET, set_delay); REG_SETF(RFCU_POWER, RF_CNTRL_TIMER_29_REG, RESET_OFFSET, reset_delay); /* enable DCF Signals for Port 2 (CSD) for both rx/tx */ rf_port_en |= 0x30; # endif /* dg_configFEM_SKY66112_11_CSD_USE_DCF != 0 */ #endif /* Set bypass (CPS) DCF timers (but don't enable yet) */ REG_SETF(RFCU_POWER, RF_CNTRL_TIMER_30_REG, SET_OFFSET, set_delay); REG_SETF(RFCU_POWER, RF_CNTRL_TIMER_30_REG, RESET_OFFSET, reset_delay); /* Set TX Power (CHL) DCF timers (but don't enable yet) */ REG_SETF(RFCU_POWER, RF_CNTRL_TIMER_31_REG, SET_OFFSET, dg_configFEM_SKY66112_11_TXSET_DCF); REG_SETF(RFCU_POWER, RF_CNTRL_TIMER_31_REG, RESET_OFFSET, dg_configFEM_SKY66112_11_TXRESET_DCF); /* Enable DCFs */ #if dg_configBLACK_ORCA_IC_REV == BLACK_ORCA_IC_REV_A RFCU_POWER->RF_PORT_EN_REG = rf_port_en; hw_fem_set_txpower(fem_config.tx_power); #else RFCU_POWER->RF_PORT_EN_BLE_REG = rf_port_en; RFCU_POWER->RF_PORT_EN_FTDF_REG = rf_port_en; set_txpower(); #endif set_bypass(); GLOBAL_INT_RESTORE(); }
int8_t MPU9150::setup_compass(void){ unsigned char data[4], akm_addr; set_bypass(1); // Find compass. Possible addresses range from 0x0C to 0x0F. for (akm_addr = 0x0C; akm_addr <= 0x0F; akm_addr++) { int result; result = i2c.read_register8(akm_addr, AKM_REG_WHOAMI, 1, data); if (result && (data[0] == AKM_WHOAMI)) break; } if(akm_addr > 0x0F) return -1; data[0] = AKM_POWER_DOWN; if (!i2c.write_register8(akm_addr, AKM_REG_CNTL, 1, data)) return -2; Time.delay_ms(1); data[0] = AKM_FUSE_ROM_ACCESS; if (!i2c.write_register8(akm_addr, AKM_REG_CNTL, 1, data)) return -3; Time.delay_ms(1); // Get sensitivity adjustment data from fuse ROM. (Not needed) uint16_t mag_sens_adj[3]; if (!i2c.read_register8(akm_addr, AKM_REG_ASAX, 3, data)) return -4; mag_sens_adj[0] = (long)data[0] + 128; mag_sens_adj[1] = (long)data[1] + 128; mag_sens_adj[2] = (long)data[2] + 128; data[0] = AKM_POWER_DOWN; if (!i2c.write_register8(akm_addr, AKM_REG_CNTL, 1, data)) return -5; Time.delay_ms(1); set_bypass(0); // Set up master mode, master clock, and ES bit. data[0] = 0x40; if (!i2c.write_register8(MPU9150_ADDRESS, MPU9150_RA_I2C_MST_CTRL, 1, data)) return -6; // Slave 0 reads from AKM data registers. data[0] = BIT_I2C_READ | akm_addr; if (!i2c.write_register8(MPU9150_ADDRESS, MPU9150_RA_I2C_SLV0_ADDR, 1, data)) return -7; // Compass reads start at this register. data[0] = AKM_REG_ST1; if (!i2c.write_register8(MPU9150_ADDRESS, MPU9150_RA_I2C_SLV0_REG, 1, data)) return -8; // Enable slave 0, 8-byte reads. data[0] = BIT_SLAVE_EN | 8; if (!i2c.write_register8(MPU9150_ADDRESS, MPU9150_RA_I2C_SLV0_CTRL, 1, data)) return -9; // Slave 1 changes AKM measurement mode. data[0] = akm_addr; if (!i2c.write_register8(MPU9150_ADDRESS, MPU9150_RA_I2C_SLV1_ADDR, 1, data)) return -10; // AKM measurement mode register. data[0] = AKM_REG_CNTL; if (!i2c.write_register8(MPU9150_ADDRESS, MPU9150_RA_I2C_SLV1_REG, 1, data)) return -11; // Enable slave 1, 1-byte writes. data[0] = BIT_SLAVE_EN | 1; if (!i2c.write_register8(MPU9150_ADDRESS, MPU9150_RA_I2C_SLV1_CTRL, 1, data)) return -12; // Set slave 1 data. data[0] = AKM_SINGLE_MEASUREMENT; if (!i2c.write_register8(MPU9150_ADDRESS, MPU9150_RA_I2C_SLV1_DO, 1, data)) return -13; // Trigger slave 0 and slave 1 actions at each sample. data[0] = 0x03; if (!i2c.write_register8(MPU9150_ADDRESS, MPU9150_RA_I2C_MST_DELAY_CTRL, 1, data)) return -14; // For the MPU9150, the auxiliary I2C bus needs to be set to VDD. data[0] = BIT_I2C_MST_VDDIO; if (!i2c.write_register8(MPU9150_ADDRESS, MPU9150_RA_YG_OFFS_TC, 1, data)) return -15; return 0; }