Merge pull request #1350 from g-oikonomou/bugfix/cc26xx/tx-power

Correctly set new CC26xx TX power when the RFC is powered off
This commit is contained in:
George Oikonomou 2016-01-09 17:59:24 +00:00
commit 109696174f
3 changed files with 35 additions and 21 deletions

View File

@ -395,26 +395,33 @@ set_tx_power(radio_value_t power)
int i; int i;
rfc_CMD_SET_TX_POWER_t cmd; rfc_CMD_SET_TX_POWER_t cmd;
/* Send a CMD_SET_TX_POWER command to the RF */ /* First, find the correct setting and save it */
memset(&cmd, 0x00, sizeof(cmd));
cmd.commandNo = CMD_SET_TX_POWER;
for(i = OUTPUT_CONFIG_COUNT - 1; i >= 0; --i) { for(i = OUTPUT_CONFIG_COUNT - 1; i >= 0; --i) {
if(power <= output_power[i].dbm) { if(power <= output_power[i].dbm) {
cmd.txPower.IB = output_power[i].register_ib; tx_power_current = &output_power[i];
cmd.txPower.GC = output_power[i].register_gc; break;
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;
} }
} }
/*
* 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 static uint8_t

View File

@ -122,10 +122,18 @@ rf_core_send_cmd(uint32_t cmd, uint32_t *status)
bool interrupts_disabled; bool interrupts_disabled;
bool is_radio_op = false; 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) { if((cmd & 0x03) == 0) {
is_radio_op = true; uint32_t cmd_type;
((rfc_radioOp_t *)cmd)->status = RF_CORE_RADIO_OP_STATUS_IDLE; 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; HWREG(RFC_DBELL_BASE + RFC_DBELL_O_CMDR) = cmd;
do { do {
*status = HWREG(RFC_DBELL_BASE + RFC_DBELL_O_CMDSTA); *status = HWREG(RFC_DBELL_BASE + RFC_DBELL_O_CMDSTA) & 0xFF;
if(++timeout_count > 50000) { if(++timeout_count > 50000) {
PRINTF("rf_core_send_cmd: 0x%08lx Timeout\n", cmd); PRINTF("rf_core_send_cmd: 0x%08lx Timeout\n", cmd);
if(!interrupts_disabled) { if(!interrupts_disabled) {

View File

@ -218,7 +218,6 @@ typedef struct rf_core_primary_mode_s {
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
/* Command Types */ /* Command Types */
#define RF_CORE_COMMAND_TYPE_MASK 0x0C00 #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_RADIO_OP 0x0800
#define RF_CORE_COMMAND_TYPE_IEEE_BG_RADIO_OP 0x0800 #define RF_CORE_COMMAND_TYPE_IEEE_BG_RADIO_OP 0x0800
#define RF_CORE_COMMAND_TYPE_IEEE_FG_RADIO_OP 0x0C00 #define RF_CORE_COMMAND_TYPE_IEEE_FG_RADIO_OP 0x0C00