Prototype RF driver for STM Sub-1 GHz RF expansion board based on the SPSGRF-868 module for STM32 Nucleo.
Prototype RF Driver for STM Sub-1 GHz RF Expansion Boards based on the SPSGRF-868 and SPSGRF-915 Modules for STM32 Nucleo
Currently supported boards:
Note, in order to use expansion board X-NUCLEO-IDS01A4 in mbed you need to perform the following HW modifications on the board:
- Unmount resistor
R4 - Mount resistor
R7
Furthermore, on some Nucleo development boards (e.g. the NUCLEO_F429ZI), in order to be able to use Ethernet together with these Sub-1 GHz RF expansion boards, you need to compile this driver with macro SPIRIT1_SPI_MOSI=PB_5 defined, while the development board typically requires some HW modification as e.g. described here!
This driver can be used together with the 6LoWPAN stack (a.k.a. Nanostack).
Revision 40:343254875d89, committed 2016-11-29
- Comitter:
- Wolfgang Betz
- Date:
- Tue Nov 29 17:25:20 2016 +0100
- Parent:
- 39:75481c4c6655
- Child:
- 41:ebaceefad0de
- Commit message:
- Handle RX errors immediately & use channel 1
Changed in this revision
--- a/source/SimpleSpirit1.cpp Thu Nov 24 08:47:27 2016 +0100
+++ b/source/SimpleSpirit1.cpp Tue Nov 29 17:25:20 2016 +0100
@@ -128,7 +128,6 @@
CLEAR_TXBUF();
CLEAR_RXBUF();
_spirit_tx_started = false;
- _spirit_rx_err = false;
_is_receiving = false;
/* Configure the radio to route the IRQ signal to its GPIO 3 */
@@ -238,7 +237,6 @@
_spirit_tx_started = false;
_is_receiving = false;
- _spirit_rx_err = false;
stop_rx_timeout();
cmd_strobe(SPIRIT1_STROBE_FRX);
@@ -451,18 +449,17 @@
uint32_t *tmp = (uint32_t*)&x_irq_status;
debug("\n\r%s (%d): irq=%x", __func__, __LINE__, *tmp);
#endif
- _spirit_rx_err = true;
- _is_receiving = false;
- CLEAR_RXBUF();
- cmd_strobe(SPIRIT1_STROBE_FRX);
+ rx_timeout_handler();
if(_spirit_tx_started) {
_spirit_tx_started = false;
- CLEAR_TXBUF();
/* call user callback */
if(_current_irq_callback) {
_current_irq_callback(TX_ERR);
}
}
+
+ /* Disable handling of other RX flags */
+ x_irq_status.IRQ_RX_DATA_READY = x_irq_status.IRQ_RX_FIFO_ALMOST_FULL = S_RESET;
}
/* Transmission error */
@@ -472,15 +469,16 @@
debug("\n\r%s (%d): irq=%x", __func__, __LINE__, *tmp);
#endif
csma_ca_state(S_DISABLE); // disable CSMA/CA
- cmd_strobe(SPIRIT1_STROBE_FTX);
if(_spirit_tx_started) {
_spirit_tx_started = false;
- CLEAR_TXBUF();
/* call user callback */
if(_current_irq_callback) {
_current_irq_callback(TX_ERR);
}
}
+
+ /* Disable handling of other TX flags */
+ x_irq_status.IRQ_TX_DATA_SENT = S_RESET;
}
/* The IRQ_TX_DATA_SENT notifies the packet received. Puts the SPIRIT1 in RX */
@@ -489,10 +487,7 @@
debug_if(!_spirit_tx_started, "\n\rAssert failed in: %s (%d)\n\r", __func__, __LINE__);
#endif
- _spirit_rx_err = false;
_spirit_tx_started = false;
- CLEAR_TXBUF();
- CLEAR_RXBUF();
/* call user callback */
if(_current_irq_callback) {
@@ -502,25 +497,20 @@
/* RX FIFO almost full */
if(x_irq_status.IRQ_RX_FIFO_ALMOST_FULL) {
- if(_spirit_rx_err) {
- _is_receiving = false;
- cmd_strobe(SPIRIT1_STROBE_FRX);
- CLEAR_RXBUF();
+ uint8_t fifo_available = linear_fifo_read_num_elements_rx_fifo();
+ unsigned int remaining = MAX_PACKET_LEN - _spirit_rx_pos;
+ if(fifo_available > remaining) {
+#ifdef DEBUG_IRQ
+ uint32_t *tmp = (uint32_t*)&x_irq_status;
+ debug("\n\r%s (%d): irq=%x", __func__, __LINE__, *tmp);
+#endif
+ rx_timeout_handler();
} else {
- uint8_t fifo_available = linear_fifo_read_num_elements_rx_fifo();
- unsigned int remaining = MAX_PACKET_LEN - _spirit_rx_pos;
- if(fifo_available > remaining) {
- _spirit_rx_err = true;
- _is_receiving = false;
- CLEAR_RXBUF();
- cmd_strobe(SPIRIT1_STROBE_FRX);
- } else {
- spi_read_linear_fifo(fifo_available, &spirit_rx_buf[_spirit_rx_pos]);
- _spirit_rx_pos += fifo_available;
- if(!_is_receiving) {
- _is_receiving = true;
- start_rx_timeout();
- }
+ spi_read_linear_fifo(fifo_available, &spirit_rx_buf[_spirit_rx_pos]);
+ _spirit_rx_pos += fifo_available;
+ if(!_is_receiving) {
+ _is_receiving = true;
+ start_rx_timeout();
}
}
}
@@ -530,34 +520,28 @@
_is_receiving = false; // Finished receiving
stop_rx_timeout();
- if(_spirit_rx_err) {
- _spirit_rx_err = false;
- CLEAR_RXBUF();
- cmd_strobe(SPIRIT1_STROBE_FRX);
- } else {
- spirit_rx_len = pkt_basic_get_received_pkt_length();
+ spirit_rx_len = pkt_basic_get_received_pkt_length();
#ifdef DEBUG_IRQ
- debug_if(!(spirit_rx_len <= MAX_PACKET_LEN), "\n\rAssert failed in: %s (%d)\n\r", __func__, __LINE__);
+ debug_if(!(spirit_rx_len <= MAX_PACKET_LEN), "\n\rAssert failed in: %s (%d)\n\r", __func__, __LINE__);
#endif
- for(; _spirit_rx_pos < spirit_rx_len;) {
- uint8_t to_receive = spirit_rx_len - _spirit_rx_pos;
- if(to_receive > 0) {
- spi_read_linear_fifo(to_receive, &spirit_rx_buf[_spirit_rx_pos]);
- _spirit_rx_pos += to_receive;
- }
+ for(; _spirit_rx_pos < spirit_rx_len;) {
+ uint8_t to_receive = spirit_rx_len - _spirit_rx_pos;
+ if(to_receive > 0) {
+ spi_read_linear_fifo(to_receive, &spirit_rx_buf[_spirit_rx_pos]);
+ _spirit_rx_pos += to_receive;
}
+ }
- cmd_strobe(SPIRIT1_STROBE_FRX);
-
- last_rssi = qi_get_rssi(); //MGR
- last_sqi = qi_get_sqi(); //MGR
+ cmd_strobe(SPIRIT1_STROBE_FRX);
- /* call user callback */
- if(_current_irq_callback) {
- _current_irq_callback(RX_DONE);
- }
+ last_rssi = qi_get_rssi(); //MGR
+ last_sqi = qi_get_sqi(); //MGR
+
+ /* call user callback */
+ if(_current_irq_callback) {
+ _current_irq_callback(RX_DONE);
}
}
@@ -574,8 +558,6 @@
#endif
} else {
_is_receiving = true;
- _spirit_rx_err = false;
- CLEAR_RXBUF();
start_rx_timeout();
}
}
--- a/source/libs/Contiki_STM32_Library/spirit1.h Thu Nov 24 08:47:27 2016 +0100 +++ b/source/libs/Contiki_STM32_Library/spirit1.h Tue Nov 29 17:25:20 2016 +0100 @@ -137,7 +137,7 @@ #define CONTROL_LENGTH PKT_CONTROL_LENGTH_0BYTES #define EN_ADDRESS S_DISABLE #define EN_FEC S_DISABLE -#define CHANNEL_NUMBER 0 +#define CHANNEL_NUMBER 1 // betzw - WAS: 0 #define LENGTH_TYPE PKT_LENGTH_VAR #define POWER_INDEX 7 #define RECEIVE_TIMEOUT 2000.0 /*change the value for required timeout period*/
X-NUCLEO-IDS01A4 Sub-1GHz RF Expansion Board