/** * @brief this function starts the TX process * @param None * @retval None */ void Spirit1StartTx(uint8_t *buffer, uint8_t size ) { /* fit the TX FIFO */ SpiritCmdStrobeFlushTxFifo(); SpiritSpiWriteLinearFifo(size, buffer); /* send the TX command */ SpiritCmdStrobeTx(); #if 0 do{ /* Delay for state transition */ for(volatile uint8_t i=0; i!=0xFF; i++); /* Reads the MC_STATUS register */ SpiritRefreshStatus(); } while(g_xStatus.MC_STATE!=MC_STATE_TX); #endif #if defined(P2P_DEMO) /* wait for TX done */ while(!xTxDoneFlag); xTxDoneFlag = RESET; #endif }
/*---------------------------------------------------------------------------*/ static int spirit_radio_prepare(const void *payload, unsigned short payload_len) { PRINTF("Spirit1: prep %u\n", payload_len); packet_is_prepared = 0; /* Checks if the payload length is supported */ if(payload_len > MAX_PACKET_LEN) { return RADIO_TX_ERR; } /* Waits the end of a still running spirit_radio_transmit */ BUSYWAIT_UNTIL(IS_TXBUF_EMPTY(), TX_WAIT_PCKT_PERIOD * RTIMER_SECOND/1000); if(!IS_TXBUF_EMPTY()) { PRINTF("PREPARE OUT ERR\n"); return RADIO_TX_ERR; } /* Should we delay for an ack? */ #if NULLRDC_CONF_802154_AUTOACK frame802154_t info154; wants_an_ack = 0; if(payload_len > ACK_LEN && frame802154_parse((char*)payload, payload_len, &info154) != 0) { if(info154.fcf.frame_type == FRAME802154_DATAFRAME && info154.fcf.ack_required != 0) { wants_an_ack = 1; } } #endif /* NULLRDC_CONF_802154_AUTOACK */ /* Sets the length of the packet to send */ spirit1_strobe(SPIRIT1_STROBE_FTX); SpiritPktBasicSetPayloadLength(payload_len); SpiritSpiWriteLinearFifo(payload_len, (uint8_t *)payload); PRINTF("PREPARE OUT\n"); packet_is_prepared = 1; return RADIO_TX_OK; }
/** * @brief System main function. * @param None * @retval None */ void main (void) { //*** DiZiC SPIRIT1 Demo NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0000); // Use STM32L1xx_flash.icf RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA | RCC_AHBPeriph_GPIOB, ENABLE ); SdkEvalIdentification(); SdkStartSysTick(); SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK); SdkEvalLedInit(LED1); SdkEvalLedInit(LED2); SdkEvalM2SGpioInit(M2S_GPIO_SDN,M2S_MODE_GPIO_OUT); SpiritSpiInit(); WUKPIN1_Init(); /*********************/ /* Allow access to RTC Domain */ // PWR_RTCAccessCmd(ENABLE); /* Clear WakeUp flag */ // PWR_ClearFlag(PWR_FLAG_WU); /* Check if the StandBy flag is set */ // if (PWR_GetFlagStatus(PWR_FLAG_SB) != RESET) // { /* Clear StandBy flag */ // PWR_ClearFlag(PWR_FLAG_SB); /* Wait for RTC APB registers synchronisation */ // RTC_WaitForSynchro(); /* No need to configure the RTC as the RTC config(clock source, enable, prescaler,...) are kept after wake-up from STANDBY */ // } /* RTC Configuration */ /* Reset RTC Domain */ // RCC_RTCResetCmd(ENABLE); // RCC_RTCResetCmd(DISABLE); /* Enable the LSE OSC */ // RCC_LSICmd(ENABLE); /* Wait till LSE is ready */ // while (RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET) // {} /* Select the RTC Clock Source */ // RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI); /* Enable the RTC Clock */ // RCC_RTCCLKCmd(ENABLE); /* Wait for RTC APB registers synchronisation */ // RTC_WaitForSynchro(); /* RTC domain*/ // RTC_WakeUpCmd(DISABLE); // RTC_ITConfig(RTC_IT_WUT , ENABLE); // RTC_WakeUpClockConfig(RTC_WakeUpClock_RTCCLK_Div4); // RTC_SetWakeUpCounter(0xFF00); // PWR_WakeUpPinCmd(PWR_WakeUpPin_1 , DISABLE); #ifdef USE_VCOM /* VC config */ // SdkEvalVCInit(); // while(bDeviceState != CONFIGURED); #endif /* Spirit ON */ SpiritEnterShutdown(); SpiritExitShutdown(); SpiritManagementIdentificationRFBoard(); SdkEvalM2SGpioInit(M2S_GPIO_0,M2S_MODE_EXTI_IN); /* Spirit IRQ config */ SpiritGpioInit(&xGpioIRQ); SdkEvalM2SGpioInterruptCmd(M2S_GPIO_0,0x0F,0x0F,ENABLE); //*** SdkEvalLedOn(LED1); /* Spirit Radio config */ SpiritRadioInit(&xRadioInit); /* Spirit Packet config */ SpiritPktBasicInit(&xBasicInit); SpiritPktBasicAddressesInit(&xAddressInit); /* Spirit IRQs enable */ SpiritIrqDeInit(&xIrqStatus); SpiritIrq(RX_DATA_DISC,S_ENABLE); SpiritIrq(RX_DATA_READY,S_ENABLE); SpiritIrq(TX_DATA_SENT , S_ENABLE); /* payload length config */ SpiritPktBasicSetPayloadLength(512); /* enable SQI check */ SpiritQiSetSqiThreshold(SQI_TH_0); SpiritQiSqiCheck(S_ENABLE); /* RX timeout config */ SpiritTimerSetRxTimeoutMs(200.0); SpiritTimerSetRxTimeoutStopCondition(SQI_ABOVE_THRESHOLD); /* IRQ registers blanking */ SpiritIrqClearStatus(); /* RX command */ SpiritCmdStrobeRx(); // PWR_PVDCmd(DISABLE); // RCC_MSIRangeConfig(RCC_MSIRange_0); // RCC_AdjustMSICalibrationValue(0x00); // RCC_MSICmd(DISABLE); // RCC_HSICmd(DISABLE); // PWR_EnterSTOPMode(PWR_Regulator_LowPower , PWR_STOPEntry_WFI); // PWR_UltraLowPowerCmd(ENABLE); // PWR_FastWakeUpCmd(ENABLE); //////////////////////////////////////////////////////////////////////////////// // ErrorStatus HSE_Status; // RCC_HSEConfig(RCC_HSE_ON); // HSE_Status = RCC_WaitForHSEStartUp(); // FLASH_SetLatency(FLASH_Latency_1); // FLASH_PrefetchBufferCmd(ENABLE); // RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); // RCC_HCLKConfig(RCC_SYSCLK_Div1); // RCC_PLLConfig(RCC_PLLSource_HSE, RCC_PLLMul_12, RCC_PLLDiv_3); // RCC_PCLK1Config(RCC_HCLK_Div1); // RCC_PCLK2Config(RCC_HCLK_Div1); ///////////////////////////////////////////////////////////////////////////////// /* infinite loop */ while (1){ printf("123"); SpiritCmdStrobeRx(); if(PressButtom) { PressButtom = FALSE; NOPdelay(2000); // fit the TX FIFO SpiritCmdStrobeFlushTxFifo(); SpiritSpiWriteLinearFifo(500, vectcTxBuff2); // send the TX command SpiritCmdStrobeTx(); // wait for TX done SdkEvalLedToggle(LED_GREEN); while(!xTxDoneFlag); SdkEvalLedToggle(LED_GREEN); xTxDoneFlag = RESET; // fit the TX FIFO SpiritCmdStrobeFlushTxFifo(); SpiritSpiWriteLinearFifo(500, vectcTxBuff2); // send the TX command SpiritCmdStrobeTx(); // wait for TX done SdkEvalLedToggle(LED_GREEN); while(!xTxDoneFlag); SdkEvalLedToggle(LED_GREEN); xTxDoneFlag = RESET; // fit the TX FIFO SpiritCmdStrobeFlushTxFifo(); SpiritSpiWriteLinearFifo(500, vectcTxBuff2); // send the TX command SpiritCmdStrobeTx(); // wait for TX done SdkEvalLedToggle(LED_GREEN); while(!xTxDoneFlag); SdkEvalLedToggle(LED_GREEN); xTxDoneFlag = RESET; } } }
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(); }
/** * @brief System main function. * @param None * @retval None */ void main (void) { SDK_SYSTEM_CONFIG(); #ifdef USE_VCOM #ifdef STM8L SdkEvalComInit(115200,USART_WordLength_8b,USART_StopBits_1,USART_Parity_No,USART_Mode_Tx); #elif SDK /* VC config */ SdkEvalVCInit(); while(bDeviceState != CONFIGURED); #endif #endif /* Spirit ON */ SpiritEnterShutdown(); SpiritExitShutdown(); SpiritManagementWaExtraCurrent(); #ifdef STM8L /* Manually set the XTAL_FREQUENCY */ SpiritRadioSetXtalFrequency(XTAL_FREQUENCY); /* Initialize the frequency offset variable to compensate XTAL offset */ xRadioInit.lFrequencyBase = xRadioInit.lFrequencyBase + FREQUENCY_OFFSET; /* Initialize the signals to drive the range extender application board */ RANGE_EXT_INIT(RANGE_TYPE); #elif SDK SpiritManagementIdentificationRFBoard(); /* if the board has eeprom, we can compensate the offset calling SpiritManagementGetOffset (if eeprom is not present this fcn will return 0) */ xRadioInit.lFrequencyBase = xRadioInit.lFrequencyBase + SpiritManagementGetOffset(); /* Initialize the signals to drive the range extender application board */ SpiritManagementRangeExtInit(); #endif /* Initialize the signals to drive the range extender application board */ SpiritManagementRangeExtInit(); SdkEvalM2SGpioInit(M2S_GPIO_3,M2S_MODE_EXTI_IN); SdkEvalM2SGpioInterruptCmd(M2S_GPIO_3,0x0A,0x0A,ENABLE); /* Spirit IRQ config */ SpiritGpioInit(&xGpioIRQ); /* Spirit Radio config */ SpiritRadioInit(&xRadioInit); /* Spirit Radio set power */ SpiritRadioSetPALevelMaxIndex(7); SpiritRadioSetPALeveldBm(7,POWER_DBM); /* Spirit Packet config */ SpiritPktStackInit(&xStackInit); SpiritPktStackAddressesInit(&xAddressInit); SpiritPktStackLlpInit(&xStackLLPInit); /* Spirit IRQs enable */ SpiritIrqDeInit(NULL); SpiritIrq(TX_DATA_SENT, S_ENABLE); SpiritIrq(RX_DATA_READY, S_ENABLE); SpiritIrq(RX_DATA_DISC, S_ENABLE); /* RX timeout config */ SET_INFINITE_RX_TIMEOUT(); SpiritTimerSetRxTimeoutStopCondition(SQI_ABOVE_THRESHOLD); /* Payload length config */ SpiritPktStackSetPayloadLength(20); /* Destination address */ SpiritPktStackSetDestinationAddress(DESTINATION_ADDRESS); /* IRQ registers blanking */ SpiritIrqClearStatus(); /* infinite loop */ while (1){ /* RX command */ SpiritCmdStrobeRx(); /* wait for data received */ while(!xRxDoneFlag); xRxDoneFlag=RESET; /* when rx data ready read the number of received bytes */ cRxData=SpiritLinearFifoReadNumElementsRxFifo(); /* read the RX FIFO */ SpiritSpiReadLinearFifo(cRxData, vectcBallBuff); SpiritCmdStrobeFlushRxFifo(); /* A simple way to control if the received data sequence is correct. Use a local block. */ { SpiritBool correct=S_TRUE; /* control all the received bytes and verify that they are sequential numbers from 1 to 20. If one of them is not an expected value then stop the communication. */ for(uint8_t i=0 ; i<cRxData ; i++) if(vectcBallBuff[i] != i+1) correct=S_FALSE; #ifdef USE_VCOM /* send messages via COM */ if(correct) { printf("B Rx data: ["); for(uint8_t i=0 ; i<cRxData ; i++) printf("%d ", vectcBallBuff[i]); printf("]\r\n"); } else { printf("data error! ping pong stopped\n\r"); } #endif /* stop communication if an incorrect sequence has been received */ if(!correct){ SdkEvalLedOn(LED4); while(1); } } /* pause between RX and TX */ SdkDelayMs(500); /* fit the TX FIFO */ SpiritCmdStrobeFlushTxFifo(); SpiritSpiWriteLinearFifo(20, vectcBallBuff); /* send the TX command */ SpiritCmdStrobeTx(); /* wait for TX done */ while(!xTxDoneFlag); xTxDoneFlag = RESET; #ifdef USE_VCOM /* send messages via COM */ printf("B Tx data: ["); for(uint8_t i=0 ; i<cRxData ; i++) printf("%d ", vectcBallBuff[i]); printf("]\n\r"); #endif } }
/** * @brief System main function. * @param None * @retval None */ void main (void) { SDK_SYSTEM_CONFIG(); #ifdef USE_VCOM #ifdef STM8L SdkEvalComInit(115200,USART_WordLength_8b,USART_StopBits_1,USART_Parity_No,USART_Mode_Tx); #elif SDK /* VC config */ SdkEvalVCInit(); while(bDeviceState != CONFIGURED); #endif #endif /* Spirit ON */ SpiritEnterShutdown(); SpiritExitShutdown(); SpiritManagementWaExtraCurrent(); #ifdef STM8L /* Manually set the XTAL_FREQUENCY */ SpiritRadioSetXtalFrequency(XTAL_FREQUENCY); /* Initialize the frequency offset variable to compensate XTAL offset */ xRadioInit.lFrequencyBase = xRadioInit.lFrequencyBase + FREQUENCY_OFFSET; /* Initialize the signals to drive the range extender application board */ RANGE_EXT_INIT(RANGE_TYPE); #elif SDK SpiritManagementIdentificationRFBoard(); /* if the board has eeprom, we can compensate the offset calling SpiritManagementGetOffset (if eeprom is not present this fcn will return 0) */ xRadioInit.lFrequencyBase = xRadioInit.lFrequencyBase + SpiritManagementGetOffset(); /* Initialize the signals to drive the range extender application board */ SpiritManagementRangeExtInit(); #endif SdkEvalM2SGpioInit(M2S_GPIO_3,M2S_MODE_EXTI_IN); /* Spirit IRQ config */ SpiritGpioInit(&xGpioIRQ); #ifdef STM8L enableInterrupts(); #elif SDK SdkEvalM2SGpioInterruptCmd(M2S_GPIO_3,0x0A,0x0A,ENABLE); #endif /* Spirit Radio config */ SpiritRadioInit(&xRadioInit); /* Spirit Radio set power */ SpiritRadioSetPALeveldBm(7,POWER_DBM); SpiritRadioSetPALevelMaxIndex(7); /* Spirit Packet config */ SpiritPktStackInit(&xStackInit); SpiritPktStackAddressesInit(&xAddressInit); /* Spirit IRQs enable */ SpiritIrqDeInit(NULL); SpiritIrq(TX_DATA_SENT , S_ENABLE); /* payload length config */ SpiritPktStackSetPayloadLength(20); /* destination address */ SpiritPktStackSetDestinationAddress(DESTINATION_ADDRESS); /* IRQ registers blanking */ SpiritIrqClearStatus(); /* infinite loop */ while (1){ #ifdef USE_VCOM printf("A data to transmit: ["); for(uint8_t i=0 ; i<20 ; i++) printf("%d ", vectcTxBuff[i]); printf("]\n\r"); #endif /* fit the TX FIFO */ SpiritCmdStrobeFlushTxFifo(); SpiritSpiWriteLinearFifo(20, vectcTxBuff); /* send the TX command */ SpiritCmdStrobeTx(); /* wait for TX done */ while(!xTxDoneFlag); xTxDoneFlag = RESET; /* pause between two transmissions */ SdkDelayMs(500); } }
/** * @brief System main function. * @param None * @retval None */ void main (void) { SDK_SYSTEM_CONFIG(); #ifdef USE_VCOM #ifdef STM8L SdkEvalComInit(115200,USART_WordLength_8b,USART_StopBits_1,USART_Parity_No,(USART_Mode_TypeDef)(USART_Mode_Rx | USART_Mode_Tx)); #elif SDK /* VC config */ SdkEvalVCInit(); while(bDeviceState != CONFIGURED); #endif #endif /* Spirit ON */ SpiritEnterShutdown(); SpiritExitShutdown(); SpiritManagementWaExtraCurrent(); #ifdef STM8L /* Manually set the XTAL_FREQUENCY */ SpiritRadioSetXtalFrequency(XTAL_FREQUENCY); /* Initialize the frequency offset variable to compensate XTAL offset */ xRadioInit.lFrequencyBase = xRadioInit.lFrequencyBase + FREQUENCY_OFFSET; /* Initialize the signals to drive the range extender application board */ RANGE_EXT_INIT(RANGE_TYPE); #elif SDK SpiritManagementIdentificationRFBoard(); /* if the board has eeprom, we can compensate the offset calling SpiritManagementGetOffset (if eeprom is not present this fcn will return 0) */ xRadioInit.lFrequencyBase = xRadioInit.lFrequencyBase + SpiritManagementGetOffset(); /* Initialize the signals to drive the range extender application board */ SpiritManagementRangeExtInit(); #endif /* Spirit IRQ config */ SpiritGpioInit(&xGpioIRQ); /* Spirit Radio config */ SpiritRadioInit(&xRadioInit); /* Spirit Radio set power */ SpiritRadioSetPALeveldBm(0,POWER_DBM); SpiritRadioSetPALevelMaxIndex(0); /* Spirit Packet config */ SpiritPktStackInit(&xStackInit); //SpiritPktStackAddressesInit(&xAddressInit); SpiritPktStackLlpInit(&xStackLLPInit); /* Spirit IRQs enable */ SpiritIrqDeInit(&xIrqStatus); SpiritIrq(RX_DATA_DISC,S_ENABLE); SpiritIrq(RX_DATA_READY,S_ENABLE); SpiritIrq(TX_DATA_SENT , S_ENABLE); EXTI_ClearITPendingBit(M2S_GPIO_3_EXTI_LINE); SdkEvalM2SGpioInit(M2S_GPIO_3,M2S_MODE_EXTI_IN); /* enable SQI check */ SpiritQiSetSqiThreshold(SQI_TH_0); SpiritQiSqiCheck(S_ENABLE); /* rx timeout config */ SpiritTimerSetRxTimeoutMs(1000.0); //SET_INFINITE_RX_TIMEOUT(); SpiritTimerSetRxTimeoutStopCondition(SQI_ABOVE_THRESHOLD); /* IRQ registers blanking */ SpiritIrqClearStatus(); #ifdef PIGGYBACKING /* payload length config */ SpiritPktStackSetPayloadLength(20); /* write piggybacking data */ SpiritSpiWriteLinearFifo(20, vectcTxBuff); #endif #ifdef STM8L enableInterrupts(); #elif SDK SdkEvalM2SGpioInterruptCmd(M2S_GPIO_3,0x0A,0x0A,ENABLE); #endif /* RX command */ SpiritCmdStrobeRx(); while (1){ } }
void M2S_GPIO_3_EXTI_IRQ_HANDLER(void) #endif { /* Check the flag status of EXTI line */ if(EXTI_GetITStatus(M2S_GPIO_3_EXTI_LINE)){ /* Get the IRQ status */ SpiritIrqGetStatus(&xIrqStatus); /* Check the SPIRIT RX_DATA_DISC IRQ flag */ if(xIrqStatus.IRQ_RX_DATA_DISC) { SpiritCmdStrobeRx() SdkEvalLedToggle(LED1); } /* Check the SPIRIT TX_DATA_SENT IRQ flag for the acknoledgement */ if(xIrqStatus.IRQ_TX_DATA_SENT) { // SdkEvalLedToggle(LED1); #ifdef PIGGYBACKING SpiritSpiWriteLinearFifo(20, vectcTxBuff); printf("Loaded piggybacking data: ["); for(uint8_t i=0 ; i<20 ; i++) printf("%d ", vectcTxBuff[i]); printf("]\n\r"); #endif SpiritCmdStrobeRx(); } /* Check the SPIRIT RX_DATA_READY IRQ flag */ if(xIrqStatus.IRQ_RX_DATA_READY) { /* Get the RX FIFO size */ cRxData=SpiritLinearFifoReadNumElementsRxFifo(); /* Read the RX FIFO */ SpiritSpiReadLinearFifo(cRxData, vectcRxBuff); /* Flush the RX FIFO */ SpiritCmdStrobeFlushRxFifo(); /* A simple way to control if the received data sequence is correct (in this case LED2 will toggle) */ { SpiritBool correct=S_TRUE; for(uint8_t i=0 ; i<cRxData ; i++) if(vectcRxBuff[i] != i+1) correct=S_FALSE; if(correct) SdkEvalLedToggle(LED2); } #ifdef USE_VCOM /* print the received data */ printf("B data received: ["); for(uint8_t i=0 ; i<cRxData ; i++) printf("%d ", vectcRxBuff[i]); printf("]\r\n"); #endif } /* Clear the EXTI line flag */ EXTI_ClearITPendingBit(M2S_GPIO_3_EXTI_LINE); } }
/** * @brief System main function. * @param None * @retval None */ void main (void) { SDK_SYSTEM_CONFIG(); #ifdef USE_VCOM #ifdef STM8L SdkEvalComInit(115200,USART_WordLength_8b,USART_StopBits_1,USART_Parity_No,(USART_Mode_TypeDef)(USART_Mode_Rx | USART_Mode_Tx)); #elif SDK /* VC config */ SdkEvalVCInit(); while(bDeviceState != CONFIGURED); #endif #endif /* Spirit ON */ SpiritEnterShutdown(); SpiritExitShutdown(); SpiritManagementWaExtraCurrent(); #ifdef STM8L /* Manually set the XTAL_FREQUENCY */ SpiritRadioSetXtalFrequency(XTAL_FREQUENCY); /* Initialize the frequency offset variable to compensate XTAL offset */ xRadioInit.lFrequencyBase = xRadioInit.lFrequencyBase + FREQUENCY_OFFSET; /* Initialize the signals to drive the range extender application board */ RANGE_EXT_INIT(RANGE_TYPE); #elif SDK SpiritManagementIdentificationRFBoard(); /* if the board has eeprom, we can compensate the offset calling SpiritManagementGetOffset (if eeprom is not present this fcn will return 0) */ xRadioInit.lFrequencyBase = xRadioInit.lFrequencyBase + SpiritManagementGetOffset(); /* Initialize the signals to drive the range extender application board */ SpiritManagementRangeExtInit(); #endif /* Spirit IRQ config */ SpiritGpioInit(&xGpioIRQ); /* Spirit Radio config */ SpiritRadioInit(&xRadioInit); /* Spirit Radio set power */ SpiritRadioSetPALeveldBm(7,POWER_DBM); SpiritRadioSetPALevelMaxIndex(7); /* Spirit Packet config */ SpiritPktStackInit(&xStackInit); SpiritPktStackLlpInit(&xStackLLPInit); /* Spirit IRQs enable */ SpiritIrqDeInit(NULL); SpiritIrq(TX_DATA_SENT , S_ENABLE); SpiritIrq(RX_DATA_READY, S_ENABLE); SpiritIrq(MAX_RE_TX_REACH, S_ENABLE); EXTI_ClearITPendingBit(M2S_GPIO_3_EXTI_LINE); SdkEvalM2SGpioInit(M2S_GPIO_3,M2S_MODE_EXTI_IN); /* payload length config */ SpiritPktStackSetPayloadLength(20); /* enable SQI check */ SpiritQiSetSqiThreshold(SQI_TH_0); SpiritQiSqiCheck(S_ENABLE); /* rx timeout config */ SpiritTimerSetRxTimeoutMs(200.0); SpiritTimerSetRxTimeoutStopCondition(SQI_ABOVE_THRESHOLD); /* require ack from the receiver */ SpiritPktStackRequireAck(S_ENABLE); /* IRQ registers blanking */ SpiritIrqClearStatus(); #ifdef STM8L enableInterrupts(); #elif SDK SdkEvalM2SGpioInterruptCmd(M2S_GPIO_3,0x0A,0x0A,ENABLE); #endif /* infinite loop */ while (1){ #ifdef USE_VCOM printf("A data to transmit: ["); for(uint8_t i=0 ; i<20 ; i++) printf("%d ", vectcTxBuff[i]); printf("]\r\n"); #endif /* fit the TX FIFO */ SpiritCmdStrobeFlushTxFifo(); SpiritSpiWriteLinearFifo(20, vectcTxBuff); /* send the TX command */ SpiritCmdStrobeTx(); /* wait for TX done */ while(!xTxDoneFlag); xTxDoneFlag = RESET; /* Delay after reset */ SdkDelayMs(500); } }
/** * @brief System main function. * @param None * @retval None */ void main (void) { SDK_SYSTEM_CONFIG(); #ifdef USE_VCOM #ifdef STM8L SdkEvalComInit(115200,USART_WordLength_8b,USART_StopBits_1,USART_Parity_No,(USART_Mode_TypeDef)(USART_Mode_Rx | USART_Mode_Tx)); #elif SDK /* VC config */ SdkEvalVCInit(); while(bDeviceState != CONFIGURED); #endif #endif /* Spirit ON */ SpiritEnterShutdown(); SpiritExitShutdown(); SpiritManagementWaExtraCurrent(); #ifdef STM8L /* Manually set the XTAL_FREQUENCY */ SpiritRadioSetXtalFrequency(XTAL_FREQUENCY); /* Initialize the frequency offset variable to compensate XTAL offset */ xRadioInit.lFrequencyBase = xRadioInit.lFrequencyBase + FREQUENCY_OFFSET; /* Initialize the signals to drive the range extender application board */ RANGE_EXT_INIT(RANGE_TYPE); #elif SDK SpiritManagementIdentificationRFBoard(); /* if the board has eeprom, we can compensate the offset calling SpiritManagementGetOffset (if eeprom is not present this fcn will return 0) */ xRadioInit.lFrequencyBase = xRadioInit.lFrequencyBase + SpiritManagementGetOffset(); /* Initialize the signals to drive the range extender application board */ SpiritManagementRangeExtInit(); #endif SdkEvalM2SGpioInit(M2S_GPIO_3,M2S_MODE_EXTI_IN); /* Spirit IRQ config */ SpiritGpioInit(&xGpioIRQ); /* Configure some output signals (to be probed with a scope to verify) */ SpiritGpioInit(&xGpio1Tx); SpiritGpioInit(&xGpio0Sleep); /* Spirit Radio config */ SpiritRadioInit(&xRadioInit); SpiritCalibrationRco(S_ENABLE); /* Spirit Radio set power */ SpiritRadioSetPALevelMaxIndex(7); SpiritRadioSetPALeveldBm(7,POWER_DBM); /* Spirit Packet config */ SpiritPktBasicInit(&xBasicInit); /* IRQ registers blanking */ SpiritIrqClearStatus(); #ifdef STM8L enableInterrupts(); #elif SDK SdkEvalM2SGpioInterruptCmd(M2S_GPIO_3,0x0A,0x0A,ENABLE); #endif /* Spirit IRQs enable */ SpiritIrqDeInit(&xIrqStatus); SpiritIrq(TX_DATA_SENT, S_ENABLE); /* payload length config */ SpiritPktBasicSetPayloadLength(20); /* Set the wake Up event every WAKEUP_TIMER ms */ SpiritTimerSetWakeUpTimerMs(WAKEUP_TIMER); SpiritCmdStrobeFlushTxFifo(); /* Enable the LDCR mode */ SpiritTimerLdcrMode(S_ENABLE); /* Send a Tx command */ SpiritCmdStrobeTx(); /* infinite loop */ while (1) { #ifdef USE_VCOM printf("A data to transmit: ["); for(uint8_t i=0 ; i<20 ; i++) printf("%d ", vectcTxBuff[i]); printf("]\n\r"); #endif /* Load the Tx FIFO with 20 bytes of data */ SpiritSpiWriteLinearFifo(20,vectcTxBuff); SpiritRefreshStatus(); /* Wait for the Tx done */ while(!xTxDoneFlag); xTxDoneFlag = RESET; } }