Contiki-Inga 3.x
Files | Macros | Functions | Variables

Driver implementation for the cc2538 RF transceiver. More...

Files

file  cc2538-rf.c
 Implementation of the cc2538 RF driver.
 
file  cc2538-rf.h
 Header file for the cc2538 RF driver.
 

Macros

#define CC2538_RF_CSP_ISRXON()   do { REG(RFCORE_SFR_RFST) = CC2538_RF_CSP_OP_ISRXON; } while(0)
 Send an RX ON command strobe to the CSP.
 
#define CC2538_RF_CSP_ISTXON()   do { REG(RFCORE_SFR_RFST) = CC2538_RF_CSP_OP_ISTXON; } while(0)
 Send a TX ON command strobe to the CSP.
 
#define CC2538_RF_CSP_ISRFOFF()   do { REG(RFCORE_SFR_RFST) = CC2538_RF_CSP_OP_ISRFOFF; } while(0)
 Send a RF OFF command strobe to the CSP.
 
#define CC2538_RF_CSP_ISFLUSHRX()
 Flush the RX FIFO.
 
#define CC2538_RF_CSP_ISFLUSHTX()
 Flush the TX FIFO.
 

Functions

uint8_t cc2538_rf_channel_get (void)
 Get the current operating channel. More...
 
int8_t cc2538_rf_channel_set (uint8_t channel)
 Set the current operating channel. More...
 
uint8_t cc2538_rf_power_set (uint8_t new_power)
 Sets RF TX power. More...
 
void cc2538_rf_set_addr (uint16_t pan)
 Sets addresses and PAN identifier to the relevant RF hardware registers. More...
 
int cc2538_rf_read_rssi (void)
 Reads the current signal strength (RSSI) More...
 
 PROCESS_THREAD (cc2538_rf_process, ev, data)
 Implementation of the cc2538 RF driver process. More...
 
void cc2538_rf_rx_tx_isr (void)
 The cc2538 RF RX/TX ISR. More...
 
void cc2538_rf_err_isr (void)
 The cc2538 RF Error ISR. More...
 
void cc2538_rf_set_promiscous_mode (char p)
 Turn promiscous mode on or off. More...
 

Variables

struct radio_driver cc2538_rf_driver
 The NETSTACK data structure for the cc2538 RF driver.
 
struct radio_driver cc2538_rf_driver
 The NETSTACK data structure for the cc2538 RF driver.
 

Detailed Description

Driver implementation for the cc2538 RF transceiver.

Function Documentation

uint8_t cc2538_rf_channel_get ( void  )

Get the current operating channel.

Returns
Returns a value in [11,26] representing the current channel

Definition at line 132 of file cc2538-rf.c.

References RFCORE_XREG_FREQCTRL, and RFCORE_XREG_FREQCTRL_FREQ.

int8_t cc2538_rf_channel_set ( uint8_t  channel)

Set the current operating channel.

Parameters
channelThe desired channel as a value in [11,26]
Returns
Returns a value in [11,26] representing the current channel or a negative value if channel was out of bounds

Definition at line 141 of file cc2538-rf.c.

References radio_driver::off, radio_driver::on, and RFCORE_XREG_FREQCTRL.

void cc2538_rf_err_isr ( void  )

The cc2538 RF Error ISR.

This is the interrupt service routine for all RF errors. We acknowledge every error type and instead of trying to be smart and act differently depending on error condition, we simply reset the transceiver. RX FIFO overflow is an exception, we ignore this error since read() handles it anyway.

However, we don't want to reset within this ISR. If the error occurs while we are reading a frame out of the FIFO, trashing the FIFO in the middle of read(), would result in further errors (RX underflows).

Instead, we set a flag and poll the driver process. The process will reset the transceiver without any undesirable consequences.

Definition at line 730 of file cc2538-rf.c.

References process_poll(), RFCORE_SFR_RFERRF, and RFCORE_SFR_RFERRF_RXOVERF.

uint8_t cc2538_rf_power_set ( uint8_t  new_power)

Sets RF TX power.

Parameters
new_powerThe desired power level
Returns
The power level in use after the adjustment

The value specified in new_power will be written directly to the RFCORE_XREG_TXPOWER register. See the datasheet for more details on possible values.

Definition at line 159 of file cc2538-rf.c.

References RFCORE_XREG_TXPOWER.

int cc2538_rf_read_rssi ( void  )

Reads the current signal strength (RSSI)

Returns
The current RSSI

This function reads the current RSSI on the currently configured channel.

Definition at line 190 of file cc2538-rf.c.

References radio_driver::off, radio_driver::on, RFCORE_XREG_FSMSTAT0, RFCORE_XREG_FSMSTAT0_FSM_FFCTRL_STATE, RFCORE_XREG_RSSI, RFCORE_XREG_RSSISTAT, and RFCORE_XREG_RSSISTAT_RSSI_VALID.

void cc2538_rf_rx_tx_isr ( void  )

The cc2538 RF RX/TX ISR.

This is the interrupt service routine for all RF interrupts relating to RX and TX. Error conditions are handled by cc2538_rf_err_isr(). Currently, we only acknowledge the FIFOP interrupt source.

Definition at line 701 of file cc2538-rf.c.

References process_poll(), and RFCORE_SFR_RFIRQF0.

void cc2538_rf_set_addr ( uint16_t  pan)

Sets addresses and PAN identifier to the relevant RF hardware registers.

Parameters
panThe PAN Identifier

Values for short and extended addresses are not needed as parameters since they exist in the linkaddr buffer in the contiki core. They are thus simply copied over from there.

Definition at line 170 of file cc2538-rf.c.

References linkaddr_node_addr, RFCORE_FFSM_EXT_ADDR0, RFCORE_FFSM_PAN_ID0, RFCORE_FFSM_PAN_ID1, RFCORE_FFSM_SHORT_ADDR0, and RFCORE_FFSM_SHORT_ADDR1.

Referenced by main().

void cc2538_rf_set_promiscous_mode ( char  p)

Turn promiscous mode on or off.

Parameters
pIf promiscous mode should be on (1) or off (0)

This function turns promiscous mode on or off. In promiscous mode, every received frame is returned from the RF core. In non-promiscous mode, only broadcast frames or frames with our address as the receive address are returned from the RF core.

Definition at line 749 of file cc2538-rf.c.

References RFCORE_XREG_FRMFILT0, and RFCORE_XREG_FRMFILT0_FRAME_FILTER_EN.

PROCESS_THREAD ( cc2538_rf_process  ,
ev  ,
data   
)

Implementation of the cc2538 RF driver process.

This process is started by init(). It simply sits there waiting for an event. Upon frame reception, the RX ISR will poll this process. Subsequently, the contiki core will generate an event which will call this process so that the received frame can be picked up from the RF RX FIFO

Definition at line 664 of file cc2538-rf.c.

References radio_driver::off, packetbuf_clear(), packetbuf_dataptr(), packetbuf_set_datalen(), PACKETBUF_SIZE, PROCESS_BEGIN, PROCESS_END, PROCESS_YIELD_UNTIL, and radio_driver::read.