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).

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?

UserRevisionLine numberNew 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 }