Skip to content

Commit dc9bb19

Browse files
author
Hasnain Virk
committed
Removing software RX timeouts in RX chain
Both in FSK and LoRa mode, we do not rely on software timers anymore. This makes our timing precise and enables us to consume less power. It also gives us flexibility which we need for future deep sleep venture as Mbed OS timeout class may lock the sleep manager if not using low power timers.
1 parent c4dd25e commit dc9bb19

File tree

4 files changed

+124
-185
lines changed

4 files changed

+124
-185
lines changed

SX1272/SX1272_LoRaRadio.cpp

Lines changed: 43 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -306,7 +306,6 @@ void SX1272_LoRaRadio::sleep()
306306
{
307307
// stop timers
308308
tx_timeout_timer.detach();
309-
rx_timeout_timer.detach();
310309

311310
// put module in sleep mode
312311
set_operation_mode(RF_OPMODE_SLEEP);
@@ -415,8 +414,7 @@ void SX1272_LoRaRadio::set_rx_config(radio_modems_t modem, uint32_t bandwidth,
415414
_rf_settings.fsk.iq_inverted = iq_inverted;
416415
_rf_settings.fsk.rx_continuous = rx_continuous;
417416
_rf_settings.fsk.preamble_len = preamble_len;
418-
_rf_settings.fsk.rx_single_timeout =
419-
symb_timeout * ((1.0 / (double) datarate) * 8.0) * 1e3;
417+
_rf_settings.fsk.rx_single_timeout = (symb_timeout + 1) / 2; // dividing by 2 as our detector size is 2 symbols (16 bytes)
420418

421419
datarate = (uint16_t) ((double) XTAL_FREQ / (double) datarate);
422420
write_to_register(REG_BITRATEMSB, (uint8_t) (datarate >> 8));
@@ -867,19 +865,13 @@ void SX1272_LoRaRadio::transmit(uint32_t timeout)
867865
* and finally a DIO0 interrupt let's the state machine know that a packet is
868866
* ready to be read from the FIFO
869867
*/
870-
void SX1272_LoRaRadio::receive(uint32_t timeout)
868+
void SX1272_LoRaRadio::receive(uint32_t /**timeout**/)
871869
{
872870
switch (_rf_settings.modem) {
873871
case MODEM_FSK:
874-
if (timeout == 0 && _rf_settings.fsk.rx_continuous == false) {
875-
// user messed up probably timeout was 0 but mode was not
876-
// continuous, force it to be continuous
877-
_rf_settings.fsk.rx_continuous = true;
878-
}
879-
880872
// DIO0=PayloadReady
881873
// DIO1=FifoLevel
882-
// DIO2=SyncAddr
874+
// DIO2=RxTimeout
883875
// DIO3=FifoEmpty
884876
// DIO4=Preamble
885877
// DIO5=ModeReady
@@ -889,7 +881,7 @@ void SX1272_LoRaRadio::receive(uint32_t timeout)
889881
RF_DIOMAPPING1_DIO2_MASK) |
890882
RF_DIOMAPPING1_DIO0_00 |
891883
RF_DIOMAPPING1_DIO1_00 |
892-
RF_DIOMAPPING1_DIO2_11);
884+
RF_DIOMAPPING1_DIO2_10);
893885

894886
write_to_register(REG_DIOMAPPING2, (read_register(REG_DIOMAPPING2) &
895887
RF_DIOMAPPING2_DIO4_MASK &
@@ -904,6 +896,11 @@ void SX1272_LoRaRadio::receive(uint32_t timeout)
904896
RF_RXCONFIG_AGCAUTO_ON |
905897
RF_RXCONFIG_RXTRIGER_PREAMBLEDETECT);
906898

899+
write_to_register(REG_RXTIMEOUT2, _rf_settings.fsk.rx_single_timeout <= 255 ?
900+
_rf_settings.fsk.rx_single_timeout : 255);
901+
write_to_register(REG_RXTIMEOUT3, 0x00);
902+
write_to_register(REG_RXTIMEOUT1, 0x00);
903+
907904
_rf_settings.fsk_packet_handler.preamble_detected = 0;
908905
_rf_settings.fsk_packet_handler.sync_word_detected = 0;
909906
_rf_settings.fsk_packet_handler.nb_bytes = 0;
@@ -912,11 +909,6 @@ void SX1272_LoRaRadio::receive(uint32_t timeout)
912909
break;
913910

914911
case MODEM_LORA:
915-
if (timeout == 0 && _rf_settings.lora.rx_continuous == false) {
916-
// user messed up probably timeout was 0 but mode was not
917-
// continuous, force it to be continuous
918-
_rf_settings.lora.rx_continuous = true;
919-
}
920912

921913
if (_rf_settings.lora.iq_inverted == true) {
922914
write_to_register(REG_LR_INVERTIQ, ((read_register(REG_LR_INVERTIQ) &
@@ -971,21 +963,8 @@ void SX1272_LoRaRadio::receive(uint32_t timeout)
971963

972964
_rf_settings.state = RF_RX_RUNNING;
973965

974-
if (timeout != 0) {
975-
rx_timeout_timer.attach_us(callback(this,
976-
&SX1272_LoRaRadio::timeout_irq_isr),
977-
timeout*1e3);
978-
}
979-
980966
if (_rf_settings.modem == MODEM_FSK) {
981967
set_operation_mode(RF_OPMODE_RECEIVER);
982-
983-
if (_rf_settings.fsk.rx_continuous == false) {
984-
rx_timeout_sync_word.attach_us(callback(this,
985-
&SX1272_LoRaRadio::timeout_irq_isr),
986-
_rf_settings.fsk.rx_single_timeout * 1e3);
987-
}
988-
989968
return;
990969
}
991970

@@ -1144,8 +1123,6 @@ void SX1272_LoRaRadio::set_tx_continuous_wave(uint32_t freq, int8_t power,
11441123
void SX1272_LoRaRadio::standby( void )
11451124
{
11461125
tx_timeout_timer.detach();
1147-
rx_timeout_timer.detach();
1148-
11491126
set_operation_mode(RF_OPMODE_STANDBY);
11501127
_rf_settings.state = RF_IDLE;
11511128
}
@@ -1732,7 +1709,6 @@ void SX1272_LoRaRadio::handle_dio0_irq()
17321709

17331710

17341711
if (_rf_settings.fsk.rx_continuous == false) {
1735-
rx_timeout_sync_word.detach();
17361712
_rf_settings.state = RF_IDLE;
17371713
} else {
17381714
// Continuous mode restart Rx chain
@@ -1741,8 +1717,6 @@ void SX1272_LoRaRadio::handle_dio0_irq()
17411717
RF_RXCONFIG_RESTARTRXWITHOUTPLLLOCK);
17421718
}
17431719

1744-
rx_timeout_timer.detach();
1745-
17461720
if ((_radio_events != NULL)
17471721
&& (_radio_events->rx_error)) {
17481722
_radio_events->rx_error();
@@ -1757,6 +1731,15 @@ void SX1272_LoRaRadio::handle_dio0_irq()
17571731
}
17581732
}
17591733

1734+
// This block was moved from dio2_handler.
1735+
// We can have a snapshot of RSSI here as at this point it
1736+
// should be more smoothed out.
1737+
_rf_settings.fsk_packet_handler.rssi_value = -(read_register(REG_RSSIVALUE) >> 1);
1738+
_rf_settings.fsk_packet_handler.afc_value = (int32_t)(double)(((uint16_t)read_register(REG_AFCMSB) << 8) |
1739+
(uint16_t)read_register(REG_AFCLSB)) *
1740+
(double)FREQ_STEP;
1741+
_rf_settings.fsk_packet_handler.rx_gain = (read_register(REG_LNA) >> 5) & 0x07;
1742+
17601743
// Read received packet size
17611744
if ((_rf_settings.fsk_packet_handler.size == 0)
17621745
&& (_rf_settings.fsk_packet_handler.nb_bytes == 0)) {
@@ -1778,15 +1761,12 @@ void SX1272_LoRaRadio::handle_dio0_irq()
17781761

17791762
if (_rf_settings.fsk.rx_continuous == false) {
17801763
_rf_settings.state = RF_IDLE;
1781-
rx_timeout_sync_word.detach();
17821764
} else {
17831765
// Continuous mode restart Rx chain
17841766
write_to_register(REG_RXCONFIG, read_register(REG_RXCONFIG)
17851767
| RF_RXCONFIG_RESTARTRXWITHOUTPLLLOCK);
17861768
}
17871769

1788-
rx_timeout_timer.detach();
1789-
17901770
if ((_radio_events != NULL) && (_radio_events->rx_done)) {
17911771
_radio_events->rx_done(
17921772
_data_buffer,
@@ -1814,7 +1794,6 @@ void SX1272_LoRaRadio::handle_dio0_irq()
18141794
if (_rf_settings.lora.rx_continuous == false) {
18151795
_rf_settings.state = RF_IDLE;
18161796
}
1817-
rx_timeout_timer.detach();
18181797

18191798
if ((_radio_events != NULL)
18201799
&& (_radio_events->rx_error)) {
@@ -1849,7 +1828,6 @@ void SX1272_LoRaRadio::handle_dio0_irq()
18491828
if (_rf_settings.lora.rx_continuous == false) {
18501829
_rf_settings.state = RF_IDLE;
18511830
}
1852-
rx_timeout_timer.detach();
18531831

18541832
if ((_radio_events != NULL)
18551833
&& (_radio_events->rx_done)) {
@@ -1923,7 +1901,6 @@ void SX1272_LoRaRadio::handle_dio1_irq()
19231901
break;
19241902
case MODEM_LORA:
19251903
// Sync time out
1926-
rx_timeout_timer.detach( );
19271904
_rf_settings.state = RF_IDLE;
19281905
if ((_radio_events != NULL) && (_radio_events->rx_timeout)) {
19291906
_radio_events->rx_timeout();
@@ -1969,23 +1946,33 @@ void SX1272_LoRaRadio::handle_dio2_irq(void)
19691946
switch( _rf_settings.modem )
19701947
{
19711948
case MODEM_FSK:
1949+
_rf_settings.fsk_packet_handler.preamble_detected = 0;
1950+
_rf_settings.fsk_packet_handler.sync_word_detected = 0;
1951+
_rf_settings.fsk_packet_handler.nb_bytes = 0;
1952+
_rf_settings.fsk_packet_handler.size = 0;
1953+
1954+
// Clear Irqs
1955+
write_to_register(REG_IRQFLAGS1, RF_IRQFLAGS1_RSSI |
1956+
RF_IRQFLAGS1_PREAMBLEDETECT |
1957+
RF_IRQFLAGS1_SYNCADDRESSMATCH |
1958+
RF_IRQFLAGS1_TIMEOUT);
1959+
1960+
write_to_register( REG_IRQFLAGS2, RF_IRQFLAGS2_FIFOOVERRUN);
1961+
1962+
if (_rf_settings.fsk.rx_continuous == true) {
1963+
// Continuous mode restart Rx chain
1964+
write_to_register( REG_RXCONFIG,
1965+
read_register(REG_RXCONFIG) |
1966+
RF_RXCONFIG_RESTARTRXWITHOUTPLLLOCK);
1967+
} else {
1968+
_rf_settings.state = RF_IDLE;
1969+
}
19721970

1973-
// DIO4 must have been asserted to set preamble_detected to true
1974-
if( ( _rf_settings.fsk_packet_handler.preamble_detected == 1 ) && ( _rf_settings.fsk_packet_handler.sync_word_detected == 0 ) )
1975-
{
1976-
if (_rf_settings.fsk.rx_continuous == false) {
1977-
rx_timeout_sync_word.detach( );
1978-
}
1979-
1980-
_rf_settings.fsk_packet_handler.sync_word_detected = 1;
1981-
1982-
_rf_settings.fsk_packet_handler.rssi_value = -( read_register( REG_RSSIVALUE ) >> 1 );
1983-
1984-
_rf_settings.fsk_packet_handler.afc_value = ( int32_t )( double )( ( ( uint16_t )read_register( REG_AFCMSB ) << 8 ) |
1985-
( uint16_t )read_register( REG_AFCLSB ) ) *
1986-
( double )FREQ_STEP;
1987-
_rf_settings.fsk_packet_handler.rx_gain = ( read_register( REG_LNA ) >> 5 ) & 0x07;
1971+
if ((_radio_events != NULL)
1972+
&& (_radio_events->rx_timeout)) {
1973+
_radio_events->rx_timeout();
19881974
}
1975+
19891976
break;
19901977
case MODEM_LORA:
19911978
if( _rf_settings.lora.freq_hop_on == true )
@@ -2117,8 +2104,6 @@ void SX1272_LoRaRadio::handle_timeout_irq()
21172104
else
21182105
{
21192106
_rf_settings.state = RF_IDLE;
2120-
rx_timeout_sync_word.attach_us(callback(this, &SX1272_LoRaRadio::timeout_irq_isr),
2121-
_rf_settings.fsk.rx_single_timeout * 1e3);
21222107
}
21232108
}
21242109

SX1272/SX1272_LoRaRadio.h

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -203,7 +203,7 @@ class SX1272_LoRaRadio: public LoRaRadio {
203203
* @param timeout Reception timeout [ms]
204204
*
205205
*/
206-
virtual void receive(uint32_t timeout);
206+
virtual void receive(uint32_t /**timeout**/);
207207

208208
/**
209209
* Sets the carrier frequency
@@ -360,10 +360,11 @@ class SX1272_LoRaRadio: public LoRaRadio {
360360
// Default is 256 bytes
361361
uint8_t _data_buffer[MAX_DATA_BUFFER_SIZE_SX172];
362362

363-
// TX/RX Timers - all use milisecond units
363+
// TX timer in ms. This timer is used as a fail safe for TX.
364+
// If the chip fails to transmit, its a fatal error, reflecting
365+
// some catastrophic bus failure etc. We wish to have the control
366+
// back from the driver in such a case.
364367
mbed::Timeout tx_timeout_timer;
365-
mbed::Timeout rx_timeout_timer;
366-
mbed::Timeout rx_timeout_sync_word;
367368

368369
#ifdef MBED_CONF_RTOS_PRESENT
369370
// Thread to handle interrupts

0 commit comments

Comments
 (0)