/** * @brief This function handles External lines 15 to 4 interrupt request. * @param None * @retval None */ void EXTI9_5_IRQHandler(void) { /* EXTI line 7 interrupt detected */ if(__HAL_GPIO_EXTI_GET_IT(RADIO_GPIO_3_EXTI_LINE)) { __HAL_GPIO_EXTI_CLEAR_IT(RADIO_GPIO_3_EXTI_LINE); HAL_GPIO_EXTI_Callback(RADIO_GPIO_3_EXTI_LINE); spirit1_interrupt_callback(); } __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_9); __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_8); __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_7); __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_6); __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_5); #ifndef LPM_ENABLE // if(__HAL_GPIO_EXTI_GET_IT(KEY_BUTTON_EXTI_LINE) != RESET) // { // __HAL_GPIO_EXTI_CLEAR_IT(KEY_BUTTON_EXTI_LINE); // // Set_KeyStatus(SET); // } // #else /*Low Power mode enabled*/ #if defined(RF_STANDBY)/*if spirit1 is in standby*/ if(EXTI->PR & KEY_BUTTON_EXTI_LINE) { HAL_GPIO_EXTI_Callback(KEY_BUTTON_EXTI_LINE); /* EXTI line 13 interrupt detected */ if(HAL_GPIO_ReadPin(KEY_BUTTON_GPIO_PORT, KEY_BUTTON_PIN) == 0x01) //0x00 { HAL_GPIO_EXTI_Callback(KEY_BUTTON_EXTI_LINE); PushButtonStatusWakeup = SET; PushButtonStatusData = RESET; wakeupCounter = LPM_WAKEUP_TIME; dataSendCounter = DATA_SEND_TIME; dataSendCounter++; } __HAL_GPIO_EXTI_CLEAR_IT(KEY_BUTTON_EXTI_LINE); } #else /*if spirit1 is not in standby or sleep mode but MCU is in LPM*/ if(__HAL_GPIO_EXTI_GET_IT(KEY_BUTTON_EXTI_LINE) != RESET) { __HAL_GPIO_EXTI_CLEAR_IT(KEY_BUTTON_EXTI_LINE); HAL_GPIO_EXTI_Callback(KEY_BUTTON_EXTI_LINE); Set_KeyStatus(SET); } #endif #endif }
/* The Spirit1 transceiver use a GPIO to signal irqs; this is the first-line interrupt handler. It passes down handling to a callback in the radio driver. */ void M2S_GPIO_3_EXTI_IRQ_HANDLER(void) { if(EXTI_GetITStatus(M2S_GPIO_3_EXTI_LINE)) { EXTI_ClearITPendingBit(M2S_GPIO_3_EXTI_LINE); spirit1_interrupt_callback(); } }
PROCESS_THREAD(spirit_radio_process, ev, data) { PROCESS_BEGIN(); PRINTF("Spirit1: process started\n"); while(1) { int len; PROCESS_YIELD_UNTIL(ev == PROCESS_EVENT_POLL); PRINTF("Spirit1: polled\n"); packetbuf_clear(); len = spirit_radio_read(packetbuf_dataptr(), PACKETBUF_SIZE); if(len > 0) { #if NULLRDC_CONF_802154_AUTOACK /* Check if the packet has an ACK request */ frame802154_t info154; if(len > ACK_LEN && frame802154_parse((char*)packetbuf_dataptr(), len, &info154) != 0) { if(info154.fcf.frame_type == FRAME802154_DATAFRAME && info154.fcf.ack_required != 0 && rimeaddr_cmp((rimeaddr_t *)&info154.dest_addr, &rimeaddr_node_addr)) { /* Send an ACK packet */ uint8_t ack_frame[ACK_LEN] = { FRAME802154_ACKFRAME, 0x00, info154.seq }; spirit1_strobe(SPIRIT1_STROBE_FTX); SpiritPktBasicSetPayloadLength((uint16_t) ACK_LEN); SpiritSpiWriteLinearFifo((uint16_t) ACK_LEN, (uint8_t *) ack_frame); SpiritSetReadyState(); spirit1_strobe(SPIRIT1_STROBE_TX); BUSYWAIT_UNTIL(SPIRIT1_STATUS() == SPIRIT1_STATE_TX, 1 * RTIMER_SECOND/1000); BUSYWAIT_UNTIL(SPIRIT1_STATUS() != SPIRIT1_STATE_TX, 1 * RTIMER_SECOND/1000); ACKPRINTF("debug_ack: sent ack %d\n", ack_frame[2]); } } #endif /* NULLRDC_CONF_802154_AUTOACK */ packetbuf_set_datalen(len); NETSTACK_RDC.input(); } if(!IS_RXBUF_EMPTY()){ process_poll(&spirit_radio_process); } if(interrupt_callback_wants_poll) { spirit1_interrupt_callback(); if(SPIRIT1_STATUS() == SPIRIT1_STATE_READY) { spirit1_strobe(SPIRIT1_STROBE_RX); BUSYWAIT_UNTIL(SPIRIT1_STATUS() == SPIRIT1_STATE_RX, 1 * RTIMER_SECOND/1000); } } } PROCESS_END(); }