Appiko
S2LP_Radio.c
Go to the documentation of this file.
1 
25 /* Includes ------------------------------------------------------------------*/
26 #include "S2LP_Radio.h"
27 #include "S2LP_Config.h"
28 #include "MCU_Interface.h"
29 
30 
45 #define MAX_PA_VALUE 14
46 #define MIN_PA_VALUE -31
47 
48 #define VCO_CENTER_FREQ 3600000000
50 #define HIGH_BAND_FACTOR 4
51 #define MIDDLE_BAND_FACTOR 8
53 #define HIGH_BAND_LOWER_LIMIT 825900000
54 #define HIGH_BAND_UPPER_LIMIT 1056000000
55 #define MIDDLE_BAND_LOWER_LIMIT 412900000
56 #define MIDDLE_BAND_UPPER_LIMIT 527100000
58 #define MINIMUM_DATARATE 100
59 #define MAXIMUM_DATARATE 250000
71 #define IS_PA_MAX_INDEX(INDEX) ((INDEX)<=7)
72 #define IS_PAPOWER_DBM(PATABLE) ((PATABLE)>= (MIN_PA_VALUE) && (PATABLE)<=(MAX_PA_VALUE))
73 #define IS_PAPOWER(PATABLE) ((PATABLE)<=90)
74 #define IS_PA_STEP_WIDTH(WIDTH) ((WIDTH)>=1 && (WIDTH)<=4)
75 
76 #define IS_MODULATION(MOD) (((MOD) == MOD_NO_MOD) || \
77  ((MOD) == MOD_2FSK) || \
78  ((MOD) == MOD_4FSK) || \
79  ((MOD) == MOD_2GFSK_BT05) || \
80  ((MOD) == MOD_2GFSK_BT1) || \
81  ((MOD) == MOD_4GFSK_BT05) || \
82  ((MOD) == MOD_4GFSK_BT1) || \
83  ((MOD) == MOD_ASK_OOK) || \
84  ((MOD) == MOD_POLAR))
85 
86 #define IS_AFC_MODE(MODE) (MODE<=1)
87 #define IS_AFC_GAIN(GAIN) (GAIN<=15)
88 #define IS_ISI_EQU(MODE) (MODE<=2)
89 #define IS_CLKREC_MODE(MODE) (MODE<=1)
90 #define IS_CLKREC_P_GAIN(GAIN) (GAIN<=7)
91 #define IS_CLKREC_I_GAIN(GAIN) (GAIN<=15)
92 
93 
94 #define IS_FREQUENCY_BAND_HIGH(FREQUENCY) ((FREQUENCY)>=HIGH_BAND_LOWER_LIMIT && \
95  (FREQUENCY)<=HIGH_BAND_UPPER_LIMIT)
96 
97 #define IS_FREQUENCY_BAND_MIDDLE(FREQUENCY) ((FREQUENCY)>=MIDDLE_BAND_LOWER_LIMIT && \
98  (FREQUENCY)<=MIDDLE_BAND_UPPER_LIMIT)
99 
100 #define IS_FREQUENCY_BAND(FREQUENCY) (IS_FREQUENCY_BAND_HIGH(FREQUENCY) || \
101  IS_FREQUENCY_BAND_MIDDLE(FREQUENCY))
102 
103 #define IS_CHANNEL_SPACE(CHANNELSPACE, F_Xo) (CHANNELSPACE<=(F_Xo/32768*255))
104 
105 
106 #define IS_DATARATE(DATARATE, F_CLK) (DATARATE>=MINIMUM_DATARATE && DATARATE<=((uint64_t)MAXIMUM_DATARATE*F_CLK/1000000)/26)
107 
108 
109 #define F_DEV_LOWER_LIMIT(F_Xo) (F_Xo>>22)
110 #define F_DEV_UPPER_LIMIT(F_Xo) (((uint64_t)787109*F_Xo/1000000)/26)
111 #define IS_F_DEV(FDEV,F_Xo) (FDEV>=F_DEV_LOWER_LIMIT(F_Xo) && FDEV<=F_DEV_UPPER_LIMIT(F_Xo))
112 
113 #define CH_BW_LOWER_LIMIT(F_CLK) (((uint64_t)1100*F_CLK/1000000)/26)
114 #define CH_BW_UPPER_LIMIT(F_CLK) (((uint64_t)800100*F_CLK/1000000)/26)
116 #define IS_CH_BW(BW,F_Xo) ((BW)>=CH_BW_LOWER_LIMIT(F_Xo) && (BW)<=CH_BW_UPPER_LIMIT(F_Xo))
117 
130 static uint32_t s_lXtalFrequency=50000000;
131 
132 
138 static const uint16_t s_vectnBandwidth26M[90]=
139 {
140  8001, 7951, 7684, 7368, 7051, 6709, 6423, 5867, 5414, \
141  4509, 4259, 4032, 3808, 3621, 3417, 3254, 2945, 2703, \
142  2247, 2124, 2015, 1900, 1807, 1706, 1624, 1471, 1350, \
143  1123, 1062, 1005, 950, 903, 853, 812, 735, 675, \
144  561, 530, 502, 474, 451, 426, 406, 367, 337, \
145  280, 265, 251, 237, 226, 213, 203, 184, 169, \
146  140, 133, 126, 119, 113, 106, 101, 92, 84, \
147  70, 66, 63, 59, 56, 53, 51, 46, 42, \
148  35, 33, 31, 30, 28, 27, 25, 23, 21, \
149  18, 17, 16, 15, 14, 13, 13, 12, 11
150 };
151 
152 
161 uint32_t S2LPRadioComputeDatarate(uint16_t cM, uint8_t cE);
162 void S2LPRadioSearchDatarateME(uint32_t lDatarate, uint16_t* pcM, uint8_t* pcE);
163 void S2LPRadioSearchFreqDevME(uint32_t lFDev, uint8_t* pcM, uint8_t* pcE);
164 void S2LPRadioSearchChannelBwME(uint32_t lBandwidth, uint8_t* pcM, uint8_t* pcE);
165 uint32_t S2LPRadioComputeDatarate(uint16_t cM, uint8_t cE);
166 uint32_t S2LPRadioComputeFreqDeviation(uint8_t cM, uint8_t cE, uint8_t bs, uint8_t refdiv);
167 uint32_t S2LPRadioComputeChannelFilterBw(uint8_t cM, uint8_t cE);
168 uint32_t S2LPRadioComputeFrequencyBase(uint32_t lSynthWord, uint8_t bs, uint8_t refdiv);
169 uint32_t S2LPRadioComputeSynthWord(uint32_t frequency, uint8_t refdiv);
170 uint8_t S2LPRadioComputeChannelSpacingRegValue(uint32_t lChannelSpace);
171 uint32_t S2LPRadioComputeChannelSpacing(uint8_t cChSpaceRegVal);
172 void S2LPRadioSearchWCP(uint8_t* cp_isel, uint8_t* pfd_split, uint32_t lFc, uint8_t refdiv);
173 void S2LPRadioComputeIF(uint32_t nIF, uint8_t* pcAnaIf, uint8_t* pcPcDigIf);
174 
192 void S2LPRadioSearchDatarateME(uint32_t lDatarate, uint16_t* pcM, uint8_t* pcE)
193 {
194  uint32_t lDatarateTmp, f_dig=s_lXtalFrequency;
195  uint8_t uDrE;
196  uint64_t tgt1,tgt2,tgt;
197 
198  if(f_dig>DIG_DOMAIN_XTAL_THRESH) {
199  f_dig >>= 1;
200  }
201 
202  /* Search the exponent value */
203  for(uDrE = 0; uDrE != 12; uDrE++) {
204  lDatarateTmp = S2LPRadioComputeDatarate(0xFFFF, uDrE);
205  if(lDatarate<=lDatarateTmp)
206  break;
207  }
208  (*pcE) = (uint8_t)uDrE;
209 
210  if(uDrE==0) {
211  tgt=((uint64_t)lDatarate)<<32;
212  (*pcM) = (uint16_t)(tgt/f_dig);
213  tgt1=(uint64_t)f_dig*(*pcM);
214  tgt2=(uint64_t)f_dig*((*pcM)+1);
215  }
216  else {
217  tgt=((uint64_t)lDatarate)<<(33-uDrE);
218  (*pcM) = (uint16_t)((tgt/f_dig)-65536);
219  tgt1=(uint64_t)f_dig*((*pcM)+65536);
220  tgt2=(uint64_t)f_dig*((*pcM)+1+65536);
221  }
222 
223 
224  (*pcM)=((tgt2-tgt)<(tgt-tgt1))?((*pcM)+1):(*pcM);
225 
226 }
227 
236 void S2LPRadioSearchFreqDevME(uint32_t lFDev, uint8_t* pcM, uint8_t* pcE)
237 {
238  uint8_t uFDevE, tmp, bs = MIDDLE_BAND_FACTOR, refdiv = 1;
239  uint32_t lFDevTmp;
240  uint64_t tgt1,tgt2,tgt;
241 
242  s_assert_param(IS_F_DEV(lFDev, s_lXtalFrequency));
243 
244  S2LPSpiReadRegisters(SYNT3_ADDR, 1, &tmp);
245  if((tmp&BS_REGMASK) == 0) {
246  bs = HIGH_BAND_FACTOR;
247  }
248 
249  if(S2LPRadioGetRefDiv()) {
250  refdiv = 2;
251  }
252 
253  /* Search the exponent of the frequency deviation value */
254  for(uFDevE = 0; uFDevE != 12; uFDevE++) {
255  lFDevTmp = S2LPRadioComputeFreqDeviation(255, uFDevE, bs, refdiv);
256  if(lFDev<lFDevTmp)
257  break;
258  }
259  (*pcE) = (uint8_t)uFDevE;
260 
261  if(uFDevE==0)
262  {
263  tgt=((uint64_t)lFDev)<<22;
264  (*pcM)=(uint32_t)(tgt/s_lXtalFrequency);
265  tgt1=(uint64_t)s_lXtalFrequency*(*pcM);
266  tgt2=(uint64_t)s_lXtalFrequency*((*pcM)+1);
267  }
268  else
269  {
270  tgt=((uint64_t)lFDev)<<(23-uFDevE);
271  (*pcM)=(uint32_t)(tgt/s_lXtalFrequency)-256;
272  tgt1=(uint64_t)s_lXtalFrequency*((*pcM)+256);
273  tgt2=(uint64_t)s_lXtalFrequency*((*pcM)+1+256);
274  }
275 
276  (*pcM)=((tgt2-tgt)<(tgt-tgt1))?((*pcM)+1):(*pcM);
277 }
278 
279 
291 void S2LPRadioSearchChannelBwME(uint32_t lBandwidth, uint8_t* pcM, uint8_t* pcE)
292 {
293  int8_t i, i_tmp;
294  uint32_t f_dig=s_lXtalFrequency;
295  int32_t chfltCalculation[3];
296 
297 
298  if(f_dig>DIG_DOMAIN_XTAL_THRESH) {
299  f_dig >>= 1;
300  }
301 
302  s_assert_param(IS_CH_BW(lBandwidth,f_dig));
303 
304  /* Search the channel filter bandwidth table index */
305  for(i=0;i<90 && (lBandwidth<(uint32_t)(((uint64_t)s_vectnBandwidth26M[i]*f_dig)/260000));i++);
306 
307  if(i!=0) {
308  /* Finds the index value with best approximation in i-1, i and i+1 elements */
309  i_tmp = i;
310 
311  for(uint8_t j=0;j<3;j++) {
312  if(((i_tmp+j-1)>=0) && ((i_tmp+j-1)<=89)) {
313  chfltCalculation[j] = (int32_t)lBandwidth - (int32_t)(((uint64_t)s_vectnBandwidth26M[i_tmp+j-1]*f_dig)/260000);
314  }
315  else {
316  chfltCalculation[j] = 0x7FFFFFFF;
317  }
318  }
319  uint32_t chfltDelta = 0xFFFFFFFF;
320 
321  for(uint8_t j=0;j<3;j++) {
322  if(S_ABS(chfltCalculation[j])<chfltDelta) {
323  chfltDelta = S_ABS(chfltCalculation[j]);
324  i=i_tmp+j-1;
325  }
326  }
327  }
328  (*pcE) = (uint8_t)(i/9);
329  (*pcM) = (uint8_t)(i%9);
330 
331 }
332 
341 uint32_t S2LPRadioComputeDatarate(uint16_t cM, uint8_t cE)
342 {
343  uint32_t f_dig=s_lXtalFrequency;
344  uint64_t dr;
345 
346  if(f_dig>DIG_DOMAIN_XTAL_THRESH) {
347  f_dig >>= 1;
348  }
349 
350  if(cE==0) {
351  dr=((uint64_t)f_dig*cM);
352  return (uint32_t)(dr>>32);
353  }
354 
355  dr=((uint64_t)f_dig)*((uint64_t)cM+65536);
356 
357  return (uint32_t)(dr>>(33-cE));
358 }
359 
368 uint32_t S2LPRadioComputeFreqDeviation(uint8_t cM, uint8_t cE, uint8_t bs, uint8_t refdiv)
369 {
370  uint32_t f_xo=s_lXtalFrequency;
371 
372  if(cE==0) {
373  return (uint32_t)(((uint64_t)f_xo*cM)>>22);
374  }
375 
376  return (uint32_t)(((uint64_t)f_xo*(256+cM))>>(23-cE));
377 }
378 
379 
386 uint32_t S2LPRadioComputeChannelFilterBw(uint8_t cM, uint8_t cE)
387 {
388  uint32_t f_dig=s_lXtalFrequency;
389 
390  if(f_dig>DIG_DOMAIN_XTAL_THRESH) {
391  f_dig >>= 1;
392  }
393 
394  return (uint32_t)((uint64_t)100*s_vectnBandwidth26M[cM+(cE*9)]*f_dig/26000000);
395 
396 }
397 
398 
406 uint32_t S2LPRadioComputeFrequencyBase(uint32_t lSynthWord, uint8_t bs, uint8_t refdiv)
407 {
408  return (uint32_t)((((uint64_t)s_lXtalFrequency*lSynthWord)>>19)/bs/refdiv);
409 }
410 
411 
418 uint32_t S2LPRadioComputeSynthWord(uint32_t frequency, uint8_t refdiv)
419 {
420  uint8_t band;
421 
422  if(IS_FREQUENCY_BAND_HIGH(frequency)) {
423  band = HIGH_BAND_FACTOR;
424  }
425  else {
426  band = MIDDLE_BAND_FACTOR;
427  }
428 
429  uint64_t tgt1,tgt2,tgt;
430  uint32_t synth;
431 
432  tgt = (((uint64_t)frequency)<<19)*(band*refdiv);
433  synth=(uint32_t)(tgt/s_lXtalFrequency);
434  tgt1 = (uint64_t)s_lXtalFrequency*(synth);
435  tgt2 = (uint64_t)s_lXtalFrequency*(synth+1);
436 
437  synth=((tgt2-tgt)<(tgt-tgt1))?(synth+1):(synth);
438 
439  return synth;
440 }
441 
442 
449 uint8_t S2LPRadioComputeChannelSpacingRegValue(uint32_t lChannelSpace)
450 {
451  return (uint32_t)(((uint64_t)lChannelSpace)<<15)/s_lXtalFrequency;
452 }
453 
454 
461 uint32_t S2LPRadioComputeChannelSpacing(uint8_t cChSpaceRegVal)
462 {
463  return (uint32_t)(((uint64_t)s_lXtalFrequency*cChSpaceRegVal)>>15);
464 }
465 
466 
475 void S2LPRadioComputeIF(uint32_t nIF, uint8_t* pcAnaIf, uint8_t* pcDigIf)
476 {
477  uint32_t f_dig=s_lXtalFrequency;
478 
479  if(f_dig>DIG_DOMAIN_XTAL_THRESH) {
480  f_dig >>= 1;
481  }
482 
483  (*pcAnaIf)=(uint8_t)((((uint64_t)nIF)<<13)*3/s_lXtalFrequency-100);
484  (*pcDigIf)=(uint8_t)((((uint64_t)nIF)<<13)*3/f_dig-100);
485 }
486 
487 
499 void S2LPRadioSearchWCP(uint8_t* cp_isel, uint8_t* pfd_split, uint32_t lFc, uint8_t refdiv)
500 {
501  uint32_t vcofreq, lFRef;
502  uint8_t BFactor = MIDDLE_BAND_FACTOR;
503 
504  s_assert_param(IS_FREQUENCY_BAND(lFc));
505 
506  /* Search the operating band */
507  if(IS_FREQUENCY_BAND_HIGH(lFc)) {
508  BFactor = HIGH_BAND_FACTOR;
509  }
510 
511  /* Calculates the VCO frequency VCOFreq = lFc*B */
512  vcofreq = lFc*BFactor;
513 
514  /* Calculated the reference frequency clock */
515  lFRef = s_lXtalFrequency/refdiv;
516 
517  /* Set the correct charge pump word */
518  if(vcofreq>=VCO_CENTER_FREQ) {
519  if(lFRef>DIG_DOMAIN_XTAL_THRESH) {
520  *cp_isel = 0x02;
521  *pfd_split = 0;
522  }
523  else {
524  *cp_isel = 0x01;
525  *pfd_split = 1;
526  }
527  }
528  else {
529  if(lFRef>DIG_DOMAIN_XTAL_THRESH) {
530  *cp_isel = 0x03;
531  *pfd_split = 0;
532  }
533  else {
534  *cp_isel = 0x02;
535  *pfd_split = 1;
536  }
537  }
538 
539 }
540 
541 
559 uint8_t S2LPRadioInit(SRadioInit* pxSRadioInitStruct)
560 {
561  uint8_t tmpBuffer[6], tmp8, dr_e, fdev_m, fdev_e, bw_m, bw_e;
562  uint16_t dr_m;
563  SFunctionalState xState;
564 
565  s_assert_param(IS_FREQUENCY_BAND(pxSRadioInitStruct->lFrequencyBase));
566  s_assert_param(IS_MODULATION(pxSRadioInitStruct->xModulationSelect));
567  s_assert_param(IS_DATARATE(pxSRadioInitStruct->lDatarate,s_lXtalFrequency));
568  s_assert_param(IS_F_DEV(pxSRadioInitStruct->lFreqDev,s_lXtalFrequency));
569 
570  /* Configure the digital, ADC, SMPS reference clock divider */
571  xState = S2LPRadioGetDigDiv();
572  if(((s_lXtalFrequency<DIG_DOMAIN_XTAL_THRESH) && (xState==S_ENABLE))
573  || ((s_lXtalFrequency>DIG_DOMAIN_XTAL_THRESH) && (xState==S_DISABLE)))
574  {
575  S2LPSpiCommandStrobes(CMD_STANDBY);
576  do{
577  for(volatile uint8_t i=0; i!=0xFF; i++);
578  S2LPRefreshStatus(); // add a timer expiration callback
580 
581  xState = (SFunctionalState)!xState;
582  S2LPRadioSetDigDiv(xState);
583 
584  S2LPSpiCommandStrobes(CMD_READY);
585  do{
586  for(volatile uint8_t i=0; i!=0xFF; i++);
587  S2LPRefreshStatus(); // add a timer expiration callback
589  }
590 
591  if(xState==S_ENABLE) {
592  s_assert_param(IS_CH_BW(pxSRadioInitStruct->lBandwidth,(s_lXtalFrequency>>1)));
593  }
594  else {
595  s_assert_param(IS_CH_BW(pxSRadioInitStruct->lBandwidth,s_lXtalFrequency));
596  }
597 
598  /* Intermediate Frequency setting */
599  S2LPRadioComputeIF(300000, &tmpBuffer[0], &tmpBuffer[1]);
600  S2LPSpiWriteRegisters(IF_OFFSET_ANA_ADDR, 2, tmpBuffer);
601 
602  /* Calculates the datarate register values */
603  S2LPRadioSearchDatarateME(pxSRadioInitStruct->lDatarate, &dr_m, &dr_e);
604  tmpBuffer[0] = (uint8_t)(dr_m>>8);
605  tmpBuffer[1] = (uint8_t)dr_m;
606  tmpBuffer[2] = (uint8_t)(pxSRadioInitStruct->xModulationSelect | dr_e);
607 
608 
609 
610  /* Calculates the frequency deviation register values */
611  S2LPRadioSearchFreqDevME(pxSRadioInitStruct->lFreqDev, &fdev_m, &fdev_e);
612  S2LPSpiReadRegisters(MOD1_ADDR, 1, &tmpBuffer[3]);
613  tmpBuffer[3] &= ~FDEV_E_REGMASK;
614  tmpBuffer[3] |= fdev_e;
615  tmpBuffer[4] = fdev_m;
616 
617  /* Calculates the channel filter register values */
618  S2LPRadioSearchChannelBwME(pxSRadioInitStruct->lBandwidth, &bw_m, &bw_e);
619  tmpBuffer[5] = (bw_m<<4) | bw_e;
620 
621  /* Configures the radio registers */
622  S2LPSpiWriteRegisters(MOD4_ADDR, 6, tmpBuffer);
623 
624  S2LPSpiReadRegisters(PA_POWER0_ADDR, 3, &tmpBuffer[0]);
625 
626  /* if OOK is selected enable the PA_FC else enable it */
627  if((pxSRadioInitStruct->xModulationSelect)!=MOD_ASK_OOK)
628  {
629  tmpBuffer[0] &= 0x7F;
630  tmpBuffer[1] &= 0xFD;
631  }
632  else
633  {
634  tmpBuffer[0] |= 0x80;
635  tmpBuffer[1] |= 0x02;
636  }
637 
638 
639  tmpBuffer[2]&=0xFC;
640 
641  /* Bessel filter config */
642  if(pxSRadioInitStruct->lDatarate<16000)
643  {
644  tmpBuffer[2]|=0x00;
645  }
646  else if(pxSRadioInitStruct->lDatarate<32000)
647  {
648  tmpBuffer[2]|=0x01;
649  }
650  else if(pxSRadioInitStruct->lDatarate<62500)
651  {
652  tmpBuffer[2]|=0x02;
653  }
654  else
655  {
656  tmpBuffer[2]|=0x03;
657  }
658  S2LPSpiWriteRegisters(PA_POWER0_ADDR, 3, &tmpBuffer[0]);
659 
660  /* Enable the freeze option of the AFC on the SYNC word */
661  S2LPSpiReadRegisters(AFC2_ADDR, 1, &tmp8);
662  tmp8 |= AFC_FREEZE_ON_SYNC_REGMASK; S2LPSpiWriteRegisters(AFC2_ADDR, 1, &tmp8);
663 
664  return S2LPRadioSetFrequencyBase(pxSRadioInitStruct->lFrequencyBase);
665 
666 }
667 
668 
675 void S2LPRadioGetInfo(SRadioInit* pxSRadioInitStruct)
676 {
677  uint8_t tmpBuffer[6];
678  uint8_t band, cRefDiv, dr_e, fdev_m, fdev_e, bw_e, bw_m;
679  uint16_t dr_m;
680  uint32_t tmp32;
681 
682  S2LPSpiReadRegisters(SYNT3_ADDR, 4, tmpBuffer);
683 
684  /* Reads the operating band masking the Band selected field */
685  if(tmpBuffer[0] & BS_REGMASK) {
686  band = MIDDLE_BAND_FACTOR;
687  }
688  else {
689  band = HIGH_BAND_FACTOR;
690  }
691 
692  /* Computes the synth word */
693  tmp32 = (((uint32_t)(tmpBuffer[0] & SYNT_27_24_REGMASK))<<24) | (((uint32_t)tmpBuffer[1])<<16) | (((uint32_t)tmpBuffer[2])<<8) | ((uint32_t)tmpBuffer[3]);
694 
695  /* Calculates the frequency base */
696  cRefDiv = (uint8_t)S2LPRadioGetRefDiv() + 1;
697 
698  pxSRadioInitStruct->lFrequencyBase = S2LPRadioComputeFrequencyBase(tmp32, band, cRefDiv);
699 
700  /* Reads the radio registers */
701  g_xStatus = S2LPSpiReadRegisters(MOD4_ADDR, 6, tmpBuffer);
702 
703  /* Modulation select */
704  pxSRadioInitStruct->xModulationSelect = (ModulationSelect)(tmpBuffer[2] & MOD_TYPE_REGMASK);
705 
706  /* Reads the frequency deviation for mantissa and exponent */
707  fdev_m = tmpBuffer[4];
708  fdev_e = tmpBuffer[3] & FDEV_E_REGMASK;
709 
710  /* Reads the channel filter register for mantissa and exponent */
711  bw_m = (tmpBuffer[5] & CHFLT_M_REGMASK)>>4;
712  bw_e = tmpBuffer[5] & CHFLT_E_REGMASK;
713 
714  /* Reads the data rate register for mantissa and exponent */
715  dr_m = ((uint16_t)tmpBuffer[0]<<8) | ((uint16_t)tmpBuffer[1]);
716  dr_e = tmpBuffer[2] & DATARATE_E_REGMASK;
717 
718  /* Calculates the datarate */
719  pxSRadioInitStruct->lDatarate = S2LPRadioComputeDatarate(dr_m, dr_e);
720 
721  /* Calculates the frequency deviation */
722  pxSRadioInitStruct->lFreqDev = S2LPRadioComputeFreqDeviation(fdev_m, fdev_e, band, cRefDiv);
723 
724  /* Reads the channel filter bandwidth from the look-up table and return it */
725  pxSRadioInitStruct->lBandwidth = S2LPRadioComputeChannelFilterBw(bw_m, bw_e);
726 
727 }
728 
729 
735 void S2LPRadioSetSynthWord(uint32_t lSynthWord)
736 {
737  uint8_t tmpBuffer[4];
738  uint8_t tmp;
739 
740  S2LPSpiReadRegisters(SYNT3_ADDR, 1, &tmp);
741  tmp &= ~SYNT_27_24_REGMASK;
742 
743  /* Build the array for SYNTH registers */
744  tmpBuffer[0] = (((uint8_t)(lSynthWord>>24)) & SYNT_27_24_REGMASK) | tmp;
745  tmpBuffer[1] = (uint8_t)(lSynthWord>>16);
746  tmpBuffer[2] = (uint8_t)(lSynthWord>>8);
747  tmpBuffer[3] = (uint8_t)lSynthWord;
748 
749  g_xStatus = S2LPSpiWriteRegisters(SYNT3_ADDR, 4, tmpBuffer);
750 }
751 
752 
758 uint32_t S2LPRadioGetSynthWord(void)
759 {
760  uint8_t tmpBuffer[4];
761  g_xStatus = S2LPSpiReadRegisters(SYNT3_ADDR, 4, tmpBuffer);
762  return ((((uint32_t)(tmpBuffer[0] & SYNT_27_24_REGMASK))<<24) | (((uint32_t)tmpBuffer[1])<<16) | (((uint32_t)tmpBuffer[2])<<8) | ((uint32_t)tmpBuffer[3]));
763 }
764 
765 
771 void S2LPRadioSetChannel(uint8_t cChannel)
772 {
773  g_xStatus = S2LPSpiWriteRegisters(CHNUM_ADDR, 1, &cChannel);
774 }
775 
776 
782 uint8_t S2LPRadioGetChannel(void)
783 {
784  uint8_t tmp;
785  g_xStatus = S2LPSpiReadRegisters(CHNUM_ADDR, 1, &tmp);
786  return tmp;
787 }
788 
789 
796 {
797  uint8_t tmp;
798 
799  s_assert_param(IS_SFUNCTIONAL_STATE(xNewState));
800 
801  S2LPSpiReadRegisters(XO_RCO_CONF0_ADDR, 1, &tmp);
802 
803  if(xNewState == S_ENABLE) {
804  tmp |= REFDIV_REGMASK;
805  } else {
806  tmp &= ~REFDIV_REGMASK;
807  }
808  g_xStatus = S2LPSpiWriteRegisters(XO_RCO_CONF0_ADDR, 1, &tmp);
809 }
810 
811 
818 {
819  uint8_t tmp;
820 
821  g_xStatus = S2LPSpiReadRegisters(XO_RCO_CONF0_ADDR, 1, &tmp);
822 
823  if(tmp & REFDIV_REGMASK) {
824  return S_ENABLE;
825  } else {
826  return S_DISABLE;
827  }
828 }
829 
830 
837 {
838  uint8_t tmp;
839 
840  s_assert_param(IS_SFUNCTIONAL_STATE(xNewState));
841 
842  S2LPSpiReadRegisters(XO_RCO_CONF1_ADDR, 1, &tmp);
843 
844  if(xNewState == S_ENABLE) {
845  tmp &= ~PD_CLKDIV_REGMASK;
846  } else {
847  tmp |= PD_CLKDIV_REGMASK;
848  }
849  g_xStatus = S2LPSpiWriteRegisters(XO_RCO_CONF1_ADDR, 1, &tmp);
850 }
851 
852 
858 {
859  uint8_t tmp;
860 
861  g_xStatus = S2LPSpiReadRegisters(XO_RCO_CONF1_ADDR, 1, &tmp);
862 
863  if(tmp & PD_CLKDIV_REGMASK) {
864  return S_DISABLE;
865  } else {
866  return S_ENABLE;
867  }
868 }
869 
870 
877 void S2LPRadioSetChannelSpace(uint32_t lChannelSpace)
878 {
879  uint8_t tmp;
880  tmp = S2LPRadioComputeChannelSpacingRegValue(lChannelSpace);
881  g_xStatus = S2LPSpiWriteRegisters(CH_SPACE_ADDR, 1, &tmp);
882 }
883 
884 
892 {
893  uint8_t tmp;
894  g_xStatus = S2LPSpiReadRegisters(CH_SPACE_ADDR, 1, &tmp);
895  return S2LPRadioComputeChannelSpacing(tmp);
896 }
897 
898 
906 uint8_t S2LPRadioSetFrequencyBase(uint32_t lFBase)
907 {
908  uint32_t tmp32;
909  uint8_t tmpBuffer[4], cp_isel, bs = 1, pfd_split, tmp, cRefDiv;
910 
911  s_assert_param(IS_FREQUENCY_BAND(lFBase));
912 
913  tmp32 = S2LPRadioComputeSynthWord(lFBase, ((uint8_t)S2LPRadioGetRefDiv()+1));
914 
915  if(IS_FREQUENCY_BAND_HIGH(lFBase)) {
916  bs = 0;
917  }
918 
919  cRefDiv = (uint8_t)S2LPRadioGetRefDiv() + 1;
920 
921  /* Search the VCO charge pump word and set the corresponding register */
922  S2LPRadioSearchWCP(&cp_isel, &pfd_split, lFBase, cRefDiv);
923 
924  S2LPSpiReadRegisters(SYNTH_CONFIG2_ADDR, 1, &tmp);
925  tmp &= ~PLL_PFD_SPLIT_EN_REGMASK;
926  tmp |= (pfd_split<<2);
927  S2LPSpiWriteRegisters(SYNTH_CONFIG2_ADDR, 1, &tmp);
928 
929  /* Build the array of registers values for the analog part */
930  tmpBuffer[0] = (((uint8_t)(tmp32>>24)) & SYNT_27_24_REGMASK) | cp_isel<<5 | (bs<<4) ;
931  tmpBuffer[1] = (uint8_t)(tmp32>>16);
932  tmpBuffer[2] = (uint8_t)(tmp32>>8);
933  tmpBuffer[3] = (uint8_t)tmp32;
934 
935  g_xStatus = S2LPSpiWriteRegisters(SYNT3_ADDR, 4, tmpBuffer);
936 
937  return 0;
938 }
939 
940 
947 {
948  uint8_t tmpBuffer[4];
949  uint32_t tmp32;
950  uint8_t cRefDiv, band;
951 
952  /* Reads the synth registers */
953  g_xStatus = S2LPSpiReadRegisters(SYNT3_ADDR, 4, tmpBuffer);
954 
955  /* Reads the operating band masking the Band selected field */
956  if(tmpBuffer[0] & BS_REGMASK) {
957  band = MIDDLE_BAND_FACTOR;
958  }
959  else {
960  band = HIGH_BAND_FACTOR;
961  }
962  cRefDiv = (uint8_t)S2LPRadioGetRefDiv() + 1;
963 
964  /* Computes the synth word */
965  tmp32 = (((uint32_t)(tmpBuffer[0] & SYNT_27_24_REGMASK))<<24) | (((uint32_t)tmpBuffer[1])<<16) | (((uint32_t)tmpBuffer[2])<<8) | ((uint32_t)tmpBuffer[3]);
966 
967  /* Calculates the frequency base and return it */
968  return S2LPRadioComputeFrequencyBase(tmp32, band, cRefDiv);
969 }
970 
971 
978 void S2LPRadioSetDatarate(uint32_t lDatarate)
979 {
980  uint8_t dr_e, tmpBuffer[3];
981  uint16_t dr_m;
982 
983  if(s_lXtalFrequency>DIG_DOMAIN_XTAL_THRESH) {
984  s_assert_param(IS_DATARATE(lDatarate,s_lXtalFrequency/2));
985  }
986  else {
987  s_assert_param(IS_DATARATE(lDatarate,s_lXtalFrequency));
988  }
989 
990  /* Calculates the datarate mantissa and exponent */
991  S2LPRadioSearchDatarateME(lDatarate, &dr_m, &dr_e);
992 
993  /* Reads the MOD_O register*/
994  S2LPSpiReadRegisters(MOD4_ADDR, 3, tmpBuffer);
995 
996  /* Mask the other fields and set the datarate exponent */
997  tmpBuffer[0] = (uint8_t)(dr_m>>8);
998  tmpBuffer[1] = (uint8_t)dr_m;
999  tmpBuffer[2] &= ~DATARATE_E_REGMASK;
1000  tmpBuffer[2] |= dr_e;
1001 
1002  /* Writes the Datarate registers */
1003  g_xStatus = S2LPSpiWriteRegisters(MOD4_ADDR, 3, tmpBuffer);
1004 
1005 }
1006 
1007 
1013 uint32_t S2LPRadioGetDatarate(void)
1014 {
1015  uint8_t tmpBuffer[3], dr_e;
1016  uint16_t dr_m;
1017 
1018  g_xStatus = S2LPSpiReadRegisters(MOD4_ADDR, 3, tmpBuffer);
1019  dr_m = (((uint16_t)tmpBuffer[0])<<8) | ((uint16_t)tmpBuffer[1]);
1020  dr_e = tmpBuffer[2]&DATARATE_E_REGMASK;
1021 
1022  return S2LPRadioComputeDatarate(dr_m, dr_e);
1023 }
1024 
1025 
1032 void S2LPRadioSetFrequencyDev(uint32_t lFDev)
1033 {
1034  uint8_t uFDevM, uFDevE, tmpBuffer[2];
1035 
1036  s_assert_param(IS_F_DEV(lFDev, s_lXtalFrequency));
1037 
1038  /* Calculates the frequency deviation mantissa and exponent */
1039  S2LPRadioSearchFreqDevME(lFDev, &uFDevM, &uFDevE);
1040 
1041  S2LPSpiReadRegisters(MOD1_ADDR, 2, tmpBuffer);
1042  tmpBuffer[0] &= ~FDEV_E_REGMASK;
1043  tmpBuffer[0] |= uFDevE;
1044  tmpBuffer[1] = uFDevM;
1045  g_xStatus = S2LPSpiWriteRegisters(MOD1_ADDR, 2, tmpBuffer);
1046 }
1047 
1048 
1056 {
1057  uint8_t tmpBuffer[2], uFDevE, tmp, refdiv, cBs = HIGH_BAND_FACTOR;
1058 
1059  refdiv = (uint8_t)S2LPRadioGetRefDiv() + 1;
1060  g_xStatus = S2LPSpiReadRegisters(SYNT3_ADDR, 1, &tmp);
1061  if((tmp&BS_REGMASK) == 0) {
1062  cBs = MIDDLE_BAND_FACTOR;
1063  }
1064 
1065  /* Reads the frequency deviation register for mantissa and exponent */
1066  S2LPSpiReadRegisters(MOD1_ADDR, 2, tmpBuffer);
1067  uFDevE = tmpBuffer[0] & FDEV_E_REGMASK;
1068 
1069  /* Calculates the frequency deviation and return it */
1070  return S2LPRadioComputeFreqDeviation(tmpBuffer[1], uFDevE, cBs, refdiv);
1071 }
1072 
1073 
1083 void S2LPRadioSetChannelBW(uint32_t lBandwidth)
1084 {
1085  uint8_t uBwM, uBwE, tmpBuffer;
1086 
1087  /* Search in the channel filter bandwidth table the exponent value */
1088  if(s_lXtalFrequency>DIG_DOMAIN_XTAL_THRESH) {
1089  s_assert_param(IS_CH_BW(lBandwidth,(s_lXtalFrequency>>1)));
1090  }
1091  else {
1092  s_assert_param(IS_CH_BW(lBandwidth,(s_lXtalFrequency)));
1093  }
1094 
1095  /* Calculates the channel bandwidth mantissa and exponent */
1096  S2LPRadioSearchChannelBwME(lBandwidth, &uBwM, &uBwE);
1097  tmpBuffer = (uBwM<<4)|(uBwE);
1098 
1099  /* Writes the Channel filter register */
1100  g_xStatus = S2LPSpiWriteRegisters(CHFLT_ADDR, 1, &tmpBuffer);
1101 
1102 }
1103 
1110 {
1111  uint8_t tmpBuffer, uBwM, uBwE;
1112 
1113  /* Reads the channel filter register for mantissa and exponent */
1114  g_xStatus = S2LPSpiReadRegisters(CHFLT_ADDR, 1, &tmpBuffer);
1115  uBwM = (tmpBuffer&0xF0)>>4;
1116  uBwE = tmpBuffer&0x0F;
1117 
1118  return S2LPRadioComputeChannelFilterBw(uBwM, uBwE);
1119 
1120 }
1121 
1122 
1130 {
1131  uint8_t tmpBuffer;
1132  s_assert_param(IS_MODULATION(xModulation));
1133 
1134  S2LPSpiReadRegisters(MOD2_ADDR, 1, &tmpBuffer);
1135  tmpBuffer &= ~MOD_TYPE_REGMASK;
1136  tmpBuffer |= xModulation;
1137  g_xStatus = S2LPSpiWriteRegisters(MOD2_ADDR, 1, &tmpBuffer);
1138 }
1139 
1140 
1147 {
1148  uint8_t tmpBuffer;
1149 
1150  g_xStatus = S2LPSpiReadRegisters(MOD2_ADDR, 1, &tmpBuffer);
1151  return (ModulationSelect)(tmpBuffer&MOD_TYPE_REGMASK);
1152 
1153 }
1154 
1155 
1162 void S2LPRadioSetXtalFrequency(uint32_t lXtalFrequency)
1163 {
1164  s_lXtalFrequency = lXtalFrequency;
1165 }
1166 
1167 
1174 {
1175  return s_lXtalFrequency;
1176 }
1177 
1178 
1185 {
1186  uint8_t tmp;
1187 
1188  S2LPSpiReadRegisters(PA_POWER0_ADDR, 1, &tmp);
1189 
1190  if(xNewState == S_ENABLE) {
1191  tmp |= PA_MAXDBM_REGMASK;
1192  } else {
1193  tmp &= ~PA_MAXDBM_REGMASK;
1194  }
1195 
1196  g_xStatus = S2LPSpiWriteRegisters(PA_POWER0_ADDR, 1, &tmp);
1197 }
1198 
1199 
1209 void S2LPRadioSetPALeveldBm(uint8_t cIndex, int32_t lPowerdBm)
1210 {
1211  uint8_t address, paLevelValue;
1212  s_assert_param(IS_PA_MAX_INDEX(cIndex));
1213  s_assert_param(IS_PAPOWER_DBM(lPowerdBm));
1214 
1215  if(lPowerdBm> 14)
1216  {
1217  paLevelValue = 1;
1218  }
1219  else {
1220  paLevelValue = (uint8_t)((int32_t)29-2*lPowerdBm);
1221  }
1222 
1223  address = PA_POWER8_ADDR + 7 - cIndex;
1224 
1225  g_xStatus = S2LPSpiWriteRegisters(address, 1, &paLevelValue);
1226 }
1227 
1228 
1238 int32_t S2LPRadioGetPALeveldBm(uint8_t cIndex)
1239 {
1240  uint8_t address, paLevelValue;
1241  s_assert_param(IS_PA_MAX_INDEX(cIndex));
1242 
1243  address = PA_POWER8_ADDR + 7 - cIndex;
1244 
1245  g_xStatus = S2LPSpiReadRegisters(address, 1, &paLevelValue);
1246 
1247  return ((int32_t)29-paLevelValue)/2;
1248 }
1249 
1250 
1256 void S2LPRadioSetPALevelMaxIndex(uint8_t cIndex)
1257 {
1258  uint8_t tmp;
1259  s_assert_param(IS_PA_MAX_INDEX(cIndex));
1260 
1261  S2LPSpiReadRegisters(PA_POWER0_ADDR, 1, &tmp);
1262  tmp &= (~PA_LEVEL_MAX_IDX_REGMASK);
1263  tmp |= cIndex;
1264  g_xStatus = S2LPSpiWriteRegisters(PA_POWER0_ADDR, 1, &tmp);
1265 }
1266 
1267 
1274 {
1275  uint8_t tmp;
1276  g_xStatus = S2LPSpiReadRegisters(PA_POWER0_ADDR, 1, &tmp);
1277  return (tmp & PA_LEVEL_MAX_IDX_REGMASK);
1278 }
1279 
1280 
1281 
1293 {
1294  uint8_t tmpBuffer[2];
1295 
1296  S2LPSpiReadRegisters(PA_POWER0_ADDR, 2, tmpBuffer);
1297 
1298  if(xNewState == S_ENABLE) {
1299  tmpBuffer[0] &= ~PA_MAXDBM_REGMASK;
1300  tmpBuffer[0] &= ~PA_RAMP_EN_REGMASK;
1301  tmpBuffer[1] |= FIR_EN_REGMASK;
1302  } else {
1303  tmpBuffer[1] &= ~FIR_EN_REGMASK;
1304  }
1305 
1306  g_xStatus = S2LPSpiWriteRegisters(PA_POWER0_ADDR, 2, tmpBuffer);
1307 }
1308 
1309 
1310 
1321 {
1322  uint8_t tmpBuffer[2];
1323 
1324  S2LPSpiReadRegisters(PA_POWER0_ADDR, 2, tmpBuffer);
1325 
1326  if(xNewState == S_ENABLE) {
1327  tmpBuffer[0] &= ~PA_MAXDBM_REGMASK;
1328  tmpBuffer[0] |= PA_RAMP_EN_REGMASK;
1329  tmpBuffer[1] &= ~FIR_EN_REGMASK;
1330  } else {
1331  tmpBuffer[0] &= ~PA_RAMP_EN_REGMASK;
1332  }
1333 
1334  g_xStatus = S2LPSpiWriteRegisters(PA_POWER0_ADDR, 2, tmpBuffer);
1335 }
1336 
1337 
1344 void S2LPRadioCalibrationVco(SFunctionalState xAmplitudeCalibration, SFunctionalState xFrequencyCalibration)
1345 {
1346  uint8_t tmp;
1347  s_assert_param(IS_SFUNCTIONAL_STATE(xAmplitudeCalibration));
1348  s_assert_param(IS_SFUNCTIONAL_STATE(xFrequencyCalibration));
1349 
1350  S2LPSpiReadRegisters(VCO_CONFIG_ADDR, 1, &tmp);
1351 
1352  if(xAmplitudeCalibration == S_ENABLE) {
1353  tmp |= VCO_CALAMP_EXT_SEL_REGMASK;
1354  } else {
1355  tmp &= ~VCO_CALAMP_EXT_SEL_REGMASK;
1356  }
1357 
1358  if(xFrequencyCalibration == S_ENABLE) {
1359  tmp |= VCO_CALFREQ_EXT_SEL_REGMASK;
1360  } else {
1361  tmp &= ~VCO_CALFREQ_EXT_SEL_REGMASK;
1362  }
1363  g_xStatus = S2LPSpiWriteRegisters(VCO_CONFIG_ADDR, 1, &tmp);
1364 }
1365 
1372 {
1373  value <<= 4;
1374  g_xStatus = S2LPSpiWriteRegisters(VCO_CALIBR_IN2_ADDR, 1, &value);
1375 }
1376 
1383 {
1384  value &= VCO_CALAMP_RX_REGMASK;
1385  g_xStatus = S2LPSpiWriteRegisters(VCO_CALIBR_IN2_ADDR, 1, &value);
1386 }
1387 
1394 {
1395  g_xStatus = S2LPSpiWriteRegisters(VCO_CALIBR_IN1_ADDR, 1, &value);
1396 }
1397 
1404 {
1405  g_xStatus = S2LPSpiWriteRegisters(VCO_CALIBR_IN0_ADDR, 1, &value);
1406 }
1407 
1408 
1414 void S2LPRadioAfcInit(SAfcInit* xSAfcInit)
1415 {
1416  uint8_t tmpBuffer[3];
1417  s_assert_param(IS_SFUNCTIONAL_STATE(xSAfcInit->xAfcEnable));
1418  s_assert_param(IS_SFUNCTIONAL_STATE(xSAfcInit->xAfcFreezeOnSync));
1419  s_assert_param(IS_AFC_MODE(xSAfcInit->xAfcMode));
1420  s_assert_param(IS_AFC_GAIN(xSAfcInit->cAfcFastGain));
1421  s_assert_param(IS_AFC_GAIN(xSAfcInit->cAfcSlowGain));
1422 
1423  /* Reads the PCKT_FLT_OPTIONS ragister */
1424  S2LPSpiReadRegisters(AFC2_ADDR, 1, &tmpBuffer[0]);
1425 
1426  /* Enables or disables filtering on my address */
1427  if(xSAfcInit->xAfcEnable == S_ENABLE) {
1428  tmpBuffer[0] |= AFC_ENABLED_REGMASK;
1429  }
1430  else {
1431  tmpBuffer[0] &= ~AFC_ENABLED_REGMASK;
1432  }
1433 
1434  /* Enables or disables filtering on multicast address */
1435  if(xSAfcInit->xAfcFreezeOnSync == S_ENABLE) {
1436  tmpBuffer[0] |= AFC_FREEZE_ON_SYNC_REGMASK;
1437  }
1438  else {
1439  tmpBuffer[0] &= ~AFC_FREEZE_ON_SYNC_REGMASK;
1440  }
1441 
1442  /* Enables or disables filtering on broadcast address */
1443  if(xSAfcInit->xAfcMode == AFC_MODE_LOOP_CLOSED_ON_SLICER) {
1444  tmpBuffer[0] &= ~AFC_MODE_REGMASK;
1445  }
1446  else {
1447  tmpBuffer[0] |= AFC_MODE_REGMASK;
1448  }
1449 
1450  tmpBuffer[1] = xSAfcInit->cAfcFastPeriod;
1451  tmpBuffer[2] = (xSAfcInit->cAfcFastGain<<4) | xSAfcInit->cAfcSlowGain;
1452 
1453  g_xStatus = S2LPSpiWriteRegisters(AFC2_ADDR, 3, tmpBuffer);
1454 }
1455 
1456 
1463 {
1464  uint8_t tmpBuffer[3];
1465 
1466  S2LPSpiReadRegisters(AFC2_ADDR, 3, tmpBuffer);
1467 
1468  xSAfcInit->xAfcFreezeOnSync = (SFunctionalState)((tmpBuffer[0]&AFC_FREEZE_ON_SYNC_REGMASK)>>7);
1469  xSAfcInit->xAfcEnable = (SFunctionalState)((tmpBuffer[0]&AFC_ENABLED_REGMASK)>>6);
1470  xSAfcInit->xAfcMode = (SAfcMode)(tmpBuffer[0]&AFC_MODE_REGMASK);
1471 
1472  xSAfcInit->cAfcFastPeriod = tmpBuffer[1];
1473  xSAfcInit->cAfcFastGain = (tmpBuffer[2] & AFC_FAST_GAIN_REGMASK)>>4;
1474  xSAfcInit->cAfcSlowGain = (tmpBuffer[2] & AFC_SLOW_GAIN_REGMASK);
1475 
1476 }
1477 
1478 
1485 {
1486  uint8_t tmp;
1487  s_assert_param(IS_ISI_EQU(xSIsiMode));
1488 
1489  S2LPSpiReadRegisters(ANT_SELECT_CONF_ADDR, 1, &tmp);
1490  tmp &= ~EQU_CTRL_REGMASK;
1491  tmp |= (((uint8_t)xSIsiMode)<<5);
1492  g_xStatus = S2LPSpiWriteRegisters(ANT_SELECT_CONF_ADDR, 1, &tmp);
1493 }
1494 
1495 
1502 {
1503  uint8_t tmp;
1504 
1505  g_xStatus = S2LPSpiReadRegisters(ANT_SELECT_CONF_ADDR, 1, &tmp);
1506  return (SIsiEqu)((tmp&EQU_CTRL_REGMASK)>>5);
1507 
1508 }
1509 
1510 
1517 {
1518  uint8_t tmpBuffer[2] = {0x00, 0x00};
1519  s_assert_param(IS_CLKREC_MODE(xSSymClkRecInit->xSClkRecMode));
1520  s_assert_param(IS_SFUNCTIONAL_STATE(xSSymClkRecInit->cClkRec16SymPostFlt));
1521  s_assert_param(IS_CLKREC_I_GAIN(xSSymClkRecInit->cClkRecIGainFast));
1522  s_assert_param(IS_CLKREC_I_GAIN(xSSymClkRecInit->cClkRecIGainSlow));
1523  s_assert_param(IS_CLKREC_P_GAIN(xSSymClkRecInit->cClkRecPGainFast));
1524  s_assert_param(IS_CLKREC_P_GAIN(xSSymClkRecInit->cClkRecPGainSlow));
1525 
1526  /* Enables or disables filtering on my address */
1527  if(xSSymClkRecInit->xSClkRecMode == CLKREC_PLL_MODE) {
1528  tmpBuffer[0] |= CLK_REC_ALGO_SEL_REGMASK;
1529  }
1530  tmpBuffer[0] |= xSSymClkRecInit->cClkRecIGainSlow;
1531  tmpBuffer[0] |= (xSSymClkRecInit->cClkRecPGainSlow<<5);
1532 
1533  /* Enables or disables filtering on my address */
1534  if(xSSymClkRecInit->cClkRec16SymPostFlt == S_ENABLE) {
1535  tmpBuffer[1] |= PSTFLT_LEN_REGMASK;
1536  }
1537  tmpBuffer[1] |= xSSymClkRecInit->cClkRecIGainFast;
1538  tmpBuffer[1] |= (xSSymClkRecInit->cClkRecPGainFast<<5);
1539 
1540  g_xStatus = S2LPSpiWriteRegisters(CLOCKREC1_ADDR, 2, tmpBuffer);
1541 }
1542 
1543 
1550 {
1551  uint8_t tmpBuffer[2];
1552 
1553  S2LPSpiReadRegisters(CLOCKREC1_ADDR, 2, tmpBuffer);
1554 
1555  xSSymClkRecInit->xSClkRecMode = (SClkRecMode)((tmpBuffer[0]&CLK_REC_ALGO_SEL_REGMASK)>>4);
1556  xSSymClkRecInit->cClkRecIGainSlow = tmpBuffer[0]&CLK_REC_I_GAIN_SLOW_REGMASK;
1557  xSSymClkRecInit->cClkRecPGainSlow = (tmpBuffer[0]&CLK_REC_P_GAIN_SLOW_REGMASK)>>5;
1558 
1559  xSSymClkRecInit->cClkRec16SymPostFlt = (SFunctionalState)((tmpBuffer[0]&CLK_REC_ALGO_SEL_REGMASK)>>4);
1560  xSSymClkRecInit->cClkRecIGainFast = tmpBuffer[0]&CLK_REC_I_GAIN_FAST_REGMASK;
1561  xSSymClkRecInit->cClkRecPGainFast = (tmpBuffer[0]&CLK_REC_P_GAIN_FAST_REGMASK)>>5;
1562 
1563 }
1564 
1565 
1566 
1583 /******************* (C) COPYRIGHT 2016 STMicroelectronics *****END OF FILE****/
1584 
uint32_t S2LPRadioComputeFrequencyBase(uint32_t lSynthWord, uint8_t bs, uint8_t refdiv)
Computes a frequency from a given SYNTH word.
Definition: S2LP_Radio.c:406
uint32_t S2LPRadioGetXtalFrequency(void)
Return the XTAL frequency.
Definition: S2LP_Radio.c:1173
uint32_t S2LPRadioGetChannelSpace(void)
Return the channel space register.
Definition: S2LP_Radio.c:891
uint32_t lFreqDev
Definition: S2LP_Radio.h:123
uint32_t lFrequencyBase
Definition: S2LP_Radio.h:114
uint32_t lBandwidth
Definition: S2LP_Radio.h:126
uint8_t S2LPRadioSetFrequencyBase(uint32_t lFBase)
Set the Synth word and the Band Select register according to desired base carrier frequency....
Definition: S2LP_Radio.c:906
#define CH_SPACE_ADDR
CH_SPACE register.
Definition: S2LP_Regs.h:193
ModulationSelect xModulationSelect
Definition: S2LP_Radio.h:119
void S2LPRadioSetMaxPALevel(SFunctionalState xNewState)
Set the MAX_DBM bit. This will allow to transmit at the maximum power.
Definition: S2LP_Radio.c:1184
void S2LPRadioSearchFreqDevME(uint32_t lFDev, uint8_t *pcM, uint8_t *pcE)
Returns the mantissa and exponent, whose value used in the frequency deviation formula will give a fr...
Definition: S2LP_Radio.c:236
S2LPState MC_STATE
Definition: S2LP_Types.h:119
#define AFC2_ADDR
AFC2 register.
Definition: S2LP_Regs.h:310
void S2LPRadioSetRefDiv(SFunctionalState xNewState)
Set the reference divider value.
Definition: S2LP_Radio.c:795
void S2LPRadioSetPALeveldBm(uint8_t cIndex, int32_t lPowerdBm)
Sets a specific PA_LEVEL register, with a value given in dBm.
Definition: S2LP_Radio.c:1209
#define MOD1_ADDR
MOD1 register.
Definition: S2LP_Regs.h:263
SFunctionalState
S2LP Functional state. Used to enable or disable a specific option.
Definition: S2LP_Types.h:67
void S2LPRadioSetSynthWord(uint32_t lSynthWord)
Sets the SYNTH registers.
Definition: S2LP_Radio.c:735
void S2LPRadioSetPALevelMaxIndex(uint8_t cIndex)
Sets a specific PA_LEVEL_MAX_INDEX.
Definition: S2LP_Radio.c:1256
void S2LPRadioSearchDatarateME(uint32_t lDatarate, uint16_t *pcM, uint8_t *pcE)
Returns the mantissa and exponent, whose value used in the datarate formula will give the datarate va...
Definition: S2LP_Radio.c:192
#define CHNUM_ADDR
CHNUM register.
Definition: S2LP_Regs.h:206
SIsiEqu S2LPRadioGetIsiEqualizationMode(void)
Returnthe ISI equalization.
Definition: S2LP_Radio.c:1501
#define SYNTH_CONFIG2_ADDR
SYNTH_CONFIG2 register.
Definition: S2LP_Regs.h:1229
void S2LPRadioSetAutoRampingMode(SFunctionalState xNewState)
Set the autoramping mode. If enabled:
Definition: S2LP_Radio.c:1292
void S2LPRadioSetDigDiv(SFunctionalState xNewState)
Set the digital divider .
Definition: S2LP_Radio.c:836
SFunctionalState xAfcEnable
Definition: S2LP_Radio.h:145
uint32_t S2LPRadioComputeSynthWord(uint32_t frequency, uint8_t refdiv)
Computes the synth word from a given frequency.
Definition: S2LP_Radio.c:418
uint8_t cClkRecIGainFast
Definition: S2LP_Radio.h:181
SClkRecMode xSClkRecMode
Definition: S2LP_Radio.h:177
#define VCO_CONFIG_ADDR
VCO_CONFIG register.
Definition: S2LP_Regs.h:1246
SIsiEqu
S2LP ISI Equalization type enumeration.
Definition: S2LP_Radio.h:157
void S2LPRadioSetFrequencyDev(uint32_t lFDev)
Set the frequency deviation.
Definition: S2LP_Radio.c:1032
uint8_t cAfcFastPeriod
Definition: S2LP_Radio.h:148
uint32_t lDatarate
Definition: S2LP_Radio.h:120
#define PA_POWER8_ADDR
PA_POWER8 register.
Definition: S2LP_Regs.h:1073
uint8_t cClkRecPGainSlow
Definition: S2LP_Radio.h:178
S2LP Radio Init structure definition.
Definition: S2LP_Radio.h:113
SAfcMode xAfcMode
Definition: S2LP_Radio.h:147
void S2LPRadioCalibrationVco(SFunctionalState xAmplitudeCalibration, SFunctionalState xFrequencyCalibration)
Enable the calibration of the VCO frequency and amplitude.
Definition: S2LP_Radio.c:1344
void S2LPRadioSetRxCalibVcoAmpWord(uint8_t value)
Set calibration word of the aplitude in RX.
Definition: S2LP_Radio.c:1382
#define DIG_DOMAIN_XTAL_THRESH
Definition: S2LP_Config.h:86
uint8_t S2LPRadioGetChannel(void)
Returns the actual channel number.
Definition: S2LP_Radio.c:782
int32_t S2LPRadioGetPALeveldBm(uint8_t cIndex)
Returns a specific PA_LEVEL register, returning a value in dBm.
Definition: S2LP_Radio.c:1238
uint32_t S2LPRadioComputeChannelSpacing(uint8_t cChSpaceRegVal)
Compute the channel spacing register from the channel spacing given in Hz. The channel spacing step i...
Definition: S2LP_Radio.c:461
S2LP AFC Init structure definition.
Definition: S2LP_Radio.h:144
void S2LPRadioSetModulation(ModulationSelect xModulation)
Set the modulation type.
Definition: S2LP_Radio.c:1129
uint8_t S2LPRadioComputeChannelSpacingRegValue(uint32_t lChannelSpace)
Computes the channel space register staring from the channel space value in Hz. The channel spacing s...
Definition: S2LP_Radio.c:449
void S2LPRadioSetIsiEqualizationMode(SIsiEqu xSIsiMode)
Set the ISI equalizer.
Definition: S2LP_Radio.c:1484
#define MOD2_ADDR
MOD2 register.
Definition: S2LP_Regs.h:246
ModulationSelect
S2LP Modulation enumeration.
Definition: S2LP_Radio.h:97
void S2LPRadioSetChannel(uint8_t cChannel)
Sets the channel number.
Definition: S2LP_Radio.c:771
SFunctionalState S2LPRadioGetDigDiv(void)
Get the digital divider .
Definition: S2LP_Radio.c:857
SClkRecMode
S2LP Clock Recovery mode enumeration.
Definition: S2LP_Radio.h:167
SFunctionalState cClkRec16SymPostFlt
Definition: S2LP_Radio.h:182
uint8_t S2LPRadioInit(SRadioInit *pxSRadioInitStruct)
Initializes the S2LP analog and digital radio part according to the specified parameters in the pxSRa...
Definition: S2LP_Radio.c:559
#define MIDDLE_BAND_FACTOR
Definition: S2LP_Radio.c:51
void S2LPRadioSearchChannelBwME(uint32_t lBandwidth, uint8_t *pcM, uint8_t *pcE)
Returns the mantissa and exponent for a given bandwidth. Even if it is possible to pass as parameter ...
Definition: S2LP_Radio.c:291
ModulationSelect S2LPRadioGetModulation(void)
Return the modulation type used.
Definition: S2LP_Radio.c:1146
uint32_t S2LPRadioGetSynthWord(void)
Returns the synth word.
Definition: S2LP_Radio.c:758
void S2LPRefreshStatus(void)
Updates the gState (the global variable used to maintain memory of S2LP Status) reading the MC_STATE ...
Definition: S2LP_Types.c:133
uint32_t S2LPRadioGetFrequencyBase(void)
Return the base carrier frequency.
Definition: S2LP_Radio.c:946
void S2LPRadioAfcInit(SAfcInit *xSAfcInit)
Initialize the AFC block according to the passed parameters.
Definition: S2LP_Radio.c:1414
uint32_t S2LPRadioComputeDatarate(uint16_t cM, uint8_t cE)
Returns the mantissa and exponent, whose value used in the datarate formula will give the datarate va...
Definition: S2LP_Radio.c:341
void S2LPRadioSymClkRecoverInit(SSymClkRecInit *xSSymClkRecInit)
Clock recovery configuration.
Definition: S2LP_Radio.c:1516
void S2LPRadioSetChannelSpace(uint32_t lChannelSpace)
Set the channel space factor in channel space register. The channel spacing step is computed as F_Xo/...
Definition: S2LP_Radio.c:877
#define HIGH_BAND_FACTOR
Definition: S2LP_Radio.c:50
uint32_t S2LPRadioComputeChannelFilterBw(uint8_t cM, uint8_t cE)
Computes the channel filter value starting from mantissa and exponent.
Definition: S2LP_Radio.c:386
void S2LPRadioComputeIF(uint32_t nIF, uint8_t *pcAnaIf, uint8_t *pcPcDigIf)
Computes the ANALOG_IF and DIGITAL_IF register values staring from a image frequency value in Hz.
Definition: S2LP_Radio.c:475
uint32_t S2LPRadioGetFrequencyDev(void)
Return the frequency deviation.
Definition: S2LP_Radio.c:1055
void S2LPRadioSetChannelBW(uint32_t lBandwidth)
Set the channel filter bandwidth.
Definition: S2LP_Radio.c:1083
uint32_t S2LPRadioGetDatarate(void)
Return the datarate.
Definition: S2LP_Radio.c:1013
S2LP Configuration and useful defines .
SAfcMode
S2LP AFC mode enumeration.
Definition: S2LP_Radio.h:135
SFunctionalState S2LPRadioGetRefDiv(void)
To know if the reference deivider is enabled or disabled.
Definition: S2LP_Radio.c:817
#define CHFLT_ADDR
CHFLT register.
Definition: S2LP_Regs.h:293
void S2LPRadioGetSymClkRecoverInfo(SSymClkRecInit *xSSymClkRecInit)
Return the clock recovery configuration.
Definition: S2LP_Radio.c:1549
uint8_t cAfcSlowGain
Definition: S2LP_Radio.h:150
volatile S2LPStatus g_xStatus
S2LP Status global variable. This global variable of S2LPStatus type is updated on every SPI transact...
Definition: S2LP_Types.c:82
void S2LPRadioSetXtalFrequency(uint32_t lXtalFrequency)
Set the XTAL frequency.
Definition: S2LP_Radio.c:1162
void S2LPRadioGetInfo(SRadioInit *pxSRadioInitStruct)
Returns the S2LP analog and digital radio structure according to the registers value.
Definition: S2LP_Radio.c:675
uint32_t S2LPRadioComputeFreqDeviation(uint8_t cM, uint8_t cE, uint8_t bs, uint8_t refdiv)
Returns the mantissa and exponent, whose value used in the datarate formula will give the datarate va...
Definition: S2LP_Radio.c:368
uint8_t cClkRecPGainFast
Definition: S2LP_Radio.h:179
#define ANT_SELECT_CONF_ADDR
ANT_SELECT_CONF register.
Definition: S2LP_Regs.h:386
void S2LPRadioSetRxCalibVcoFreqWord(uint8_t value)
Set calibration word of the frequency in RX.
Definition: S2LP_Radio.c:1403
#define VCO_CALIBR_IN0_ADDR
VCO_CALIBR_IN0 register.
Definition: S2LP_Regs.h:1290
#define VCO_CALIBR_IN2_ADDR
VCO_CALIBR_IN2 register.
Definition: S2LP_Regs.h:1261
uint8_t S2LPRadioGetPALevelMaxIndex(void)
Returns the actual PA_LEVEL_MAX_INDEX.
Definition: S2LP_Radio.c:1273
#define VCO_CENTER_FREQ
Definition: S2LP_Radio.c:48
void S2LPRadioSearchWCP(uint8_t *cp_isel, uint8_t *pfd_split, uint32_t lFc, uint8_t refdiv)
Returns the charge pump word for a given VCO frequency.
Definition: S2LP_Radio.c:499
void S2LPRadioGetAfcInfo(SAfcInit *xSAfcInit)
Return the AFC struct that corresponds to the AFC block parameters set on the chip.
Definition: S2LP_Radio.c:1462
#define PA_POWER0_ADDR
PA_POWER0 register.
Definition: S2LP_Regs.h:1188
void S2LPRadioSetTxCalibVcoAmpWord(uint8_t value)
Set calibration word of the aplitude in TX.
Definition: S2LP_Radio.c:1371
uint8_t cClkRecIGainSlow
Definition: S2LP_Radio.h:180
S2LP Clock Recovery Init structure definition.
Definition: S2LP_Radio.h:176
#define XO_RCO_CONF1_ADDR
XO_RCO_CONF1 register.
Definition: S2LP_Regs.h:1307
#define SYNT3_ADDR
SYNT3 register.
Definition: S2LP_Regs.h:113
#define XO_RCO_CONF0_ADDR
XO_RCO_CONF0 register.
Definition: S2LP_Regs.h:1325
#define MOD4_ADDR
MOD4 register.
Definition: S2LP_Regs.h:219
Header file for low level S2LP SPI driver.
uint32_t S2LPRadioGetChannelBW(void)
Return the channel filter bandwidth.
Definition: S2LP_Radio.c:1109
void S2LPRadioSetDatarate(uint32_t lDatarate)
Set the datarate.
Definition: S2LP_Radio.c:978
#define CLOCKREC1_ADDR
CLOCKREC1 register.
Definition: S2LP_Regs.h:404
void S2LPRadioSetTxCalibVcoFreqWord(uint8_t value)
Set calibration word of the frequency in TX.
Definition: S2LP_Radio.c:1393
#define VCO_CALIBR_IN1_ADDR
VCO_CALIBR_IN1 register.
Definition: S2LP_Regs.h:1276
SFunctionalState xAfcFreezeOnSync
Definition: S2LP_Radio.h:146
uint8_t cAfcFastGain
Definition: S2LP_Radio.h:149
Configuration and management of S2-LP RF Analog and Digital part.
#define IF_OFFSET_ANA_ADDR
IF_OFFSET_ANA register.
Definition: S2LP_Regs.h:167
void S2LPRadioSetManualRampingMode(SFunctionalState xNewState)
Set the manual ramping mode.
Definition: S2LP_Radio.c:1320