Skip to content

Commit 56777b2

Browse files
committed
Add support to X-NUCLEO-S2915A1
1 parent 878c035 commit 56777b2

File tree

5 files changed

+143
-26
lines changed

5 files changed

+143
-26
lines changed

library.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
name=STM32duino S2-LP
2-
version=1.0.1
2+
version=1.1.0
33
author=SRA
44
maintainer=stm32duino
55
sentence=This library includes drivers for ST S2-LP sub-1GHz transceiver.

src/S2LP.cpp

Lines changed: 122 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@ S2LP::S2LP(SPIClass *spi, int csn, int sdn, int irqn, uint32_t frequency, uint32
9090
cRxData = 0;
9191
is_waiting_for_read = false;
9292
is_tx_done_before_read = false;
93+
is_bypass_enabled = false;
9394
}
9495

9596
/**
@@ -146,9 +147,14 @@ void S2LP::begin(void)
146147

147148
if(s_paInfo.paRfRangeExtender == RANGE_EXT_SKYWORKS_SE2435L)
148149
{
149-
S2LPGpioInit(&s_paInfo.paSignalCSD);
150-
S2LPGpioInit(&s_paInfo.paSignalCPS);
151-
S2LPGpioInit(&s_paInfo.paSignalCTX);
150+
S2LPGpioInit(&s_paInfo.paSignalCSD_S2LP);
151+
S2LPGpioInit(&s_paInfo.paSignalCPS_S2LP);
152+
S2LPGpioInit(&s_paInfo.paSignalCTX_S2LP);
153+
} else if(s_paInfo.paRfRangeExtender == RANGE_EXT_SKYWORKS_SKY66420)
154+
{
155+
pinMode(s_paInfo.paSignalCSD_MCU, OUTPUT);
156+
pinMode(s_paInfo.paSignalCPS_MCU, OUTPUT);
157+
pinMode(s_paInfo.paSignalCTX_MCU, OUTPUT);
152158
}
153159
}
154160

@@ -230,6 +236,14 @@ void S2LP::begin(void)
230236
/* enable the fast rx timer */
231237
S2LpTimerFastRxTermTimer(S_ENABLE);
232238

239+
uint8_t tmp = 0x90;
240+
S2LPSpiWriteRegisters(0x76, 1, &tmp);
241+
242+
if(s_paInfo.paRfRangeExtender == RANGE_EXT_SKYWORKS_SKY66420)
243+
{
244+
FEM_Operation_SKY66420(FEM_RX);
245+
}
246+
233247
/* the RX command triggers the LDC in fast RX termination mode */
234248
S2LPCmdStrobeCommand(CMD_RX);
235249

@@ -261,6 +275,14 @@ void S2LP::end(void)
261275
/* Reset SDN pin */
262276
pinMode(sdn_pin, INPUT);
263277

278+
/* Reset CSD, CPS and CTX if it is needed */
279+
if(s_paInfo.paRfRangeExtender == RANGE_EXT_SKYWORKS_SKY66420)
280+
{
281+
pinMode(s_paInfo.paSignalCSD_MCU, INPUT);
282+
pinMode(s_paInfo.paSignalCPS_MCU, INPUT);
283+
pinMode(s_paInfo.paSignalCTX_MCU, INPUT);
284+
}
285+
264286
/* Reset all internal variables */
265287
memset((void *)&g_xStatus, 0, sizeof(S2LPStatus));
266288
s_cWMbusSubmode = WMBUS_SUBMODE_NOT_CONFIGURED;
@@ -272,6 +294,7 @@ void S2LP::end(void)
272294
cRxData = 0;
273295
is_waiting_for_read = false;
274296
is_tx_done_before_read = false;
297+
is_bypass_enabled = false;
275298
}
276299

277300
/**
@@ -337,6 +360,14 @@ uint8_t S2LP::send(uint8_t *payload, uint8_t payload_len, uint8_t dest_addr, boo
337360

338361
enableS2LPIrq();
339362

363+
uint8_t tmp=0x9C;
364+
S2LPSpiWriteRegisters(0x76,1,&tmp);
365+
366+
if(s_paInfo.paRfRangeExtender == RANGE_EXT_SKYWORKS_SKY66420)
367+
{
368+
FEM_Operation_SKY66420(FEM_TX);
369+
}
370+
340371
S2LPCmdStrobeCommand(CMD_TX);
341372

342373
start_time = millis();
@@ -361,6 +392,14 @@ uint8_t S2LP::send(uint8_t *payload, uint8_t payload_len, uint8_t dest_addr, boo
361392
is_tx_done_before_read = true;
362393
} else
363394
{
395+
uint8_t tmp = 0x90;
396+
S2LPSpiWriteRegisters(0x76, 1, &tmp);
397+
398+
if(s_paInfo.paRfRangeExtender == RANGE_EXT_SKYWORKS_SKY66420)
399+
{
400+
FEM_Operation_SKY66420(FEM_RX);
401+
}
402+
364403
/* Return to RX state */
365404
S2LPCmdStrobeCommand(CMD_RX);
366405
}
@@ -418,6 +457,13 @@ uint8_t S2LP::read(uint8_t *payload, uint8_t payload_len)
418457
if(is_tx_done_before_read)
419458
{
420459
is_tx_done_before_read = false;
460+
uint8_t tmp = 0x90;
461+
S2LPSpiWriteRegisters(0x76, 1, &tmp);
462+
463+
if(s_paInfo.paRfRangeExtender == RANGE_EXT_SKYWORKS_SKY66420)
464+
{
465+
FEM_Operation_SKY66420(FEM_RX);
466+
}
421467

422468
/* Return to RX state */
423469
S2LPCmdStrobeCommand(CMD_RX);
@@ -560,6 +606,79 @@ void S2LP::enableS2LPIrq(void)
560606
}
561607
}
562608

