Appiko
S2LP_Qi.c
Go to the documentation of this file.
1 
24 /* Includes ------------------------------------------------------------------*/
25 #include "S2LP_Qi.h"
26 #include "MCU_Interface.h"
27 
28 
29 
67 #define IS_RSSI_MODE(MODE) (MODE<=3)
68 #define IS_RSSI_DBM(VAL) ((VAL>=-146) && (VAL<=-2))
69 #define IS_RSSI_FLT(VAL) (VAL<=15)
70 #define IS_PQI_LVL_CHECK(VAL) (VAL<=15)
71 #define S2LPRadioRegToRssidBm(VAL) (VAL - 146)
72 #define S2LPRadioRssidBmToReg(VAL) (uint8_t)(VAL+146)
73 
109 int32_t S2LPRadioGetRssidBm(void)
110 {
111  uint8_t tmp;
112  g_xStatus = S2LPSpiReadRegisters(RSSI_LEVEL_ADDR, 1, &tmp);
113  return S2LPRadioRegToRssidBm((int32_t)tmp);
114 }
115 
122 {
123  uint8_t tmpBuffer[2];
124 
125  /*The first value is the previous one, so the first read operation clear this value,
126  than it is read the actual during RX. */
127  g_xStatus = S2LPSpiReadRegisters(RSSI_LEVEL_RUN_ADDR, 2, tmpBuffer);
128 
129  return S2LPRadioRegToRssidBm((int32_t)tmpBuffer[1]);
130 }
131 
132 
133 
139 void S2LPRadioSetRssiThreshdBm(int32_t wRssiThrehsold)
140 {
141  uint8_t tmp;
142  s_assert_param(IS_RSSI_DBM(wRssiThrehsold));
143 
144  tmp = S2LPRadioRssidBmToReg(wRssiThrehsold);
145  g_xStatus = S2LPSpiWriteRegisters(RSSI_TH_ADDR, 1, &tmp);
146 }
147 
148 
149 
155 void S2LPRadioRssiInit(SRssiInit* xSRssiInit)
156 {
157  uint8_t tmpBuffer[2];
158 
159  s_assert_param(IS_RSSI_MODE(xSRssiInit->xRssiMode));
160  s_assert_param(IS_RSSI_DBM(xSRssiInit->cRssiThreshdBm));
161  s_assert_param(IS_RSSI_FLT(xSRssiInit->cRssiFlt));
162 
163  /* Reads the PCKT_FLT_OPTIONS rrgister */
164  S2LPSpiReadRegisters(RSSI_FLT_ADDR, 1, &tmpBuffer[0]);
165 
166  /* Enables or disables filtering on my address */
167  tmpBuffer[0] &= ~(RSSI_FLT_REGMASK | CS_MODE_REGMASK);
168  tmpBuffer[0] |= (xSRssiInit->cRssiFlt<<4);
169  tmpBuffer[0] |= (xSRssiInit->xRssiMode<<2);
170 
171  tmpBuffer[1] = S2LPRadioRssidBmToReg(xSRssiInit->cRssiThreshdBm);
172 
173  g_xStatus = S2LPSpiWriteRegisters(RSSI_FLT_ADDR, 2, tmpBuffer);
174 }
175 
176 
184 {
185  uint8_t tmpBuffer[2];
186 
187  S2LPSpiReadRegisters(RSSI_FLT_ADDR, 2, tmpBuffer);
188 
189  xSRssiInit->xRssiMode = (SRssiMode)((tmpBuffer[0]&CS_MODE_REGMASK)>>2);
190  xSRssiInit->cRssiFlt = (tmpBuffer[0]&RSSI_FLT_REGMASK)>>4;
191  xSRssiInit->cRssiThreshdBm = S2LPRadioRegToRssidBm(tmpBuffer[1]);
192 
193 }
194 
195 
202 {
203  uint8_t tmp;
204 
205  s_assert_param(IS_SFUNCTIONAL_STATE(xCsBlank));
206 
207  S2LPSpiReadRegisters(ANT_SELECT_CONF_ADDR, 1, &tmp);
208 
209  if(xCsBlank == S_ENABLE) {
210  tmp |= CS_BLANKING_REGMASK;
211  } else {
212  tmp &= ~CS_BLANKING_REGMASK;
213  }
214  g_xStatus = S2LPSpiWriteRegisters(ANT_SELECT_CONF_ADDR, 1, &tmp);
215 
216 }
217 
218 
225 {
226  uint8_t tmp;
227 
228  s_assert_param(IS_SFUNCTIONAL_STATE(xAntennaSwitch));
229 
230  S2LPSpiReadRegisters(ANT_SELECT_CONF_ADDR, 1, &tmp);
231 
232  if(xAntennaSwitch == S_ENABLE) {
233  tmp |= AS_ENABLE_REGMASK;
234  } else {
235  tmp &= ~AS_ENABLE_REGMASK;
236  }
237  g_xStatus = S2LPSpiWriteRegisters(ANT_SELECT_CONF_ADDR, 1, &tmp);
238 
239 }
240 
241 
247 void S2LPRadioSetPqiCheck(uint8_t cPqiLevel)
248 {
249  uint8_t tmp;
250  s_assert_param(IS_PQI_LVL_CHECK(cPqiLevel));
251 
252  S2LPSpiReadRegisters(QI_ADDR, 1, &tmp);
253  tmp &= ~PQI_TH_REGMASK;
254  tmp |= (((uint8_t)cPqiLevel)<<1);
255  S2LPSpiWriteRegisters(QI_ADDR, 1, &tmp);
256 
257 }
258 
259 
266 {
267  uint8_t tmp;
268 
269  S2LPSpiReadRegisters(LINK_QUALIF1_ADDR, 1, &tmp);
270  tmp = (tmp&CS_REGMASK)>>7;
271  return (SFlagStatus)tmp;
272 }
273 
274 
275 
291 /******************* (C) COPYRIGHT 2016 STMicroelectronics *****END OF FILE****/
void S2LPRadioSetRssiThreshdBm(int32_t wRssiThrehsold)
Set the RSSI threshold in dBm.
Definition: S2LP_Qi.c:139
S2LP RSSI Init structure definition.
Definition: S2LP_Qi.h:96
void S2LPRadioAntennaSwitching(SFunctionalState xAntennaSwitch)
Enable or Disable the antenna switching.
Definition: S2LP_Qi.c:224
SFlagStatus S2LPQiGetCs(void)
Return the CS (carrier sense) indication.
Definition: S2LP_Qi.c:265
SFunctionalState
S2LP Functional state. Used to enable or disable a specific option.
Definition: S2LP_Types.h:67
void S2LPRadioSetPqiCheck(uint8_t cPqiLevel)
Set the PQI check.
Definition: S2LP_Qi.c:247
#define RSSI_FLT_ADDR
RSSI_FLT register.
Definition: S2LP_Regs.h:355
#define RSSI_LEVEL_ADDR
RSSI_LEVEL register.
Definition: S2LP_Regs.h:1656
uint8_t cRssiFlt
Definition: S2LP_Qi.h:97
SFlagStatus
S2LP Flag status. Used to control the state of a flag.
Definition: S2LP_Types.h:76
Configuration and management of S2LP QI.
int32_t S2LPRadioGetRssidBmRun(void)
Returns the RSSI value from a current RX mode.
Definition: S2LP_Qi.c:121
void S2LPRadioGetRssiInfo(SRssiInit *xSRssiInit)
Return the RSSI measurements information to be filled with the information.
Definition: S2LP_Qi.c:183
void S2LPRadioRssiInit(SRssiInit *xSRssiInit)
Initialize the RSSI measurement.
Definition: S2LP_Qi.c:155
#define QI_ADDR
QI register.
Definition: S2LP_Regs.h:627
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
SRssiMode
S2LP RSSI mode enumeration.
Definition: S2LP_Qi.h:85
void S2LPRadioCsBlanking(SFunctionalState xCsBlank)
Enable or disables the CS blanking.
Definition: S2LP_Qi.c:201
#define ANT_SELECT_CONF_ADDR
ANT_SELECT_CONF register.
Definition: S2LP_Regs.h:386
#define RSSI_TH_ADDR
RSSI_TH register.
Definition: S2LP_Regs.h:369
int32_t cRssiThreshdBm
Definition: S2LP_Qi.h:99
Header file for low level S2LP SPI driver.
#define LINK_QUALIF1_ADDR
LINK_QUALIF1 register.
Definition: S2LP_Regs.h:1642
int32_t S2LPRadioGetRssidBm(void)
Returns the RSSI value.
Definition: S2LP_Qi.c:109
#define RSSI_LEVEL_RUN_ADDR
RSSI_LEVEL_RUN register.
Definition: S2LP_Regs.h:1773
SRssiMode xRssiMode
Definition: S2LP_Qi.h:98