/** * @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 } }
/*---------------------------------------------------------------------------*/ static int spirit_radio_init(void) { PRINTF("RADIO INIT IN\n"); SpiritSpiInit(); /* Configure radio shut-down (SDN) pin and activate radio */ SdkEvalM2SGpioInit(M2S_GPIO_SDN, M2S_MODE_GPIO_OUT); /* Configures the SPIRIT1 library */ SpiritRadioSetXtalFrequency(XTAL_FREQUENCY); SpiritManagementSetVersion(SPIRIT1_VERSION); SpiritGeneralSetSpiritVersion(SPIRIT1_VERSION); SpiritManagementSetXtalFrequency(XTAL_FREQUENCY); /* wake up to READY state */ /* weirdly enough, this *should* actually *set* the pin, not clear it! The pins is declared as GPIO_pin13 == 0x2000 */ M2S_GPIO_SDN_PORT->BSRRL = M2S_GPIO_SDN_PIN; /* GPIOC->BSRRL = M2S_GPIO_SDN_PIN;*/ GPIO_ResetBits(M2S_GPIO_SDN_PORT, M2S_GPIO_SDN_PIN); /* wait minimum 1.5 ms to allow SPIRIT1 a proper boot-up sequence */ BUSYWAIT_UNTIL(0, 3 * RTIMER_SECOND/2000); /* Soft reset of core */ spirit1_strobe(SPIRIT1_STROBE_SRES); /* SpiritCmdStrobeSres();*/ /* Configures the SPIRIT1 radio part */ SRadioInit xRadioInit = { XTAL_FREQUENCY, XTAL_OFFSET_PPM, BASE_FREQUENCY, CHANNEL_SPACE, CHANNEL_NUMBER, MODULATION_SELECT, DATARATE, FREQ_DEVIATION, BANDWIDTH }; SpiritRadioInit(&xRadioInit); SpiritRadioSetPALeveldBm(0,POWER_DBM); SpiritRadioSetPALevelMaxIndex(0); /* Configures the SPIRIT1 packet handler part*/ PktBasicInit xBasicInit = { PREAMBLE_LENGTH, SYNC_LENGTH, SYNC_WORD, LENGTH_TYPE, LENGTH_WIDTH, CRC_MODE, CONTROL_LENGTH, EN_ADDRESS, EN_FEC, EN_WHITENING }; SpiritPktBasicInit(&xBasicInit); /* Enable the following interrupt sources, routed to GPIO */ SpiritIrqDeInit(NULL); SpiritIrqClearStatus(); SpiritIrq(TX_DATA_SENT, S_ENABLE); SpiritIrq(RX_DATA_READY,S_ENABLE); SpiritIrq(VALID_SYNC,S_ENABLE); SpiritIrq(RX_DATA_DISC, S_ENABLE); SpiritIrq(TX_FIFO_ERROR, S_ENABLE); SpiritIrq(RX_FIFO_ERROR, S_ENABLE); /* Configure Spirit1 */ SpiritRadioPersistenRx(S_ENABLE); SpiritQiSetSqiThreshold(SQI_TH_0); SpiritQiSqiCheck(S_ENABLE); SpiritQiSetRssiThresholddBm(CCA_THRESHOLD); SpiritTimerSetRxTimeoutStopCondition(SQI_ABOVE_THRESHOLD); SET_INFINITE_RX_TIMEOUT(); SpiritRadioAFCFreezeOnSync(S_ENABLE); /* Puts the SPIRIT1 in STANDBY mode (125us -> rx/tx) */ spirit1_strobe(SPIRIT1_STROBE_STANDBY); /* SpiritCmdStrobeCommand(SPIRIT1_STROBE_STANDBY);*/ /* SpiritCmdStrobeStandby();*/ spirit_on = OFF; CLEAR_RXBUF(); CLEAR_TXBUF(); /* Initializes the mcu pin as input, used for IRQ */ SdkEvalM2SGpioInit(M2S_GPIO_0, M2S_MODE_EXTI_IN); SdkEvalM2SGpioInit(M2S_GPIO_1, M2S_MODE_EXTI_IN); SdkEvalM2SGpioInit(M2S_GPIO_2, M2S_MODE_EXTI_IN); SdkEvalM2SGpioInit(M2S_GPIO_3, M2S_MODE_EXTI_IN); /* Configure the radio to route the IRQ signal to its GPIO 3 */ SpiritGpioInit(&(SGpioInit){SPIRIT_GPIO_3, SPIRIT_GPIO_MODE_DIGITAL_OUTPUT_LP, SPIRIT_GPIO_DIG_OUT_IRQ}); process_start(&spirit_radio_process, NULL); PRINTF("Spirit1 init done\n"); return 0; }
/** * @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){ } }
/** * @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 this function sets the radio power * @param uint8_t cIndex, float fPowerdBm * @retval None */ void Spirit1SetPower(uint8_t cIndex, float fPowerdBm) { /* Spirit Radio set power */ SpiritRadioSetPALeveldBm(cIndex,fPowerdBm); SpiritRadioSetPALevelMaxIndex(cIndex); }
/** * @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; } }