Ejemplo n.º 1
0
Archivo: rf.c Proyecto: devilholk/bldc
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();
}
Ejemplo n.º 2
0
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;
}
Ejemplo n.º 3
0
// 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);

    }

}
Ejemplo n.º 4
0
void bmac_enable()
{
    is_enabled=1;
    rf_power_up();
    nrk_event_signal (bmac_enable_signal);
}
Ejemplo n.º 5
0
void tdma_enable ()
{
  tdma_is_enabled = 1;
  rf_power_up ();
  nrk_event_signal (tdma_enable_signal);
}
Ejemplo n.º 6
0
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();
  }

}
Ejemplo n.º 7
0
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;
}