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).
SimpleSpirit1.cpp@0:4fb29d9ee571, 2016-10-13 (annotated)
- Committer:
- Wolfgang Betz
- Date:
- Thu Oct 13 15:41:39 2016 +0200
- Revision:
- 0:4fb29d9ee571
- Child:
- 2:45642c5198a2
First compiling version (without warnings)
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| Wolfgang Betz |
0:4fb29d9ee571 | 1 | /*** Mbed Includes ***/ |
| Wolfgang Betz |
0:4fb29d9ee571 | 2 | #include "SimpleSpirit1.h" |
| Wolfgang Betz |
0:4fb29d9ee571 | 3 | |
| Wolfgang Betz |
0:4fb29d9ee571 | 4 | |
| Wolfgang Betz |
0:4fb29d9ee571 | 5 | /*** Macros from Cube Implementation ***/ |
| Wolfgang Betz |
0:4fb29d9ee571 | 6 | #define CLEAR_TXBUF() (spirit_txbuf[0] = 0) |
| Wolfgang Betz |
0:4fb29d9ee571 | 7 | #define CLEAR_RXBUF() (spirit_rxbuf[0] = 0) |
| Wolfgang Betz |
0:4fb29d9ee571 | 8 | /* transceiver state. */ |
| Wolfgang Betz |
0:4fb29d9ee571 | 9 | #define ON 0 |
| Wolfgang Betz |
0:4fb29d9ee571 | 10 | #define OFF 1 |
| Wolfgang Betz |
0:4fb29d9ee571 | 11 | |
| Wolfgang Betz |
0:4fb29d9ee571 | 12 | |
| Wolfgang Betz |
0:4fb29d9ee571 | 13 | SimpleSpirit1 *SimpleSpirit1::_singleton = NULL; |
| Wolfgang Betz |
0:4fb29d9ee571 | 14 | |
| Wolfgang Betz |
0:4fb29d9ee571 | 15 | /*** Class Implementation ***/ |
| Wolfgang Betz |
0:4fb29d9ee571 | 16 | SimpleSpirit1::SimpleSpirit1(PinName mosi, PinName miso, PinName sclk, |
| Wolfgang Betz |
0:4fb29d9ee571 | 17 | PinName irq, PinName cs, PinName sdn, |
| Wolfgang Betz |
0:4fb29d9ee571 | 18 | PinName led) : |
| Wolfgang Betz |
0:4fb29d9ee571 | 19 | _spi(mosi, miso, sclk), |
| Wolfgang Betz |
0:4fb29d9ee571 | 20 | _irq(irq), |
| Wolfgang Betz |
0:4fb29d9ee571 | 21 | _chip_select(cs), |
| Wolfgang Betz |
0:4fb29d9ee571 | 22 | _shut_down(sdn), |
| Wolfgang Betz |
0:4fb29d9ee571 | 23 | _led(led), |
| Wolfgang Betz |
0:4fb29d9ee571 | 24 | _nr_of_irq_disables(0) |
| Wolfgang Betz |
0:4fb29d9ee571 | 25 | { |
| Wolfgang Betz |
0:4fb29d9ee571 | 26 | /* reset irq disable counter & disable irq */ |
| Wolfgang Betz |
0:4fb29d9ee571 | 27 | disable_irq(); |
| Wolfgang Betz |
0:4fb29d9ee571 | 28 | |
| Wolfgang Betz |
0:4fb29d9ee571 | 29 | /* unselect chip */ |
| Wolfgang Betz |
0:4fb29d9ee571 | 30 | chip_unselect(); |
| Wolfgang Betz |
0:4fb29d9ee571 | 31 | |
| Wolfgang Betz |
0:4fb29d9ee571 | 32 | /* configure spi */ |
| Wolfgang Betz |
0:4fb29d9ee571 | 33 | _spi.format(8, 0); /* 8-bit, mode = 0, [order = SPI_MSB] only available in mbed3 */ |
| Wolfgang Betz |
0:4fb29d9ee571 | 34 | _spi.frequency(5000000); // 5MHz |
| Wolfgang Betz |
0:4fb29d9ee571 | 35 | |
| Wolfgang Betz |
0:4fb29d9ee571 | 36 | /* set frequencies */ |
| Wolfgang Betz |
0:4fb29d9ee571 | 37 | radio_set_xtal_freq(XTAL_FREQUENCY); |
| Wolfgang Betz |
0:4fb29d9ee571 | 38 | mgmt_set_freq_base(XTAL_FREQUENCY); |
| Wolfgang Betz |
0:4fb29d9ee571 | 39 | |
| Wolfgang Betz |
0:4fb29d9ee571 | 40 | /* restart board */ |
| Wolfgang Betz |
0:4fb29d9ee571 | 41 | enter_shutdown(); |
| Wolfgang Betz |
0:4fb29d9ee571 | 42 | exit_shutdown(); |
| Wolfgang Betz |
0:4fb29d9ee571 | 43 | |
| Wolfgang Betz |
0:4fb29d9ee571 | 44 | /* soft core reset */ |
| Wolfgang Betz |
0:4fb29d9ee571 | 45 | cmd_strobe_command(SPIRIT1_STROBE_SRES); |
| Wolfgang Betz |
0:4fb29d9ee571 | 46 | |
| Wolfgang Betz |
0:4fb29d9ee571 | 47 | /* Configures the SPIRIT1 radio part */ |
| Wolfgang Betz |
0:4fb29d9ee571 | 48 | SRadioInit x_radio_init = { |
| Wolfgang Betz |
0:4fb29d9ee571 | 49 | XTAL_OFFSET_PPM, |
| Wolfgang Betz |
0:4fb29d9ee571 | 50 | (uint32_t)BASE_FREQUENCY, |
| Wolfgang Betz |
0:4fb29d9ee571 | 51 | (uint32_t)CHANNEL_SPACE, |
| Wolfgang Betz |
0:4fb29d9ee571 | 52 | CHANNEL_NUMBER, |
| Wolfgang Betz |
0:4fb29d9ee571 | 53 | MODULATION_SELECT, |
| Wolfgang Betz |
0:4fb29d9ee571 | 54 | DATARATE, |
| Wolfgang Betz |
0:4fb29d9ee571 | 55 | (uint32_t)FREQ_DEVIATION, |
| Wolfgang Betz |
0:4fb29d9ee571 | 56 | (uint32_t)BANDWIDTH |
| Wolfgang Betz |
0:4fb29d9ee571 | 57 | }; |
| Wolfgang Betz |
0:4fb29d9ee571 | 58 | radio_init(&x_radio_init); |
| Wolfgang Betz |
0:4fb29d9ee571 | 59 | radio_set_pa_level_dbm(0,POWER_DBM); |
| Wolfgang Betz |
0:4fb29d9ee571 | 60 | radio_set_pa_level_max_index(0); |
| Wolfgang Betz |
0:4fb29d9ee571 | 61 | |
| Wolfgang Betz |
0:4fb29d9ee571 | 62 | /* Configures the SPIRIT1 packet handler part*/ |
| Wolfgang Betz |
0:4fb29d9ee571 | 63 | PktBasicInit x_basic_init = { |
| Wolfgang Betz |
0:4fb29d9ee571 | 64 | PREAMBLE_LENGTH, |
| Wolfgang Betz |
0:4fb29d9ee571 | 65 | SYNC_LENGTH, |
| Wolfgang Betz |
0:4fb29d9ee571 | 66 | SYNC_WORD, |
| Wolfgang Betz |
0:4fb29d9ee571 | 67 | LENGTH_TYPE, |
| Wolfgang Betz |
0:4fb29d9ee571 | 68 | LENGTH_WIDTH, |
| Wolfgang Betz |
0:4fb29d9ee571 | 69 | CRC_MODE, |
| Wolfgang Betz |
0:4fb29d9ee571 | 70 | CONTROL_LENGTH, |
| Wolfgang Betz |
0:4fb29d9ee571 | 71 | EN_ADDRESS, |
| Wolfgang Betz |
0:4fb29d9ee571 | 72 | EN_FEC, |
| Wolfgang Betz |
0:4fb29d9ee571 | 73 | EN_WHITENING |
| Wolfgang Betz |
0:4fb29d9ee571 | 74 | }; |
| Wolfgang Betz |
0:4fb29d9ee571 | 75 | pkt_basic_init(&x_basic_init); |
| Wolfgang Betz |
0:4fb29d9ee571 | 76 | |
| Wolfgang Betz |
0:4fb29d9ee571 | 77 | /* Enable the following interrupt sources, routed to GPIO */ |
| Wolfgang Betz |
0:4fb29d9ee571 | 78 | irq_de_init(NULL); |
| Wolfgang Betz |
0:4fb29d9ee571 | 79 | irq_clear_status(); |
| Wolfgang Betz |
0:4fb29d9ee571 | 80 | irq_set_status(TX_DATA_SENT, S_ENABLE); |
| Wolfgang Betz |
0:4fb29d9ee571 | 81 | irq_set_status(RX_DATA_READY,S_ENABLE); |
| Wolfgang Betz |
0:4fb29d9ee571 | 82 | irq_set_status(VALID_SYNC,S_ENABLE); |
| Wolfgang Betz |
0:4fb29d9ee571 | 83 | irq_set_status(RX_DATA_DISC, S_ENABLE); |
| Wolfgang Betz |
0:4fb29d9ee571 | 84 | irq_set_status(TX_FIFO_ERROR, S_ENABLE); |
| Wolfgang Betz |
0:4fb29d9ee571 | 85 | irq_set_status(RX_FIFO_ERROR, S_ENABLE); |
| Wolfgang Betz |
0:4fb29d9ee571 | 86 | |
| Wolfgang Betz |
0:4fb29d9ee571 | 87 | /* Configure Spirit1 */ |
| Wolfgang Betz |
0:4fb29d9ee571 | 88 | radio_persisten_rx(S_ENABLE); |
| Wolfgang Betz |
0:4fb29d9ee571 | 89 | qi_set_sqi_threshold(SQI_TH_0); |
| Wolfgang Betz |
0:4fb29d9ee571 | 90 | qi_sqi_check(S_ENABLE); |
| Wolfgang Betz |
0:4fb29d9ee571 | 91 | qi_set_rssi_threshold_dbm(CCA_THRESHOLD); |
| Wolfgang Betz |
0:4fb29d9ee571 | 92 | timer_set_rx_timeout_stop_condition(SQI_ABOVE_THRESHOLD); |
| Wolfgang Betz |
0:4fb29d9ee571 | 93 | timer_set_infinite_rx_timeout(); |
| Wolfgang Betz |
0:4fb29d9ee571 | 94 | radio_afc_freeze_on_sync(S_ENABLE); |
| Wolfgang Betz |
0:4fb29d9ee571 | 95 | |
| Wolfgang Betz |
0:4fb29d9ee571 | 96 | /* Puts the SPIRIT1 in STANDBY mode (125us -> rx/tx) */ |
| Wolfgang Betz |
0:4fb29d9ee571 | 97 | cmd_strobe_command(SPIRIT1_STROBE_STANDBY); |
| Wolfgang Betz |
0:4fb29d9ee571 | 98 | spirit_on = OFF; |
| Wolfgang Betz |
0:4fb29d9ee571 | 99 | CLEAR_RXBUF(); |
| Wolfgang Betz |
0:4fb29d9ee571 | 100 | CLEAR_TXBUF(); |
| Wolfgang Betz |
0:4fb29d9ee571 | 101 | |
| Wolfgang Betz |
0:4fb29d9ee571 | 102 | /* Configure the radio to route the IRQ signal to its GPIO 3 */ |
| Wolfgang Betz |
0:4fb29d9ee571 | 103 | SGpioInit x_gpio_init = { |
| Wolfgang Betz |
0:4fb29d9ee571 | 104 | SPIRIT_GPIO_IRQ, |
| Wolfgang Betz |
0:4fb29d9ee571 | 105 | SPIRIT_GPIO_MODE_DIGITAL_OUTPUT_LP, |
| Wolfgang Betz |
0:4fb29d9ee571 | 106 | SPIRIT_GPIO_DIG_OUT_IRQ |
| Wolfgang Betz |
0:4fb29d9ee571 | 107 | }; |
| Wolfgang Betz |
0:4fb29d9ee571 | 108 | spirit_gpio_init(&x_gpio_init); |
| Wolfgang Betz |
0:4fb29d9ee571 | 109 | } |
X-NUCLEO-IDS01A4 Sub-1GHz RF Expansion Board