Eurobot2012_Secondary

Fork of Eurobot_2012_Secondary by Shuto Naruse

Committer:
narshu
Date:
Fri Apr 20 21:32:24 2012 +0000
Revision:
0:fbfafa6bf5f9

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
narshu 0:fbfafa6bf5f9 1 #include "RF12B.h"
narshu 0:fbfafa6bf5f9 2
narshu 0:fbfafa6bf5f9 3 #include "RF_defs.h"
narshu 0:fbfafa6bf5f9 4 #include <algorithm>
narshu 0:fbfafa6bf5f9 5
narshu 0:fbfafa6bf5f9 6 //#include "globals.h"
narshu 0:fbfafa6bf5f9 7
narshu 0:fbfafa6bf5f9 8 //DigitalOut DBG2(LED2);
narshu 0:fbfafa6bf5f9 9 //DigitalOut DBG3(LED3);
narshu 0:fbfafa6bf5f9 10 //DigitalOut DBG4(LED4);
narshu 0:fbfafa6bf5f9 11
narshu 0:fbfafa6bf5f9 12 RF12B::RF12B(PinName _SDI,
narshu 0:fbfafa6bf5f9 13 PinName _SDO,
narshu 0:fbfafa6bf5f9 14 PinName _SCK,
narshu 0:fbfafa6bf5f9 15 PinName _NCS,
narshu 0:fbfafa6bf5f9 16 PinName _NIRQ):spi(_SDI, _SDO, _SCK),
narshu 0:fbfafa6bf5f9 17 NCS(_NCS), NIRQ(_NIRQ), NIRQ_in(_NIRQ){// rfled(LED3) {
narshu 0:fbfafa6bf5f9 18
narshu 0:fbfafa6bf5f9 19 /* SPI frequency, word lenght, polarity and phase */
narshu 0:fbfafa6bf5f9 20 spi.format(16,0);
narshu 0:fbfafa6bf5f9 21 spi.frequency(2000000);
narshu 0:fbfafa6bf5f9 22
narshu 0:fbfafa6bf5f9 23 /* Set ~CS high */
narshu 0:fbfafa6bf5f9 24 NCS = 1;
narshu 0:fbfafa6bf5f9 25
narshu 0:fbfafa6bf5f9 26 /* Initialise RF Module */
narshu 0:fbfafa6bf5f9 27 init();
narshu 0:fbfafa6bf5f9 28
narshu 0:fbfafa6bf5f9 29 /* Setup interrupt to happen on falling edge of NIRQ */
narshu 0:fbfafa6bf5f9 30 NIRQ.fall(this, &RF12B::rxISR);
narshu 0:fbfafa6bf5f9 31 }
narshu 0:fbfafa6bf5f9 32
narshu 0:fbfafa6bf5f9 33 /* Returns the packet length if data is available in the receive buffer, 0 otherwise*/
narshu 0:fbfafa6bf5f9 34 unsigned int RF12B::available() {
narshu 0:fbfafa6bf5f9 35 return fifo.size();
narshu 0:fbfafa6bf5f9 36 }
narshu 0:fbfafa6bf5f9 37
narshu 0:fbfafa6bf5f9 38 /* Reads a packet of data, with length "size" Returns false if read failed. TODO: make a metafifo to isolate packets*/
narshu 0:fbfafa6bf5f9 39 bool RF12B::read(unsigned char* data, unsigned int size) {
narshu 0:fbfafa6bf5f9 40 if (fifo.size() == 0) {
narshu 0:fbfafa6bf5f9 41 return false;
narshu 0:fbfafa6bf5f9 42 } else {
narshu 0:fbfafa6bf5f9 43 unsigned int i = 0;
narshu 0:fbfafa6bf5f9 44 while (fifo.size() > 0 && i < size) {
narshu 0:fbfafa6bf5f9 45 data[i++] = fifo.front();
narshu 0:fbfafa6bf5f9 46 fifo.pop();
narshu 0:fbfafa6bf5f9 47 }
narshu 0:fbfafa6bf5f9 48 return true;
narshu 0:fbfafa6bf5f9 49 }
narshu 0:fbfafa6bf5f9 50 }
narshu 0:fbfafa6bf5f9 51
narshu 0:fbfafa6bf5f9 52 /* Reads a byte of data from the receive buffer */
narshu 0:fbfafa6bf5f9 53 unsigned char RF12B::read() {
narshu 0:fbfafa6bf5f9 54 if (available()) {
narshu 0:fbfafa6bf5f9 55 unsigned char data = fifo.front();
narshu 0:fbfafa6bf5f9 56 fifo.pop();
narshu 0:fbfafa6bf5f9 57 return data;
narshu 0:fbfafa6bf5f9 58 } else {
narshu 0:fbfafa6bf5f9 59 return 0xFF; // Error val although could also be data...
narshu 0:fbfafa6bf5f9 60 }
narshu 0:fbfafa6bf5f9 61 }
narshu 0:fbfafa6bf5f9 62
narshu 0:fbfafa6bf5f9 63 /* Sends a packet of data to the RF module for transmission TODO: Make asych*/
narshu 0:fbfafa6bf5f9 64 void RF12B::write(unsigned char *data, unsigned char length) {
narshu 0:fbfafa6bf5f9 65 unsigned char crc = 0;
narshu 0:fbfafa6bf5f9 66
narshu 0:fbfafa6bf5f9 67 /* Transmitter mode */
narshu 0:fbfafa6bf5f9 68 changeMode(TX);
narshu 0:fbfafa6bf5f9 69
narshu 0:fbfafa6bf5f9 70 writeCmd(0x0000);
narshu 0:fbfafa6bf5f9 71 send(0xAA); // PREAMBLE
narshu 0:fbfafa6bf5f9 72 send(0xAA);
narshu 0:fbfafa6bf5f9 73 send(0xAA);
narshu 0:fbfafa6bf5f9 74 send(0x2D); // SYNC
narshu 0:fbfafa6bf5f9 75 send(0xD4);
narshu 0:fbfafa6bf5f9 76 /* Packet Length */
narshu 0:fbfafa6bf5f9 77 send(length);
narshu 0:fbfafa6bf5f9 78 crc = crc8(crc, length);
narshu 0:fbfafa6bf5f9 79 send(crc);
narshu 0:fbfafa6bf5f9 80 crc = crc8(crc, crc);
narshu 0:fbfafa6bf5f9 81 /* Packet Data */
narshu 0:fbfafa6bf5f9 82 for (unsigned char i=0; i<length; i++) {
narshu 0:fbfafa6bf5f9 83 send(data[i]);
narshu 0:fbfafa6bf5f9 84 crc = crc8(crc, data[i]);
narshu 0:fbfafa6bf5f9 85 }
narshu 0:fbfafa6bf5f9 86 send(crc);
narshu 0:fbfafa6bf5f9 87 send(0xAA); // DUMMY BYTES
narshu 0:fbfafa6bf5f9 88 send(0xAA);
narshu 0:fbfafa6bf5f9 89 send(0xAA);
narshu 0:fbfafa6bf5f9 90
narshu 0:fbfafa6bf5f9 91 /* Back to receiver mode */
narshu 0:fbfafa6bf5f9 92 changeMode(RX);
narshu 0:fbfafa6bf5f9 93 status();
narshu 0:fbfafa6bf5f9 94
narshu 0:fbfafa6bf5f9 95
narshu 0:fbfafa6bf5f9 96 }
narshu 0:fbfafa6bf5f9 97
narshu 0:fbfafa6bf5f9 98 /* Transmit a 1-byte data packet */
narshu 0:fbfafa6bf5f9 99 void RF12B::write(unsigned char data) {
narshu 0:fbfafa6bf5f9 100 write(&data, 1);
narshu 0:fbfafa6bf5f9 101 }
narshu 0:fbfafa6bf5f9 102
narshu 0:fbfafa6bf5f9 103 void RF12B::write(queue<char> &data, int length) {
narshu 0:fbfafa6bf5f9 104 char crc = 0;
narshu 0:fbfafa6bf5f9 105 char length_byte = 0;
narshu 0:fbfafa6bf5f9 106
narshu 0:fbfafa6bf5f9 107 /* -1 means try to transmit everything in the queue */
narshu 0:fbfafa6bf5f9 108 if(length == -1) {
narshu 0:fbfafa6bf5f9 109 length = data.size();
narshu 0:fbfafa6bf5f9 110 }
narshu 0:fbfafa6bf5f9 111
narshu 0:fbfafa6bf5f9 112 /* max length of packet is 255 */
narshu 0:fbfafa6bf5f9 113 length_byte = min(length, 255);
narshu 0:fbfafa6bf5f9 114
narshu 0:fbfafa6bf5f9 115 /* Transmitter mode */
narshu 0:fbfafa6bf5f9 116 changeMode(TX);
narshu 0:fbfafa6bf5f9 117
narshu 0:fbfafa6bf5f9 118 writeCmd(0x0000);
narshu 0:fbfafa6bf5f9 119 send(0xAA); // PREAMBLE
narshu 0:fbfafa6bf5f9 120 send(0xAA);
narshu 0:fbfafa6bf5f9 121 send(0xAA);
narshu 0:fbfafa6bf5f9 122 send(0x2D); // SYNC
narshu 0:fbfafa6bf5f9 123 send(0xD4);
narshu 0:fbfafa6bf5f9 124 /* Packet Length */
narshu 0:fbfafa6bf5f9 125 send(length_byte);
narshu 0:fbfafa6bf5f9 126 crc = crc8(crc, length_byte);
narshu 0:fbfafa6bf5f9 127 send(crc);
narshu 0:fbfafa6bf5f9 128 crc = crc8(crc, crc);
narshu 0:fbfafa6bf5f9 129 /* Packet Data */
narshu 0:fbfafa6bf5f9 130 for (char i=0; i<length_byte; i++) {
narshu 0:fbfafa6bf5f9 131 send(data.front());
narshu 0:fbfafa6bf5f9 132 crc = crc8(crc, data.front());
narshu 0:fbfafa6bf5f9 133 data.pop();
narshu 0:fbfafa6bf5f9 134 }
narshu 0:fbfafa6bf5f9 135 send(crc);
narshu 0:fbfafa6bf5f9 136 send(0xAA); // DUMMY BYTES
narshu 0:fbfafa6bf5f9 137 send(0xAA);
narshu 0:fbfafa6bf5f9 138 send(0xAA);
narshu 0:fbfafa6bf5f9 139
narshu 0:fbfafa6bf5f9 140 /* Back to receiver mode */
narshu 0:fbfafa6bf5f9 141 changeMode(RX);
narshu 0:fbfafa6bf5f9 142 status();
narshu 0:fbfafa6bf5f9 143 }
narshu 0:fbfafa6bf5f9 144
narshu 0:fbfafa6bf5f9 145 /**********************************************************************
narshu 0:fbfafa6bf5f9 146 * PRIVATE FUNCTIONS
narshu 0:fbfafa6bf5f9 147 *********************************************************************/
narshu 0:fbfafa6bf5f9 148
narshu 0:fbfafa6bf5f9 149 /* Initialises the RF12B module */
narshu 0:fbfafa6bf5f9 150 void RF12B::init() {
narshu 0:fbfafa6bf5f9 151 /* writeCmd(0x80E7); //EL,EF,868band,12.0pF
narshu 0:fbfafa6bf5f9 152 changeMode(RX);
narshu 0:fbfafa6bf5f9 153 writeCmd(0xA640); //frequency select
narshu 0:fbfafa6bf5f9 154 writeCmd(0xC647); //4.8kbps
narshu 0:fbfafa6bf5f9 155 writeCmd(0x94A0); //VDI,FAST,134kHz,0dBm,-103dBm
narshu 0:fbfafa6bf5f9 156 writeCmd(0xC2AC); //AL,!ml,DIG,DQD4
narshu 0:fbfafa6bf5f9 157 writeCmd(0xCA81); //FIFO8,SYNC,!ff,DR
narshu 0:fbfafa6bf5f9 158 writeCmd(0xCED4); //SYNC=2DD4
narshu 0:fbfafa6bf5f9 159 writeCmd(0xC483); //@PWR,NO RSTRIC,!st,!fi,OE,EN
narshu 0:fbfafa6bf5f9 160 writeCmd(0x9850); //!mp,90kHz,MAX OUT
narshu 0:fbfafa6bf5f9 161 writeCmd(0xCC17); //OB1, COB0, LPX, Iddy, CDDIT&#65533;CBW0
narshu 0:fbfafa6bf5f9 162 writeCmd(0xE000); //NOT USED
narshu 0:fbfafa6bf5f9 163 writeCmd(0xC800); //NOT USED
narshu 0:fbfafa6bf5f9 164 writeCmd(0xC040); //1.66MHz,2.2V */
narshu 0:fbfafa6bf5f9 165
narshu 0:fbfafa6bf5f9 166 writeCmd(
narshu 0:fbfafa6bf5f9 167 RFM_CONFIG_EL |
narshu 0:fbfafa6bf5f9 168 RFM_CONFIG_EF |
narshu 0:fbfafa6bf5f9 169 RFM_CONFIG_BAND_433 //|
narshu 0:fbfafa6bf5f9 170 //RFM_CONFIG_X_11_0pf // meh, using default
narshu 0:fbfafa6bf5f9 171 );
narshu 0:fbfafa6bf5f9 172
narshu 0:fbfafa6bf5f9 173 // 2. Power Management Command
narshu 0:fbfafa6bf5f9 174 // leave everything switched off for now
narshu 0:fbfafa6bf5f9 175 /*
narshu 0:fbfafa6bf5f9 176 writeCmd(
narshu 0:fbfafa6bf5f9 177 RFM_POWER_MANAGEMENT // switch all off
narshu 0:fbfafa6bf5f9 178 );
narshu 0:fbfafa6bf5f9 179 */
narshu 0:fbfafa6bf5f9 180
narshu 0:fbfafa6bf5f9 181 // 3. Frequency Setting Command
narshu 0:fbfafa6bf5f9 182 writeCmd(
narshu 0:fbfafa6bf5f9 183 RFM_FREQUENCY |
narshu 0:fbfafa6bf5f9 184 RFM_FREQ_433Band(435.7) //I totally made this value up... if someone knows where the sweetspots are in this band, tell me!
narshu 0:fbfafa6bf5f9 185 );
narshu 0:fbfafa6bf5f9 186
narshu 0:fbfafa6bf5f9 187
narshu 0:fbfafa6bf5f9 188 // 4. Data Rate Command
narshu 0:fbfafa6bf5f9 189 writeCmd(RFM_DATA_RATE_9600);
narshu 0:fbfafa6bf5f9 190
narshu 0:fbfafa6bf5f9 191
narshu 0:fbfafa6bf5f9 192 // 5. Receiver Control Command
narshu 0:fbfafa6bf5f9 193 writeCmd(
narshu 0:fbfafa6bf5f9 194 RFM_RX_CONTROL_P20_VDI |
narshu 0:fbfafa6bf5f9 195 RFM_RX_CONTROL_VDI_FAST |
narshu 0:fbfafa6bf5f9 196 //RFM_RX_CONTROL_BW(RFM_BAUD_RATE) |
narshu 0:fbfafa6bf5f9 197 RFM_RX_CONTROL_BW_134 | // CHANGE THIS TO 67 TO IMPROVE RANGE! (though the bitrate must then be below 8kbaud, and fsk modulation changed)
narshu 0:fbfafa6bf5f9 198 RFM_RX_CONTROL_GAIN_0 |
narshu 0:fbfafa6bf5f9 199 RFM_RX_CONTROL_RSSI_103 // Might need adjustment. Datasheet says around 10^-5 bit error rate at this level and baudrate.
narshu 0:fbfafa6bf5f9 200 );
narshu 0:fbfafa6bf5f9 201
narshu 0:fbfafa6bf5f9 202 // 6. Data Filter Command
narshu 0:fbfafa6bf5f9 203 writeCmd(
narshu 0:fbfafa6bf5f9 204 RFM_DATA_FILTER_AL |
narshu 0:fbfafa6bf5f9 205 RFM_DATA_FILTER_ML |
narshu 0:fbfafa6bf5f9 206 RFM_DATA_FILTER_DIG //|
narshu 0:fbfafa6bf5f9 207 //RFM_DATA_FILTER_DQD(4)
narshu 0:fbfafa6bf5f9 208 );
narshu 0:fbfafa6bf5f9 209
narshu 0:fbfafa6bf5f9 210 // 7. FIFO and Reset Mode Command
narshu 0:fbfafa6bf5f9 211 writeCmd(
narshu 0:fbfafa6bf5f9 212 RFM_FIFO_IT(8) |
narshu 0:fbfafa6bf5f9 213 RFM_FIFO_DR |
narshu 0:fbfafa6bf5f9 214 0x8 //turn on 16bit sync word
narshu 0:fbfafa6bf5f9 215 );
narshu 0:fbfafa6bf5f9 216
narshu 0:fbfafa6bf5f9 217 // 8. FIFO Syncword
narshu 0:fbfafa6bf5f9 218 // Leave as default: 0xD4
narshu 0:fbfafa6bf5f9 219
narshu 0:fbfafa6bf5f9 220 // 9. Receiver FIFO Read
narshu 0:fbfafa6bf5f9 221 // when the interupt goes high, (and if we can assume that it was a fifo fill interrupt) we can read a byte using:
narshu 0:fbfafa6bf5f9 222 // result = RFM_READ_FIFO();
narshu 0:fbfafa6bf5f9 223
narshu 0:fbfafa6bf5f9 224 // 10. AFC Command
narshu 0:fbfafa6bf5f9 225 writeCmd(
narshu 0:fbfafa6bf5f9 226 //RFM_AFC_AUTO_VDI | //Note this might be changed to improve range. Refer to datasheet.
narshu 0:fbfafa6bf5f9 227 RFM_AFC_AUTO_INDEPENDENT |
narshu 0:fbfafa6bf5f9 228 RFM_AFC_RANGE_LIMIT_7_8 |
narshu 0:fbfafa6bf5f9 229 RFM_AFC_EN |
narshu 0:fbfafa6bf5f9 230 RFM_AFC_OE |
narshu 0:fbfafa6bf5f9 231 RFM_AFC_FI
narshu 0:fbfafa6bf5f9 232 );
narshu 0:fbfafa6bf5f9 233
narshu 0:fbfafa6bf5f9 234 // 11. TX Configuration Control Command
narshu 0:fbfafa6bf5f9 235 writeCmd(
narshu 0:fbfafa6bf5f9 236 RFM_TX_CONTROL_MOD_60 |
narshu 0:fbfafa6bf5f9 237 RFM_TX_CONTROL_POW_0
narshu 0:fbfafa6bf5f9 238 );
narshu 0:fbfafa6bf5f9 239
narshu 0:fbfafa6bf5f9 240
narshu 0:fbfafa6bf5f9 241 // 12. PLL Setting Command
narshu 0:fbfafa6bf5f9 242 writeCmd(
narshu 0:fbfafa6bf5f9 243 0xCC77 & ~0x01 // Setting the PLL bandwith, less noise, but max bitrate capped at 86.2
narshu 0:fbfafa6bf5f9 244 // I think this will slow down the pll's reaction time. Not sure, check with someone!
narshu 0:fbfafa6bf5f9 245 );
narshu 0:fbfafa6bf5f9 246
narshu 0:fbfafa6bf5f9 247 changeMode(RX);
narshu 0:fbfafa6bf5f9 248 resetRX();
narshu 0:fbfafa6bf5f9 249 status();
narshu 0:fbfafa6bf5f9 250 }
narshu 0:fbfafa6bf5f9 251
narshu 0:fbfafa6bf5f9 252 /* Write a command to the RF Module */
narshu 0:fbfafa6bf5f9 253 unsigned int RF12B::writeCmd(unsigned int cmd) {
narshu 0:fbfafa6bf5f9 254 NCS = 0;
narshu 0:fbfafa6bf5f9 255 unsigned int recv = spi.write(cmd);
narshu 0:fbfafa6bf5f9 256 NCS = 1;
narshu 0:fbfafa6bf5f9 257 return recv;
narshu 0:fbfafa6bf5f9 258 }
narshu 0:fbfafa6bf5f9 259
narshu 0:fbfafa6bf5f9 260 /* Sends a byte of data across RF */
narshu 0:fbfafa6bf5f9 261 void RF12B::send(unsigned char data) {
narshu 0:fbfafa6bf5f9 262 while (NIRQ);
narshu 0:fbfafa6bf5f9 263 writeCmd(0xB800 + data);
narshu 0:fbfafa6bf5f9 264 }
narshu 0:fbfafa6bf5f9 265
narshu 0:fbfafa6bf5f9 266 /* Change the mode of the RF module to Transmitting or Receiving */
narshu 0:fbfafa6bf5f9 267 void RF12B::changeMode(rfmode_t _mode) {
narshu 0:fbfafa6bf5f9 268 mode = _mode;
narshu 0:fbfafa6bf5f9 269 if (_mode == TX) {
narshu 0:fbfafa6bf5f9 270 writeCmd(0x8239); //!er,!ebb,ET,ES,EX,!eb,!ew,DC
narshu 0:fbfafa6bf5f9 271 } else { /* mode == RX */
narshu 0:fbfafa6bf5f9 272 writeCmd(0x8299); //er,!ebb,ET,ES,EX,!eb,!ew,DC
narshu 0:fbfafa6bf5f9 273 }
narshu 0:fbfafa6bf5f9 274 }
narshu 0:fbfafa6bf5f9 275
narshu 0:fbfafa6bf5f9 276 /* Interrupt routine for data reception */
narshu 0:fbfafa6bf5f9 277 void RF12B::rxISR() {
narshu 0:fbfafa6bf5f9 278
narshu 0:fbfafa6bf5f9 279 //static int cnt = 0;
narshu 0:fbfafa6bf5f9 280 //printf("%d hits\r\n", cnt);
narshu 0:fbfafa6bf5f9 281 //cnt++;
narshu 0:fbfafa6bf5f9 282
narshu 0:fbfafa6bf5f9 283 //DBG2 = !(cnt%3);
narshu 0:fbfafa6bf5f9 284 //DBG3 = !((cnt+1)%3);
narshu 0:fbfafa6bf5f9 285 //DBG4 = !((cnt+2)%3);
narshu 0:fbfafa6bf5f9 286
narshu 0:fbfafa6bf5f9 287 unsigned int data = 0;
narshu 0:fbfafa6bf5f9 288 static int i = -2;
narshu 0:fbfafa6bf5f9 289 static unsigned char packet_length = 0;
narshu 0:fbfafa6bf5f9 290 static unsigned char crc = 0;
narshu 0:fbfafa6bf5f9 291
narshu 0:fbfafa6bf5f9 292 //Loop while interrupt is asserted
narshu 0:fbfafa6bf5f9 293 while (!NIRQ_in && mode == RX) {
narshu 0:fbfafa6bf5f9 294
narshu 0:fbfafa6bf5f9 295 // Grab the packet's length byte
narshu 0:fbfafa6bf5f9 296 if (i == -2) {
narshu 0:fbfafa6bf5f9 297 data = writeCmd(0x0000);
narshu 0:fbfafa6bf5f9 298 if ( (data&0x8000) ) {
narshu 0:fbfafa6bf5f9 299 data = writeCmd(0xB000);
narshu 0:fbfafa6bf5f9 300 packet_length = (data&0x00FF);
narshu 0:fbfafa6bf5f9 301 crc = crc8(crc, packet_length);
narshu 0:fbfafa6bf5f9 302 i++;
narshu 0:fbfafa6bf5f9 303 }
narshu 0:fbfafa6bf5f9 304 }
narshu 0:fbfafa6bf5f9 305
narshu 0:fbfafa6bf5f9 306 //If we exhaust the interrupt, exit
narshu 0:fbfafa6bf5f9 307 if (NIRQ_in)
narshu 0:fbfafa6bf5f9 308 break;
narshu 0:fbfafa6bf5f9 309
narshu 0:fbfafa6bf5f9 310 // Check that packet length was correct
narshu 0:fbfafa6bf5f9 311 if (i == -1) {
narshu 0:fbfafa6bf5f9 312 data = writeCmd(0x0000);
narshu 0:fbfafa6bf5f9 313 if ( (data&0x8000) ) {
narshu 0:fbfafa6bf5f9 314 data = writeCmd(0xB000);
narshu 0:fbfafa6bf5f9 315 unsigned char crcofsize = (data&0x00FF);
narshu 0:fbfafa6bf5f9 316 if (crcofsize != crc) {
narshu 0:fbfafa6bf5f9 317 //It was wrong, start over
narshu 0:fbfafa6bf5f9 318 i = -2;
narshu 0:fbfafa6bf5f9 319 packet_length = 0;
narshu 0:fbfafa6bf5f9 320 crc = 0;
narshu 0:fbfafa6bf5f9 321 //temp = queue<unsigned char>();
narshu 0:fbfafa6bf5f9 322 resetRX();
narshu 0:fbfafa6bf5f9 323 } else {
narshu 0:fbfafa6bf5f9 324 crc = crc8(crc, crcofsize);
narshu 0:fbfafa6bf5f9 325 i++;
narshu 0:fbfafa6bf5f9 326 }
narshu 0:fbfafa6bf5f9 327 }
narshu 0:fbfafa6bf5f9 328 }
narshu 0:fbfafa6bf5f9 329
narshu 0:fbfafa6bf5f9 330 //If we exhaust the interrupt, exit
narshu 0:fbfafa6bf5f9 331 if (NIRQ_in)
narshu 0:fbfafa6bf5f9 332 break;
narshu 0:fbfafa6bf5f9 333
narshu 0:fbfafa6bf5f9 334 // Grab the packet's data
narshu 0:fbfafa6bf5f9 335 if (i >= 0 && i < packet_length) {
narshu 0:fbfafa6bf5f9 336 data = writeCmd(0x0000);
narshu 0:fbfafa6bf5f9 337 if ( (data&0x8000) ) {
narshu 0:fbfafa6bf5f9 338 data = writeCmd(0xB000);
narshu 0:fbfafa6bf5f9 339 //temp.push(data&0x00FF);
narshu 0:fbfafa6bf5f9 340 crc = crc8(crc, (unsigned char)(data&0x00FF));
narshu 0:fbfafa6bf5f9 341 i++;
narshu 0:fbfafa6bf5f9 342 }
narshu 0:fbfafa6bf5f9 343 }
narshu 0:fbfafa6bf5f9 344
narshu 0:fbfafa6bf5f9 345 //If we exhaust the interrupt, exit
narshu 0:fbfafa6bf5f9 346 if (NIRQ_in)
narshu 0:fbfafa6bf5f9 347 break;
narshu 0:fbfafa6bf5f9 348
narshu 0:fbfafa6bf5f9 349 if (i >= packet_length) {
narshu 0:fbfafa6bf5f9 350 data = writeCmd(0x0000);
narshu 0:fbfafa6bf5f9 351 if ( (data&0x8000) ) {
narshu 0:fbfafa6bf5f9 352 data = writeCmd(0xB000);
narshu 0:fbfafa6bf5f9 353 if ((unsigned char)(data & 0x00FF) == crc) {
narshu 0:fbfafa6bf5f9 354 //If the checksum is correct, add our data to the end of the output buffer
narshu 0:fbfafa6bf5f9 355 //while (!temp.empty()) {
narshu 0:fbfafa6bf5f9 356 // fifo.push(temp.front());
narshu 0:fbfafa6bf5f9 357 // temp.pop();
narshu 0:fbfafa6bf5f9 358 //}
narshu 0:fbfafa6bf5f9 359 }
narshu 0:fbfafa6bf5f9 360
narshu 0:fbfafa6bf5f9 361 // Tell RF Module we are finished, and clean up
narshu 0:fbfafa6bf5f9 362 i = -2;
narshu 0:fbfafa6bf5f9 363 packet_length = 0;
narshu 0:fbfafa6bf5f9 364 crc = 0;
narshu 0:fbfafa6bf5f9 365 //temp = queue<unsigned char>();
narshu 0:fbfafa6bf5f9 366 resetRX();
narshu 0:fbfafa6bf5f9 367 }
narshu 0:fbfafa6bf5f9 368 }
narshu 0:fbfafa6bf5f9 369 }
narshu 0:fbfafa6bf5f9 370 }
narshu 0:fbfafa6bf5f9 371
narshu 0:fbfafa6bf5f9 372 unsigned int RF12B::status() {
narshu 0:fbfafa6bf5f9 373 return writeCmd(0x0000);
narshu 0:fbfafa6bf5f9 374 }
narshu 0:fbfafa6bf5f9 375
narshu 0:fbfafa6bf5f9 376 /* Tell the RF Module this packet is received and wait for the next */
narshu 0:fbfafa6bf5f9 377 void RF12B::resetRX() {
narshu 0:fbfafa6bf5f9 378 writeCmd(0xCA81);
narshu 0:fbfafa6bf5f9 379 writeCmd(0xCA83);
narshu 0:fbfafa6bf5f9 380 };
narshu 0:fbfafa6bf5f9 381
narshu 0:fbfafa6bf5f9 382 /* Calculate CRC8 */
narshu 0:fbfafa6bf5f9 383 unsigned char RF12B::crc8(unsigned char crc, unsigned char data) {
narshu 0:fbfafa6bf5f9 384 crc = crc ^ data;
narshu 0:fbfafa6bf5f9 385 for (int i = 0; i < 8; i++) {
narshu 0:fbfafa6bf5f9 386 if (crc & 0x01) {
narshu 0:fbfafa6bf5f9 387 crc = (crc >> 1) ^ 0x8C;
narshu 0:fbfafa6bf5f9 388 } else {
narshu 0:fbfafa6bf5f9 389 crc >>= 1;
narshu 0:fbfafa6bf5f9 390 }
narshu 0:fbfafa6bf5f9 391 }
narshu 0:fbfafa6bf5f9 392 return crc;
narshu 0:fbfafa6bf5f9 393 }