diff --git a/cpu/cc26xx-cc13xx/rf-core/ieee-mode.c b/cpu/cc26xx-cc13xx/rf-core/ieee-mode.c index d4188b88f..e6b0d7e61 100644 --- a/cpu/cc26xx-cc13xx/rf-core/ieee-mode.c +++ b/cpu/cc26xx-cc13xx/rf-core/ieee-mode.c @@ -395,26 +395,33 @@ set_tx_power(radio_value_t power) int i; rfc_CMD_SET_TX_POWER_t cmd; - /* Send a CMD_SET_TX_POWER command to the RF */ - memset(&cmd, 0x00, sizeof(cmd)); - - cmd.commandNo = CMD_SET_TX_POWER; - + /* First, find the correct setting and save it */ for(i = OUTPUT_CONFIG_COUNT - 1; i >= 0; --i) { if(power <= output_power[i].dbm) { - cmd.txPower.IB = output_power[i].register_ib; - cmd.txPower.GC = output_power[i].register_gc; - cmd.txPower.tempCoeff = output_power[i].temp_coeff; - - if(rf_core_send_cmd((uint32_t)&cmd, &cmd_status) == RF_CORE_CMD_OK) { - /* Success: Remember the new setting */ - tx_power_current = &output_power[i]; - } else { - PRINTF("set_tx_power: CMDSTA=0x%08lx\n", cmd_status); - } - return; + tx_power_current = &output_power[i]; + break; } } + + /* + * If the core is not accessible, the new setting will be applied next + * time we send CMD_RADIO_SETUP, so we don't need to do anything further. + * If the core is accessible, we can apply the new setting immediately with + * CMD_SET_TX_POWER + */ + if(rf_core_is_accessible() == RF_CORE_NOT_ACCESSIBLE) { + return; + } + + memset(&cmd, 0x00, sizeof(cmd)); + cmd.commandNo = CMD_SET_TX_POWER; + cmd.txPower.IB = output_power[i].register_ib; + cmd.txPower.GC = output_power[i].register_gc; + cmd.txPower.tempCoeff = output_power[i].temp_coeff; + + if(rf_core_send_cmd((uint32_t)&cmd, &cmd_status) == RF_CORE_CMD_ERROR) { + PRINTF("set_tx_power: CMDSTA=0x%08lx\n", cmd_status); + } } /*---------------------------------------------------------------------------*/ static uint8_t diff --git a/cpu/cc26xx-cc13xx/rf-core/rf-core.c b/cpu/cc26xx-cc13xx/rf-core/rf-core.c index 3c17085db..236f5813e 100644 --- a/cpu/cc26xx-cc13xx/rf-core/rf-core.c +++ b/cpu/cc26xx-cc13xx/rf-core/rf-core.c @@ -122,10 +122,18 @@ rf_core_send_cmd(uint32_t cmd, uint32_t *status) bool interrupts_disabled; bool is_radio_op = false; - /* If cmd is 4-byte aligned, then it's a radio OP. Clear the status field */ + /* + * If cmd is 4-byte aligned, then it's either a radio OP or an immediate + * command. Clear the status field if it's a radio OP + */ if((cmd & 0x03) == 0) { - is_radio_op = true; - ((rfc_radioOp_t *)cmd)->status = RF_CORE_RADIO_OP_STATUS_IDLE; + uint32_t cmd_type; + cmd_type = ((rfc_command_t *)cmd)->commandNo & RF_CORE_COMMAND_TYPE_MASK; + if(cmd_type == RF_CORE_COMMAND_TYPE_IEEE_FG_RADIO_OP || + cmd_type == RF_CORE_COMMAND_TYPE_RADIO_OP) { + is_radio_op = true; + ((rfc_radioOp_t *)cmd)->status = RF_CORE_RADIO_OP_STATUS_IDLE; + } } /* @@ -152,7 +160,7 @@ rf_core_send_cmd(uint32_t cmd, uint32_t *status) HWREG(RFC_DBELL_BASE + RFC_DBELL_O_CMDR) = cmd; do { - *status = HWREG(RFC_DBELL_BASE + RFC_DBELL_O_CMDSTA); + *status = HWREG(RFC_DBELL_BASE + RFC_DBELL_O_CMDSTA) & 0xFF; if(++timeout_count > 50000) { PRINTF("rf_core_send_cmd: 0x%08lx Timeout\n", cmd); if(!interrupts_disabled) { diff --git a/cpu/cc26xx-cc13xx/rf-core/rf-core.h b/cpu/cc26xx-cc13xx/rf-core/rf-core.h index 7cf0b10e8..42c6edb90 100644 --- a/cpu/cc26xx-cc13xx/rf-core/rf-core.h +++ b/cpu/cc26xx-cc13xx/rf-core/rf-core.h @@ -218,7 +218,6 @@ typedef struct rf_core_primary_mode_s { /*---------------------------------------------------------------------------*/ /* Command Types */ #define RF_CORE_COMMAND_TYPE_MASK 0x0C00 -#define RF_CORE_COMMAND_TYPE_IMMEDIATE 0x0000 #define RF_CORE_COMMAND_TYPE_RADIO_OP 0x0800 #define RF_CORE_COMMAND_TYPE_IEEE_BG_RADIO_OP 0x0800 #define RF_CORE_COMMAND_TYPE_IEEE_FG_RADIO_OP 0x0C00