44 #define delay_us(us) { udelay(us); }
45 #define cli() MK60_DISABLE_INTERRUPT()
46 #define sei() MK60_ENABLE_INTERRUPT()
50 #define PRINTF(...) printf(__VA_ARGS__)
51 #define PRINTSHORT(...) printf(__VA_ARGS__)
54 #define PRINTSHORT(...)
65 #define WITH_SEND_CCA 0
68 #if RF230_CONF_TIMESTAMPS
70 #define TIMESTAMP_LEN 3
72 #define TIMESTAMP_LEN 0
78 #ifndef RF230_CONF_CHECKSUM
79 #define RF230_CONF_CHECKSUM 0
83 #ifndef RF230_CONF_AUTOACK
84 #define RF230_CONF_AUTOACK 1
88 #if RF230_CONF_AUTOACK
89 static bool is_promiscuous;
94 #ifndef RF230_CONF_AUTORETRIES
95 #define RF230_CONF_AUTORETRIES 3
110 #if RF320_CONF_INSERTACK && RF230_CONF_AUTORETRIES
111 #define RF230_INSERTACK 1
112 uint8_t ack_pending, ack_seqnum;
117 #ifndef RF230_CONF_CSMARETRIES
118 #define RF230_CONF_CSMARETRIES 5
122 #if RF230_CONF_CHECKSUM || defined(RF230BB_HOOK_TX_PACKET)
125 #define CHECKSUM_LEN 2
128 #define AUX_LEN (CHECKSUM_LEN + TIMESTAMP_LEN + FOOTER_LEN)
129 #if AUX_LEN != CHECKSUM_LEN
130 #warning RF230 Untested Configuration!
135 uint8_t authority_level;
138 #define FOOTER1_CRC_OK 0x80
139 #define FOOTER1_CORRELATION 0x7f
144 #define RADIOALWAYSON 1
146 #define RADIOALWAYSON 0
147 #define RADIOSLEEPSWHENOFF 1
173 uint16_t RF230_sendpackets, RF230_receivepackets, RF230_sendfail, RF230_receivefail;
176 #if RADIO_CONF_CALIBRATE_INTERVAL
179 uint8_t rf230_calibrate;
180 uint8_t rf230_calibrated;
185 extern uint8_t debugflowsize, debugflow[DEBUGFLOWSIZE];
186 #define DEBUGFLOW(c) if(debugflowsize < (DEBUGFLOWSIZE - 1)) debugflow[debugflowsize++] = c
192 rtimer_clock_t rf230_time_of_arrival, rf230_time_of_departure;
194 int rf230_authority_level_of_sender;
196 #if RF230_CONF_TIMESTAMPS
197 static rtimer_clock_t setup_time_for_transmission;
198 static unsigned long total_time_for_transmission, total_transmission_len;
199 static int num_transmissions;
202 #if defined(__AVR_ATmega128RFA1__)
203 volatile uint8_t rf230_interruptwait, rf230_ccawait;
206 uint8_t
volatile rf230_pending;
224 PROCESS(rf230_process,
"RF230 driver");
230 static int rf230_read(
void *buf,
unsigned short bufsize);
232 static int rf230_prepare(
const void *data,
unsigned short len);
233 static int rf230_transmit(
unsigned short len);
234 static int rf230_send(
const void *data,
unsigned short len);
236 static int rf230_receiving_packet(
void);
237 static int rf230_pending_packet(
void);
238 static int rf230_cca(
void);
240 uint8_t rf230_last_correlation, rf230_last_rssi, rf230_smallest_rssi;
250 rf230_receiving_packet,
251 rf230_pending_packet,
256 uint8_t RF230_receive_on;
257 static uint8_t channel;
260 uint8_t rxframe_head, rxframe_tail;
323 bool sleeping =
false;
375 for(i = 0; i < 10000; i++) {
408 uint8_t original_state;
412 (new_state ==
RX_ON) ||
435 if(new_state == original_state) {
468 if(original_state ==
TRX_OFF) {
482 return set_state_status;
485 rf230_set_promiscuous_mode(
bool isPromiscuous)
487 #if RF230_CONF_AUTOACK
488 is_promiscuous = isPromiscuous;
494 rf230_is_ready_to_send()
507 rxframe[rxframe_head].
length = 0;
514 ENERGEST_ON(ENERGEST_TYPE_LISTEN);
515 RF230_receive_on = 1;
516 #ifdef RF230BB_HOOK_RADIO_ON
517 RF230BB_HOOK_RADIO_ON();
522 ENERGEST_ON(ENERGEST_TYPE_LED_RED);
523 #if RF230BB_CONF_LEDONPORTE1
526 #if defined(__AVR_ATmega128RFA1__)
528 rf230_interruptwait = 1;
531 while(rf230_interruptwait) {
552 #if RF230_CONF_AUTOACK
563 #if RF230BB_CONF_LEDONPORTE1
564 PORTE &= ~(1 << PE1);
566 #ifdef RF230BB_HOOK_RADIO_OFF
567 RF230BB_HOOK_RADIO_OFF();
579 #if RADIOSLEEPSWHENOFF
583 LLWU_UNINHIBIT_LLS();
588 ENERGEST_OFF(ENERGEST_TYPE_LED_RED);
592 RF230_receive_on = 0;
593 ENERGEST_OFF(ENERGEST_TYPE_LISTEN);
597 set_txpower(uint8_t power)
599 if(power > TX_PWR_17_2DBM) {
600 power = TX_PWR_17_2DBM;
604 PRINTF(
"rf230_set_txpower:Sleeping");
611 rf230_setpendingbit(uint8_t value)
627 #define HAL_ENTER_CRITICAL_REGION() DisableInterrupts
628 #define HAL_LEAVE_CRITICAL_REGION() EnableInterrupts
629 uint8_t osccal_original, osccal_calibrated;
641 uint8_t osccal_original = OSCCAL;
642 volatile uint16_t temp;
661 uint8_t counter = 128;
667 while(ASSR & ((1 << TCN2UB) | (1 << OCR2AUB) | (1 << TCR2AUB) | (1 << TCR2BUB))) {
679 while(!(TIFR2 & (1 << TOV2))) {
686 #define cal_upper 32812
687 #define cal_lower 29687
689 if(temp < cal_lower) {
698 }
else if(temp > cal_upper) {
713 }
while((counter != 0) && (
false == cal_ok));
715 osccal_calibrated = OSCCAL;
718 OSCCAL = osccal_original;
721 OSCCAL = osccal_original;
749 for(i = 0; i < RF230_CONF_RX_BUFFERS; i++) {
785 if((tvers != RF230_REVA) && (tvers != RF230_REVB) && (tvers != RF230B)) {
786 PRINTF(
"rf230: Unsupported version %u\r\n", tvers);
788 if(tmanu != SUPPORTED_MANUFACTURER_ID) {
789 PRINTF(
"rf230: Unsupported manufacturer ID %u\r\n", tmanu);
792 PRINTF(
"rf230: Version %u, ID %u\r\n", tvers, tmanu);
807 rf230_warm_reset(
void)
809 #if RF230_CONF_SNEEZER && JACKDAW
811 #warning Manipulating PORTB pins for RF230 Sneezer mode!
835 #ifdef RF230_MIN_RX_POWER
836 #if RF230_MIN_RX_POWER > 84
837 #warning rf231 power threshold clipped to -48dBm by hardware register
839 #elif RF230_MIN_RX_POWER < 0
840 #error RF230_MIN_RX_POWER can not be negative!
847 #ifdef RF230_CONF_CCA_THRES
848 #if RF230_CONF_CCA_THRES < -91
850 #warning RF230_CONF_CCA_THRES below hardware limit, setting to -91dBm
853 #elif RF230_CONF_CCA_THRES > -61
855 #warning RF230_CONF_CCA_THRES above hardware limit, setting to -61dBm
864 #if RF230_CONF_CHECKSUM
871 #ifdef RF230_MAX_TX_POWER
872 set_txpower(RF230_MAX_TX_POWER);
879 rf230_transmit(
unsigned short payload_len)
884 #if RF230_CONF_TIMESTAMPS
885 struct timestamp timestamp;
891 #if defined(__AVR_ATmega128RFA1__)
892 ENERGEST_ON(ENERGEST_TYPE_LED_RED);
893 #if RF230BB_CONF_LEDONPORTE1
896 rf230_interruptwait = 1;
901 for(i = 0; i < 10000; i++) {
902 if(!rf230_interruptwait) {
917 #if RADIO_CONF_CALIBRATE_INTERVAL
919 if(rf230_calibrate) {
924 rf230_calibrated = 1;
932 if(RF230_receive_on) {
933 ENERGEST_OFF(ENERGEST_TYPE_LISTEN);
936 #if RF230_CONF_AUTORETRIES
946 if(packetbuf_attr(PACKETBUF_ATTR_RADIO_TXPOWER) > 0) {
948 txpower = rf230_get_txpower();
950 set_txpower(packetbuf_attr(PACKETBUF_ATTR_RADIO_TXPOWER) - 1);
953 total_len = payload_len + AUX_LEN;
955 #if RF230_CONF_TIMESTAMPS
959 ENERGEST_ON(ENERGEST_TYPE_TRANSMIT);
961 #if defined(__AVR_ATmega128RFA1__)
971 #if defined(__AVR_ATmega128RFA1__)
974 PRINTF(
"rf230_transmit: %d\r\n", (
int)total_len);
982 for(i = 0; i < total_len; i++) {
983 PRINTF(
" %02x", buffer[i]);
998 #if RF230_CONF_AUTORETRIES
1001 tx_result = RADIO_TX_OK;
1004 #ifdef ENERGEST_CONF_LEVELDEVICE_LEVELS
1005 ENERGEST_OFF_LEVEL(ENERGEST_TYPE_TRANSMIT, rf230_get_txpower());
1009 if(packetbuf_attr(PACKETBUF_ATTR_RADIO_TXPOWER) > 0) {
1010 set_txpower(txpower & 0xff);
1013 #if RF230_CONF_TIMESTAMPS
1014 setup_time_for_transmission = txtime - timestamp.time;
1016 if(num_transmissions < 10000) {
1018 total_transmission_len += total_len;
1019 num_transmissions++;
1024 ENERGEST_OFF(ENERGEST_TYPE_TRANSMIT);
1025 if(RF230_receive_on) {
1027 ENERGEST_ON(ENERGEST_TYPE_LISTEN);
1035 PRINTF(
"rf230_transmit: turning radio off\r\n");
1043 if(tx_result == 1) {
1044 tx_result = RADIO_TX_OK;
1047 if(tx_result == RADIO_TX_OK) {
1048 RIMESTATS_ADD(lltx);
1049 if(packetbuf_attr(PACKETBUF_ATTR_RELIABLE)) {
1050 RIMESTATS_ADD(ackrx);
1054 if(!((buffer[5] == 0xff) && (buffer[6] == 0xff)) && (buffer[0] & (1 << 6))) {
1058 }
else if(tx_result == 3) {
1060 RIMESTATS_ADD(contentiondrop);
1061 PRINTF(
"rf230_transmit: Transmission never started\r\n");
1062 tx_result = RADIO_TX_COLLISION;
1063 }
else if(tx_result == 5) {
1065 tx_result = RADIO_TX_NOACK;
1066 PRINTF(
"rf230_transmit: ACK not received\r\n");
1067 RIMESTATS_ADD(badackrx);
1068 }
else if(tx_result == 7) {
1070 tx_result = RADIO_TX_ERR;
1077 rf230_prepare(
const void *payload,
unsigned short payload_len)
1080 uint8_t total_len, *pbuf;
1081 #if RF230_CONF_TIMESTAMPS
1082 struct timestamp timestamp;
1084 #if RF230_CONF_CHECKSUM
1089 ack_seqnum = *(((uint8_t *)payload) + 2);
1099 #if RF230_CONF_CHECKSUM
1100 checksum =
crc16_data(payload, payload_len, 0);
1104 total_len = payload_len + AUX_LEN;
1114 memcpy(pbuf, payload, payload_len);
1115 pbuf += payload_len;
1117 #if RF230_CONF_CHECKSUM
1118 memcpy(pbuf, &checksum, CHECKSUM_LEN);
1119 pbuf += CHECKSUM_LEN;
1122 #if RF230_CONF_TIMESTAMPS
1125 memcpy(pbuf, ×tamp, TIMESTAMP_LEN);
1126 pbuf += TIMESTAMP_LEN;
1130 #ifdef RF230BB_HOOK_TX_PACKET
1131 #if !RF230_CONF_CHECKSUM
1134 checksum =
crc16_data(payload, payload_len, 0);
1135 memcpy(buffer + total_len - CHECKSUM_LEN, &checksum, CHECKSUM_LEN);
1138 RF230BB_HOOK_TX_PACKET(buffer, total_len);
1146 rf230_send(
const void *payload,
unsigned short payload_len)
1150 #ifdef RF230BB_HOOK_IS_SEND_ENABLED
1151 if(!RF230BB_HOOK_IS_SEND_ENABLED()) {
1156 if((ret = rf230_prepare(payload, payload_len))) {
1157 PRINTF(
"rf230_send: Unable to send, prep failed (%d)\r\n", ret);
1161 ret = rf230_transmit(payload_len);
1178 if(RF230_receive_on == 0) {
1186 if(!rf230_isidle()) {
1187 PRINTF(
"rf230_off: busy receiving\r\r\n");
1198 if(RF230_receive_on) {
1208 rf230_get_channel(
void)
1216 rf230_set_channel(uint8_t c)
1219 PRINTF(
"rf230: Set Channel %u\r\n", c);
1226 rf230_listen_channel(uint8_t c)
1230 rf230_set_channel(c);
1235 rf230_set_pan_addr(
unsigned pan,
1237 const uint8_t ieee_addr[8])
1240 PRINTF(
"rf230: PAN=%x Short Addr=%x\r\n", pan, addr);
1245 abyte = (pan >> 8 * 1) & 0xFF;
1248 abyte = addr & 0xFF;
1250 abyte = (addr >> 8 * 1) & 0xFF;
1253 if(ieee_addr !=
NULL) {
1254 PRINTF(
"MAC=%x", *ieee_addr);
1256 PRINTF(
":%x", *ieee_addr);
1258 PRINTF(
":%x", *ieee_addr);
1260 PRINTF(
":%x", *ieee_addr);
1262 PRINTF(
":%x", *ieee_addr);
1264 PRINTF(
":%x", *ieee_addr);
1266 PRINTF(
":%x", *ieee_addr);
1268 PRINTF(
":%x", *ieee_addr);
1277 #if RF230_CONF_TIMESTAMPS
1278 static volatile rtimer_clock_t interrupt_time;
1279 static volatile int interrupt_time_set;
1282 rf230_interrupt(
void)
1286 if(RF230_receive_on) {
1289 #if RF230_CONF_TIMESTAMPS
1291 interrupt_time_set = 1;
1299 RF230_receivepackets++;
1301 RIMESTATS_ADD(llrx);
1306 rxframe[rxframe_head].
length = 0;
1318 uint8_t rf230processflag;
1319 #define RF230PROCESSFLAG(arg) rf230processflag = arg
1321 #define RF230PROCESSFLAG(arg)
1328 RF230PROCESSFLAG(99);
1332 RF230PROCESSFLAG(42);
1347 PRINTF(
"rf230_read: %u bytes lqi %u\r\n", len, rf230_last_correlation);
1356 RF230PROCESSFLAG(1);
1359 RF230PROCESSFLAG(2);
1360 NETSTACK_RDC.input();
1363 RF230_receivefail++;
1380 rf230_read(
void *buf,
unsigned short bufsize)
1382 uint8_t len, *framep;
1384 uint8_t footer[FOOTER_LEN];
1386 #if RF230_CONF_CHECKSUM
1389 #if RF230_CONF_TIMESTAMPS
1394 if(ack_pending && bufsize == 3) {
1396 uint8_t *buff = (uint8_t *)buf;
1399 buff[2] = ack_seqnum;
1405 len = rxframe[rxframe_head].
length;
1407 #if RADIOALWAYSON && DEBUGFLOWSIZE
1408 if(RF230_receive_on == 0) {
1409 if(debugflow[debugflowsize - 1] !=
'z') {
1418 if(RF230_receive_on) {
1424 if(!RF230_receive_on) {
1430 #if RF230_CONF_TIMESTAMPS
1431 if(interrupt_time_set) {
1432 rf230_time_of_arrival = interrupt_time;
1433 interrupt_time_set = 0;
1435 rf230_time_of_arrival = 0;
1437 rf230_time_of_departure = 0;
1457 RIMESTATS_ADD(badsynch);
1461 if(len <= AUX_LEN) {
1465 RIMESTATS_ADD(tooshort);
1469 if(len - AUX_LEN > bufsize) {
1473 RIMESTATS_ADD(toolong);
1477 framep = &(rxframe[rxframe_head].
data[0]);
1478 memcpy(buf, framep, len - AUX_LEN + CHECKSUM_LEN);
1479 rf230_last_correlation = rxframe[rxframe_head].
lqi;
1480 rf230_last_rssi = rxframe[rxframe_head].rssi;
1483 rxframe[rxframe_head].
length = 0;
1485 if(rxframe_head >= RF230_CONF_RX_BUFFERS) {
1489 if(rxframe[rxframe_head].length) {
1494 framep += len - AUX_LEN;
1495 #if RF230_CONF_CHECKSUM
1496 memcpy(&checksum, framep, CHECKSUM_LEN);
1498 framep += CHECKSUM_LEN;
1499 #if RF230_CONF_TIMESTAMPS
1500 memcpy(&t, framep, TIMESTAMP_LEN);
1502 framep += TIMESTAMP_LEN;
1504 memcpy(footer, framep, FOOTER_LEN);
1506 #if RF230_CONF_CHECKSUM
1507 if(checksum !=
crc16_data(buf, len - AUX_LEN, 0)) {
1513 if(footer[1] & FOOTER1_CRC_OK &&
1514 checksum ==
crc16_data(buf, len - AUX_LEN, 0)) {
1520 rf230_last_rssi = rf230_get_raw_rssi();
1522 #if RF230_CONF_AUTOACK
1532 if((rf230_smallest_rssi == 0) || (rf230_last_rssi < rf230_smallest_rssi)) {
1533 rf230_smallest_rssi = rf230_last_rssi;
1537 packetbuf_set_attr(PACKETBUF_ATTR_RSSI, rf230_last_rssi);
1538 packetbuf_set_attr(PACKETBUF_ATTR_LINK_QUALITY, rf230_last_correlation);
1542 #if RF230_CONF_TIMESTAMPS
1543 rf230_time_of_departure =
1545 setup_time_for_transmission +
1546 (total_time_for_transmission * (len - 2)) / total_transmission_len;
1548 rf230_authority_level_of_sender = t.authority_level;
1550 packetbuf_set_attr(PACKETBUF_ATTR_TIMESTAMP, t.time);
1553 #if RF230_CONF_CHECKSUM
1558 RIMESTATS_ADD(badcrc);
1564 #ifdef RF230BB_HOOK_RX_PACKET
1565 RF230BB_HOOK_RX_PACKET(buf, len);
1569 return len - AUX_LEN;
1580 rf230_set_txpower(uint8_t power)
1586 rf230_get_txpower(
void)
1588 uint8_t power = TX_PWR_UNDEFINED;
1590 PRINTF(
"rf230_get_txpower:Sleeping");
1598 rf230_get_raw_rssi(
void)
1600 uint8_t rssi, state;
1601 bool radio_was_off = 0;
1604 if(!RF230_receive_on) {
1619 rssi = (rssi << 1) + rssi;
1635 uint8_t radio_was_off = 0;
1639 if(RF230_receive_on) {
1644 if(!rf230_isidle()) {
1654 ENERGEST_ON(ENERGEST_TYPE_LED_YELLOW);
1661 #if defined(__AVR_ATmega128RFA1__)
1674 while(rf230_ccawait) {
1676 #ifdef RF230_CONF_CCA_THRES
1685 #if RF230_CONF_AUTOACK
1691 #ifdef RF230_CONF_CCA_THRES
1709 while((cca & 0x80) == 0) {
1715 ENERGEST_OFF(ENERGEST_TYPE_LED_YELLOW);
1731 rf230_receiving_packet(
void)
1733 uint8_t radio_state;
1748 rf230_pending_packet(
void)
1751 if(ack_pending == 1) {
1755 return rf230_pending;
1758 #if RF230_CONF_SNEEZER && JACKDAW
1764 void rf230_start_sneeze(
void) {
#define hal_set_slptr_low()
This macro pulls the SLP_TR pin low.
The requested service timed out.
#define RX_ON
Constant RX_ON for sub-register SR_TRX_STATUS.
#define SR_TRX_STATUS
Access parameters for sub-register TRX_STATUS in register RG_TRX_STATUS.
Time it takes to execute the FORCE_TRX_OFF command.
#define SR_PLL_DCU_START
Access parameters for sub-register PLL_DCU_START in register RG_PLL_DCU.
#define hal_get_slptr()
Read current state of the SLP_TR pin (High/Low).
uint8_t lqi
LQI value for received frame.
Transition time from P_ON to TRX_OFF.
#define RG_IEEE_ADDR_3
Offset for register IEEE_ADDR_3.
#define RG_IRQ_MASK
Offset for register IRQ_MASK.
uint8_t hal_register_read(uint8_t address)
This function reads data from one of the radio transceiver's registers.
void process_poll(struct process *p)
Request a process to be polled.
#define RG_CSMA_SEED_0
Offset for register CSMA_SEED_0.
bool radio_is_sleeping(void)
This function checks if the radio transceiver is sleeping.
#define LEDS_RED
LED1 (Red) -> PC0.
#define RX_AACK_ON
Constant RX_AACK_ON for sub-register SR_TRX_STATUS.
#define PORTE
Peripheral PORTE base pointer.
#define PROCESS_BEGIN()
Define the beginning of a process.
Provide udelay routine for MK60DZ10.
#define RG_IEEE_ADDR_5
Offset for register IEEE_ADDR_5.
#define RG_IEEE_ADDR_4
Offset for register IEEE_ADDR_4.
#define SR_TRAC_STATUS
Access parameters for sub-register TRAC_STATUS in register RG_TRX_STATE.
int timesynch_authority_level(void)
Get the current authority level of the time-synchronized time.
#define AVR_ENTER_CRITICAL_REGION()
This macro will protect the following code from interrupts.
Transition time from *_NOCLK to being awake.
#define RG_SHORT_ADDR_1
Offset for register SHORT_ADDR_1.
#define RG_PHY_ED_LEVEL
Offset for register PHY_ED_LEVEL.
void calibrate_rc_osc_32k(void)
Calibrate the internal RC oscillator.
#define AVR_LEAVE_CRITICAL_REGION()
This macro must always be used in conjunction with AVR_ENTER_CRITICAL_REGION so that interrupts are e...
Header file for the Rime buffer (packetbuf) management
Transition time from SLEEP to TRX_OFF.
#define RG_PAN_ID_0
Offset for register PAN_ID_0.
#define PORTB
Peripheral PORTB base pointer.
Transition time from PLL active state to another.
#define TRX_OFF
Constant TRX_OFF for sub-register SR_TRX_STATUS.
uint8_t length
Length of frame.
uint8_t hal_subregister_read(uint8_t address, uint8_t mask, uint8_t position)
This function reads the value of a specific subregister.
#define NULL
The null pointer.
The structure of a device driver for a radio in Contiki.
#define hal_set_rst_low()
This macro pulls the RST pin low.
#define SR_CHANNEL
Access parameters for sub-register CHANNEL in register RG_PHY_CC_CCA.
#define SR_CCA_MODE
Access parameters for sub-register CCA_MODE in register RG_PHY_CC_CCA.
void hal_init(void)
This function initializes the Hardware Abstraction Layer.
This struct defines the rx data container.
void hal_subregister_write(uint8_t address, uint8_t mask, uint8_t position, uint8_t value)
This function writes a new value to one of the radio transceiver's subregisters.
#define hal_set_rst_high()
This macro pulls the RST pin high.
uint8_t data[HAL_MAX_FRAME_LENGTH]
Actual frame data.
#define BUSY_RX
Constant BUSY_RX for sub-register SR_TRX_STATUS.
#define SR_TRX_CMD
Access parameters for sub-register TRX_CMD in register RG_TRX_STATE.
Header file for a simple time synchronization mechanism
void packetbuf_set_datalen(uint16_t len)
Set the length of the data in the packetbuf.
#define RG_MAN_ID_0
Offset for register MAN_ID_0.
uint8_t radio_get_trx_state(void)
This function return the Radio Transceivers current state.
#define HAL_LEAVE_CRITICAL_REGION()
This macro must always be used in conjunction with HAL_ENTER_CRITICAL_REGION so that interrupts are e...
Transition time from TRX_OFF to: RX_ON, PLL_ON, TX_ARET_ON and RX_AACK_ON.
rtimer_clock_t timesynch_time(void)
Get the current time-synchronized time.
Maximum time it should take for the PLL to lock.
#define SR_AACK_SET_PD
Access parameters for AACK_SET_PD bit in register RG_CSMA_SEED_1.
#define RG_SHORT_ADDR_0
Offset for register SHORT_ADDR_0.
#define RG_RX_SYN
Offset for register RX_SYN.
Transition time from VCC is applied to P_ON.
#define SR_RSSI
Access parameters for sub-register RSSI in register RG_PHY_RSSI.
void hal_frame_write(uint8_t *write_buffer, uint8_t length)
This function will download a frame to the radio transceiver's frame buffer.
#define LEDS_GREEN
LED3 (Green) -> PC2.
The end-user tried to do an invalid state transition.
#define PROCESS_THREAD(name, ev, data)
Define the body of a process.
#define PROCESS_END()
Define the end of a process.
This file contains radio driver code.
#define STATE_TRANSITION
Constant STATE_TRANSITION for sub-register SR_TRX_STATUS.
Provide common UART routines for MK60DZ10.
#define hal_set_slptr_high()
This macro pulls the SLP_TR pin high.
#define SR_MAX_FRAME_RETRIES
Access parameters for sub-register MAX_FRAME_RETRIES in register RG_XAH_CTRL_0.
radio_trx_timing_t
This enumeration defines the necessary timing information for the AT86RF230 radio transceiver...
#define RG_IEEE_ADDR_0
Offset for register IEEE_ADDR_0.
radio_status_t
This enumeration defines the possible return values for the TAT API functions.
#define SR_PLL_CF_START
Access parameters for sub-register PLL_CF_START in register RG_PLL_CF.
#define BUSY_RX_AACK
Constant BUSY_RX_AACK for sub-register SR_TRX_STATUS.
#define CMD_FORCE_TRX_OFF
Constant CMD_FORCE_TRX_OFF for sub-register SR_TRX_CMD.
int(* on)(void)
Turn the radio on.
#define RG_IEEE_ADDR_1
Offset for register IEEE_ADDR_1.
Time it takes to do a ED measurement.
#define RF230_MAX_TX_FRAME_LENGTH
127 Byte PSDU.
#define RG_CSMA_BE
Offset for register CSMA_BE.
The requested service was performed successfully.
#define RG_IEEE_ADDR_7
Offset for register IEEE_ADDR_7.
#define HAL_ENTER_CRITICAL_REGION()
This macro will protect the following code from interrupts.
#define RG_IEEE_ADDR_6
Offset for register IEEE_ADDR_6.
Time it takes to do a CCA.
Time to hold the RST pin low during reset.
#define RG_TRX_STATUS
Offset for register TRX_STATUS.
#define SR_TX_PWR
Access parameters for sub-register TX_PWR in register RG_PHY_TX_PWR.
#define BUSY_TX_ARET
Constant BUSY_TX_ARET for sub-register SR_TRX_STATUS.
#define PROCESS(name, strname)
Declare a process.
#define TX_ARET_ON
Constant TX_ARET_ON for sub-register SR_TRX_STATUS.
#define RG_VERSION_NUM
Offset for register VERSION_NUM.
#define RG_IEEE_ADDR_2
Offset for register IEEE_ADDR_2.
void packetbuf_clear(void)
Clear and reset the packetbuf.
void process_start(struct process *p, process_data_t data)
Start a process.
#define PLL_ON
Constant PLL_ON for sub-register SR_TRX_STATUS.
void hal_register_write(uint8_t address, uint8_t value)
This function writes a new value to one of the radio transceiver's registers.
#define SR_TX_AUTO_CRC_ON
Access parameters for sub-register TX_AUTO_CRC_ON in register RG_PHY_TX_PWR.
Maximum time it should take to do the filter tuning.
#define PACKETBUF_SIZE
The size of the packetbuf, in bytes.
#define SR_MAX_CSMA_RETRIES
Access parameters for sub-register MAX_CSMA_RETRIES in register RG_XAH_CTRL_0.
#define RG_PAN_ID_1
Offset for register PAN_ID_1.
Header file for Rime statistics
void * packetbuf_dataptr(void)
Get a pointer to the data in the packetbuf.
One or more of the supplied function arguments are invalid.
#define SR_CCA_ED_THRES
Access parameters for sub-register CCA_ED_THRES in register RG_CCA_THRES.
Header file for the CRC16 calculcation
#define PROCESS_YIELD_UNTIL(c)
Yield the currently running process until a condition occurs.
radio_status_t radio_set_trx_state(uint8_t new_state)
This function will change the current state of the radio transceiver's internal state machine...
#define BUSY_TX
Constant BUSY_TX for sub-register SR_TRX_STATUS.
unsigned short crc16_data(const unsigned char *data, int len, unsigned short acc)
Calculate the CRC16 over a data area.
void radio_reset_state_machine(void)
This function will reset the state machine (to TRX_OFF) from any of its states, except for the SLEEP ...
#define RG_PHY_RSSI
Offset for register PHY_RSSI.
int(* off)(void)
Turn the radio off.
Include file for the Contiki low-layer network stack (NETSTACK)
#define SR_CCA_REQUEST
Access parameters for sub-register CCA_REQUEST in register RG_PHY_CC_CCA.