@@ -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
0 commit comments