示例#1
0
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
}
示例#2
0
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();
}
示例#3
0
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;
}