void at86rf231_gpio_spi_interrupts_init(void) { /* set up GPIO pins */ /* SCLK and MOSI*/ GPIOA->CRL &= ~(0xf << (5 * 4)); GPIOA->CRL |= (0xb << (5 * 4)); GPIOA->CRL &= ~(0xf << (7 * 4)); GPIOA->CRL |= (0xb << (7 * 4)); /* MISO */ gpio_init_in(SPI_0_MISO_GPIO, GPIO_NOPULL); /* SPI init */ spi_init_master(SPI_0, SPI_CONF_FIRST_RISING, SPI_SPEED_5MHZ); spi_poweron(SPI_0); /* IRQ0 */ gpio_init_in(SPI_0_IRQ0_GPIO, GPIO_NOPULL); gpio_init_int(SPI_0_IRQ0_GPIO, GPIO_NOPULL, GPIO_RISING, (gpio_cb_t)at86rf231_rx_irq, NULL); /* Connect EXTI4 Line to PC4 pin */ at86rf231_enable_interrupts(); /* CS */ gpio_init_out(SPI_0_CS_GPIO, GPIO_NOPULL); /* SLEEP */ gpio_init_out(SPI_0_SLEEP_GPIO, GPIO_NOPULL); /* RESET */ gpio_init_out(SPI_0_RESET_GPIO, GPIO_NOPULL); }
void at86rf231_switch_to_rx(void) { at86rf231_disable_interrupts(); // Send a FORCE TRX OFF command at86rf231_reg_write(AT86RF231_REG__TRX_STATE, AT86RF231_TRX_STATE__FORCE_TRX_OFF); // Reset IRQ to TRX END only at86rf231_reg_write(AT86RF231_REG__IRQ_MASK, AT86RF231_IRQ_STATUS_MASK__TRX_END); // Read IRQ to clear it at86rf231_reg_read(AT86RF231_REG__IRQ_STATUS); // Enable IRQ interrupt at86rf231_enable_interrupts(); // Start RX at86rf231_reg_write(AT86RF231_REG__TRX_STATE, AT86RF231_TRX_STATE__RX_ON); // wait until it is on RX_ON state uint8_t status; uint8_t max_wait = 100; // TODO : move elsewhere, this is in 10us do { status = at86rf231_get_status(); vtimer_usleep(10); if (!--max_wait) { printf("at86rf231 : ERROR : could not enter RX_ON mode"); break; } } while ((status & AT86RF231_TRX_STATUS_MASK__TRX_STATUS) != AT86RF231_TRX_STATUS__RX_ON); }