Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of EV-COG-AD3029LZ by
SimpleSpirit1.cpp@3:0df38cfb1e53, 2016-10-14 (annotated)
- 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?
| 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 |
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 |