609+
/**
610+
* @brief Commands for external PA of type SKY66420.
611+
* @param operation the command to be executed.
612+
* @retval None.
613+
*/
614+
void S2LP::FEM_Operation_SKY66420(FEM_OperationType operation)
615+
{
616+
switch (operation)
617+
{
618+
case FEM_SHUTDOWN:
619+
{
620+
/* Puts CSD high to turn on PA */
621+
digitalWrite(s_paInfo.paSignalCSD_MCU, LOW);
622+
623+
/* Puts CTX high to go in TX state DON'T CARE */
624+
digitalWrite(s_paInfo.paSignalCTX_MCU, HIGH);
625+
626+
/* No Bypass mode select DON'T CARE */
627+
digitalWrite(s_paInfo.paSignalCPS_MCU, HIGH);
628+
629+
break;
630+
}
631+
case FEM_TX_BYPASS:
632+
{
633+
/* Puts CSD high to turn on PA */
634+
digitalWrite(s_paInfo.paSignalCSD_MCU, HIGH);
635+
636+
/* Puts CTX high to go in TX state */
637+
digitalWrite(s_paInfo.paSignalCTX_MCU, HIGH);
638+
639+
/* Bypass mode select */
640+
digitalWrite(s_paInfo.paSignalCPS_MCU, LOW);
641+
642+
break;
643+
}
644+
case FEM_TX:
645+
{
646+
/* Puts CSD high to turn on PA */
647+
digitalWrite(s_paInfo.paSignalCSD_MCU, HIGH);
648+
649+
/* Puts CTX high to go in TX state */
650+
digitalWrite(s_paInfo.paSignalCTX_MCU, HIGH);
651+
652+
/* No Bypass mode select DON'T CARE */
653+
digitalWrite(s_paInfo.paSignalCPS_MCU, HIGH);
654+
655+
break;
656+
}
657+
case FEM_RX:
658+
{
659+
/* Puts CSD high to turn on PA */
660+
digitalWrite(s_paInfo.paSignalCSD_MCU, HIGH);
661+
662+
/* Puts CTX low */
663+
digitalWrite(s_paInfo.paSignalCTX_MCU, LOW);
664+
665+
/* Check Bypass mode */
666+
if (is_bypass_enabled)
667+
{
668+
digitalWrite(s_paInfo.paSignalCPS_MCU, LOW);
669+
} else
670+
{
671+
digitalWrite(s_paInfo.paSignalCPS_MCU, HIGH);
672+
}
673+
674+
break;
675+
}
676+
default:
677+
/* Error */
678+
break;
679+
}
680+
}
681+
563682
/**
564683
* @brief Write single or multiple registers.
565684
* @param cRegAddress: base register's address to be write

src/S2LP.h

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -85,9 +85,12 @@ typedef void (*S2LPEventHandler)(void);
8585

8686
typedef struct PAInfo_s {
8787
RangeExtType paRfRangeExtender;
88-
SGpioInit paSignalCSD;
89-
SGpioInit paSignalCPS;
90-
SGpioInit paSignalCTX;
88+
SGpioInit paSignalCSD_S2LP;
89+
SGpioInit paSignalCPS_S2LP;
90+
SGpioInit paSignalCTX_S2LP;
91+
int paSignalCSD_MCU;
92+
int paSignalCPS_MCU;
93+
int paSignalCTX_MCU;
9194
uint8_t paLevelValue;
9295
} PAInfo_t;
9396

@@ -99,7 +102,7 @@ typedef struct PAInfo_s {
99102
class S2LP
100103
{
101104
public:
102-
S2LP(SPIClass *spi, int csn, int sdn, int irqn, uint32_t frequency=868000000, uint32_t xtalFrequency=50000000, PAInfo_t paInfo={.paRfRangeExtender=RANGE_EXT_NONE, .paSignalCSD={S2LP_GPIO_0, S2LP_GPIO_MODE_DIGITAL_OUTPUT_LP, S2LP_GPIO_DIG_OUT_TX_RX_MODE}, .paSignalCPS={S2LP_GPIO_1, S2LP_GPIO_MODE_DIGITAL_OUTPUT_LP, S2LP_GPIO_DIG_OUT_RX_STATE}, .paSignalCTX={S2LP_GPIO_2, S2LP_GPIO_MODE_DIGITAL_OUTPUT_LP, S2LP_GPIO_DIG_OUT_TX_STATE}, .paLevelValue=0x25}, S2LPGpioPin irq_gpio=S2LP_GPIO_3, uint8_t my_addr=0x44, uint8_t multicast_addr=0xEE, uint8_t broadcast_addr=0xFF);
105+
S2LP(SPIClass *spi, int csn, int sdn, int irqn, uint32_t frequency=868000000, uint32_t xtalFrequency=50000000, PAInfo_t paInfo={.paRfRangeExtender=RANGE_EXT_NONE, .paSignalCSD_S2LP={S2LP_GPIO_0, S2LP_GPIO_MODE_DIGITAL_OUTPUT_LP, S2LP_GPIO_DIG_OUT_TX_RX_MODE}, .paSignalCPS_S2LP={S2LP_GPIO_1, S2LP_GPIO_MODE_DIGITAL_OUTPUT_LP, S2LP_GPIO_DIG_OUT_RX_STATE}, .paSignalCTX_S2LP={S2LP_GPIO_2, S2LP_GPIO_MODE_DIGITAL_OUTPUT_LP, S2LP_GPIO_DIG_OUT_TX_STATE}, .paSignalCSD_MCU=A0, .paSignalCPS_MCU=A2, .paSignalCTX_MCU=A3, .paLevelValue=0x25}, S2LPGpioPin irq_gpio=S2LP_GPIO_3, uint8_t my_addr=0x44, uint8_t multicast_addr=0xEE, uint8_t broadcast_addr=0xFF);
103106
void begin(void);
104107
void end(void);
105108
void attachS2LPReceive(S2LPEventHandler func);
@@ -114,6 +117,7 @@ class S2LP
114117
void S2LPIrqHandler(void);
115118
void disableS2LPIrq(void);
116119
void enableS2LPIrq(void);
120+
void FEM_Operation_SKY66420(FEM_OperationType operation);
117121
S2LPStatus S2LPSpiWriteRegisters(uint8_t cRegAddress, uint8_t cNbBytes, uint8_t* pcBuffer);
118122
S2LPStatus S2LPSpiReadRegisters(uint8_t cRegAddress, uint8_t cNbBytes, uint8_t* pcBuffer);
119123
S2LPStatus S2LPSpiCommandStrobes(uint8_t cCommandCode);
@@ -368,6 +372,7 @@ class S2LP
368372
uint8_t cRxData;
369373
volatile bool is_waiting_for_read;
370374
volatile bool is_tx_done_before_read;
375+
bool is_bypass_enabled;
371376
};
372377

373378
#endif /* __S2LP_H__ */

