void m_aci_q_flush(void) { noInterrupts(); /* re-initialize aci cmd queue and aci event queue to flush them*/ m_aci_q_init(&aci_tx_q); m_aci_q_init(&aci_rx_q); interrupts(); }
void hal_aci_tl_init() { received_data.buffer[0] = 0; //SPI.begin(); SPI.setBitOrder(LSBFIRST); SPI.setClockDivider(SPI_CLOCK_DIV8); SPI.setDataMode(SPI_MODE0); /* initialize aci cmd queue */ m_aci_q_init(&aci_tx_q); m_aci_q_init(&aci_rx_q); //Configure the IO lines pinMode(HAL_IO_RADIO_RESET, OUTPUT); pinMode(HAL_IO_RADIO_RDY, INPUT_PULLUP); pinMode(HAL_IO_RADIO_REQN, OUTPUT); digitalWrite(HAL_IO_RADIO_RESET, 1); delay(100); digitalWrite(HAL_IO_RADIO_RESET, 0); digitalWrite(HAL_IO_RADIO_RESET, 1); digitalWrite(SCK, 0); digitalWrite(MOSI, 0); digitalWrite(HAL_IO_RADIO_REQN, 1); digitalWrite(SCK, 0); HAL_IO_RADIO_IRQ = 0xFF; for (uint8_t i=0; i<sizeof(dreqinttable); i+=2) { if (HAL_IO_RADIO_RDY == dreqinttable[i]) { HAL_IO_RADIO_IRQ = dreqinttable[i+1]; } } delay(30); //Wait for the nRF8001 to get hold of its lines - the lines float for a few ms after the reset if (HAL_IO_RADIO_IRQ != 0xFF) attachInterrupt(HAL_IO_RADIO_IRQ, m_rdy_line_handle, LOW); // We use the LOW level of the RDYN line as the atmega328 can wakeup from sleep only on LOW }
void hal_aci_tl_init(aci_pins_t *a_pins) { received_data.buffer[0] = 0; m_aci_pins_set(a_pins); /* The SPI lines used are mapped directly to the hardware SPI MISO MOSI and SCK Change here if the pins are mapped differently The SPI library assumes that the hardware pins are used */ spi.begin(); spi.setBitOrder(MSBFIRST); //Use MSBFIRST and REVERSE the bits on the SPI as LSBFIRST is not supported spi.setClockDivider(a_pins->spi_clock_divider); spi.setDataMode(SPI_MODE0); /* initialize aci cmd queue */ m_aci_q_init(&aci_tx_q); m_aci_q_init(&aci_rx_q); //Configure the IO lines pinMode(a_pins->rdyn_pin, INPUT_PULLUP); pinMode(a_pins->reqn_pin, OUTPUT); if (UNUSED != a_pins->active_pin) { pinMode(a_pins->active_pin, INPUT); } if (UNUSED != a_pins->reset_pin) { pinMode(a_pins->reset_pin, OUTPUT); if (REDBEARLAB_SHIELD_V1_1 == a_pins->board_name) { //The reset for this board is inverted and has a Power On Reset //circuit that takes about 100ms to trigger the reset digitalWrite(a_pins->reset_pin, 1); delay(100); digitalWrite(a_pins->reset_pin, 0); } else { digitalWrite(a_pins->reset_pin, 1); digitalWrite(a_pins->reset_pin, 0); digitalWrite(a_pins->reset_pin, 1); } } digitalWrite(a_pins->miso_pin, 0); digitalWrite(a_pins->mosi_pin, 0); digitalWrite(a_pins->reqn_pin, 1); digitalWrite(a_pins->sck_pin, 0); delay(30); //Wait for the nRF8001 to get hold of its lines - the lines float for a few ms after the reset //Attach the interrupt to the RDYN line as requested by the caller if (a_pins->interface_is_interrupt) { attachInterrupt(a_pins->interrupt_number, m_rdy_line_handle, LOW); // We use the LOW level of the RDYN line as the atmega328 can wakeup from sleep only on LOW } }