Merge pull request #1348 from g-oikonomou/bugfix/cc26xx/wait-for-rssi-valid

Wait for a valid RSSI reading in CC13xx/CC26xx RF drivers
This commit is contained in:
George Oikonomou 2017-03-17 22:52:51 +00:00 committed by GitHub
commit b91448dfa4
2 changed files with 25 additions and 14 deletions

View file

@ -385,9 +385,8 @@ static radio_value_t
get_rssi(void) get_rssi(void)
{ {
uint32_t cmd_status; uint32_t cmd_status;
int8_t rssi;
uint8_t was_off = 0; uint8_t was_off = 0;
rfc_CMD_GET_RSSI_t cmd; rfc_CMD_IEEE_CCA_REQ_t cmd;
/* If we are off, turn on first */ /* If we are off, turn on first */
if(!rf_is_on()) { if(!rf_is_on()) {
@ -399,13 +398,19 @@ get_rssi(void)
} }
memset(&cmd, 0x00, sizeof(cmd)); memset(&cmd, 0x00, sizeof(cmd));
cmd.commandNo = CMD_GET_RSSI; cmd.ccaInfo.ccaEnergy = RF_CMD_CCA_REQ_CCA_STATE_INVALID;
rssi = RF_CMD_CCA_REQ_RSSI_UNKNOWN; while(cmd.ccaInfo.ccaEnergy == RF_CMD_CCA_REQ_CCA_STATE_INVALID) {
memset(&cmd, 0x00, sizeof(cmd));
cmd.commandNo = CMD_IEEE_CCA_REQ;
if(rf_core_send_cmd((uint32_t)&cmd, &cmd_status) == RF_CORE_CMD_OK) { if(rf_core_send_cmd((uint32_t)&cmd, &cmd_status) == RF_CORE_CMD_ERROR) {
/* Current RSSI in bits 23:16 of cmd_status */ PRINTF("get_rssi: CMDSTA=0x%08lx\n", cmd_status);
rssi = (cmd_status >> 16) & 0xFF;
/* Make sure to return RSSI unknown */
cmd.currentRssi = RF_CMD_CCA_REQ_RSSI_UNKNOWN;
break;
}
} }
/* If we were off, turn back off */ /* If we were off, turn back off */
@ -413,7 +418,7 @@ get_rssi(void)
off(); off();
} }
return rssi; return cmd.currentRssi;
} }
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
/* Returns the current TX power in dBm */ /* Returns the current TX power in dBm */

View file

@ -270,6 +270,7 @@ get_rssi(void)
{ {
uint32_t cmd_status; uint32_t cmd_status;
int8_t rssi; int8_t rssi;
uint8_t attempts = 0;
uint8_t was_off = 0; uint8_t was_off = 0;
rfc_CMD_GET_RSSI_t cmd; rfc_CMD_GET_RSSI_t cmd;
@ -282,15 +283,20 @@ get_rssi(void)
} }
} }
rssi = RF_CMD_CCA_REQ_RSSI_UNKNOWN;
while((rssi == RF_CMD_CCA_REQ_RSSI_UNKNOWN || rssi == 0) && ++attempts < 10) {
memset(&cmd, 0x00, sizeof(cmd)); memset(&cmd, 0x00, sizeof(cmd));
cmd.commandNo = CMD_GET_RSSI; cmd.commandNo = CMD_GET_RSSI;
rssi = RF_CMD_CCA_REQ_RSSI_UNKNOWN; if(rf_core_send_cmd((uint32_t)&cmd, &cmd_status) == RF_CORE_CMD_ERROR) {
PRINTF("get_rssi: CMDSTA=0x%08lx\n", cmd_status);
if(rf_core_send_cmd((uint32_t)&cmd, &cmd_status) == RF_CORE_CMD_OK) { break;
} else {
/* Current RSSI in bits 23:16 of cmd_status */ /* Current RSSI in bits 23:16 of cmd_status */
rssi = (cmd_status >> 16) & 0xFF; rssi = (cmd_status >> 16) & 0xFF;
} }
}
/* If we were off, turn back off */ /* If we were off, turn back off */
if(was_off) { if(was_off) {