src/S2LP_Commands.h

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -110,24 +110,6 @@ typedef enum
110110
* @{
111111
*/
112112

113-
/**
114-
* @brief Sends the TX command to S2-LP. Start to transmit.
115-
* @param None.
116-
* @retval None.
117-
* @note: this macro sets the SMPS switching frequency to 5.46MHz about for ETSI regulation compliancy.
118-
*/
119-
#define S2LPCmdStrobeTx() {uint8_t tmp=0x9C; S2LPSpiWriteRegisters(0x76,1,&tmp);\
120-
S2LPCmdStrobeCommand(CMD_TX);}
121-
122-
/**
123-
* @brief Sends the RX command to S2-LP. Start to receive.
124-
* @param None.
125-
* @retval None.
126-
* @note: this macro sets the SMPS switching frequency to 3.12MHz.
127-
*/
128-
#define S2LPCmdStrobeRx() {uint8_t tmp=0x90; S2LPSpiWriteRegisters(0x76,1,&tmp);\
129-
S2LPCmdStrobeCommand(CMD_RX);}
130-
131113
#define S2LPCmdStrobeReady() S2LPCmdStrobeCommand(CMD_READY)
132114
#define S2LPCmdStrobeStandby() S2LPCmdStrobeCommand(CMD_STANDBY)
133115
#define S2LPCmdStrobeSleep() S2LPCmdStrobeCommand(CMD_SLEEP)

src/S2LP_Types.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,17 @@ typedef enum
150150
S2LP_CUT_3_0 = 0xC1,
151151
} S2LPCutType;
152152

153+
/**
154+
* @brief FEM Operation type. This definition represents the structure to manage External PA.
155+
*/
156+
typedef enum
157+
{
158+
FEM_SHUTDOWN = 0x00,
159+
FEM_TX_BYPASS = 0x01,
160+
FEM_TX = 0x02,
161+
FEM_RX = 0x03,
162+
} FEM_OperationType;
163+
153164

154165
/**
155166
* @}

0 commit comments

Comments
 (0)