JunMo Hong / stm-spirit1-rf-driver_for_cubebite

Fork of EV-COG-AD3029LZ by JunMo Hong

Committer:
Wolfgang Betz
Date:
Fri Oct 14 16:47:22 2016 +0200
Revision:
3:0df38cfb1e53
Parent:
2:45642c5198a2
Child:
4:07537ca85c66
Switching radio on

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 3:0df38cfb1e53 3 #include "radio_spi.h"
Wolfgang Betz 0:4fb29d9ee571 4
Wolfgang Betz 0:4fb29d9ee571 5
Wolfgang Betz 0:4fb29d9ee571 6 /*** Macros from Cube Implementation ***/
Wolfgang Betz 3:0df38cfb1e53 7 #define CLEAR_TXBUF() (spirit_txbuf[0] = 0)
Wolfgang Betz 3:0df38cfb1e53 8 #define CLEAR_RXBUF() (spirit_rxbuf[0] = 0)
Wolfgang Betz 0:4fb29d9ee571 9 /* transceiver state. */
Wolfgang Betz 0:4fb29d9ee571 10 #define ON 0
Wolfgang Betz 0:4fb29d9ee571 11 #define OFF 1
Wolfgang Betz 0:4fb29d9ee571 12
Wolfgang Betz 3:0df38cfb1e53 13 #ifndef NDEBUG
Wolfgang Betz 3:0df38cfb1e53 14 #include <stdio.h>
Wolfgang Betz 3:0df38cfb1e53 15 #define PRINTF(...) printf(__VA_ARGS__)
Wolfgang Betz 3:0df38cfb1e53 16 #else
Wolfgang Betz 3:0df38cfb1e53 17 #define PRINTF(...)
Wolfgang Betz 3:0df38cfb1e53 18 #endif
Wolfgang Betz 0:4fb29d9ee571 19
Wolfgang Betz 3:0df38cfb1e53 20 #if NULLRDC_CONF_802154_AUTOACK
Wolfgang Betz 3:0df38cfb1e53 21 #define ACK_LEN 3
Wolfgang Betz 3:0df38cfb1e53 22 static int wants_an_ack = 0; /* The packet sent expects an ack */
Wolfgang Betz 3:0df38cfb1e53 23 //#define ACKPRINTF printf
Wolfgang Betz 3:0df38cfb1e53 24 #define ACKPRINTF(...)
Wolfgang Betz 3:0df38cfb1e53 25 #endif /* NULLRDC_CONF_802154_AUTOACK */
Wolfgang Betz 3:0df38cfb1e53 26
Wolfgang Betz 3:0df38cfb1e53 27 #define SPIRIT_GPIO_IRQ (SPIRIT_GPIO_3)
Wolfgang Betz 3:0df38cfb1e53 28
Wolfgang Betz 3:0df38cfb1e53 29 #define SPIRIT1_STATUS() (arch_refresh_status() & SPIRIT1_STATE_STATEBITS)
Wolfgang Betz 3:0df38cfb1e53 30
Wolfgang Betz 3:0df38cfb1e53 31 #define SABORT_WAIT_US (400)
Wolfgang Betz 3:0df38cfb1e53 32
Wolfgang Betz 3:0df38cfb1e53 33 #define BUSYWAIT_UNTIL(cond, millisecs) \
Wolfgang Betz 3:0df38cfb1e53 34 do { \
Wolfgang Betz 3:0df38cfb1e53 35 uint32_t start = _busywait_timer.read_ms(); \
Wolfgang Betz 3:0df38cfb1e53 36 while (!(cond) && ((((uint32_t)(_busywait_timer.read_ms())) - start) < (uint32_t)millisecs)); \
Wolfgang Betz 3:0df38cfb1e53 37 } while(0)
Wolfgang Betz 3:0df38cfb1e53 38
Wolfgang Betz 0:4fb29d9ee571 39
Wolfgang Betz 0:4fb29d9ee571 40 /*** Class Implementation ***/
Wolfgang Betz 3:0df38cfb1e53 41 /** Static Class Variables **/
Wolfgang Betz 3:0df38cfb1e53 42 SimpleSpirit1 *SimpleSpirit1::_singleton = NULL;
Wolfgang Betz 3:0df38cfb1e53 43 Timer SimpleSpirit1::_busywait_timer;
Wolfgang Betz 3:0df38cfb1e53 44
Wolfgang Betz 3:0df38cfb1e53 45 /** Constructor **/
Wolfgang Betz 0:4fb29d9ee571 46 SimpleSpirit1::SimpleSpirit1(PinName mosi, PinName miso, PinName sclk,
Wolfgang Betz 0:4fb29d9ee571 47 PinName irq, PinName cs, PinName sdn,
Wolfgang Betz 0:4fb29d9ee571 48 PinName led) :
Wolfgang Betz 0:4fb29d9ee571 49 _spi(mosi, miso, sclk),
Wolfgang Betz 0:4fb29d9ee571 50 _irq(irq),
Wolfgang Betz 0:4fb29d9ee571 51 _chip_select(cs),
Wolfgang Betz 0:4fb29d9ee571 52 _shut_down(sdn),
Wolfgang Betz 3:0df38cfb1e53 53 _led(led)
Wolfgang Betz 0:4fb29d9ee571 54 {
Wolfgang Betz 3:0df38cfb1e53 55 /* reset irq disable counter and irq callback & disable irq */
Wolfgang Betz 3:0df38cfb1e53 56 _nr_of_irq_disables = 0;
Wolfgang Betz 3:0df38cfb1e53 57 _current_irq_callback = NULL;
Wolfgang Betz 0:4fb29d9ee571 58 disable_irq();
Wolfgang Betz 0:4fb29d9ee571 59
Wolfgang Betz 0:4fb29d9ee571 60 /* unselect chip */
Wolfgang Betz 0:4fb29d9ee571 61 chip_unselect();
Wolfgang Betz 0:4fb29d9ee571 62
Wolfgang Betz 0:4fb29d9ee571 63 /* configure spi */
Wolfgang Betz 0:4fb29d9ee571 64 _spi.format(8, 0); /* 8-bit, mode = 0, [order = SPI_MSB] only available in mbed3 */
Wolfgang Betz 0:4fb29d9ee571 65 _spi.frequency(5000000); // 5MHz
Wolfgang Betz 3:0df38cfb1e53 66
Wolfgang Betz 3:0df38cfb1e53 67 /* start timer */
Wolfgang Betz 3:0df38cfb1e53 68 _busywait_timer.start();
Wolfgang Betz 3:0df38cfb1e53 69
Wolfgang Betz 3:0df38cfb1e53 70 /* init cube vars */
Wolfgang Betz 3:0df38cfb1e53 71 spirit_on = OFF;
Wolfgang Betz 3:0df38cfb1e53 72 packet_is_prepared = 0;
Wolfgang Betz 3:0df38cfb1e53 73 receiving_packet = 0;
Wolfgang Betz 3:0df38cfb1e53 74 just_got_an_ack = 0;
Wolfgang Betz 2:45642c5198a2 75 }
Wolfgang Betz 0:4fb29d9ee571 76
Wolfgang Betz 3:0df38cfb1e53 77 /** Init Function **/
Wolfgang Betz 2:45642c5198a2 78 void SimpleSpirit1::init() {
Wolfgang Betz 0:4fb29d9ee571 79 /* set frequencies */
Wolfgang Betz 0:4fb29d9ee571 80 radio_set_xtal_freq(XTAL_FREQUENCY);
Wolfgang Betz 2:45642c5198a2 81 mgmt_set_freq_base((uint32_t)BASE_FREQUENCY);
Wolfgang Betz 0:4fb29d9ee571 82
Wolfgang Betz 0:4fb29d9ee571 83 /* restart board */
Wolfgang Betz 0:4fb29d9ee571 84 enter_shutdown();
Wolfgang Betz 0:4fb29d9ee571 85 exit_shutdown();
Wolfgang Betz 0:4fb29d9ee571 86
Wolfgang Betz 0:4fb29d9ee571 87 /* soft core reset */
Wolfgang Betz 0:4fb29d9ee571 88 cmd_strobe_command(SPIRIT1_STROBE_SRES);
Wolfgang Betz 0:4fb29d9ee571 89
Wolfgang Betz 0:4fb29d9ee571 90 /* Configures the SPIRIT1 radio part */
Wolfgang Betz 0:4fb29d9ee571 91 SRadioInit x_radio_init = {
Wolfgang Betz 0:4fb29d9ee571 92 XTAL_OFFSET_PPM,
Wolfgang Betz 0:4fb29d9ee571 93 (uint32_t)BASE_FREQUENCY,
Wolfgang Betz 0:4fb29d9ee571 94 (uint32_t)CHANNEL_SPACE,
Wolfgang Betz 0:4fb29d9ee571 95 CHANNEL_NUMBER,
Wolfgang Betz 0:4fb29d9ee571 96 MODULATION_SELECT,
Wolfgang Betz 0:4fb29d9ee571 97 DATARATE,
Wolfgang Betz 0:4fb29d9ee571 98 (uint32_t)FREQ_DEVIATION,
Wolfgang Betz 0:4fb29d9ee571 99 (uint32_t)BANDWIDTH
Wolfgang Betz 0:4fb29d9ee571 100 };
Wolfgang Betz 0:4fb29d9ee571 101 radio_init(&x_radio_init);
Wolfgang Betz 0:4fb29d9ee571 102 radio_set_pa_level_dbm(0,POWER_DBM);
Wolfgang Betz 0:4fb29d9ee571 103 radio_set_pa_level_max_index(0);
Wolfgang Betz 0:4fb29d9ee571 104
Wolfgang Betz 0:4fb29d9ee571 105 /* Configures the SPIRIT1 packet handler part*/
Wolfgang Betz 0:4fb29d9ee571 106 PktBasicInit x_basic_init = {
Wolfgang Betz 0:4fb29d9ee571 107 PREAMBLE_LENGTH,
Wolfgang Betz 0:4fb29d9ee571 108 SYNC_LENGTH,
Wolfgang Betz 0:4fb29d9ee571 109 SYNC_WORD,
Wolfgang Betz 0:4fb29d9ee571 110 LENGTH_TYPE,
Wolfgang Betz 0:4fb29d9ee571 111 LENGTH_WIDTH,
Wolfgang Betz 0:4fb29d9ee571 112 CRC_MODE,
Wolfgang Betz 0:4fb29d9ee571 113 CONTROL_LENGTH,
Wolfgang Betz 0:4fb29d9ee571 114 EN_ADDRESS,
Wolfgang Betz 0:4fb29d9ee571 115 EN_FEC,
Wolfgang Betz 0:4fb29d9ee571 116 EN_WHITENING
Wolfgang Betz 0:4fb29d9ee571 117 };
Wolfgang Betz 0:4fb29d9ee571 118 pkt_basic_init(&x_basic_init);
Wolfgang Betz 0:4fb29d9ee571 119
Wolfgang Betz 0:4fb29d9ee571 120 /* Enable the following interrupt sources, routed to GPIO */
Wolfgang Betz 0:4fb29d9ee571 121 irq_de_init(NULL);
Wolfgang Betz 0:4fb29d9ee571 122 irq_clear_status();
Wolfgang Betz 0:4fb29d9ee571 123 irq_set_status(TX_DATA_SENT, S_ENABLE);
Wolfgang Betz 0:4fb29d9ee571 124 irq_set_status(RX_DATA_READY,S_ENABLE);
Wolfgang Betz 0:4fb29d9ee571 125 irq_set_status(VALID_SYNC,S_ENABLE);
Wolfgang Betz 0:4fb29d9ee571 126 irq_set_status(RX_DATA_DISC, S_ENABLE);
Wolfgang Betz 0:4fb29d9ee571 127 irq_set_status(TX_FIFO_ERROR, S_ENABLE);
Wolfgang Betz 0:4fb29d9ee571 128 irq_set_status(RX_FIFO_ERROR, S_ENABLE);
Wolfgang Betz 0:4fb29d9ee571 129
Wolfgang Betz 0:4fb29d9ee571 130 /* Configure Spirit1 */
Wolfgang Betz 0:4fb29d9ee571 131 radio_persisten_rx(S_ENABLE);
Wolfgang Betz 0:4fb29d9ee571 132 qi_set_sqi_threshold(SQI_TH_0);
Wolfgang Betz 0:4fb29d9ee571 133 qi_sqi_check(S_ENABLE);
Wolfgang Betz 0:4fb29d9ee571 134 qi_set_rssi_threshold_dbm(CCA_THRESHOLD);
Wolfgang Betz 0:4fb29d9ee571 135 timer_set_rx_timeout_stop_condition(SQI_ABOVE_THRESHOLD);
Wolfgang Betz 0:4fb29d9ee571 136 timer_set_infinite_rx_timeout();
Wolfgang Betz 0:4fb29d9ee571 137 radio_afc_freeze_on_sync(S_ENABLE);
Wolfgang Betz 0:4fb29d9ee571 138
Wolfgang Betz 0:4fb29d9ee571 139 /* Puts the SPIRIT1 in STANDBY mode (125us -> rx/tx) */
Wolfgang Betz 0:4fb29d9ee571 140 cmd_strobe_command(SPIRIT1_STROBE_STANDBY);
Wolfgang Betz 0:4fb29d9ee571 141 spirit_on = OFF;
Wolfgang Betz 0:4fb29d9ee571 142 CLEAR_RXBUF();
Wolfgang Betz 0:4fb29d9ee571 143 CLEAR_TXBUF();
Wolfgang Betz 0:4fb29d9ee571 144
Wolfgang Betz 0:4fb29d9ee571 145 /* Configure the radio to route the IRQ signal to its GPIO 3 */
Wolfgang Betz 0:4fb29d9ee571 146 SGpioInit x_gpio_init = {
Wolfgang Betz 0:4fb29d9ee571 147 SPIRIT_GPIO_IRQ,
Wolfgang Betz 0:4fb29d9ee571 148 SPIRIT_GPIO_MODE_DIGITAL_OUTPUT_LP,
Wolfgang Betz 0:4fb29d9ee571 149 SPIRIT_GPIO_DIG_OUT_IRQ
Wolfgang Betz 0:4fb29d9ee571 150 };
Wolfgang Betz 0:4fb29d9ee571 151 spirit_gpio_init(&x_gpio_init);
Wolfgang Betz 0:4fb29d9ee571 152 }
Wolfgang Betz 3:0df38cfb1e53 153
Wolfgang Betz 3:0df38cfb1e53 154 /** Prepare the radio with a packet to be sent. **/
Wolfgang Betz 3:0df38cfb1e53 155 int SimpleSpirit1::prepare(const void *payload, unsigned short payload_len) {
Wolfgang Betz 3:0df38cfb1e53 156 PRINTF("Spirit1: prep %u\n", payload_len);
Wolfgang Betz 3:0df38cfb1e53 157 packet_is_prepared = 0;
Wolfgang Betz 3:0df38cfb1e53 158
Wolfgang Betz 3:0df38cfb1e53 159 /* Checks if the payload length is supported */
Wolfgang Betz 3:0df38cfb1e53 160 if(payload_len > MAX_PACKET_LEN) {
Wolfgang Betz 3:0df38cfb1e53 161 return RADIO_TX_ERR;
Wolfgang Betz 3:0df38cfb1e53 162 }
Wolfgang Betz 3:0df38cfb1e53 163
Wolfgang Betz 3:0df38cfb1e53 164 /* Should we delay for an ack? */
Wolfgang Betz 3:0df38cfb1e53 165 #if NULLRDC_CONF_802154_AUTOACK
Wolfgang Betz 3:0df38cfb1e53 166 frame802154_t info154;
Wolfgang Betz 3:0df38cfb1e53 167 wants_an_ack = 0;
Wolfgang Betz 3:0df38cfb1e53 168 if(payload_len > ACK_LEN
Wolfgang Betz 3:0df38cfb1e53 169 && frame802154_parse((char*)payload, payload_len, &info154) != 0) {
Wolfgang Betz 3:0df38cfb1e53 170 if(info154.fcf.frame_type == FRAME802154_DATAFRAME
Wolfgang Betz 3:0df38cfb1e53 171 && info154.fcf.ack_required != 0) {
Wolfgang Betz 3:0df38cfb1e53 172 wants_an_ack = 1;
Wolfgang Betz 3:0df38cfb1e53 173 }
Wolfgang Betz 3:0df38cfb1e53 174 }
Wolfgang Betz 3:0df38cfb1e53 175 #endif /* NULLRDC_CONF_802154_AUTOACK */
Wolfgang Betz 3:0df38cfb1e53 176
Wolfgang Betz 3:0df38cfb1e53 177 /* Sets the length of the packet to send */
Wolfgang Betz 3:0df38cfb1e53 178 disable_irq();
Wolfgang Betz 3:0df38cfb1e53 179 cmd_strobe_command(SPIRIT1_STROBE_FTX);
Wolfgang Betz 3:0df38cfb1e53 180 pkt_basic_set_payload_length(payload_len);
Wolfgang Betz 3:0df38cfb1e53 181 spi_write_linear_fifo(payload_len, (uint8_t *)payload);
Wolfgang Betz 3:0df38cfb1e53 182 enable_irq();
Wolfgang Betz 3:0df38cfb1e53 183
Wolfgang Betz 3:0df38cfb1e53 184 PRINTF("PREPARE OUT\n");
Wolfgang Betz 3:0df38cfb1e53 185
Wolfgang Betz 3:0df38cfb1e53 186 packet_is_prepared = 1;
Wolfgang Betz 3:0df38cfb1e53 187 return RADIO_TX_OK;
Wolfgang Betz 3:0df38cfb1e53 188 }
Wolfgang Betz 3:0df38cfb1e53 189
Wolfgang Betz 3:0df38cfb1e53 190 /** Send the packet that has previously been prepared. **/
Wolfgang Betz 3:0df38cfb1e53 191 int SimpleSpirit1::transmit(unsigned short payload_len) {
Wolfgang Betz 3:0df38cfb1e53 192 /* This function blocks until the packet has been transmitted */
Wolfgang Betz 3:0df38cfb1e53 193 //rtimer_clock_t rtimer_txdone, rtimer_rxack;
Wolfgang Betz 3:0df38cfb1e53 194
Wolfgang Betz 3:0df38cfb1e53 195 PRINTF("TRANSMIT IN\n");
Wolfgang Betz 3:0df38cfb1e53 196 if(!packet_is_prepared) {
Wolfgang Betz 3:0df38cfb1e53 197 return RADIO_TX_ERR;
Wolfgang Betz 3:0df38cfb1e53 198 }
Wolfgang Betz 3:0df38cfb1e53 199
Wolfgang Betz 3:0df38cfb1e53 200 /* Stores the length of the packet to send */
Wolfgang Betz 3:0df38cfb1e53 201 /* Others spirit_radio_prepare will be in hold */
Wolfgang Betz 3:0df38cfb1e53 202 spirit_txbuf[0] = payload_len;
Wolfgang Betz 3:0df38cfb1e53 203
Wolfgang Betz 3:0df38cfb1e53 204 /* Puts the SPIRIT1 in TX state */
Wolfgang Betz 3:0df38cfb1e53 205 receiving_packet = 0;
Wolfgang Betz 3:0df38cfb1e53 206 set_ready_state();
Wolfgang Betz 3:0df38cfb1e53 207 cmd_strobe_command(SPIRIT1_STROBE_TX);
Wolfgang Betz 3:0df38cfb1e53 208 just_got_an_ack = 0;
Wolfgang Betz 3:0df38cfb1e53 209 BUSYWAIT_UNTIL(SPIRIT1_STATUS() == SPIRIT1_STATE_TX, 1);
Wolfgang Betz 3:0df38cfb1e53 210 //BUSYWAIT_UNTIL(SPIRIT1_STATUS() != SPIRIT1_STATE_TX, 4); //For GFSK with high data rate
Wolfgang Betz 3:0df38cfb1e53 211 BUSYWAIT_UNTIL(SPIRIT1_STATUS() != SPIRIT1_STATE_TX, 50); //For FSK with low data rate
Wolfgang Betz 3:0df38cfb1e53 212
Wolfgang Betz 3:0df38cfb1e53 213 /* Reset radio - needed for immediate RX of ack */
Wolfgang Betz 3:0df38cfb1e53 214 CLEAR_TXBUF();
Wolfgang Betz 3:0df38cfb1e53 215 CLEAR_RXBUF();
Wolfgang Betz 3:0df38cfb1e53 216 disable_irq();
Wolfgang Betz 3:0df38cfb1e53 217 irq_clear_status();
Wolfgang Betz 3:0df38cfb1e53 218 cmd_strobe_command(SPIRIT1_STROBE_SABORT);
Wolfgang Betz 3:0df38cfb1e53 219 wait_us(SABORT_WAIT_US);
Wolfgang Betz 3:0df38cfb1e53 220 cmd_strobe_command(SPIRIT1_STROBE_READY);
Wolfgang Betz 3:0df38cfb1e53 221 BUSYWAIT_UNTIL(SPIRIT1_STATUS() == SPIRIT1_STATE_READY, 1);
Wolfgang Betz 3:0df38cfb1e53 222 cmd_strobe_command(SPIRIT1_STROBE_RX);
Wolfgang Betz 3:0df38cfb1e53 223 BUSYWAIT_UNTIL(SPIRIT1_STATUS() == SPIRIT1_STATE_RX, 1);
Wolfgang Betz 3:0df38cfb1e53 224 enable_irq();
Wolfgang Betz 3:0df38cfb1e53 225
Wolfgang Betz 3:0df38cfb1e53 226 #if XXX_ACK_WORKAROUND
Wolfgang Betz 3:0df38cfb1e53 227 just_got_an_ack = 1;
Wolfgang Betz 3:0df38cfb1e53 228 #endif /* XXX_ACK_WORKAROUND */
Wolfgang Betz 3:0df38cfb1e53 229
Wolfgang Betz 3:0df38cfb1e53 230 #if NULLRDC_CONF_802154_AUTOACK
Wolfgang Betz 3:0df38cfb1e53 231 if (wants_an_ack) {
Wolfgang Betz 3:0df38cfb1e53 232 rtimer_txdone = _busywait_timer.read_ms();
Wolfgang Betz 3:0df38cfb1e53 233 BUSYWAIT_UNTIL(just_got_an_ack, 2);
Wolfgang Betz 3:0df38cfb1e53 234 rtimer_rxack = _busywait_timer.read_ms();
Wolfgang Betz 3:0df38cfb1e53 235
Wolfgang Betz 3:0df38cfb1e53 236 if(just_got_an_ack) {
Wolfgang Betz 3:0df38cfb1e53 237 ACKPRINTF("debug_ack: ack received after %u ms\n",
Wolfgang Betz 3:0df38cfb1e53 238 (uint32_t)(rtimer_rxack - rtimer_txdone));
Wolfgang Betz 3:0df38cfb1e53 239 } else {
Wolfgang Betz 3:0df38cfb1e53 240 ACKPRINTF("debug_ack: no ack received\n");
Wolfgang Betz 3:0df38cfb1e53 241 }
Wolfgang Betz 3:0df38cfb1e53 242 }
Wolfgang Betz 3:0df38cfb1e53 243 #endif /* NULLRDC_CONF_802154_AUTOACK */
Wolfgang Betz 3:0df38cfb1e53 244
Wolfgang Betz 3:0df38cfb1e53 245 PRINTF("TRANSMIT OUT\n");
Wolfgang Betz 3:0df38cfb1e53 246
Wolfgang Betz 3:0df38cfb1e53 247 CLEAR_TXBUF();
Wolfgang Betz 3:0df38cfb1e53 248
Wolfgang Betz 3:0df38cfb1e53 249 packet_is_prepared = 0;
Wolfgang Betz 3:0df38cfb1e53 250
Wolfgang Betz 3:0df38cfb1e53 251 wait_us(1);
Wolfgang Betz 3:0df38cfb1e53 252
Wolfgang Betz 3:0df38cfb1e53 253 return RADIO_TX_OK;
Wolfgang Betz 3:0df38cfb1e53 254 }
Wolfgang Betz 3:0df38cfb1e53 255
Wolfgang Betz 3:0df38cfb1e53 256 /** Set Ready State **/
Wolfgang Betz 3:0df38cfb1e53 257 void SimpleSpirit1::set_ready_state(void) {
Wolfgang Betz 3:0df38cfb1e53 258 PRINTF("READY IN\n");
Wolfgang Betz 3:0df38cfb1e53 259
Wolfgang Betz 3:0df38cfb1e53 260 irq_clear_status();
Wolfgang Betz 3:0df38cfb1e53 261 disable_irq();
Wolfgang Betz 3:0df38cfb1e53 262
Wolfgang Betz 3:0df38cfb1e53 263 if(SPIRIT1_STATUS() == SPIRIT1_STATE_STANDBY) {
Wolfgang Betz 3:0df38cfb1e53 264 cmd_strobe_command(SPIRIT1_STROBE_READY);
Wolfgang Betz 3:0df38cfb1e53 265 } else if(SPIRIT1_STATUS() == SPIRIT1_STATE_RX) {
Wolfgang Betz 3:0df38cfb1e53 266 cmd_strobe_command(SPIRIT1_STROBE_SABORT);
Wolfgang Betz 3:0df38cfb1e53 267 irq_clear_status();
Wolfgang Betz 3:0df38cfb1e53 268 }
Wolfgang Betz 3:0df38cfb1e53 269
Wolfgang Betz 3:0df38cfb1e53 270 enable_irq();
Wolfgang Betz 3:0df38cfb1e53 271
Wolfgang Betz 3:0df38cfb1e53 272 PRINTF("READY OUT\n");
Wolfgang Betz 3:0df38cfb1e53 273 }
Wolfgang Betz 3:0df38cfb1e53 274
Wolfgang Betz 3:0df38cfb1e53 275 int SimpleSpirit1::radio_off(void) {
Wolfgang Betz 3:0df38cfb1e53 276 PRINTF("Spirit1: ->off\n");
Wolfgang Betz 3:0df38cfb1e53 277 if(spirit_on == ON) {
Wolfgang Betz 3:0df38cfb1e53 278 /* Disables the mcu to get IRQ from the SPIRIT1 */
Wolfgang Betz 3:0df38cfb1e53 279 disable_irq();
Wolfgang Betz 3:0df38cfb1e53 280
Wolfgang Betz 3:0df38cfb1e53 281 /* first stop rx/tx */
Wolfgang Betz 3:0df38cfb1e53 282 cmd_strobe_command(SPIRIT1_STROBE_SABORT);
Wolfgang Betz 3:0df38cfb1e53 283
Wolfgang Betz 3:0df38cfb1e53 284 /* Clear any pending irqs */
Wolfgang Betz 3:0df38cfb1e53 285 irq_clear_status();
Wolfgang Betz 3:0df38cfb1e53 286
Wolfgang Betz 3:0df38cfb1e53 287 BUSYWAIT_UNTIL(SPIRIT1_STATUS() == SPIRIT1_STATE_READY, 5);
Wolfgang Betz 3:0df38cfb1e53 288 if(SPIRIT1_STATUS() != SPIRIT1_STATE_READY) {
Wolfgang Betz 3:0df38cfb1e53 289 PRINTF("Spirit1: failed off->ready\n");
Wolfgang Betz 3:0df38cfb1e53 290 return 1;
Wolfgang Betz 3:0df38cfb1e53 291 }
Wolfgang Betz 3:0df38cfb1e53 292
Wolfgang Betz 3:0df38cfb1e53 293 /* Puts the SPIRIT1 in STANDBY */
Wolfgang Betz 3:0df38cfb1e53 294 cmd_strobe_command(SPIRIT1_STROBE_STANDBY);
Wolfgang Betz 3:0df38cfb1e53 295 BUSYWAIT_UNTIL(SPIRIT1_STATUS() == SPIRIT1_STATE_STANDBY, 5);
Wolfgang Betz 3:0df38cfb1e53 296 if(SPIRIT1_STATUS() != SPIRIT1_STATE_STANDBY) {
Wolfgang Betz 3:0df38cfb1e53 297 PRINTF("Spirit1: failed off->standby\n");
Wolfgang Betz 3:0df38cfb1e53 298 return 1;
Wolfgang Betz 3:0df38cfb1e53 299 }
Wolfgang Betz 3:0df38cfb1e53 300
Wolfgang Betz 3:0df38cfb1e53 301 spirit_on = OFF;
Wolfgang Betz 3:0df38cfb1e53 302 CLEAR_TXBUF();
Wolfgang Betz 3:0df38cfb1e53 303 CLEAR_RXBUF();
Wolfgang Betz 3:0df38cfb1e53 304 }
Wolfgang Betz 3:0df38cfb1e53 305 PRINTF("Spirit1: off.\n");
Wolfgang Betz 3:0df38cfb1e53 306 return 0;
Wolfgang Betz 3:0df38cfb1e53 307 }
Wolfgang Betz 3:0df38cfb1e53 308
Wolfgang Betz 3:0df38cfb1e53 309 int SimpleSpirit1::radio_on(void) {
Wolfgang Betz 3:0df38cfb1e53 310 PRINTF("Spirit1: on\n");
Wolfgang Betz 3:0df38cfb1e53 311 cmd_strobe_command(SPIRIT1_STROBE_SABORT);
Wolfgang Betz 3:0df38cfb1e53 312 wait_us(SABORT_WAIT_US);
Wolfgang Betz 3:0df38cfb1e53 313 if(spirit_on == OFF) {
Wolfgang Betz 3:0df38cfb1e53 314 /* ensure we are in READY state as we go from there to Rx */
Wolfgang Betz 3:0df38cfb1e53 315 cmd_strobe_command(SPIRIT1_STROBE_READY);
Wolfgang Betz 3:0df38cfb1e53 316 BUSYWAIT_UNTIL(SPIRIT1_STATUS() == SPIRIT1_STATE_READY, 5);
Wolfgang Betz 3:0df38cfb1e53 317 if(SPIRIT1_STATUS() != SPIRIT1_STATE_READY) {
Wolfgang Betz 3:0df38cfb1e53 318 PRINTF("Spirit1: failed to turn on\n");
Wolfgang Betz 3:0df38cfb1e53 319 while(1);
Wolfgang Betz 3:0df38cfb1e53 320 //return 1;
Wolfgang Betz 3:0df38cfb1e53 321 }
Wolfgang Betz 3:0df38cfb1e53 322
Wolfgang Betz 3:0df38cfb1e53 323 /* now we go to Rx */
Wolfgang Betz 3:0df38cfb1e53 324 cmd_strobe_command(SPIRIT1_STROBE_RX);
Wolfgang Betz 3:0df38cfb1e53 325 BUSYWAIT_UNTIL(SPIRIT1_STATUS() == SPIRIT1_STATE_RX, 5);
Wolfgang Betz 3:0df38cfb1e53 326 if(SPIRIT1_STATUS() != SPIRIT1_STATE_RX) {
Wolfgang Betz 3:0df38cfb1e53 327 PRINTF("Spirit1: failed to enter rx\n");
Wolfgang Betz 3:0df38cfb1e53 328 while(1);
Wolfgang Betz 3:0df38cfb1e53 329 //return 1;
Wolfgang Betz 3:0df38cfb1e53 330 }
Wolfgang Betz 3:0df38cfb1e53 331
Wolfgang Betz 3:0df38cfb1e53 332 /* Enables the mcu to get IRQ from the SPIRIT1 */
Wolfgang Betz 3:0df38cfb1e53 333 spirit_on = ON;
Wolfgang Betz 3:0df38cfb1e53 334 if((_current_irq_callback != NULL) && (*_current_irq_callback)) {
Wolfgang Betz 3:0df38cfb1e53 335 enable_irq();
Wolfgang Betz 3:0df38cfb1e53 336 }
Wolfgang Betz 3:0df38cfb1e53 337 }
Wolfgang Betz 3:0df38cfb1e53 338
Wolfgang Betz 3:0df38cfb1e53 339 return 0;
Wolfgang Betz 3:0df38cfb1e53 340 }
Wolfgang Betz 3:0df38cfb1e53 341
Wolfgang Betz 3:0df38cfb1e53 342 uint16_t SimpleSpirit1::arch_refresh_status(void) {
Wolfgang Betz 3:0df38cfb1e53 343 uint16_t mcstate;
Wolfgang Betz 3:0df38cfb1e53 344 uint8_t header[2];
Wolfgang Betz 3:0df38cfb1e53 345 header[0]=READ_HEADER;
Wolfgang Betz 3:0df38cfb1e53 346 header[1]=MC_STATE1_BASE;
Wolfgang Betz 3:0df38cfb1e53 347
Wolfgang Betz 3:0df38cfb1e53 348 /* Puts the SPI chip select low to start the transaction */
Wolfgang Betz 3:0df38cfb1e53 349 chip_sync_select();
Wolfgang Betz 3:0df38cfb1e53 350
Wolfgang Betz 3:0df38cfb1e53 351 /* Write the aHeader bytes and read the SPIRIT1 status bytes */
Wolfgang Betz 3:0df38cfb1e53 352 mcstate = _spi.write(header[0]);
Wolfgang Betz 3:0df38cfb1e53 353 mcstate = mcstate<<8;
Wolfgang Betz 3:0df38cfb1e53 354
Wolfgang Betz 3:0df38cfb1e53 355 /* Write the aHeader bytes and read the SPIRIT1 status bytes */
Wolfgang Betz 3:0df38cfb1e53 356 mcstate |= _spi.write(header[1]);
Wolfgang Betz 3:0df38cfb1e53 357
Wolfgang Betz 3:0df38cfb1e53 358 /* Puts the SPI chip select high to end the transaction */
Wolfgang Betz 3:0df38cfb1e53 359 chip_sync_unselect();
Wolfgang Betz 3:0df38cfb1e53 360
Wolfgang Betz 3:0df38cfb1e53 361 return mcstate;
Wolfgang Betz 3:0df38cfb1e53 362 }
Wolfgang Betz 3:0df38cfb1e53 363