25 #include "S2LP_SDK_Util.h" 46 static volatile FlagStatus s_xTIMChCompareModeRaised = RESET;
51 static volatile uint8_t s_RfModuleBand = 0, s_Tcxo=0;
52 static volatile int32_t s_RfModuleOffset=0;
53 static volatile RangeExtType s_RangeExtType = RANGE_EXT_NONE;
54 static volatile uint32_t s_XtalFrequency=50000000;
55 static volatile S2LPCutType s_S2LPCut = S2LP_CUT_2_1;
56 static TIM_HandleTypeDef TimHandle;
77 HAL_TIM_IRQHandler(&TimHandle);
80 void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
82 s_xTIMChCompareModeRaised = SET;
89 HAL_GPIO_Init(GPIOC, &(GPIO_InitTypeDef){GPIO_PIN_7, GPIO_MODE_OUTPUT_PP, GPIO_NOPULL, GPIO_SPEED_HIGH });
90 HAL_GPIO_WritePin(GPIOC, GPIO_PIN_7, GPIO_PIN_SET);
93 void S2LPManagementRangeExtInit(
void)
96 if(s_RangeExtType==RANGE_EXT_SKYWORKS_868)
98 uint8_t tmp[3]={0x92,0x52,0x2A};
103 RangeExtType S2LPManagementGetRangeExtender(
void)
105 return s_RangeExtType;
108 S2LPCutType S2LPManagementGetCut(
void)
113 static void S2LPManagementSetRangeExtender(RangeExtType xRangeType)
115 s_RangeExtType = xRangeType;
118 static void S2LPManagementSetTcxo(uint8_t tcxo)
123 uint8_t S2LPManagementGetTcxo(
void)
128 void S2LPManagementTcxoInit(
void)
149 uint32_t lMeasuredXtalFrequency;
152 #if defined(USE_STM32L0XX_NUCLEO) || defined(USE_STM32F0XX_NUCLEO) 153 lMeasuredXtalFrequency=50000000;
158 #define SETTLING_PERIODS 40 160 GPIO_TypeDef *pGpioPeriph;
161 GPIO_InitTypeDef GPIO_InitStructure;
162 TIM_IC_InitTypeDef sICConfig;
165 TimHandle.Instance = TIM3;
168 __HAL_RCC_TIM3_CLK_ENABLE();
170 __GPIOB_CLK_ENABLE();
173 uint8_t CaptureNumber=0;
174 uint16_t IC3ReadValue1=0,IC3ReadValue2=0,Capture=0;
175 volatile uint16_t cWtchdg = 0;
176 uint32_t TIMFreq=0,lXoFreq=0,lXoFreqRounded,j=0;
179 GPIO_InitStructure.Mode = GPIO_MODE_AF_PP;
180 GPIO_InitStructure.Speed = GPIO_SPEED_HIGH;
181 GPIO_InitStructure.Pull = GPIO_PULLUP;
182 GPIO_InitStructure.Pin = GPIO_PIN_0;
184 GPIO_InitStructure.Alternate = GPIO_AF2_TIM3;
186 HAL_GPIO_Init(pGpioPeriph, &GPIO_InitStructure);
189 sICConfig.ICPolarity = TIM_ICPOLARITY_RISING;
192 sICConfig.ICSelection = TIM_ICSELECTION_DIRECTTI;
195 sICConfig.ICPrescaler = TIM_ICPSC_DIV8;
198 sICConfig.ICFilter = 0x0;
201 HAL_TIM_IC_ConfigChannel(&TimHandle, &sICConfig, TIM_CHANNEL_3);
204 HAL_TIM_IC_Start_IT(&TimHandle, TIM_CHANNEL_3);
206 HAL_NVIC_SetPriority(TIM3_IRQn, 0x0F, 0x0F);
207 HAL_NVIC_EnableIRQ(TIM3_IRQn);
235 for(uint32_t i=0;i<2*(N_SAMPLES+SETTLING_PERIODS);i++) {
237 while(!s_xTIMChCompareModeRaised && (cWtchdg!=0xFFFF)) {
241 if(cWtchdg==0xFFFF) {
249 s_xTIMChCompareModeRaised = RESET;
252 if(i>=SETTLING_PERIODS*2) {
254 if(CaptureNumber == 0)
257 IC3ReadValue1 = HAL_TIM_ReadCapturedValue(&TimHandle, TIM_CHANNEL_3);
261 else if(CaptureNumber == 1)
264 IC3ReadValue2 = HAL_TIM_ReadCapturedValue(&TimHandle, TIM_CHANNEL_3);
267 if (IC3ReadValue2 > IC3ReadValue1)
270 Capture = (IC3ReadValue2 - IC3ReadValue1) - 1;
275 Capture = ((0xFFFF - IC3ReadValue1) + IC3ReadValue2) - 1;
279 TIMFreq = (uint32_t) SystemCoreClock / Capture;
312 HAL_TIM_IC_Stop(&TimHandle, TIM_CHANNEL_3);
325 lXoFreqRounded=(lXoFreq/1000000)*1000000;
327 lMeasuredXtalFrequency=lXoFreqRounded;
328 if(lXoFreq-lXoFreqRounded > (lXoFreqRounded+1000000)-lXoFreq)
330 lMeasuredXtalFrequency+=1000000;
337 s_XtalFrequency=lMeasuredXtalFrequency;
339 return lMeasuredXtalFrequency;
342 uint32_t S2LPManagementGetXtalFrequency(
void)
344 return s_XtalFrequency;
348 uint32_t S2LPManagementComputeXtalFrequencyGpio2(
void)
356 uint32_t S2LPManagementComputeRcoFrequency(
void)
358 uint32_t lMeasuredRcoFrequency;
360 #if defined(USE_STM32L0XX_NUCLEO) || defined(USE_STM32F0XX_NUCLEO) 361 lMeasuredRcoFrequency=33330;
365 #define RCO_SETTLING_PERIODS 4000 366 #define RCO_N_SAMPLES 10000 368 HAL_NVIC_DisableIRQ(TIM2_IRQn);
370 GPIO_TypeDef *pGpioPeriph;
371 GPIO_InitTypeDef GPIO_InitStructure;
372 TIM_IC_InitTypeDef sICConfig;
375 TimHandle.Instance = TIM3;
377 __HAL_RCC_TIM3_CLK_ENABLE();
378 __GPIOB_CLK_ENABLE();
382 uint8_t CaptureNumber=0;
383 uint16_t IC3ReadValue1=0,IC3ReadValue2=0,Capture=0;
384 volatile uint16_t cWtchdg = 0;
385 uint32_t TIMFreq=0,lXoFreq=0;
389 GPIO_InitStructure.Mode = GPIO_MODE_AF_PP;
390 GPIO_InitStructure.Speed = GPIO_SPEED_HIGH;
391 GPIO_InitStructure.Pull = GPIO_PULLUP;
392 GPIO_InitStructure.Pin = GPIO_PIN_0;
394 GPIO_InitStructure.Alternate = GPIO_AF2_TIM3;
396 HAL_GPIO_Init(pGpioPeriph, &GPIO_InitStructure);
399 sICConfig.ICPolarity = TIM_ICPOLARITY_RISING;
402 sICConfig.ICSelection = TIM_ICSELECTION_DIRECTTI;
405 sICConfig.ICPrescaler = TIM_ICPSC_DIV1;
408 sICConfig.ICFilter = 0x0;
411 HAL_TIM_IC_ConfigChannel(&TimHandle, &sICConfig, TIM_CHANNEL_3);
414 HAL_TIM_IC_Start_IT(&TimHandle, TIM_CHANNEL_3);
417 HAL_NVIC_SetPriority(TIM3_IRQn, 0x0F, 0x0F);
418 HAL_NVIC_EnableIRQ(TIM3_IRQn);
448 for(uint32_t i=0;i<2*(RCO_N_SAMPLES+RCO_SETTLING_PERIODS);i++) {
450 while(!s_xTIMChCompareModeRaised && (cWtchdg!=0xFFFF)) {
453 HAL_TIM_IRQHandler(&TimHandle);
455 if(cWtchdg==0xFFFF) {
463 s_xTIMChCompareModeRaised = RESET;
466 if(i>=RCO_SETTLING_PERIODS*2) {
468 if(CaptureNumber == 0)
471 IC3ReadValue1 = HAL_TIM_ReadCapturedValue(&TimHandle, TIM_CHANNEL_3);
475 else if(CaptureNumber == 1)
478 IC3ReadValue2 = HAL_TIM_ReadCapturedValue(&TimHandle, TIM_CHANNEL_3);
481 if (IC3ReadValue2 > IC3ReadValue1)
484 Capture = (IC3ReadValue2 - IC3ReadValue1) - 1;
489 Capture = ((0xFFFF - IC3ReadValue1) + IC3ReadValue2) - 1;
493 TIMFreq = (uint32_t) SystemCoreClock / Capture;
515 HAL_TIM_IC_Stop(&TimHandle, TIM_CHANNEL_3);
530 lMeasuredRcoFrequency=lXoFreq;
532 HAL_NVIC_EnableIRQ(TIM2_IRQn);
538 return lMeasuredRcoFrequency;
555 for (
int i=0; i<2; i++)
558 if (i==1 && status==0)
563 if((status&0xF0) == EEPROM_STATUS_SRWD) {
577 if((status&0xF0) == EEPROM_STATUS_SRWD) {
593 void S2LPManagementSetBand(uint8_t value)
595 s_RfModuleBand = value;
598 uint8_t S2LPManagementGetBand(
void)
600 return s_RfModuleBand;
603 void S2LPManagementSetOffset(int32_t value)
605 s_RfModuleOffset=value;
608 int32_t S2LPManagementGetOffset(
void)
610 return s_RfModuleOffset;
613 void S2LPManagementIdentificationRFBoard(
void)
620 for(
volatile uint8_t i=0; i!=0xFF; i++);
629 s_S2LPCut=(S2LPCutType)tmp;
631 if((s_S2LPCut==S2LP_CUT_2_0) || (s_S2LPCut==S2LP_CUT_2_1))
650 uint8_t tmpBuffer[32];
654 if(tmpBuffer[0]==0 || tmpBuffer[0]==0xFF) {
657 if((s_S2LPCut==S2LP_CUT_2_0) || (s_S2LPCut==S2LP_CUT_2_1))
664 switch(tmpBuffer[1]) {
691 for(uint8_t i=0;i<4;i++)
693 ((uint8_t*)&xtal)[i]=tmpBuffer[30-i];
705 S2LPManagementSetTcxo(1);
708 S2LPManagementSetBand(tmpBuffer[3]);
710 RangeExtType range=RANGE_EXT_NONE;
713 range = RANGE_EXT_SKYWORKS_868;
715 S2LPManagementSetRangeExtender(range);
719 if(*(uint32_t*)tmpBuffer != 0xffffffff)
721 for(uint8_t i=0;i<4;i++)
723 ((uint8_t*)&foffset)[i]=tmpBuffer[3-i];
726 if(foffset<-100000 || foffset>100000)
731 S2LPManagementSetOffset((int32_t)foffset);
734 if((s_S2LPCut==S2LP_CUT_2_0) || (s_S2LPCut==S2LP_CUT_2_1))
744 void S2LPManagementRcoCalibration(
void)
763 while((tmp[0]&0x10)==0);
769 tmp[1]=(tmp[1]&0x80)|(tmp2&0x7F);
void S2LPManagementEnableTcxo(void)
void EepromSpiInitialization(void)
Initializes the SPI for the EEPROM. SPI, MISO, MOSI and SCLK are the same used for the SPIRIT1....
StatusBytes SdkEvalSpiReadRegisters(uint8_t cRegAddress, uint8_t cNbBytes, uint8_t *pcBuffer)
Read single or multiple registers.
uint32_t S2LPManagementComputeXtalFrequency(void)
This function can be used to automatically measure the XTAL frequency making use of the Spirit clock ...
S2LP Status. This definition represents the single field of the S2LP status returned on each SPI tran...
void S2LPRadioSetXtalFrequency(uint32_t lXtalFrequency)
Set the XTAL frequency.
void TIM3_IRQHandler(void)
This function handles TIM3 global interrupt.
uint8_t SdkEvalGetHasEeprom(void)
This function is to query if EEPROM is present or not.
StatusBytes SdkEvalSpiWriteRegisters(uint8_t cRegAddress, uint8_t cNbBytes, uint8_t *pcBuffer)
Write single or multiple registers.
void SdkEvalSetHasEeprom(uint8_t eeprom)
This function is to set if EEPROM is present or not.
void EepromRead(uint16_t nAddress, uint8_t cNbBytes, uint8_t *pcBuffer)
Read a page of the EEPROM. A page size is 32 bytes. The pages are 256. Page 0 address: 0x0000 Page 1 ...
void SdkEvalEnterShutdown(void)
Puts at logic 1 the SDN pin.
uint8_t EepromStatus(void)
Read the status register.
void SdkEvalExitShutdown(void)
Put at logic 0 the SDN pin.
void SdkEvalM2SGpioInit(M2SGpioPin xGpio, M2SGpioMode xGpioMode)
Configures MCU GPIO and EXTI Line for GPIOs.
void EepromCsXnucleoPinInitialization(void)
Initialization of the CSn pin of the EEPROM for XNUCLEO boards.
Header file for low level S2LP SPI driver.
uint8_t EepromSetSrwd(void)
Set the ERSR status bit.
StatusBytes SdkEvalSpiCommandStrobes(uint8_t cCommandCode)
Send a command.
void EepromWriteEnable(void)
Set the internal WEL flag to allow write operation.
uint8_t EepromIdentification(void)
Read the status register.