void rf_init(void) { spi_sw_init(); rf_power_up(); // Set default register values (TODO for the rest) rf_write_reg_byte(NRF_REG_EN_RXADDR, 0); rf_write_reg_byte(NRF_REG_DYNPD, 0); rf_set_crc_type(NRF_CRC_1B); rf_set_retr_retries(5); rf_set_retr_delay(NRF_RETR_DELAY_500US); rf_set_power(NRF_POWER_0DBM); rf_set_speed(NRF_SPEED_250K); rf_set_address_width(NRF_AW_5); rf_set_frequency(2400 + 0x20); rf_enable_features(NRF_FEATURE_DPL | NRF_FEATURE_DYN_ACK); rf_enable_pipe_autoack(NRF_MASK_PIPE0); rf_enable_pipe_address(NRF_MASK_PIPE0); rf_enable_pipe_dlp(NRF_MASK_PIPE0); // Note: The address should be set by the application. rf_mode_rx(); rf_flush_all(); rf_clear_irq(); }
int8_t bmac_set_channel (uint8_t chan) { if (chan > 26) return NRK_ERROR; g_chan = chan; rf_power_up (); rf_init (&bmac_rfRxInfo, chan, 0xFFFF, 0x00000); return NRK_OK; }
// This function will put the node into a low-duty checking mode to save power void tdma_snooze() { int8_t v; uint8_t i; // stop the software watchdog timer so it doesn't interrupt nrk_sw_wdt_stop(0); // This flag is cleared only by the button interrupt snoozing=1; // Setup the button interrupt nrk_ext_int_configure( NRK_EXT_INT_1,NRK_LEVEL_TRIGGER, &wakeup_func); // Clear it so it doesn't fire instantly EIFR=0xff; nrk_ext_int_enable( NRK_EXT_INT_1); // Now loop and periodically check for packets while(1) { nrk_led_clr(RED_LED); nrk_led_clr(GREEN_LED); rf_power_up(); rf_rx_on (); // check return from button interrupt on next cycle if(snoozing==0 ) return; tmp_time.secs=0; tmp_time.nano_secs=10*NANOS_PER_MS; nrk_led_set(RED_LED); // Leave radio on for two loops of 10ms for a total of 20ms every 10 seconds for(i=0; i<2; i++ ) { v = _tdma_rx (); if(v==NRK_OK) { nrk_led_set(RED_LED); nrk_ext_int_disable( NRK_EXT_INT_1); nrk_sw_wdt_update(0); nrk_sw_wdt_start(0); return NRK_OK; } nrk_wait(tmp_time); } nrk_led_clr(RED_LED); rf_power_down(); tmp_time.secs=10; tmp_time.nano_secs=0; nrk_sw_wdt_stop(0); nrk_wait(tmp_time); } }
void bmac_enable() { is_enabled=1; rf_power_up(); nrk_event_signal (bmac_enable_signal); }
void tdma_enable () { tdma_is_enabled = 1; rf_power_up (); nrk_event_signal (tdma_enable_signal); }
void bmac_nw_task () { int8_t v, i; int8_t e; uint8_t backoff; nrk_sig_mask_t event; while (bmac_started () == 0) nrk_wait_until_next_period (); //register the signal after bmac_init has been called v = nrk_signal_register (bmac_enable_signal); if (v == NRK_ERROR) nrk_kprintf (PSTR ("Failed to register signal\r\n")); backoff = 0; while (1) { #ifdef NRK_SW_WDT #ifdef BMAC_SW_WDT_ID nrk_sw_wdt_update (BMAC_SW_WDT_ID); #endif #endif rf_power_up (); if (is_enabled) { v = 1; #ifdef BMAC_MOD_CCA if (rx_buf_empty == 1) { if (_bmac_rx () == 1) e = nrk_event_signal (bmac_rx_pkt_signal); } else e = nrk_event_signal (bmac_rx_pkt_signal); #else if (rx_buf_empty == 1) v = _bmac_channel_check (); // If the buffer is full, signal the receiving task again. else e = nrk_event_signal (bmac_rx_pkt_signal); // bmac_channel check turns on radio, don't turn off if // data is coming. if (v == 0) { if (_bmac_rx () == 1) { e = nrk_event_signal (bmac_rx_pkt_signal); //if(e==NRK_ERROR) { // nrk_kprintf( PSTR("bmac rx pkt signal failed\r\n")); // printf( "errno: %u \r\n",nrk_errno_get() ); //} } //else nrk_kprintf( PSTR("Pkt failed, buf could be corrupt\r\n" )); } #endif if (tx_data_ready == 1) { _bmac_tx (); } rf_rx_off (); rf_power_down (); //do { nrk_wait (_bmac_check_period); // if(rx_buf_empty!=1) nrk_event_signal (bmac_rx_pkt_signal); //} while(rx_buf_empty!=1); } else { event = 0; do { v = nrk_signal_register (bmac_enable_signal); event = nrk_event_wait (SIG (bmac_enable_signal)); } while ((event & SIG (bmac_enable_signal)) == 0); } //nrk_wait_until_next_period(); } }
int8_t bmac_init (uint8_t chan) { bmac_running = 0; tx_reserve = -1; cca_active = true; rx_failure_cnt = 0; #ifdef NRK_SW_WDT #ifdef BMAC_SW_WDT_ID _bmac_check_period.secs = 30; _bmac_check_period.nano_secs = 0; nrk_sw_wdt_init (BMAC_SW_WDT_ID, &_bmac_check_period, NULL); nrk_sw_wdt_start (BMAC_SW_WDT_ID); #endif #endif _bmac_check_period.secs = 0; _bmac_check_period.nano_secs = BMAC_DEFAULT_CHECK_RATE_MS * NANOS_PER_MS; bmac_rx_pkt_signal = nrk_signal_create (); if (bmac_rx_pkt_signal == NRK_ERROR) { nrk_kprintf (PSTR ("BMAC ERROR: creating rx signal failed\r\n")); nrk_kernel_error_add (NRK_SIGNAL_CREATE_ERROR, nrk_cur_task_TCB->task_ID); return NRK_ERROR; } bmac_tx_pkt_done_signal = nrk_signal_create (); if (bmac_tx_pkt_done_signal == NRK_ERROR) { nrk_kprintf (PSTR ("BMAC ERROR: creating tx signal failed\r\n")); nrk_kernel_error_add (NRK_SIGNAL_CREATE_ERROR, nrk_cur_task_TCB->task_ID); return NRK_ERROR; } bmac_enable_signal = nrk_signal_create (); if (bmac_enable_signal == NRK_ERROR) { nrk_kprintf (PSTR ("BMAC ERROR: creating enable signal failed\r\n")); nrk_kernel_error_add (NRK_SIGNAL_CREATE_ERROR, nrk_cur_task_TCB->task_ID); return NRK_ERROR; } tx_data_ready = 0; // Set the one main rx buffer rx_buf_empty = 0; bmac_rfRxInfo.pPayload = NULL; bmac_rfRxInfo.max_length = 0; // Setup the cc2420 chip rf_power_up (); rf_init (&bmac_rfRxInfo, chan, 0xffff, 0); g_chan = chan; // FASTSPI_SETREG(CC2420_RSSI, 0xE580); // CCA THR=-25 // FASTSPI_SETREG(CC2420_TXCTRL, 0x80FF); // TX TURNAROUND = 128 us // FASTSPI_SETREG(CC2420_RXCTRL1, 0x0A56); // default cca thresh of -45 //rf_set_cca_thresh(-45); rf_set_cca_thresh (0x0); bmac_running = 1; is_enabled = 1; return NRK_OK; }