Appiko
S2LP_Gpio.c
Go to the documentation of this file.
1 
24 /* Includes ------------------------------------------------------------------*/
25 #include "S2LP_Gpio.h"
26 #include "MCU_Interface.h"
27 
28 
46 #define IS_S2LP_GPIO(PIN) ((PIN == S2LP_GPIO_0) || \
47  (PIN == S2LP_GPIO_1) || \
48  (PIN == S2LP_GPIO_2) || \
49  (PIN == S2LP_GPIO_3))
50 
51 
52 #define IS_S2LP_GPIO_MODE(MODE) ((MODE == S2LP_GPIO_MODE_DIGITAL_INPUT) || \
53  (MODE == S2LP_GPIO_MODE_DIGITAL_OUTPUT_LP) || \
54  (MODE == S2LP_GPIO_MODE_DIGITAL_OUTPUT_HP))
55 
56 #define IS_S2LP_GPIO_IO(IO_SEL) ((IO_SEL == S2LP_GPIO_DIG_OUT_IRQ) || \
57  (IO_SEL == S2LP_GPIO_DIG_OUT_POR_INV) || \
58  (IO_SEL == S2LP_GPIO_DIG_OUT_WUT_EXP) || \
59  (IO_SEL == S2LP_GPIO_DIG_OUT_LBD) || \
60  (IO_SEL == S2LP_GPIO_DIG_OUT_TX_DATA) || \
61  (IO_SEL == S2LP_GPIO_DIG_OUT_TX_STATE) || \
62  (IO_SEL == S2LP_GPIO_DIG_OUT_TXRX_FIFO_ALMOST_EMPTY) || \
63  (IO_SEL == S2LP_GPIO_DIG_OUT_TXRX_FIFO_ALMOST_FULL) || \
64  (IO_SEL == S2LP_GPIO_DIG_OUT_RX_DATA) || \
65  (IO_SEL == S2LP_GPIO_DIG_OUT_RX_CLOCK) || \
66  (IO_SEL == S2LP_GPIO_DIG_OUT_RX_STATE) || \
67  (IO_SEL == S2LP_GPIO_DIG_OUT_NOT_STANDBY_SLEEP) || \
68  (IO_SEL == S2LP_GPIO_DIG_OUT_STANDBY) || \
69  (IO_SEL == S2LP_GPIO_DIG_OUT_ANTENNA_SWITCH) || \
70  (IO_SEL == S2LP_GPIO_DIG_OUT_VALID_PREAMBLE) || \
71  (IO_SEL == S2LP_GPIO_DIG_OUT_SYNC_DETECTED) || \
72  (IO_SEL == S2LP_GPIO_DIG_OUT_RSSI_THRESHOLD) || \
73  (IO_SEL == S2LP_GPIO_DIG_OUT_MCU_CLOCK) || \
74  (IO_SEL == S2LP_GPIO_DIG_OUT_TX_RX_MODE) || \
75  (IO_SEL == S2LP_GPIO_DIG_OUT_VDD) || \
76  (IO_SEL == S2LP_GPIO_DIG_OUT_GND) || \
77  (IO_SEL == S2LP_GPIO_DIG_OUT_SMPS_EXT) ||\
78  (IO_SEL == S2LP_GPIO_DIG_OUT_SLEEP) ||\
79  (IO_SEL == S2LP_GPIO_DIG_OUT_READY) ||\
80  (IO_SEL == S2LP_GPIO_DIG_OUT_LOCK) ||\
81  (IO_SEL == S2LP_GPIO_DIG_OUT_WAIT_FOR_LOCK_SIG) ||\
82  (IO_SEL == S2LP_GPIO_DIG_OUT_TX_DATA_OOK_SIGNAL) ||\
83  (IO_SEL == S2LP_GPIO_DIG_OUT_WAIT_FOR_READY2_SIG) ||\
84  (IO_SEL == S2LP_GPIO_DIG_OUT_WAIT_FOR_TIMER_FOR_PM_SET) ||\
85  (IO_SEL == S2LP_GPIO_DIG_OUT_WAIT_VCO_CALIBRATION) ||\
86  (IO_SEL == S2LP_GPIO_DIG_OUT_ENABLE_SYNTH_FULL_CIRCUIT) ||\
87  (IO_SEL == S2LP_GPIO_DIG_IN_TX_COMMAND) ||\
88  (IO_SEL == S2LP_GPIO_DIG_IN_RX_COMMAND) ||\
89  (IO_SEL == S2LP_GPIO_DIG_IN_TX_DATA_INPUT_FOR_DIRECTRF) ||\
90  (IO_SEL == S2LP_GPIO_DIG_IN_DATA_WAKEUP) ||\
91  (IO_SEL == S2LP_GPIO_DIG_IN_EXT_CLOCK_AT_34_7KHZ))
92 
93 
94 #define IS_S2LP_GPIO_LEVEL(LEVEL) ((LEVEL == LOW) || \
95  (LEVEL == HIGH))
96 
97 #define IS_S2LP_CLOCK_OUTPUT_XO(RATIO) ((RATIO == XO_RATIO_1) || \
98  (RATIO == XO_RATIO_1_2) || \
99  (RATIO == XO_RATIO_1_4) || \
100  (RATIO == XO_RATIO_1_8) || \
101  (RATIO == XO_RATIO_1_16) || \
102  (RATIO == XO_RATIO_1_32) || \
103  (RATIO == XO_RATIO_1_64) || \
104  (RATIO == XO_RATIO_1_128) || \
105  (RATIO == XO_RATIO_1_256))
106 
107 #define IS_S2LP_CLOCK_OUTPUT_RCO(RATIO) ((RATIO == RCO_RATIO_1) || \
108  (RATIO == RCO_RATIO_1_128))
109 
110 
111 #define IS_S2LP_CLOCK_OUTPUT_EXTRA_CYCLES(CYCLES) ((CYCLES == EXTRA_CLOCK_CYCLES_0) || \
112  (CYCLES == EXTRA_CLOCK_CYCLES_128) || \
113  (CYCLES == EXTRA_CLOCK_CYCLES_256) || \
114  (CYCLES == EXTRA_CLOCK_CYCLES_512))
115 
116 
117 #define IS_S2LP_IRQ_LIST(VALUE) ((VALUE == RX_DATA_READY) || \
118  (VALUE == RX_DATA_DISC) || \
119  (VALUE == TX_DATA_SENT) || \
120  (VALUE == MAX_RE_TX_REACH) || \
121  (VALUE == CRC_ERROR) || \
122  (VALUE == TX_FIFO_ERROR) || \
123  (VALUE == RX_FIFO_ERROR) || \
124  (VALUE == TX_FIFO_ALMOST_FULL) || \
125  (VALUE == TX_FIFO_ALMOST_EMPTY) || \
126  (VALUE == RX_FIFO_ALMOST_FULL) || \
127  (VALUE == RX_FIFO_ALMOST_EMPTY) || \
128  (VALUE == MAX_BO_CCA_REACH) || \
129  (VALUE == VALID_PREAMBLE) || \
130  (VALUE == VALID_SYNC) || \
131  (VALUE == RSSI_ABOVE_TH) || \
132  (VALUE == WKUP_TOUT_LDC) || \
133  (VALUE == READY) || \
134  (VALUE == STANDBY_DELAYED) || \
135  (VALUE == LOW_BATT_LVL) || \
136  (VALUE == POR) || \
137  (VALUE == BOR) || \
138  (VALUE == LOCK) || \
139  (VALUE == VCO_CALIBRATION_END) || \
140  (VALUE == PA_CALIBRATION_END) || \
141  (VALUE == PM_COUNT_EXPIRED) || \
142  (VALUE == XO_COUNT_EXPIRED) || \
143  (VALUE == TX_START_TIME) || \
144  (VALUE == RX_START_TIME) || \
145  (VALUE == RX_TIMEOUT) || \
146  (VALUE == RX_SNIFF_TIMEOUT) || \
147  (VALUE == ALL_IRQ ))
148 
149 
150 
168 void S2LPGpioInit(SGpioInit* pxGpioInitStruct)
169 {
170  uint8_t tmp;
171 
172  s_assert_param(IS_S2LP_GPIO(pxGpioInitStruct->xS2LPGpioPin));
173  s_assert_param(IS_S2LP_GPIO_MODE(pxGpioInitStruct->xS2LPGpioMode));
174  s_assert_param(IS_S2LP_GPIO_IO(pxGpioInitStruct->xS2LPGpioIO));
175 
176  tmp = ((uint8_t)(pxGpioInitStruct->xS2LPGpioMode) | (uint8_t)(pxGpioInitStruct->xS2LPGpioIO));
177  g_xStatus = S2LPSpiWriteRegisters(pxGpioInitStruct->xS2LPGpioPin, 1, &tmp);
178 
179 }
180 
181 
182 
196 {
197  uint8_t tmp;
198 
199  s_assert_param(IS_S2LP_GPIO(xGpioX));
200  s_assert_param(IS_S2LP_GPIO_LEVEL(xLevel));
201 
202  /* Sets the value of the S2LP GPIO register according to the specified level */
203  if(xLevel == HIGH) {
205  }
206  else {
208  }
209 
210  g_xStatus = S2LPSpiWriteRegisters(xGpioX, 1, &tmp);
211 
212 }
213 
214 
227 {
228  uint8_t tmp = 0x00;
229 
230  s_assert_param(IS_S2LP_GPIO(xGpioX));
231 
232  g_xStatus = S2LPSpiReadRegisters(xGpioX, 1, &tmp);
233 
234  /* Mask the GPIO_SELECT field and returns the value according */
235  tmp &= GPIO_SELECT_REGMASK;
236  if(tmp == S2LP_GPIO_DIG_OUT_VDD) {
237  return HIGH;
238  }
239  else {
240  return LOW;
241  }
242 
243 }
244 
245 
253 void S2LPGpioIrqDeInit(S2LPIrqs* pxIrqInit)
254 {
255  uint8_t tmp[4] = {0x00,0x00,0x00,0x00};
256 
257  if(pxIrqInit!=NULL) {
258  uint32_t tempValue = 0x00000000;
259 
260  *pxIrqInit = (*(S2LPIrqs*)&tempValue);
261  }
262 
263  g_xStatus = S2LPSpiWriteRegisters(IRQ_MASK3_ADDR, 4, tmp);
264 }
265 
266 
280 void S2LPGpioIrqInit(S2LPIrqs* pxIrqInit)
281 {
282  uint8_t tmp[4];
283  uint8_t* tmpPoint;
284 
285  tmpPoint = (uint8_t*)(pxIrqInit);
286  for(uint8_t i=0; i<4; i++) {
287  tmp[3-i]= tmpPoint[i];
288  }
289 
290  g_xStatus = S2LPSpiWriteRegisters(IRQ_MASK3_ADDR, 4, tmp);
291 
292 }
293 
294 
304 {
305  uint8_t tmpBuffer[4];
306  uint32_t tempValue = 0;
307 
308  s_assert_param(IS_S2LP_IRQ_LIST(xIrq));
309  s_assert_param(IS_SFUNCTIONAL_STATE(xNewState));
310 
311  S2LPSpiReadRegisters(IRQ_MASK3_ADDR, 4, tmpBuffer);
312 
313  /* Build the IRQ mask word */
314  for(uint8_t i=0; i<4; i++) {
315  tempValue += ((uint32_t)tmpBuffer[i])<<(8*(3-i));
316  }
317 
318  /* Rebuild the new mask according to user request */
319  if(xNewState == S_DISABLE) {
320  tempValue &= (~xIrq);
321  }
322  else {
323  tempValue |= (xIrq);
324  }
325 
326  /* Build the array of bytes to write in the IRQ_MASK registers */
327  for(uint8_t j=0; j<4; j++) {
328  tmpBuffer[j] = (uint8_t)(tempValue>>(8*(3-j)));
329  }
330 
331  g_xStatus = S2LPSpiWriteRegisters(IRQ_MASK3_ADDR, 4, tmpBuffer);
332 
333 }
334 
335 
352 void S2LPGpioIrqGetMask(S2LPIrqs* pxIrqMask)
353 {
354  uint8_t tmp[4];
355  uint8_t* pIrqPointer = (uint8_t*)pxIrqMask;
356 
357  g_xStatus = S2LPSpiReadRegisters(IRQ_MASK3_ADDR, 4, tmp);
358 
359  for(uint8_t i=0; i<4; i++) {
360  *pIrqPointer = tmp[3-i];
361  pIrqPointer++;
362  }
363 
364 }
365 
366 
383 void S2LPGpioIrqGetStatus(S2LPIrqs* pxIrqStatus)
384 {
385  uint8_t tmp[4];
386  uint8_t* pIrqPointer = (uint8_t*)pxIrqStatus;
387 
388  g_xStatus = S2LPSpiReadRegisters(IRQ_STATUS3_ADDR, 4, tmp);
389 
390  /* Build the IRQ Status word */
391  for(uint8_t i=0; i<4; i++) {
392  *pIrqPointer = tmp[3-i];
393  pIrqPointer++;
394  }
395 }
396 
397 
404 {
405  uint8_t tmp[4] = {0, 0, 0, 0};
406  g_xStatus = S2LPSpiWriteRegisters(IRQ_STATUS3_ADDR, 4, tmp);
407 
408 }
409 
410 
419 {
420  uint8_t tmp[4];
421  uint32_t tempValue = 0;
422  SBool flag;
423 
424  s_assert_param(IS_S2LP_IRQ_LIST(xFlag));
425 
426  g_xStatus = S2LPSpiReadRegisters(IRQ_STATUS3_ADDR, 4, tmp);
427  for(uint8_t i=0; i<4; i++) {
428  tempValue += ((uint32_t)tmp[i])<<(8*(3-i));
429  }
430 
431  if(tempValue & xFlag) {
432  flag = S_TRUE;
433  }
434  else {
435  flag = S_FALSE;
436  }
437 
438  return flag;
439 
440 }
441 
458 /******************* (C) COPYRIGHT 2016 STMicroelectronics *****END OF FILE****/
void S2LPGpioIrqGetMask(S2LPIrqs *pxIrqMask)
Fill a pointer to a structure of S2LPIrqs type reading the IRQ_MASK registers.
Definition: S2LP_Gpio.c:352
SBool
boolean type enumeration.
Definition: S2LP_Types.h:85
#define IRQ_STATUS3_ADDR
IRQ_STATUS3 register.
Definition: S2LP_Regs.h:1812
S2LPGpioPin
S2LP GPIO pin enumeration.
Definition: S2LP_Gpio.h:83
S2LPGpioIO xS2LPGpioIO
Definition: S2LP_Gpio.h:161
SFunctionalState
S2LP Functional state. Used to enable or disable a specific option.
Definition: S2LP_Types.h:67
void S2LPGpioIrqInit(S2LPIrqs *pxIrqInit)
Enable the IRQs according to the user defined pxIrqInit structure.
Definition: S2LP_Gpio.c:280
void S2LPGpioIrqGetStatus(S2LPIrqs *pxIrqStatus)
Fill a pointer to a structure of S2LPIrqs type reading the IRQ_STATUS registers.
Definition: S2LP_Gpio.c:383
IRQ bitfield structure for S2LP. This structure is used to read or write the single IRQ bit....
Definition: S2LP_Gpio.h:222
OutputLevel
S2LP OutputLevel enumeration.
Definition: S2LP_Gpio.h:149
IrqList
IRQ list enumeration for S2LP. This enumeration type can be used to address a specific IRQ.
Definition: S2LP_Gpio.h:264
void S2LPGpioSetLevel(S2LPGpioPin xGpioX, OutputLevel xLevel)
Force S2LP GPIO_x configured as digital output, to VDD or GND.
Definition: S2LP_Gpio.c:195
Configuration and management of S2-LP GPIO.
void S2LPGpioIrqConfig(IrqList xIrq, SFunctionalState xNewState)
Enable or disables a specific IRQ.
Definition: S2LP_Gpio.c:303
void S2LPGpioIrqClearStatus(void)
Clear the IRQ status registers.
Definition: S2LP_Gpio.c:403
#define IRQ_MASK3_ADDR
IRQ_MASK3 register.
Definition: S2LP_Regs.h:1006
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
S2LPGpioMode xS2LPGpioMode
Definition: S2LP_Gpio.h:160
S2LPGpioPin xS2LPGpioPin
Definition: S2LP_Gpio.h:159
OutputLevel S2LPGpioGetLevel(S2LPGpioPin xGpioX)
Return output value (VDD or GND) of S2LP GPIO_x, when it is configured as digital output.
Definition: S2LP_Gpio.c:226
Header file for low level S2LP SPI driver.
void S2LPGpioIrqDeInit(S2LPIrqs *pxIrqInit)
Deinit the S2LPIrqs structure setting all the bitfield to 0. Moreover, it sets the IRQ mask registers...
Definition: S2LP_Gpio.c:253
void S2LPGpioInit(SGpioInit *pxGpioInitStruct)
Initialize the S2LP GPIOx according to the specified parameters in the pxGpioInitStruct.
Definition: S2LP_Gpio.c:168
S2LP GPIO Init structure definition.
Definition: S2LP_Gpio.h:158
SBool S2LPGpioIrqCheckFlag(IrqList xFlag)
Verifie if a specific IRQ has been generated. The call resets all the IRQ status, so it can't be used...
Definition: S2LP_Gpio.c:418