Library for the nRF2401A Transceiver
Dependents: nRF2401A_Hello_World nRF2401A_Wireless_Accelerometer_joypad nRF2401A_Gameduino_Invaders
nRF2401A.cpp@0:17cb4be1e37f, 2013-10-04 (annotated)
- Committer:
- TheChrisyd
- Date:
- Fri Oct 04 16:14:49 2013 +0000
- Revision:
- 0:17cb4be1e37f
- Child:
- 1:8c57f88ff574
first commit for week 1 progress update
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
TheChrisyd | 0:17cb4be1e37f | 1 | /* mbed nRF2401A Library |
TheChrisyd | 0:17cb4be1e37f | 2 | * |
TheChrisyd | 0:17cb4be1e37f | 3 | * Copyright (c) 2011, Per Söderstam |
TheChrisyd | 0:17cb4be1e37f | 4 | * |
TheChrisyd | 0:17cb4be1e37f | 5 | * Permission is hereby granted, free of charge, to any person obtaining a copy |
TheChrisyd | 0:17cb4be1e37f | 6 | * of this software and associated documentation files (the "Software"), to deal |
TheChrisyd | 0:17cb4be1e37f | 7 | * in the Software without restriction, including without limitation the rights |
TheChrisyd | 0:17cb4be1e37f | 8 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
TheChrisyd | 0:17cb4be1e37f | 9 | * copies of the Software, and to permit persons to whom the Software is |
TheChrisyd | 0:17cb4be1e37f | 10 | * furnished to do so, subject to the following conditions: |
TheChrisyd | 0:17cb4be1e37f | 11 | * |
TheChrisyd | 0:17cb4be1e37f | 12 | * The above copyright notice and this permission notice shall be included in |
TheChrisyd | 0:17cb4be1e37f | 13 | * all copies or substantial portions of the Software. |
TheChrisyd | 0:17cb4be1e37f | 14 | * |
TheChrisyd | 0:17cb4be1e37f | 15 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
TheChrisyd | 0:17cb4be1e37f | 16 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
TheChrisyd | 0:17cb4be1e37f | 17 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
TheChrisyd | 0:17cb4be1e37f | 18 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
TheChrisyd | 0:17cb4be1e37f | 19 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
TheChrisyd | 0:17cb4be1e37f | 20 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
TheChrisyd | 0:17cb4be1e37f | 21 | * THE SOFTWARE. |
TheChrisyd | 0:17cb4be1e37f | 22 | */ |
TheChrisyd | 0:17cb4be1e37f | 23 | |
TheChrisyd | 0:17cb4be1e37f | 24 | #include "nRF2401A.h" |
TheChrisyd | 0:17cb4be1e37f | 25 | |
TheChrisyd | 0:17cb4be1e37f | 26 | |
TheChrisyd | 0:17cb4be1e37f | 27 | nRF2401A::nRF2401A(PinName ce, |
TheChrisyd | 0:17cb4be1e37f | 28 | PinName cs, |
TheChrisyd | 0:17cb4be1e37f | 29 | PinName dr1, |
TheChrisyd | 0:17cb4be1e37f | 30 | PinName clk1, |
TheChrisyd | 0:17cb4be1e37f | 31 | PinName data) |
TheChrisyd | 0:17cb4be1e37f | 32 | : _ce(DigitalOut(ce)), |
TheChrisyd | 0:17cb4be1e37f | 33 | _cs(DigitalOut(cs)), |
TheChrisyd | 0:17cb4be1e37f | 34 | _dr1(DigitalIn(dr1)), |
TheChrisyd | 0:17cb4be1e37f | 35 | _clk1(DigitalOut(clk1)), |
TheChrisyd | 0:17cb4be1e37f | 36 | _data(DigitalInOut(data)), |
TheChrisyd | 0:17cb4be1e37f | 37 | _state(nRF2401A::UNDEF), |
TheChrisyd | 0:17cb4be1e37f | 38 | _rx_handler((nRF2401A_rx_handler_t) 0), |
TheChrisyd | 0:17cb4be1e37f | 39 | _rx_handler_arg((void *) 0), |
TheChrisyd | 0:17cb4be1e37f | 40 | _dr1_isr(InterruptIn(dr1)) { |
TheChrisyd | 0:17cb4be1e37f | 41 | |
TheChrisyd | 0:17cb4be1e37f | 42 | // init member variables |
TheChrisyd | 0:17cb4be1e37f | 43 | _data.output(); |
TheChrisyd | 0:17cb4be1e37f | 44 | // setup... |
TheChrisyd | 0:17cb4be1e37f | 45 | _ctrl_packet = (uint8_t *) &_ctrl_packet_buf; |
TheChrisyd | 0:17cb4be1e37f | 46 | _dr1_isr.rise(this, &nRF2401A::dataReadyHandler); |
TheChrisyd | 0:17cb4be1e37f | 47 | // ...tranciever in standby... |
TheChrisyd | 0:17cb4be1e37f | 48 | _ce = 0; |
TheChrisyd | 0:17cb4be1e37f | 49 | _cs = 0; |
TheChrisyd | 0:17cb4be1e37f | 50 | // ...and clear receive buffer |
TheChrisyd | 0:17cb4be1e37f | 51 | for (int i = 0; i < 16; i++) |
TheChrisyd | 0:17cb4be1e37f | 52 | _data_buf[i] = 0x0; |
TheChrisyd | 0:17cb4be1e37f | 53 | // ...set imutable control fields... |
TheChrisyd | 0:17cb4be1e37f | 54 | _ctrl_packet_buf.enable_dual_channel_mode = 0x0; // single channel receive |
TheChrisyd | 0:17cb4be1e37f | 55 | _ctrl_packet_buf.communication_mode = 0x1; // ShockBurst mode |
TheChrisyd | 0:17cb4be1e37f | 56 | _ctrl_packet_buf.xo_frequency = 0x3; // 16 MHz crystal |
TheChrisyd | 0:17cb4be1e37f | 57 | _ctrl_packet_buf.rf_power = 0x3; // 0 dBm (1 mW) output power |
TheChrisyd | 0:17cb4be1e37f | 58 | // ...start in RX mode |
TheChrisyd | 0:17cb4be1e37f | 59 | _ctrl_packet_buf.txr_switch = nRF2401A::RX_MODE; |
TheChrisyd | 0:17cb4be1e37f | 60 | // assure minimum wake up time while assuming tranciever powers up with uP |
TheChrisyd | 0:17cb4be1e37f | 61 | wait_ms(Tpd2cfgm); |
TheChrisyd | 0:17cb4be1e37f | 62 | |
TheChrisyd | 0:17cb4be1e37f | 63 | return; |
TheChrisyd | 0:17cb4be1e37f | 64 | } |
TheChrisyd | 0:17cb4be1e37f | 65 | |
TheChrisyd | 0:17cb4be1e37f | 66 | void nRF2401A::printControlPacket(Serial& port) |
TheChrisyd | 0:17cb4be1e37f | 67 | { |
TheChrisyd | 0:17cb4be1e37f | 68 | for(int i = 0; i < sizeof(_ctrl_packet_buf); i++) |
TheChrisyd | 0:17cb4be1e37f | 69 | port.printf("%02x ", _ctrl_packet[i]); |
TheChrisyd | 0:17cb4be1e37f | 70 | port.printf("\n\r"); |
TheChrisyd | 0:17cb4be1e37f | 71 | return; |
TheChrisyd | 0:17cb4be1e37f | 72 | } |
TheChrisyd | 0:17cb4be1e37f | 73 | |
TheChrisyd | 0:17cb4be1e37f | 74 | void nRF2401A::printDataPacket(Serial& port) |
TheChrisyd | 0:17cb4be1e37f | 75 | { |
TheChrisyd | 0:17cb4be1e37f | 76 | for(int i = 0; i < sizeof(_data_buf); i++) |
TheChrisyd | 0:17cb4be1e37f | 77 | port.printf("%02x ", _data_buf[i]); |
TheChrisyd | 0:17cb4be1e37f | 78 | port.printf("\r"); |
TheChrisyd | 0:17cb4be1e37f | 79 | return; |
TheChrisyd | 0:17cb4be1e37f | 80 | } |
TheChrisyd | 0:17cb4be1e37f | 81 | |
TheChrisyd | 0:17cb4be1e37f | 82 | nRF2401A& nRF2401A::attachRXHandler(nRF2401A_rx_handler_t handler, void *arg) { |
TheChrisyd | 0:17cb4be1e37f | 83 | |
TheChrisyd | 0:17cb4be1e37f | 84 | _rx_handler = handler; |
TheChrisyd | 0:17cb4be1e37f | 85 | _rx_handler_arg = arg; |
TheChrisyd | 0:17cb4be1e37f | 86 | |
TheChrisyd | 0:17cb4be1e37f | 87 | return *this; |
TheChrisyd | 0:17cb4be1e37f | 88 | } |
TheChrisyd | 0:17cb4be1e37f | 89 | |
TheChrisyd | 0:17cb4be1e37f | 90 | nRF2401A& nRF2401A::sendMsg(nRF2401A::address_t addr, uint8_t addr_len, uint8_t *msg_buf, uint8_t msg_len) { |
TheChrisyd | 0:17cb4be1e37f | 91 | |
TheChrisyd | 0:17cb4be1e37f | 92 | // point to start of address byte in address |
TheChrisyd | 0:17cb4be1e37f | 93 | uint8_t *aligned_addr = &addr[sizeof(address_t) - (addr_len / 8)]; |
TheChrisyd | 0:17cb4be1e37f | 94 | // wait for tx completion |
TheChrisyd | 0:17cb4be1e37f | 95 | int Toa = (_ctrl_packet_buf.rf_data_rate == nRF2401A::BIT_RATE_1MBITS ? 1 : 4) * (addr_len + msg_len + 1 + 16); |
TheChrisyd | 0:17cb4be1e37f | 96 | |
TheChrisyd | 0:17cb4be1e37f | 97 | switch (_state) { |
TheChrisyd | 0:17cb4be1e37f | 98 | case nRF2401A::RX: |
TheChrisyd | 0:17cb4be1e37f | 99 | // switch to transmit |
TheChrisyd | 0:17cb4be1e37f | 100 | _ce = 0; |
TheChrisyd | 0:17cb4be1e37f | 101 | _cs = 0; |
TheChrisyd | 0:17cb4be1e37f | 102 | wait_us(Td); |
TheChrisyd | 0:17cb4be1e37f | 103 | // assert CS/CE and wait Tcs2data |
TheChrisyd | 0:17cb4be1e37f | 104 | _ce = 0; |
TheChrisyd | 0:17cb4be1e37f | 105 | _cs = 1; |
TheChrisyd | 0:17cb4be1e37f | 106 | wait_us(Tcs2data); |
TheChrisyd | 0:17cb4be1e37f | 107 | // push out the bits |
TheChrisyd | 0:17cb4be1e37f | 108 | _data = nRF2401A::TX_MODE; |
TheChrisyd | 0:17cb4be1e37f | 109 | wait_us(Ts); |
TheChrisyd | 0:17cb4be1e37f | 110 | _clk1 = 1; |
TheChrisyd | 0:17cb4be1e37f | 111 | wait_us(Th); |
TheChrisyd | 0:17cb4be1e37f | 112 | _clk1 = 0; |
TheChrisyd | 0:17cb4be1e37f | 113 | // wait Td |
TheChrisyd | 0:17cb4be1e37f | 114 | wait_us(Td); |
TheChrisyd | 0:17cb4be1e37f | 115 | // deassert CS/CE and done... |
TheChrisyd | 0:17cb4be1e37f | 116 | _cs = 0; |
TheChrisyd | 0:17cb4be1e37f | 117 | _ce = 0; |
TheChrisyd | 0:17cb4be1e37f | 118 | |
TheChrisyd | 0:17cb4be1e37f | 119 | // zero control and data lines |
TheChrisyd | 0:17cb4be1e37f | 120 | _clk1 = 0; |
TheChrisyd | 0:17cb4be1e37f | 121 | _data = 0; |
TheChrisyd | 0:17cb4be1e37f | 122 | // wait Td |
TheChrisyd | 0:17cb4be1e37f | 123 | wait_us(Td); |
TheChrisyd | 0:17cb4be1e37f | 124 | // assert CE and wait Tcs2data |
TheChrisyd | 0:17cb4be1e37f | 125 | _ce = 1; |
TheChrisyd | 0:17cb4be1e37f | 126 | wait_us(Tce2data); |
TheChrisyd | 0:17cb4be1e37f | 127 | // push out the address bits |
TheChrisyd | 0:17cb4be1e37f | 128 | for (int i = 0; i < addr_len; i++) { |
TheChrisyd | 0:17cb4be1e37f | 129 | _data = ((0x80 >> (i % 8)) & aligned_addr[i / 8]) ? 0x1 : 0x0; |
TheChrisyd | 0:17cb4be1e37f | 130 | wait_us(Ts); |
TheChrisyd | 0:17cb4be1e37f | 131 | _clk1 = 1; |
TheChrisyd | 0:17cb4be1e37f | 132 | wait_us(Th); |
TheChrisyd | 0:17cb4be1e37f | 133 | _clk1 = 0; |
TheChrisyd | 0:17cb4be1e37f | 134 | } |
TheChrisyd | 0:17cb4be1e37f | 135 | // push out the message bits |
TheChrisyd | 0:17cb4be1e37f | 136 | for (int i = 0; i < msg_len; i++) { |
TheChrisyd | 0:17cb4be1e37f | 137 | _data = ((0x80 >> (i % 8)) & msg_buf[i / 8]) ? 0x1 : 0x0; |
TheChrisyd | 0:17cb4be1e37f | 138 | wait_us(Ts); |
TheChrisyd | 0:17cb4be1e37f | 139 | _clk1 = 1; |
TheChrisyd | 0:17cb4be1e37f | 140 | wait_us(Th); |
TheChrisyd | 0:17cb4be1e37f | 141 | _clk1 = 0; |
TheChrisyd | 0:17cb4be1e37f | 142 | } |
TheChrisyd | 0:17cb4be1e37f | 143 | // reset data |
TheChrisyd | 0:17cb4be1e37f | 144 | _data = 0; |
TheChrisyd | 0:17cb4be1e37f | 145 | // deassert CE will initiate transmission |
TheChrisyd | 0:17cb4be1e37f | 146 | _ce = 0; |
TheChrisyd | 0:17cb4be1e37f | 147 | wait_us(Tsby2txSB + Toa); |
TheChrisyd | 0:17cb4be1e37f | 148 | |
TheChrisyd | 0:17cb4be1e37f | 149 | // switch back to receive |
TheChrisyd | 0:17cb4be1e37f | 150 | wait_us(Td); |
TheChrisyd | 0:17cb4be1e37f | 151 | // assert CS/CE and wait Tcs2data |
TheChrisyd | 0:17cb4be1e37f | 152 | _cs = 1; |
TheChrisyd | 0:17cb4be1e37f | 153 | wait_us(Tcs2data); |
TheChrisyd | 0:17cb4be1e37f | 154 | // push out the bits |
TheChrisyd | 0:17cb4be1e37f | 155 | _data = nRF2401A::RX_MODE; |
TheChrisyd | 0:17cb4be1e37f | 156 | wait_us(Ts); |
TheChrisyd | 0:17cb4be1e37f | 157 | _clk1 = 1; |
TheChrisyd | 0:17cb4be1e37f | 158 | wait_us(Th); |
TheChrisyd | 0:17cb4be1e37f | 159 | _clk1 = 0; |
TheChrisyd | 0:17cb4be1e37f | 160 | // wait Td |
TheChrisyd | 0:17cb4be1e37f | 161 | wait_us(Td); |
TheChrisyd | 0:17cb4be1e37f | 162 | _data = 0; |
TheChrisyd | 0:17cb4be1e37f | 163 | // deassert CS/CE and done... |
TheChrisyd | 0:17cb4be1e37f | 164 | _cs = 0; |
TheChrisyd | 0:17cb4be1e37f | 165 | // wait Td to avoid simultaineous control high |
TheChrisyd | 0:17cb4be1e37f | 166 | wait_us(Td); |
TheChrisyd | 0:17cb4be1e37f | 167 | _ce = 1; |
TheChrisyd | 0:17cb4be1e37f | 168 | // done |
TheChrisyd | 0:17cb4be1e37f | 169 | break; |
TheChrisyd | 0:17cb4be1e37f | 170 | case nRF2401A::STANDBY: |
TheChrisyd | 0:17cb4be1e37f | 171 | case nRF2401A::TX: |
TheChrisyd | 0:17cb4be1e37f | 172 | case nRF2401A::UNDEF: |
TheChrisyd | 0:17cb4be1e37f | 173 | default: |
TheChrisyd | 0:17cb4be1e37f | 174 | // can only send in RX mode |
TheChrisyd | 0:17cb4be1e37f | 175 | break; |
TheChrisyd | 0:17cb4be1e37f | 176 | } |
TheChrisyd | 0:17cb4be1e37f | 177 | |
TheChrisyd | 0:17cb4be1e37f | 178 | return *this; |
TheChrisyd | 0:17cb4be1e37f | 179 | } |
TheChrisyd | 0:17cb4be1e37f | 180 | |
TheChrisyd | 0:17cb4be1e37f | 181 | void nRF2401A::pushCtrl(uint8_t *buf, uint8_t n_bits, bool is_ctrl) { |
TheChrisyd | 0:17cb4be1e37f | 182 | |
TheChrisyd | 0:17cb4be1e37f | 183 | DigitalOut &ctrl_pin = is_ctrl ? _cs : _ce; |
TheChrisyd | 0:17cb4be1e37f | 184 | |
TheChrisyd | 0:17cb4be1e37f | 185 | // set data to output |
TheChrisyd | 0:17cb4be1e37f | 186 | _data.output(); |
TheChrisyd | 0:17cb4be1e37f | 187 | // zero control and data lines |
TheChrisyd | 0:17cb4be1e37f | 188 | _cs = 0; |
TheChrisyd | 0:17cb4be1e37f | 189 | _ce = 0; |
TheChrisyd | 0:17cb4be1e37f | 190 | _clk1 = 0; |
TheChrisyd | 0:17cb4be1e37f | 191 | _data = 0; |
TheChrisyd | 0:17cb4be1e37f | 192 | // wait Td |
TheChrisyd | 0:17cb4be1e37f | 193 | wait_us(Td); |
TheChrisyd | 0:17cb4be1e37f | 194 | // assert CS/CE and wait Tcs2data |
TheChrisyd | 0:17cb4be1e37f | 195 | ctrl_pin = 1; |
TheChrisyd | 0:17cb4be1e37f | 196 | wait_us(Tcs2data); |
TheChrisyd | 0:17cb4be1e37f | 197 | // push out the bits |
TheChrisyd | 0:17cb4be1e37f | 198 | for (int i = 0; i < n_bits; i++) { |
TheChrisyd | 0:17cb4be1e37f | 199 | _data = ((0x80 >> (i % 8)) & buf[i / 8]) ? 0x1 : 0x0; |
TheChrisyd | 0:17cb4be1e37f | 200 | wait_us(Ts); |
TheChrisyd | 0:17cb4be1e37f | 201 | _clk1 = 1; |
TheChrisyd | 0:17cb4be1e37f | 202 | wait_us(Th); |
TheChrisyd | 0:17cb4be1e37f | 203 | _clk1 = 0; |
TheChrisyd | 0:17cb4be1e37f | 204 | } |
TheChrisyd | 0:17cb4be1e37f | 205 | _data = 0; |
TheChrisyd | 0:17cb4be1e37f | 206 | // wait Td |
TheChrisyd | 0:17cb4be1e37f | 207 | wait_us(Td); |
TheChrisyd | 0:17cb4be1e37f | 208 | // deassert CS/CE and done... |
TheChrisyd | 0:17cb4be1e37f | 209 | ctrl_pin = 0; |
TheChrisyd | 0:17cb4be1e37f | 210 | |
TheChrisyd | 0:17cb4be1e37f | 211 | return; |
TheChrisyd | 0:17cb4be1e37f | 212 | } |
TheChrisyd | 0:17cb4be1e37f | 213 | |
TheChrisyd | 0:17cb4be1e37f | 214 | int nRF2401A::pull(uint8_t *buf) { |
TheChrisyd | 0:17cb4be1e37f | 215 | int n = 0; |
TheChrisyd | 0:17cb4be1e37f | 216 | |
TheChrisyd | 0:17cb4be1e37f | 217 | // read from data pin |
TheChrisyd | 0:17cb4be1e37f | 218 | _data.input(); |
TheChrisyd | 0:17cb4be1e37f | 219 | // init signals, go to standby |
TheChrisyd | 0:17cb4be1e37f | 220 | _ce = 1; |
TheChrisyd | 0:17cb4be1e37f | 221 | _cs = 0; |
TheChrisyd | 0:17cb4be1e37f | 222 | _clk1 = 0; |
TheChrisyd | 0:17cb4be1e37f | 223 | // ensure time from DR |
TheChrisyd | 0:17cb4be1e37f | 224 | wait_us(Td); |
TheChrisyd | 0:17cb4be1e37f | 225 | |
TheChrisyd | 0:17cb4be1e37f | 226 | while (_dr1 == 1) { |
TheChrisyd | 0:17cb4be1e37f | 227 | _clk1 = 1; |
TheChrisyd | 0:17cb4be1e37f | 228 | wait_us(Thmin); |
TheChrisyd | 0:17cb4be1e37f | 229 | if(_data.read()) |
TheChrisyd | 0:17cb4be1e37f | 230 | buf[n / 8] |= (0x80 >> (n % 8)); |
TheChrisyd | 0:17cb4be1e37f | 231 | else |
TheChrisyd | 0:17cb4be1e37f | 232 | buf[n / 8] &= ~(0x80 >> (n % 8)); |
TheChrisyd | 0:17cb4be1e37f | 233 | n++; |
TheChrisyd | 0:17cb4be1e37f | 234 | _clk1 = 0; |
TheChrisyd | 0:17cb4be1e37f | 235 | wait_us(Thmin); |
TheChrisyd | 0:17cb4be1e37f | 236 | } |
TheChrisyd | 0:17cb4be1e37f | 237 | // return to active |
TheChrisyd | 0:17cb4be1e37f | 238 | _ce = 1; |
TheChrisyd | 0:17cb4be1e37f | 239 | // reset data pin direction |
TheChrisyd | 0:17cb4be1e37f | 240 | _data.output(); |
TheChrisyd | 0:17cb4be1e37f | 241 | |
TheChrisyd | 0:17cb4be1e37f | 242 | return n; |
TheChrisyd | 0:17cb4be1e37f | 243 | } |
TheChrisyd | 0:17cb4be1e37f | 244 | |
TheChrisyd | 0:17cb4be1e37f | 245 | void nRF2401A::activate(bool active) { |
TheChrisyd | 0:17cb4be1e37f | 246 | switch (_state) { |
TheChrisyd | 0:17cb4be1e37f | 247 | case nRF2401A::RX: |
TheChrisyd | 0:17cb4be1e37f | 248 | if (!active) { |
TheChrisyd | 0:17cb4be1e37f | 249 | _state = nRF2401A::STANDBY; |
TheChrisyd | 0:17cb4be1e37f | 250 | _ce = 0; |
TheChrisyd | 0:17cb4be1e37f | 251 | _cs = 0; |
TheChrisyd | 0:17cb4be1e37f | 252 | } |
TheChrisyd | 0:17cb4be1e37f | 253 | break; |
TheChrisyd | 0:17cb4be1e37f | 254 | case nRF2401A::STANDBY: |
TheChrisyd | 0:17cb4be1e37f | 255 | if (active) { |
TheChrisyd | 0:17cb4be1e37f | 256 | _state = nRF2401A::RX; |
TheChrisyd | 0:17cb4be1e37f | 257 | _ce = 1; |
TheChrisyd | 0:17cb4be1e37f | 258 | _cs = 0; |
TheChrisyd | 0:17cb4be1e37f | 259 | } |
TheChrisyd | 0:17cb4be1e37f | 260 | break; |
TheChrisyd | 0:17cb4be1e37f | 261 | case nRF2401A::TX: |
TheChrisyd | 0:17cb4be1e37f | 262 | case nRF2401A::UNDEF: |
TheChrisyd | 0:17cb4be1e37f | 263 | default: |
TheChrisyd | 0:17cb4be1e37f | 264 | break; |
TheChrisyd | 0:17cb4be1e37f | 265 | } |
TheChrisyd | 0:17cb4be1e37f | 266 | |
TheChrisyd | 0:17cb4be1e37f | 267 | return; |
TheChrisyd | 0:17cb4be1e37f | 268 | } |
TheChrisyd | 0:17cb4be1e37f | 269 | |
TheChrisyd | 0:17cb4be1e37f | 270 | void nRF2401A::dataReadyHandler(void) { |
TheChrisyd | 0:17cb4be1e37f | 271 | switch (_state) { |
TheChrisyd | 0:17cb4be1e37f | 272 | case nRF2401A::RX: |
TheChrisyd | 0:17cb4be1e37f | 273 | pull(_data_buf); |
TheChrisyd | 0:17cb4be1e37f | 274 | if (_rx_handler != (nRF2401A_rx_handler_t) 0) |
TheChrisyd | 0:17cb4be1e37f | 275 | _rx_handler(_rx_handler_arg); |
TheChrisyd | 0:17cb4be1e37f | 276 | break; |
TheChrisyd | 0:17cb4be1e37f | 277 | default: |
TheChrisyd | 0:17cb4be1e37f | 278 | // todo: error msg |
TheChrisyd | 0:17cb4be1e37f | 279 | break; |
TheChrisyd | 0:17cb4be1e37f | 280 | } |
TheChrisyd | 0:17cb4be1e37f | 281 | return; |
TheChrisyd | 0:17cb4be1e37f | 282 | } |
TheChrisyd | 0:17cb4be1e37f | 283 | |
TheChrisyd | 0:17cb4be1e37f | 284 | nRF2401A& nRF2401A::flushControlPacket() { |
TheChrisyd | 0:17cb4be1e37f | 285 | switch (_state) { |
TheChrisyd | 0:17cb4be1e37f | 286 | case nRF2401A::UNDEF: |
TheChrisyd | 0:17cb4be1e37f | 287 | case nRF2401A::RX: |
TheChrisyd | 0:17cb4be1e37f | 288 | pushCtrl(_ctrl_packet, 15 << 3 ); |
TheChrisyd | 0:17cb4be1e37f | 289 | _state = nRF2401A::RX; |
TheChrisyd | 0:17cb4be1e37f | 290 | _ce = 1; |
TheChrisyd | 0:17cb4be1e37f | 291 | _cs = 0; |
TheChrisyd | 0:17cb4be1e37f | 292 | break; |
TheChrisyd | 0:17cb4be1e37f | 293 | case nRF2401A::STANDBY: |
TheChrisyd | 0:17cb4be1e37f | 294 | pushCtrl(_ctrl_packet, 15 << 3 ); |
TheChrisyd | 0:17cb4be1e37f | 295 | _state = nRF2401A::STANDBY; |
TheChrisyd | 0:17cb4be1e37f | 296 | _ce = 0; |
TheChrisyd | 0:17cb4be1e37f | 297 | _cs = 0; |
TheChrisyd | 0:17cb4be1e37f | 298 | break; |
TheChrisyd | 0:17cb4be1e37f | 299 | case nRF2401A::TX: |
TheChrisyd | 0:17cb4be1e37f | 300 | default: |
TheChrisyd | 0:17cb4be1e37f | 301 | _ce = 0; |
TheChrisyd | 0:17cb4be1e37f | 302 | _cs = 0; |
TheChrisyd | 0:17cb4be1e37f | 303 | } |
TheChrisyd | 0:17cb4be1e37f | 304 | |
TheChrisyd | 0:17cb4be1e37f | 305 | return *this; |
TheChrisyd | 0:17cb4be1e37f | 306 | } |