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.