bool cc2538_channel_clear(void) { if (RFCORE->XREG_FSMSTAT0bits.FSM_FFCTRL_STATE == FSM_STATE_IDLE) { bool result; cc2538_on(); RFCORE_WAIT_UNTIL(RFCORE->XREG_RSSISTATbits.RSSI_VALID); result = BOOLEAN(RFCORE->XREG_FSMSTAT1bits.CCA); cc2538_off(); return result; } else { RFCORE_WAIT_UNTIL(RFCORE->XREG_RSSISTATbits.RSSI_VALID); return BOOLEAN(RFCORE->XREG_FSMSTAT1bits.CCA); } }
static int _send(netdev_t *netdev, const iolist_t *iolist) { (void) netdev; int pkt_len = 0; /* Flush TX FIFO once no transmission in progress */ RFCORE_WAIT_UNTIL(RFCORE->XREG_FSMSTAT1bits.TX_ACTIVE == 0); RFCORE_SFR_RFST = ISFLUSHTX; /* The first byte of the TX FIFO must be the packet length, but we don't know what it is yet. Write a null byte to the start of the FIFO, so we can come back and update it later */ rfcore_write_byte(0); for (const iolist_t *iol = iolist; iol; iol = iol->iol_next) { pkt_len += iol->iol_len; if (pkt_len > CC2538_RF_MAX_DATA_LEN) { DEBUG("cc2538_rf: packet too large (%u > %u)\n", pkt_len, CC2538_RF_MAX_DATA_LEN); return -EOVERFLOW; } rfcore_write_fifo(iol->iol_base, iol->iol_len); } #ifdef MODULE_NETSTATS_L2 netdev->stats.tx_bytes += pkt_len; #endif /* Set first byte of TX FIFO to the packet length */ rfcore_poke_tx_fifo(0, pkt_len + CC2538_AUTOCRC_LEN); RFCORE_SFR_RFST = ISTXON; /* Wait for transmission to complete */ RFCORE_WAIT_UNTIL(RFCORE->XREG_FSMSTAT1bits.TX_ACTIVE == 0); return pkt_len; }
void cc2538_off(void) { /* Wait for ongoing TX to complete (e.g. this could be an outgoing ACK) */ RFCORE_WAIT_UNTIL(RFCORE->XREG_FSMSTAT1bits.TX_ACTIVE == 0); /* Flush RX FIFO */ RFCORE_SFR_RFST = ISFLUSHRX; /* Don't turn off if we are off as this will trigger a Strobe Error */ if (RFCORE_XREG_RXENABLE != 0) { RFCORE_SFR_RFST = ISRFOFF; } }