Appiko
S2LP_PktWMbus.c
Go to the documentation of this file.
1 
24 /* Includes ------------------------------------------------------------------*/
25 #include "S2LP_PktWMbus.h"
26 #include "MCU_Interface.h"
27 
45 #define PKT_FORMAT_WMBUS_CODE 0x00
46 
47 #define WMBUS_PREAMBLE_LEN_S1S2LONGHEADER (uint16_t)279
48 #define WMBUS_PREAMBLE_LEN_S1MS2T2OTHERTOMETER (uint16_t)15
49 #define WMBUS_PREAMBLE_LEN_T1T2METERTOOTHER (uint16_t)19
50 #define WMBUS_PREAMBLE_LEN_R2 (uint16_t)39
51 #define WMBUS_PREAMBLE_LEN_N1N2 (uint16_t)8
52 
53 #define WMBUS_SYNC_LEN_S1S2LONGHEADER (uint8_t)18
54 #define WMBUS_SYNC_LEN_S1MS2T2OTHERTOMETER (uint8_t)18
55 #define WMBUS_SYNC_LEN_T1T2METERTOOTHER (uint8_t)10
56 #define WMBUS_SYNC_LEN_R2 (uint8_t)18
57 #define WMBUS_SYNC_LEN_N1N2 (uint16_t)16
58 
59 #define WMBUS_SYNCWORD_S1S2LONGHEADER (uint32_t)0xE25A4000
60 #define WMBUS_SYNCWORD_S1MS2T2OTHERTOMETER (uint32_t)0xE25A4000
61 #define WMBUS_SYNCWORD_T1T2METERTOOTHER (uint32_t)0x0F400000
62 #define WMBUS_SYNCWORD_R2 (uint32_t)0xE25A4000
63 #define WMBUS_SYNCWORD_N1N2 (uint32_t)0xf68d0000
64 
74 #define IS_WMBUS_SUBMODE(MODE) (((MODE) == WMBUS_SUBMODE_S1_S2_LONG_HEADER) || \
75  ((MODE) == WMBUS_SUBMODE_NOT_CONFIGURED) || \
76  ((MODE) == WMBUS_SUBMODE_S1_M_S2_T2_OTHER_TO_METER) || \
77  ((MODE) == WMBUS_SUBMODE_T1_T2_METER_TO_OTHER) || \
78  ((MODE) == WMBUS_SUBMODE_R2_SHORT_HEADER))
79 
89 static WMbusSubmode s_cWMbusSubmode = WMBUS_SUBMODE_NOT_CONFIGURED;
90 
108 void S2LPPktWMbusInit(PktWMbusInit* pxPktWMbusInit)
109 {
110  uint8_t tmp;
111  s_assert_param(IS_WMBUS_SUBMODE(pxPktWMbusInit->xWMbusSubmode));
112 
113  /* Packet format config */
115  S2LPPktCommonFilterOnCrc(S_DISABLE);
116 
117  s_cWMbusSubmode = pxPktWMbusInit->xWMbusSubmode;
118 
119  if(s_cWMbusSubmode==WMBUS_SUBMODE_S1_S2_LONG_HEADER) {
120  S2LPSetPreambleLength(((uint16_t)pxPktWMbusInit->cPreambleLength) + WMBUS_PREAMBLE_LEN_S1S2LONGHEADER);
121  S2LPSetSyncLength(WMBUS_SYNC_LEN_S1S2LONGHEADER);
122  S2LPSetSyncWords(WMBUS_SYNCWORD_S1S2LONGHEADER, WMBUS_SYNC_LEN_S1S2LONGHEADER);
123  S2LPPacketHandlerManchester(S_ENABLE);
124 
125  /* Constellation map setting */
126  S2LPSpiReadRegisters(MOD1_ADDR, 1, &tmp);
127  tmp &= ~G4FSK_CONST_MAP_REGMASK;
128  tmp |= (((uint8_t)2)<<4);
129  S2LPSpiWriteRegisters(MOD1_ADDR, 1, &tmp);
130 
131  S2LPSpiReadRegisters(0xF1, 1, &tmp);
132  if((tmp&0xC0)==0xC0)
134  }
135  else if(s_cWMbusSubmode==WMBUS_SUBMODE_S1_M_S2_T2_OTHER_TO_METER) {
136  S2LPSetPreambleLength(((uint16_t)pxPktWMbusInit->cPreambleLength) + WMBUS_PREAMBLE_LEN_S1MS2T2OTHERTOMETER);
137  S2LPSetSyncLength(WMBUS_SYNC_LEN_S1MS2T2OTHERTOMETER);
138  S2LPSetSyncWords(WMBUS_SYNCWORD_S1MS2T2OTHERTOMETER, WMBUS_SYNC_LEN_S1MS2T2OTHERTOMETER);
139  S2LPPacketHandlerManchester(S_ENABLE);
140  /* Constellation map setting */
141  S2LPSpiReadRegisters(MOD1_ADDR, 1, &tmp);
142  tmp &= ~G4FSK_CONST_MAP_REGMASK;
143  tmp |= (((uint8_t)2)<<4);
144  S2LPSpiWriteRegisters(MOD1_ADDR, 1, &tmp);
145 
146  S2LPSpiReadRegisters(0xF1, 1, &tmp);
147  if((tmp&0xC0)==0xC0)
149  }
150  else if(s_cWMbusSubmode==WMBUS_SUBMODE_T1_T2_METER_TO_OTHER) {
151  S2LPSetPreambleLength(((uint16_t)pxPktWMbusInit->cPreambleLength) + WMBUS_PREAMBLE_LEN_T1T2METERTOOTHER);
152  S2LPSetSyncLength(WMBUS_SYNC_LEN_T1T2METERTOOTHER);
153  S2LPSetSyncWords(WMBUS_SYNCWORD_T1T2METERTOOTHER, WMBUS_SYNC_LEN_T1T2METERTOOTHER);
154  S2LPPacketHandler3OutOf6(S_ENABLE);
155  }
156  else if(s_cWMbusSubmode==WMBUS_SUBMODE_R2_SHORT_HEADER) {
157  S2LPSetPreambleLength(((uint16_t)pxPktWMbusInit->cPreambleLength) + WMBUS_PREAMBLE_LEN_R2);
158  S2LPSetSyncLength(WMBUS_SYNC_LEN_R2);
159  S2LPSetSyncWords(WMBUS_SYNCWORD_R2, WMBUS_SYNC_LEN_R2);
160  S2LPPacketHandlerManchester(S_ENABLE);
161  /* Constellation map setting */
162  S2LPSpiReadRegisters(MOD1_ADDR, 1, &tmp);
163  tmp &= ~G4FSK_CONST_MAP_REGMASK;
164  tmp |= (((uint8_t)2)<<4);
165  S2LPSpiWriteRegisters(MOD1_ADDR, 1, &tmp);
166  }
167 
168 
169  S2LPPktWMbusSetPostamble(pxPktWMbusInit->cPostambleLength);
170 }
171 
178 void S2LPPktWMbusGetInfo(PktWMbusInit* pxPktWMbusInit)
179 {
180  uint16_t tmp;
181 
182  tmp = S2LPGetPreambleLength();
183 
184  if(s_cWMbusSubmode==WMBUS_SUBMODE_S1_S2_LONG_HEADER) {
185  if(tmp>=WMBUS_PREAMBLE_LEN_S1S2LONGHEADER)
186  tmp -= WMBUS_PREAMBLE_LEN_S1S2LONGHEADER;
187  }
188  else if(s_cWMbusSubmode==WMBUS_SUBMODE_S1_M_S2_T2_OTHER_TO_METER) {
189  if(tmp>=WMBUS_PREAMBLE_LEN_S1MS2T2OTHERTOMETER)
190  tmp -= WMBUS_PREAMBLE_LEN_S1MS2T2OTHERTOMETER;
191  }
192  else if(s_cWMbusSubmode==WMBUS_SUBMODE_T1_T2_METER_TO_OTHER) {
193  if(tmp>=WMBUS_PREAMBLE_LEN_T1T2METERTOOTHER)
194  tmp -= WMBUS_PREAMBLE_LEN_T1T2METERTOOTHER;
195  }
196  else if(s_cWMbusSubmode==WMBUS_SUBMODE_R2_SHORT_HEADER) {
197  if(tmp>=WMBUS_PREAMBLE_LEN_R2)
198  tmp -= WMBUS_PREAMBLE_LEN_R2;
199  }
200 
201  pxPktWMbusInit->cPreambleLength = (uint8_t)tmp;
202  pxPktWMbusInit->cPostambleLength = S2LPPktWMbusGetPostamble();
203  pxPktWMbusInit->xWMbusSubmode = s_cWMbusSubmode;
204 
205 }
206 
207 
214 {
215  uint8_t tmpBuffer[4] = {0,0,0,0};
216 
217  /* Configure the WMBUS mode packet format and reset all the other setting */
218  tmpBuffer[1] |= PKT_FORMAT_WMBUS_CODE;
219  g_xStatus = S2LPSpiWriteRegisters(PCKTCTRL4_ADDR, 4, tmpBuffer);
220 
221 }
222 
223 
224 
231 void S2LPPktWMbusSetPostamble(uint8_t cPostamble)
232 {
233  uint8_t tmp;
234  g_xStatus = S2LPSpiReadRegisters(PCKT_PSTMBL_ADDR, 1, &tmp);
235  tmp = (tmp & 0xC0) | cPostamble;
236  g_xStatus = S2LPSpiWriteRegisters(PCKT_PSTMBL_ADDR, 1, &tmp);
237 }
238 
239 
247 void S2LPPktWMbusSetPostamblePattern(uint8_t cPostamble)
248 {
249  uint8_t tmp;
250  g_xStatus = S2LPSpiReadRegisters(PCKT_PSTMBL_ADDR, 1, &tmp);
251  tmp = (tmp & 0x3F) | (cPostamble<<6);
252  g_xStatus = S2LPSpiWriteRegisters(PCKT_PSTMBL_ADDR, 1, &tmp);
253 }
254 
255 
262 {
263  uint8_t tmp;
264  g_xStatus = S2LPSpiReadRegisters(PCKT_PSTMBL_ADDR, 1, &tmp);
265  return (tmp & 0x3F);
266 }
267 
268 
275 {
276  uint8_t tmp;
277  g_xStatus = S2LPSpiReadRegisters(PCKT_PSTMBL_ADDR, 1, &tmp);
278  return ((tmp & 0xC0)>>6);
279 }
280 
281 
288 {
289  s_cWMbusSubmode = xWMbusSubmode;
290 }
291 
292 
299 {
300  return s_cWMbusSubmode;
301 }
302 
303 
310 void S2LPPktWMbusSetPayloadLength(uint16_t nPayloadLength)
311 {
312  uint8_t tmpBuffer[2];
313 
314  tmpBuffer[0] = (uint8_t)(nPayloadLength>>8);
315  tmpBuffer[1] = (uint8_t)nPayloadLength;
316  g_xStatus = S2LPSpiWriteRegisters(PCKTLEN1_ADDR, 2, tmpBuffer);
317 }
318 
319 
326 {
327  uint8_t tmpBuffer[2];
328  uint16_t nPayloadLength;
329 
330  g_xStatus = S2LPSpiReadRegisters(PCKTLEN1_ADDR, 2, tmpBuffer);
331  nPayloadLength = (((uint16_t)tmpBuffer[0])<<8) | ((uint16_t)tmpBuffer[1]);
332 
333  return nPayloadLength;
334 }
335 
353 /******************* (C) COPYRIGHT 2016 STMicroelectronics *****END OF FILE****/
void S2LPPacketHandler3OutOf6(SFunctionalState xNewState)
Enable or Disable the 3o6 encoding.
uint8_t S2LPPktWMbusGetPostamble(void)
Returns how many chips are used in the postamble.
WMbusSubmode S2LPPktWMbusGetSubmode(void)
Return the WMBUS submode used.
void S2LPPktWMbusSetSubmode(WMbusSubmode xWMbusSubmode)
Set the W-MBus submode.
void S2LPPktWMbusGetInfo(PktWMbusInit *pxPktWMbusInit)
Return the S2LP WMBUS packet structure according to the specified parameters in the registers.
#define MOD1_ADDR
MOD1 register.
Definition: S2LP_Regs.h:263
S2LP WMBUS Packet Init structure definition.
void S2LPSetPreambleLength(uint16_t cPreambleLength)
Set the PREAMBLE field Length mode for S2LP packets.
WMbusSubmode
WMbus submode enumeration.
Definition: S2LP_PktWMbus.h:92
#define PCKT_PSTMBL_ADDR
PCKT_PSTMBL register.
Definition: S2LP_Regs.h:642
void S2LPPktWMbusInit(PktWMbusInit *pxPktWMbusInit)
Initialize the S2LP WMBUS packet according to the specified parameters in the PktWMbusInit struct.
#define PCKTCTRL4_ADDR
PCKTCTRL4 register.
Definition: S2LP_Regs.h:467
uint8_t S2LPPktWMbusGetPostamblePattern(void)
Returns the pattern of the postamble.
void S2LPSetSyncWords(uint32_t lSyncWords, uint8_t xSyncLength)
Set the SYNC_WORD.
uint16_t S2LPGetPreambleLength(void)
Return the PREAMBLE field Length mode for S2LP packets.
void S2LPPktCommonFilterOnCrc(SFunctionalState xNewState)
Enable or Disable the filtering on CRC.
void S2LPPacketHandlerManchester(SFunctionalState xNewState)
Enable or Disable the MANCHESTER encoding.
void S2LPPktWMbusSetPostamblePattern(uint8_t cPostamble)
Set the pattern of the postamble.
WMbusSubmode xWMbusSubmode
Configuration and management of S2-LP WMbus packets.
uint16_t S2LPPktWMbusGetPayloadLength(void)
Return the payload length for WMBUS packets.
#define PCKTLEN1_ADDR
PCKTLEN1 register.
Definition: S2LP_Regs.h:547
void S2LPPktWMbusSetFormat(void)
Configure the WMBUS packet format as the one used by S2LP.
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 S2LPPktWMbusSetPayloadLength(uint16_t nPayloadLength)
Sets the payload length for S2LP WMBUS packets.
Header file for low level S2LP SPI driver.
uint8_t cPreambleLength
void S2LPPktWMbusSetPostamble(uint8_t cPostamble)
Set how many chips will be used in postamble.
uint8_t cPostambleLength
void S2LPSetSyncLength(uint8_t cSyncLength)
Set the SYNC field Length for S2LP packets.