final

Dependencies:   mbed FATFileSystem

Fork of KL46Z-USBHostMSD_HelloWorld by Norimasa Okamoto

Committer:
homzovam
Date:
Sat Apr 04 20:16:39 2015 +0000
Revision:
4:77d6450f34d7
prijimac-funkcni final

Who changed what in which revision?

UserRevisionLine numberNew contents of line
homzovam 4:77d6450f34d7 1 // RF22.cpp
homzovam 4:77d6450f34d7 2
homzovam 4:77d6450f34d7 3 #include "mbed.h"
homzovam 4:77d6450f34d7 4 #include "RF22.h"
homzovam 4:77d6450f34d7 5
homzovam 4:77d6450f34d7 6 Serial pc1(USBTX, USBRX);
homzovam 4:77d6450f34d7 7
homzovam 4:77d6450f34d7 8 // These are indexed by the values of ModemConfigChoic
homzovam 4:77d6450f34d7 9 // Stored in flash (program) memory to save SRAM
homzovam 4:77d6450f34d7 10 /*PROGMEM */ static const RF22::ModemConfig MODEM_CONFIG_TABLE[] = {
homzovam 4:77d6450f34d7 11 { 0x2b, 0x03, 0xf4, 0x20, 0x41, 0x89, 0x00, 0x36, 0x40, 0x0a, 0x1d, 0x80, 0x60, 0x10, 0x62, 0x2c, 0x00, 0x08 }, // Unmodulated carrier
homzovam 4:77d6450f34d7 12 { 0x2b, 0x03, 0xf4, 0x20, 0x41, 0x89, 0x00, 0x36, 0x40, 0x0a, 0x1d, 0x80, 0x60, 0x10, 0x62, 0x2c, 0x33, 0x08 }, // FSK, PN9 random modulation, 2, 5
homzovam 4:77d6450f34d7 13
homzovam 4:77d6450f34d7 14 // All the following enable FIFO with reg 71
homzovam 4:77d6450f34d7 15 // 1c, 1f, 20, 21, 22, 23, 24, 25, 2c, 2d, 2e, 58, 69, 6e, 6f, 70, 71, 72
homzovam 4:77d6450f34d7 16 // FSK, No Manchester, Max Rb err <1%, Xtal Tol 20ppm
homzovam 4:77d6450f34d7 17 { 0x2b, 0x03, 0xf4, 0x20, 0x41, 0x89, 0x00, 0x36, 0x40, 0x0a, 0x1d, 0x80, 0x60, 0x10, 0x62, 0x2c, 0x22, 0x08 }, // 2, 5
homzovam 4:77d6450f34d7 18 { 0x1b, 0x03, 0x41, 0x60, 0x27, 0x52, 0x00, 0x07, 0x40, 0x0a, 0x1e, 0x80, 0x60, 0x13, 0xa9, 0x2c, 0x22, 0x3a }, // 2.4, 36
homzovam 4:77d6450f34d7 19 { 0x1d, 0x03, 0xa1, 0x20, 0x4e, 0xa5, 0x00, 0x13, 0x40, 0x0a, 0x1e, 0x80, 0x60, 0x27, 0x52, 0x2c, 0x22, 0x48 }, // 4.8, 45
homzovam 4:77d6450f34d7 20 { 0x1e, 0x03, 0xd0, 0x00, 0x9d, 0x49, 0x00, 0x45, 0x40, 0x0a, 0x20, 0x80, 0x60, 0x4e, 0xa5, 0x2c, 0x22, 0x48 }, // 9.6, 45
homzovam 4:77d6450f34d7 21 { 0x2b, 0x03, 0x34, 0x02, 0x75, 0x25, 0x07, 0xff, 0x40, 0x0a, 0x1b, 0x80, 0x60, 0x9d, 0x49, 0x2c, 0x22, 0x0f }, // 19.2, 9.6
homzovam 4:77d6450f34d7 22 { 0x02, 0x03, 0x68, 0x01, 0x3a, 0x93, 0x04, 0xd5, 0x40, 0x0a, 0x1e, 0x80, 0x60, 0x09, 0xd5, 0x0c, 0x22, 0x1f }, // 38.4, 19.6
homzovam 4:77d6450f34d7 23 { 0x06, 0x03, 0x45, 0x01, 0xd7, 0xdc, 0x07, 0x6e, 0x40, 0x0a, 0x2d, 0x80, 0x60, 0x0e, 0xbf, 0x0c, 0x22, 0x2e }, // 57.6. 28.8
homzovam 4:77d6450f34d7 24 { 0x8a, 0x03, 0x60, 0x01, 0x55, 0x55, 0x02, 0xad, 0x40, 0x0a, 0x50, 0x80, 0x60, 0x20, 0x00, 0x0c, 0x22, 0xc8 }, // 125, 125
homzovam 4:77d6450f34d7 25
homzovam 4:77d6450f34d7 26 // GFSK, No Manchester, Max Rb err <1%, Xtal Tol 20ppm
homzovam 4:77d6450f34d7 27 // These differ from FSK only in register 71, for the modulation type
homzovam 4:77d6450f34d7 28 { 0x2b, 0x03, 0xf4, 0x20, 0x41, 0x89, 0x00, 0x36, 0x40, 0x0a, 0x1d, 0x80, 0x60, 0x10, 0x62, 0x2c, 0x23, 0x08 }, // 2, 5
homzovam 4:77d6450f34d7 29 { 0x1b, 0x03, 0x41, 0x60, 0x27, 0x52, 0x00, 0x07, 0x40, 0x0a, 0x1e, 0x80, 0x60, 0x13, 0xa9, 0x2c, 0x23, 0x3a }, // 2.4, 36
homzovam 4:77d6450f34d7 30 { 0x1d, 0x03, 0xa1, 0x20, 0x4e, 0xa5, 0x00, 0x13, 0x40, 0x0a, 0x1e, 0x80, 0x60, 0x27, 0x52, 0x2c, 0x23, 0x48 }, // 4.8, 45
homzovam 4:77d6450f34d7 31 { 0x1e, 0x03, 0xd0, 0x00, 0x9d, 0x49, 0x00, 0x45, 0x40, 0x0a, 0x20, 0x80, 0x60, 0x4e, 0xa5, 0x2c, 0x23, 0x48 }, // 9.6, 45
homzovam 4:77d6450f34d7 32 { 0x2b, 0x03, 0x34, 0x02, 0x75, 0x25, 0x07, 0xff, 0x40, 0x0a, 0x1b, 0x80, 0x60, 0x9d, 0x49, 0x2c, 0x23, 0x0f }, // 19.2, 9.6
homzovam 4:77d6450f34d7 33 { 0x02, 0x03, 0x68, 0x01, 0x3a, 0x93, 0x04, 0xd5, 0x40, 0x0a, 0x1e, 0x80, 0x60, 0x09, 0xd5, 0x0c, 0x23, 0x1f }, // 38.4, 19.6
homzovam 4:77d6450f34d7 34 { 0x06, 0x03, 0x45, 0x01, 0xd7, 0xdc, 0x07, 0x6e, 0x40, 0x0a, 0x2d, 0x80, 0x60, 0x0e, 0xbf, 0x0c, 0x23, 0x2e }, // 57.6. 28.8
homzovam 4:77d6450f34d7 35 { 0x8a, 0x03, 0x60, 0x01, 0x55, 0x55, 0x02, 0xad, 0x40, 0x0a, 0x50, 0x80, 0x60, 0x20, 0x00, 0x0c, 0x23, 0xc8 }, // 125, 125
homzovam 4:77d6450f34d7 36
homzovam 4:77d6450f34d7 37 // OOK, No Manchester, Max Rb err <1%, Xtal Tol 20ppm
homzovam 4:77d6450f34d7 38 { 0x51, 0x03, 0x68, 0x00, 0x3a, 0x93, 0x01, 0x3d, 0x2c, 0x11, 0x28, 0x80, 0x60, 0x09, 0xd5, 0x2c, 0x21, 0x08 }, // 1.2, 75
homzovam 4:77d6450f34d7 39 { 0xc8, 0x03, 0x39, 0x20, 0x68, 0xdc, 0x00, 0x6b, 0x2a, 0x08, 0x2a, 0x80, 0x60, 0x13, 0xa9, 0x2c, 0x21, 0x08 }, // 2.4, 335
homzovam 4:77d6450f34d7 40 { 0xc8, 0x03, 0x9c, 0x00, 0xd1, 0xb7, 0x00, 0xd4, 0x29, 0x04, 0x29, 0x80, 0x60, 0x27, 0x52, 0x2c, 0x21, 0x08 }, // 4.8, 335
homzovam 4:77d6450f34d7 41 { 0xb8, 0x03, 0x9c, 0x00, 0xd1, 0xb7, 0x00, 0xd4, 0x28, 0x82, 0x29, 0x80, 0x60, 0x4e, 0xa5, 0x2c, 0x21, 0x08 }, // 9.6, 335
homzovam 4:77d6450f34d7 42 { 0xa8, 0x03, 0x9c, 0x00, 0xd1, 0xb7, 0x00, 0xd4, 0x28, 0x41, 0x29, 0x80, 0x60, 0x9d, 0x49, 0x2c, 0x21, 0x08 }, // 19.2, 335
homzovam 4:77d6450f34d7 43 { 0x98, 0x03, 0x9c, 0x00, 0xd1, 0xb7, 0x00, 0xd4, 0x28, 0x20, 0x29, 0x80, 0x60, 0x09, 0xd5, 0x0c, 0x21, 0x08 }, // 38.4, 335
homzovam 4:77d6450f34d7 44 { 0x98, 0x03, 0x96, 0x00, 0xda, 0x74, 0x00, 0xdc, 0x28, 0x1f, 0x29, 0x80, 0x60, 0x0a, 0x3d, 0x0c, 0x21, 0x08 }, // 40, 335
homzovam 4:77d6450f34d7 45
homzovam 4:77d6450f34d7 46 };
homzovam 4:77d6450f34d7 47
homzovam 4:77d6450f34d7 48 RF22::RF22(PinName slaveSelectPin, PinName mosi, PinName miso, PinName sclk, PinName interrupt)
homzovam 4:77d6450f34d7 49 : _slaveSelectPin(slaveSelectPin), _spi(mosi, miso, sclk), _interrupt(interrupt) /*, led1(LED1), led2(LED2), led3(LED3), led4(LED4) */
homzovam 4:77d6450f34d7 50 {
homzovam 4:77d6450f34d7 51
homzovam 4:77d6450f34d7 52
homzovam 4:77d6450f34d7 53 _idleMode = RF22_XTON; // Default idle state is READY mode
homzovam 4:77d6450f34d7 54 _mode = RF22_MODE_IDLE; // We start up in idle mode
homzovam 4:77d6450f34d7 55 _rxGood = 0;
homzovam 4:77d6450f34d7 56 _rxBad = 0;
homzovam 4:77d6450f34d7 57 _txGood = 0;
homzovam 4:77d6450f34d7 58
homzovam 4:77d6450f34d7 59
homzovam 4:77d6450f34d7 60 }
homzovam 4:77d6450f34d7 61
homzovam 4:77d6450f34d7 62 //moje dopsane metody
homzovam 4:77d6450f34d7 63
homzovam 4:77d6450f34d7 64 void RF22::obsluhapreruseni()
homzovam 4:77d6450f34d7 65 {
homzovam 4:77d6450f34d7 66 handleInterrupt();
homzovam 4:77d6450f34d7 67 }
homzovam 4:77d6450f34d7 68
homzovam 4:77d6450f34d7 69 /* void RF22::vypisfifo()
homzovam 4:77d6450f34d7 70 {
homzovam 4:77d6450f34d7 71 _slaveSelectPin = 0;
homzovam 4:77d6450f34d7 72 _spi.write(RF22_REG_7F_FIFO_ACCESS);
homzovam 4:77d6450f34d7 73 pc1.printf("\n\r Obsah FIFA je:");
homzovam 4:77d6450f34d7 74 for(int a = 0; a<10; a++)
homzovam 4:77d6450f34d7 75 {
homzovam 4:77d6450f34d7 76 uint8_t x = _spi.write(RF22_REG_7F_FIFO_ACCESS);
homzovam 4:77d6450f34d7 77 pc1.printf("\t %i", x);
homzovam 4:77d6450f34d7 78 }
homzovam 4:77d6450f34d7 79 _slaveSelectPin = 1;
homzovam 4:77d6450f34d7 80 }*/
homzovam 4:77d6450f34d7 81
homzovam 4:77d6450f34d7 82 boolean RF22::init()
homzovam 4:77d6450f34d7 83 {
homzovam 4:77d6450f34d7 84 wait_ms(16);
homzovam 4:77d6450f34d7 85
homzovam 4:77d6450f34d7 86 _slaveSelectPin = 1; // cip select
homzovam 4:77d6450f34d7 87
homzovam 4:77d6450f34d7 88 wait_ms(100);
homzovam 4:77d6450f34d7 89
homzovam 4:77d6450f34d7 90 _spi.format(8,0); //konfigurace SPI
homzovam 4:77d6450f34d7 91 _spi.frequency(10000000);
homzovam 4:77d6450f34d7 92
homzovam 4:77d6450f34d7 93 // Software reset the device
homzovam 4:77d6450f34d7 94 reset();
homzovam 4:77d6450f34d7 95
homzovam 4:77d6450f34d7 96 // Get the device type and check it
homzovam 4:77d6450f34d7 97 // This also tests whether we are really connected to a device
homzovam 4:77d6450f34d7 98 _deviceType = spiRead(RF22_REG_00_DEVICE_TYPE);
homzovam 4:77d6450f34d7 99
homzovam 4:77d6450f34d7 100 if ( _deviceType != RF22_DEVICE_TYPE_RX_TRX
homzovam 4:77d6450f34d7 101 && _deviceType != RF22_DEVICE_TYPE_TX)
homzovam 4:77d6450f34d7 102 return false;
homzovam 4:77d6450f34d7 103
homzovam 4:77d6450f34d7 104 _interrupt.fall(this, &RF22::isr0);
homzovam 4:77d6450f34d7 105
homzovam 4:77d6450f34d7 106 clearTxBuf();
homzovam 4:77d6450f34d7 107 clearRxBuf();
homzovam 4:77d6450f34d7 108
homzovam 4:77d6450f34d7 109 // Most of these are the POR default
homzovam 4:77d6450f34d7 110 spiWrite(RF22_REG_7D_TX_FIFO_CONTROL2, RF22_TXFFAEM_THRESHOLD);
homzovam 4:77d6450f34d7 111 spiWrite(RF22_REG_7E_RX_FIFO_CONTROL, RF22_RXFFAFULL_THRESHOLD);
homzovam 4:77d6450f34d7 112 spiWrite(RF22_REG_30_DATA_ACCESS_CONTROL, RF22_ENPACRX | RF22_ENPACTX | RF22_ENCRC | RF22_CRC_CRC_16_IBM);
homzovam 4:77d6450f34d7 113 // Configure the message headers
homzovam 4:77d6450f34d7 114 // Here we set up the standard packet format for use by the RF22 library
homzovam 4:77d6450f34d7 115 // 8 nibbles preamble
homzovam 4:77d6450f34d7 116 // 2 SYNC words 2d, d4
homzovam 4:77d6450f34d7 117 // Header length 4 (to, from, id, flags)
homzovam 4:77d6450f34d7 118 // 1 octet of data length (0 to 255)
homzovam 4:77d6450f34d7 119 // 0 to 255 octets data
homzovam 4:77d6450f34d7 120 // 2 CRC octets as CRC16(IBM), computed on the header, length and data
homzovam 4:77d6450f34d7 121 // On reception the to address is check for validity against RF22_REG_3F_CHECK_HEADER3
homzovam 4:77d6450f34d7 122 // or the broadcast address of 0xff
homzovam 4:77d6450f34d7 123 // If no changes are made after this, the transmitted
homzovam 4:77d6450f34d7 124 // to address will be 0xff, the from address will be 0xff
homzovam 4:77d6450f34d7 125 // and all such messages will be accepted. This permits the out-of the box
homzovam 4:77d6450f34d7 126 // RF22 config to act as an unaddresed, unreliable datagram service
homzovam 4:77d6450f34d7 127 spiWrite(RF22_REG_32_HEADER_CONTROL1, RF22_BCEN_HEADER3 | RF22_HDCH_HEADER3);
homzovam 4:77d6450f34d7 128 spiWrite(RF22_REG_33_HEADER_CONTROL2, RF22_HDLEN_4 | RF22_SYNCLEN_2);
homzovam 4:77d6450f34d7 129 setPreambleLength(8); //delka preambule
homzovam 4:77d6450f34d7 130 uint8_t syncwords[] = { 0x2d, 0xd4 };
homzovam 4:77d6450f34d7 131 setSyncWords(syncwords, sizeof(syncwords));
homzovam 4:77d6450f34d7 132 setPromiscuous(false);
homzovam 4:77d6450f34d7 133 // Check the TO header against RF22_DEFAULT_NODE_ADDRESS
homzovam 4:77d6450f34d7 134 spiWrite(RF22_REG_3F_CHECK_HEADER3, RF22_DEFAULT_NODE_ADDRESS);
homzovam 4:77d6450f34d7 135 // Set the default transmit header values
homzovam 4:77d6450f34d7 136 setHeaderTo(RF22_DEFAULT_NODE_ADDRESS);
homzovam 4:77d6450f34d7 137 setHeaderFrom(RF22_DEFAULT_NODE_ADDRESS);
homzovam 4:77d6450f34d7 138 setHeaderId(0);
homzovam 4:77d6450f34d7 139 setHeaderFlags(0);
homzovam 4:77d6450f34d7 140
homzovam 4:77d6450f34d7 141 // Ensure the antenna can be switched automatically according to transmit and receive
homzovam 4:77d6450f34d7 142 // This assumes GPIO0(out) is connected to TX_ANT(in) to enable tx antenna during transmit
homzovam 4:77d6450f34d7 143 // This assumes GPIO1(out) is connected to RX_ANT(in) to enable rx antenna during receive
homzovam 4:77d6450f34d7 144 spiWrite (RF22_REG_0B_GPIO_CONFIGURATION0, 0x12) ; // TX state
homzovam 4:77d6450f34d7 145 spiWrite (RF22_REG_0C_GPIO_CONFIGURATION1, 0x15) ; // RX state
homzovam 4:77d6450f34d7 146
homzovam 4:77d6450f34d7 147 // Enable interrupts
homzovam 4:77d6450f34d7 148
homzovam 4:77d6450f34d7 149 spiWrite(RF22_REG_05_INTERRUPT_ENABLE1, RF22_ENTXFFAEM |RF22_ENRXFFAFULL | RF22_ENPKSENT |RF22_ENPKVALID| RF22_ENCRCERROR);
homzovam 4:77d6450f34d7 150 spiWrite(RF22_REG_06_INTERRUPT_ENABLE2, RF22_ENPREAVAL);
homzovam 4:77d6450f34d7 151
homzovam 4:77d6450f34d7 152 // Set some defaults. An innocuous ISM frequency, and reasonable pull-in
homzovam 4:77d6450f34d7 153 setFrequency(434.0, 0.05);
homzovam 4:77d6450f34d7 154 // setFrequency(900.0);
homzovam 4:77d6450f34d7 155 // Some slow, reliable default speed and modulation
homzovam 4:77d6450f34d7 156 setModemConfig(FSK_Rb2_4Fd36);
homzovam 4:77d6450f34d7 157 // setModemConfig(FSK_Rb125Fd125);
homzovam 4:77d6450f34d7 158 // Minimum power
homzovam 4:77d6450f34d7 159 setTxPower(RF22_TXPOW_8DBM);
homzovam 4:77d6450f34d7 160 // setTxPower(RF22_TXPOW_17DBM);
homzovam 4:77d6450f34d7 161
homzovam 4:77d6450f34d7 162
homzovam 4:77d6450f34d7 163
homzovam 4:77d6450f34d7 164 return true;
homzovam 4:77d6450f34d7 165 }
homzovam 4:77d6450f34d7 166
homzovam 4:77d6450f34d7 167 // C++ level interrupt handler for this instance
homzovam 4:77d6450f34d7 168 void RF22::handleInterrupt()
homzovam 4:77d6450f34d7 169 {
homzovam 4:77d6450f34d7 170 uint8_t _lastInterruptFlags[2];
homzovam 4:77d6450f34d7 171
homzovam 4:77d6450f34d7 172 //led1 = 1;
homzovam 4:77d6450f34d7 173
homzovam 4:77d6450f34d7 174 // Read the interrupt flags which clears the interrupt
homzovam 4:77d6450f34d7 175 spiBurstRead(RF22_REG_03_INTERRUPT_STATUS1, _lastInterruptFlags, 2);
homzovam 4:77d6450f34d7 176
homzovam 4:77d6450f34d7 177 #if 0
homzovam 4:77d6450f34d7 178 // Caution: Serial printing in this interrupt routine can cause mysterious crashes
homzovam 4:77d6450f34d7 179 Serial.print("interrupt ");
homzovam 4:77d6450f34d7 180 Serial.print(_lastInterruptFlags[0], HEX);
homzovam 4:77d6450f34d7 181 Serial.print(" ");
homzovam 4:77d6450f34d7 182 Serial.println(_lastInterruptFlags[1], HEX);
homzovam 4:77d6450f34d7 183 if (_lastInterruptFlags[0] == 0 && _lastInterruptFlags[1] == 0)
homzovam 4:77d6450f34d7 184 Serial.println("FUNNY: no interrupt!");
homzovam 4:77d6450f34d7 185 #endif
homzovam 4:77d6450f34d7 186
homzovam 4:77d6450f34d7 187 #if 0
homzovam 4:77d6450f34d7 188 // TESTING: fake an RF22_IFFERROR
homzovam 4:77d6450f34d7 189 static int counter = 0;
homzovam 4:77d6450f34d7 190 if (_lastInterruptFlags[0] & RF22_IPKSENT && counter++ == 10) {
homzovam 4:77d6450f34d7 191 _lastInterruptFlags[0] = RF22_IFFERROR;
homzovam 4:77d6450f34d7 192 counter = 0;
homzovam 4:77d6450f34d7 193 }
homzovam 4:77d6450f34d7 194 #endif
homzovam 4:77d6450f34d7 195
homzovam 4:77d6450f34d7 196
homzovam 4:77d6450f34d7 197 if (_lastInterruptFlags[0] & RF22_IFFERROR) {
homzovam 4:77d6450f34d7 198 // Serial.println("IFFERROR");
homzovam 4:77d6450f34d7 199 //led4 = !led4;
homzovam 4:77d6450f34d7 200 resetFifos(); // Clears the interrupt
homzovam 4:77d6450f34d7 201 if (_mode == RF22_MODE_TX)
homzovam 4:77d6450f34d7 202 restartTransmit();
homzovam 4:77d6450f34d7 203 else if (_mode == RF22_MODE_RX){
homzovam 4:77d6450f34d7 204 clearRxBuf();
homzovam 4:77d6450f34d7 205 //stop and start Rx
homzovam 4:77d6450f34d7 206 setModeIdle();
homzovam 4:77d6450f34d7 207 setModeRx();
homzovam 4:77d6450f34d7 208 }
homzovam 4:77d6450f34d7 209 // stop handling the remaining interruppts as something went wrong here
homzovam 4:77d6450f34d7 210 return;
homzovam 4:77d6450f34d7 211 }
homzovam 4:77d6450f34d7 212
homzovam 4:77d6450f34d7 213 // Caution, any delay here may cause a FF underflow or overflow
homzovam 4:77d6450f34d7 214 if (_lastInterruptFlags[0] & RF22_ITXFFAEM) {
homzovam 4:77d6450f34d7 215 // See if more data has to be loaded into the Tx FIFO
homzovam 4:77d6450f34d7 216 //led2 = !led2;
homzovam 4:77d6450f34d7 217 sendNextFragment();
homzovam 4:77d6450f34d7 218 // Serial.println("ITXFFAEM");
homzovam 4:77d6450f34d7 219 }
homzovam 4:77d6450f34d7 220
homzovam 4:77d6450f34d7 221 if (_lastInterruptFlags[0] & RF22_IRXFFAFULL) {
homzovam 4:77d6450f34d7 222 // Caution, any delay here may cause a FF overflow
homzovam 4:77d6450f34d7 223 // Read some data from the Rx FIFO
homzovam 4:77d6450f34d7 224 //led4 = !led4;
homzovam 4:77d6450f34d7 225 readNextFragment();
homzovam 4:77d6450f34d7 226 // Serial.println("IRXFFAFULL");
homzovam 4:77d6450f34d7 227 }
homzovam 4:77d6450f34d7 228 if (_lastInterruptFlags[0] & RF22_IEXT) {
homzovam 4:77d6450f34d7 229 // This is not enabled by the base code, but users may want to enable it
homzovam 4:77d6450f34d7 230 //led2 = !led2;
homzovam 4:77d6450f34d7 231 handleExternalInterrupt();
homzovam 4:77d6450f34d7 232 // Serial.println("IEXT");
homzovam 4:77d6450f34d7 233 }
homzovam 4:77d6450f34d7 234 if (_lastInterruptFlags[1] & RF22_IWUT) {
homzovam 4:77d6450f34d7 235 // This is not enabled by the base code, but users may want to enable it
homzovam 4:77d6450f34d7 236 //led2 = !led2;
homzovam 4:77d6450f34d7 237 handleWakeupTimerInterrupt();
homzovam 4:77d6450f34d7 238 // Serial.println("IWUT");
homzovam 4:77d6450f34d7 239 }
homzovam 4:77d6450f34d7 240 if (_lastInterruptFlags[0] & RF22_IPKSENT) {
homzovam 4:77d6450f34d7 241 // Serial.println("IPKSENT");
homzovam 4:77d6450f34d7 242 _txGood++;
homzovam 4:77d6450f34d7 243 //led4 = !led4;
homzovam 4:77d6450f34d7 244 // Transmission does not automatically clear the tx buffer.
homzovam 4:77d6450f34d7 245 // Could retransmit if we wanted
homzovam 4:77d6450f34d7 246 // RF22 transitions automatically to Idle
homzovam 4:77d6450f34d7 247 _mode = RF22_MODE_IDLE;
homzovam 4:77d6450f34d7 248 }
homzovam 4:77d6450f34d7 249
homzovam 4:77d6450f34d7 250 if (_lastInterruptFlags[0] & RF22_IPKVALID) {
homzovam 4:77d6450f34d7 251 uint8_t len = spiRead(RF22_REG_4B_RECEIVED_PACKET_LENGTH);
homzovam 4:77d6450f34d7 252 // Serial.println("IPKVALID");
homzovam 4:77d6450f34d7 253 // Serial.println(len);
homzovam 4:77d6450f34d7 254 // Serial.println(_bufLen);
homzovam 4:77d6450f34d7 255
homzovam 4:77d6450f34d7 256 // May have already read one or more fragments
homzovam 4:77d6450f34d7 257 // Get any remaining unread octets, based on the expected length
homzovam 4:77d6450f34d7 258 // First make sure we dont overflow the buffer in the case of a stupid length
homzovam 4:77d6450f34d7 259 // or partial bad receives
homzovam 4:77d6450f34d7 260
homzovam 4:77d6450f34d7 261 if ( len > RF22_MAX_MESSAGE_LEN || len < _bufLen) //pokud je delka zpravy delsi nez FIFO
homzovam 4:77d6450f34d7 262 {
homzovam 4:77d6450f34d7 263 _rxBad++;
homzovam 4:77d6450f34d7 264 _mode = RF22_MODE_IDLE;
homzovam 4:77d6450f34d7 265 clearRxBuf();
homzovam 4:77d6450f34d7 266 return; // Hmmm receiver buffer overflow.
homzovam 4:77d6450f34d7 267 }
homzovam 4:77d6450f34d7 268
homzovam 4:77d6450f34d7 269 spiBurstRead(RF22_REG_7F_FIFO_ACCESS, _buf + _bufLen, len - _bufLen);
homzovam 4:77d6450f34d7 270 __disable_irq(); // Disable Interrupts
homzovam 4:77d6450f34d7 271 _rxGood++;
homzovam 4:77d6450f34d7 272 _bufLen = len;
homzovam 4:77d6450f34d7 273 _mode = RF22_MODE_IDLE;
homzovam 4:77d6450f34d7 274 _rxBufValid = true;
homzovam 4:77d6450f34d7 275 // reset the fifo for next packet??
homzovam 4:77d6450f34d7 276 //resetRxFifo();
homzovam 4:77d6450f34d7 277 __enable_irq(); // Enable Interrupts
homzovam 4:77d6450f34d7 278
homzovam 4:77d6450f34d7 279 //led3 = !led3;
homzovam 4:77d6450f34d7 280
homzovam 4:77d6450f34d7 281 }
homzovam 4:77d6450f34d7 282
homzovam 4:77d6450f34d7 283 if (_lastInterruptFlags[0] & RF22_ICRCERROR) {
homzovam 4:77d6450f34d7 284 // Serial.println("ICRCERR");
homzovam 4:77d6450f34d7 285 _rxBad++;
homzovam 4:77d6450f34d7 286 //led2 = !led2;
homzovam 4:77d6450f34d7 287 clearRxBuf();
homzovam 4:77d6450f34d7 288 resetRxFifo();
homzovam 4:77d6450f34d7 289 _mode = RF22_MODE_IDLE;
homzovam 4:77d6450f34d7 290 setModeRx(); // Keep trying
homzovam 4:77d6450f34d7 291 }
homzovam 4:77d6450f34d7 292
homzovam 4:77d6450f34d7 293 if (_lastInterruptFlags[1] & RF22_IPREAVAL) {
homzovam 4:77d6450f34d7 294 // Serial.println("IPREAVAL");
homzovam 4:77d6450f34d7 295
homzovam 4:77d6450f34d7 296 _lastRssi = spiRead(RF22_REG_26_RSSI);
homzovam 4:77d6450f34d7 297
homzovam 4:77d6450f34d7 298
homzovam 4:77d6450f34d7 299 // why clear the rx-buf here? charly
homzovam 4:77d6450f34d7 300 clearRxBuf();
homzovam 4:77d6450f34d7 301
homzovam 4:77d6450f34d7 302
homzovam 4:77d6450f34d7 303 }
homzovam 4:77d6450f34d7 304 //led1 = 0;
homzovam 4:77d6450f34d7 305 }
homzovam 4:77d6450f34d7 306
homzovam 4:77d6450f34d7 307 // These are low level functions that call the interrupt handler for the correct
homzovam 4:77d6450f34d7 308 // instance of RF22.
homzovam 4:77d6450f34d7 309 // 2 interrupts allows us to have 2 different devices
homzovam 4:77d6450f34d7 310
homzovam 4:77d6450f34d7 311 void RF22::isr0()
homzovam 4:77d6450f34d7 312 {
homzovam 4:77d6450f34d7 313 //handleInterrupt();
homzovam 4:77d6450f34d7 314 obsluhapreruseni();
homzovam 4:77d6450f34d7 315
homzovam 4:77d6450f34d7 316 }
homzovam 4:77d6450f34d7 317
homzovam 4:77d6450f34d7 318
homzovam 4:77d6450f34d7 319 void RF22::reset()
homzovam 4:77d6450f34d7 320 {
homzovam 4:77d6450f34d7 321 spiWrite(RF22_REG_07_OPERATING_MODE1, RF22_SWRES); //soft reset
homzovam 4:77d6450f34d7 322 wait_ms(1);
homzovam 4:77d6450f34d7 323 }
homzovam 4:77d6450f34d7 324
homzovam 4:77d6450f34d7 325 uint8_t RF22::spiRead(uint8_t reg)
homzovam 4:77d6450f34d7 326 {
homzovam 4:77d6450f34d7 327 __disable_irq(); // Disable Interrupts
homzovam 4:77d6450f34d7 328
homzovam 4:77d6450f34d7 329 _slaveSelectPin=0;
homzovam 4:77d6450f34d7 330
homzovam 4:77d6450f34d7 331 _spi.write(reg & ~RF22_SPI_WRITE_MASK); // Send the address with the write mask off
homzovam 4:77d6450f34d7 332 uint8_t val = _spi.write(0); // The written value is ignored, reg value is read ??????
homzovam 4:77d6450f34d7 333
homzovam 4:77d6450f34d7 334 _slaveSelectPin = 1;
homzovam 4:77d6450f34d7 335 __enable_irq(); // Enable Interrupts
homzovam 4:77d6450f34d7 336 return val;
homzovam 4:77d6450f34d7 337 }
homzovam 4:77d6450f34d7 338
homzovam 4:77d6450f34d7 339 void RF22::spiWrite(uint8_t reg, uint8_t val) //zapis hodnot z define
homzovam 4:77d6450f34d7 340 {
homzovam 4:77d6450f34d7 341 __disable_irq(); // Disable Interrupts
homzovam 4:77d6450f34d7 342
homzovam 4:77d6450f34d7 343 _slaveSelectPin = 0;
homzovam 4:77d6450f34d7 344 _spi.write(reg | RF22_SPI_WRITE_MASK); // Send the address with the write mask on
homzovam 4:77d6450f34d7 345 _spi.write(val); // New value follows
homzovam 4:77d6450f34d7 346
homzovam 4:77d6450f34d7 347 _slaveSelectPin = 1;
homzovam 4:77d6450f34d7 348 __enable_irq(); // Enable Interrupts
homzovam 4:77d6450f34d7 349 }
homzovam 4:77d6450f34d7 350
homzovam 4:77d6450f34d7 351 void RF22::spiBurstRead(uint8_t reg, uint8_t* dest, uint8_t len) //tady se vycitaji data
homzovam 4:77d6450f34d7 352 {
homzovam 4:77d6450f34d7 353 _slaveSelectPin = 0;
homzovam 4:77d6450f34d7 354 _spi.write(reg & ~RF22_SPI_WRITE_MASK); // Send the start address with the write mask off
homzovam 4:77d6450f34d7 355 if(reg == RF22_REG_7F_FIFO_ACCESS) pc1.printf("\n\r Data primo z bufferu:");
homzovam 4:77d6450f34d7 356 while (len--)
homzovam 4:77d6450f34d7 357 {
homzovam 4:77d6450f34d7 358 *dest++ = _spi.write(0);
homzovam 4:77d6450f34d7 359 if(reg == RF22_REG_7F_FIFO_ACCESS) pc1.printf(" %i", *dest);
homzovam 4:77d6450f34d7 360 }
homzovam 4:77d6450f34d7 361 _slaveSelectPin = 1;
homzovam 4:77d6450f34d7 362 }
homzovam 4:77d6450f34d7 363
homzovam 4:77d6450f34d7 364 void RF22::spiBurstWrite(uint8_t reg, const uint8_t* src, uint8_t len)
homzovam 4:77d6450f34d7 365 {
homzovam 4:77d6450f34d7 366 _slaveSelectPin = 0;
homzovam 4:77d6450f34d7 367 _spi.write(reg | RF22_SPI_WRITE_MASK); // Send the start address with the write mask on
homzovam 4:77d6450f34d7 368 while (len--)
homzovam 4:77d6450f34d7 369 _spi.write(*src++);
homzovam 4:77d6450f34d7 370 _slaveSelectPin = 1;
homzovam 4:77d6450f34d7 371 }
homzovam 4:77d6450f34d7 372
homzovam 4:77d6450f34d7 373 uint8_t RF22::statusRead()
homzovam 4:77d6450f34d7 374 {
homzovam 4:77d6450f34d7 375 return spiRead(RF22_REG_02_DEVICE_STATUS);
homzovam 4:77d6450f34d7 376 }
homzovam 4:77d6450f34d7 377
homzovam 4:77d6450f34d7 378 uint8_t RF22::adcRead(uint8_t adcsel,
homzovam 4:77d6450f34d7 379 uint8_t adcref ,
homzovam 4:77d6450f34d7 380 uint8_t adcgain,
homzovam 4:77d6450f34d7 381 uint8_t adcoffs)
homzovam 4:77d6450f34d7 382 {
homzovam 4:77d6450f34d7 383 uint8_t configuration = adcsel | adcref | (adcgain & RF22_ADCGAIN);
homzovam 4:77d6450f34d7 384 spiWrite(RF22_REG_0F_ADC_CONFIGURATION, configuration | RF22_ADCSTART);
homzovam 4:77d6450f34d7 385 spiWrite(RF22_REG_10_ADC_SENSOR_AMP_OFFSET, adcoffs);
homzovam 4:77d6450f34d7 386
homzovam 4:77d6450f34d7 387 // Conversion time is nominally 305usec
homzovam 4:77d6450f34d7 388 // Wait for the DONE bit
homzovam 4:77d6450f34d7 389 while (!(spiRead(RF22_REG_0F_ADC_CONFIGURATION) & RF22_ADCDONE))
homzovam 4:77d6450f34d7 390 ;
homzovam 4:77d6450f34d7 391 // Return the value
homzovam 4:77d6450f34d7 392 return spiRead(RF22_REG_11_ADC_VALUE);
homzovam 4:77d6450f34d7 393 }
homzovam 4:77d6450f34d7 394
homzovam 4:77d6450f34d7 395
homzovam 4:77d6450f34d7 396 uint16_t RF22::wutRead()
homzovam 4:77d6450f34d7 397 {
homzovam 4:77d6450f34d7 398 uint8_t buf[2];
homzovam 4:77d6450f34d7 399 spiBurstRead(RF22_REG_17_WAKEUP_TIMER_VALUE1, buf, 2);
homzovam 4:77d6450f34d7 400 return ((uint16_t)buf[0] << 8) | buf[1]; // Dont rely on byte order
homzovam 4:77d6450f34d7 401 }
homzovam 4:77d6450f34d7 402
homzovam 4:77d6450f34d7 403 // RFM-22 doc appears to be wrong: WUT for wtm = 10000, r, = 0, d = 0 is about 1 sec
homzovam 4:77d6450f34d7 404 void RF22::setWutPeriod(uint16_t wtm, uint8_t wtr, uint8_t wtd)
homzovam 4:77d6450f34d7 405 {
homzovam 4:77d6450f34d7 406 uint8_t period[3];
homzovam 4:77d6450f34d7 407
homzovam 4:77d6450f34d7 408 period[0] = ((wtr & 0xf) << 2) | (wtd & 0x3);
homzovam 4:77d6450f34d7 409 period[1] = wtm >> 8;
homzovam 4:77d6450f34d7 410 period[2] = wtm & 0xff;
homzovam 4:77d6450f34d7 411 spiBurstWrite(RF22_REG_14_WAKEUP_TIMER_PERIOD1, period, sizeof(period));
homzovam 4:77d6450f34d7 412 }
homzovam 4:77d6450f34d7 413
homzovam 4:77d6450f34d7 414 // Returns true if centre + (fhch * fhs) is within limits
homzovam 4:77d6450f34d7 415 // Caution, different versions of the RF22 support different max freq
homzovam 4:77d6450f34d7 416 // so YMMV
homzovam 4:77d6450f34d7 417 boolean RF22::setFrequency(float centre, float afcPullInRange)
homzovam 4:77d6450f34d7 418 {
homzovam 4:77d6450f34d7 419 uint8_t fbsel = RF22_SBSEL;
homzovam 4:77d6450f34d7 420 uint8_t afclimiter;
homzovam 4:77d6450f34d7 421 if (centre < 240.0 || centre > 960.0) // 930.0 for early silicon
homzovam 4:77d6450f34d7 422 return false;
homzovam 4:77d6450f34d7 423 if (centre >= 480.0) {
homzovam 4:77d6450f34d7 424 if (afcPullInRange < 0.0 || afcPullInRange > 0.318750)
homzovam 4:77d6450f34d7 425 return false;
homzovam 4:77d6450f34d7 426 centre /= 2;
homzovam 4:77d6450f34d7 427 fbsel |= RF22_HBSEL;
homzovam 4:77d6450f34d7 428 afclimiter = afcPullInRange * 1000000.0 / 1250.0;
homzovam 4:77d6450f34d7 429 } else {
homzovam 4:77d6450f34d7 430 if (afcPullInRange < 0.0 || afcPullInRange > 0.159375)
homzovam 4:77d6450f34d7 431 return false;
homzovam 4:77d6450f34d7 432 afclimiter = afcPullInRange * 1000000.0 / 625.0;
homzovam 4:77d6450f34d7 433 }
homzovam 4:77d6450f34d7 434 centre /= 10.0;
homzovam 4:77d6450f34d7 435 float integerPart = floor(centre);
homzovam 4:77d6450f34d7 436 float fractionalPart = centre - integerPart;
homzovam 4:77d6450f34d7 437
homzovam 4:77d6450f34d7 438 uint8_t fb = (uint8_t)integerPart - 24; // Range 0 to 23
homzovam 4:77d6450f34d7 439 fbsel |= fb;
homzovam 4:77d6450f34d7 440 uint16_t fc = fractionalPart * 64000;
homzovam 4:77d6450f34d7 441 spiWrite(RF22_REG_73_FREQUENCY_OFFSET1, 0); // REVISIT
homzovam 4:77d6450f34d7 442 spiWrite(RF22_REG_74_FREQUENCY_OFFSET2, 0);
homzovam 4:77d6450f34d7 443 spiWrite(RF22_REG_75_FREQUENCY_BAND_SELECT, fbsel);
homzovam 4:77d6450f34d7 444 spiWrite(RF22_REG_76_NOMINAL_CARRIER_FREQUENCY1, fc >> 8);
homzovam 4:77d6450f34d7 445 spiWrite(RF22_REG_77_NOMINAL_CARRIER_FREQUENCY0, fc & 0xff);
homzovam 4:77d6450f34d7 446 spiWrite(RF22_REG_2A_AFC_LIMITER, afclimiter);
homzovam 4:77d6450f34d7 447 return !(statusRead() & RF22_FREQERR);
homzovam 4:77d6450f34d7 448 }
homzovam 4:77d6450f34d7 449
homzovam 4:77d6450f34d7 450 // Step size in 10kHz increments
homzovam 4:77d6450f34d7 451 // Returns true if centre + (fhch * fhs) is within limits
homzovam 4:77d6450f34d7 452 boolean RF22::setFHStepSize(uint8_t fhs)
homzovam 4:77d6450f34d7 453 {
homzovam 4:77d6450f34d7 454 spiWrite(RF22_REG_7A_FREQUENCY_HOPPING_STEP_SIZE, fhs);
homzovam 4:77d6450f34d7 455 return !(statusRead() & RF22_FREQERR);
homzovam 4:77d6450f34d7 456 }
homzovam 4:77d6450f34d7 457
homzovam 4:77d6450f34d7 458 // Adds fhch * fhs to centre frequency
homzovam 4:77d6450f34d7 459 // Returns true if centre + (fhch * fhs) is within limits
homzovam 4:77d6450f34d7 460 boolean RF22::setFHChannel(uint8_t fhch)
homzovam 4:77d6450f34d7 461 {
homzovam 4:77d6450f34d7 462 spiWrite(RF22_REG_79_FREQUENCY_HOPPING_CHANNEL_SELECT, fhch);
homzovam 4:77d6450f34d7 463 return !(statusRead() & RF22_FREQERR);
homzovam 4:77d6450f34d7 464 }
homzovam 4:77d6450f34d7 465
homzovam 4:77d6450f34d7 466 uint8_t RF22::rssiRead()
homzovam 4:77d6450f34d7 467 {
homzovam 4:77d6450f34d7 468 return spiRead(RF22_REG_26_RSSI);
homzovam 4:77d6450f34d7 469 }
homzovam 4:77d6450f34d7 470
homzovam 4:77d6450f34d7 471 uint8_t RF22::ezmacStatusRead()
homzovam 4:77d6450f34d7 472 {
homzovam 4:77d6450f34d7 473 return spiRead(RF22_REG_31_EZMAC_STATUS);
homzovam 4:77d6450f34d7 474 }
homzovam 4:77d6450f34d7 475
homzovam 4:77d6450f34d7 476 void RF22::setMode(uint8_t mode)
homzovam 4:77d6450f34d7 477 {
homzovam 4:77d6450f34d7 478 spiWrite(RF22_REG_07_OPERATING_MODE1, mode);
homzovam 4:77d6450f34d7 479 }
homzovam 4:77d6450f34d7 480
homzovam 4:77d6450f34d7 481 void RF22::setModeIdle()
homzovam 4:77d6450f34d7 482 {
homzovam 4:77d6450f34d7 483 if (_mode != RF22_MODE_IDLE) {
homzovam 4:77d6450f34d7 484 setMode(_idleMode);
homzovam 4:77d6450f34d7 485 _mode = RF22_MODE_IDLE;
homzovam 4:77d6450f34d7 486
homzovam 4:77d6450f34d7 487 }
homzovam 4:77d6450f34d7 488 }
homzovam 4:77d6450f34d7 489
homzovam 4:77d6450f34d7 490 void RF22::setModeRx()
homzovam 4:77d6450f34d7 491 {
homzovam 4:77d6450f34d7 492 if (_mode != RF22_MODE_RX) {
homzovam 4:77d6450f34d7 493 setMode(_idleMode | RF22_RXON);
homzovam 4:77d6450f34d7 494 _mode = RF22_MODE_RX;
homzovam 4:77d6450f34d7 495 }
homzovam 4:77d6450f34d7 496 }
homzovam 4:77d6450f34d7 497
homzovam 4:77d6450f34d7 498 void RF22::setModeTx()
homzovam 4:77d6450f34d7 499 {
homzovam 4:77d6450f34d7 500 if (_mode != RF22_MODE_TX) {
homzovam 4:77d6450f34d7 501 setMode(_idleMode | RF22_TXON);
homzovam 4:77d6450f34d7 502 _mode = RF22_MODE_TX;
homzovam 4:77d6450f34d7 503 // Hmmm, if you dont clear the RX FIFO here, then it appears that going
homzovam 4:77d6450f34d7 504 // to transmit mode in the middle of a receive can corrupt the
homzovam 4:77d6450f34d7 505 // RX FIFO
homzovam 4:77d6450f34d7 506 resetRxFifo();
homzovam 4:77d6450f34d7 507
homzovam 4:77d6450f34d7 508 }
homzovam 4:77d6450f34d7 509 }
homzovam 4:77d6450f34d7 510
homzovam 4:77d6450f34d7 511 uint8_t RF22::mode()
homzovam 4:77d6450f34d7 512 {
homzovam 4:77d6450f34d7 513 return _mode;
homzovam 4:77d6450f34d7 514 }
homzovam 4:77d6450f34d7 515
homzovam 4:77d6450f34d7 516 void RF22::setTxPower(uint8_t power)
homzovam 4:77d6450f34d7 517 {
homzovam 4:77d6450f34d7 518 spiWrite(RF22_REG_6D_TX_POWER, power);
homzovam 4:77d6450f34d7 519 }
homzovam 4:77d6450f34d7 520
homzovam 4:77d6450f34d7 521 // Sets registers from a canned modem configuration structure
homzovam 4:77d6450f34d7 522 void RF22::setModemRegisters(const ModemConfig* config)
homzovam 4:77d6450f34d7 523 {
homzovam 4:77d6450f34d7 524 spiWrite(RF22_REG_1C_IF_FILTER_BANDWIDTH, config->reg_1c);
homzovam 4:77d6450f34d7 525 spiWrite(RF22_REG_1F_CLOCK_RECOVERY_GEARSHIFT_OVERRIDE, config->reg_1f);
homzovam 4:77d6450f34d7 526 spiBurstWrite(RF22_REG_20_CLOCK_RECOVERY_OVERSAMPLING_RATE, &config->reg_20, 6);
homzovam 4:77d6450f34d7 527 spiBurstWrite(RF22_REG_2C_OOK_COUNTER_VALUE_1, &config->reg_2c, 3);
homzovam 4:77d6450f34d7 528 spiWrite(RF22_REG_58_CHARGE_PUMP_CURRENT_TRIMMING, config->reg_58);
homzovam 4:77d6450f34d7 529 spiWrite(RF22_REG_69_AGC_OVERRIDE1, config->reg_69);
homzovam 4:77d6450f34d7 530 spiBurstWrite(RF22_REG_6E_TX_DATA_RATE1, &config->reg_6e, 5);
homzovam 4:77d6450f34d7 531 }
homzovam 4:77d6450f34d7 532
homzovam 4:77d6450f34d7 533 // Set one of the canned FSK Modem configs
homzovam 4:77d6450f34d7 534 // Returns true if its a valid choice
homzovam 4:77d6450f34d7 535 boolean RF22::setModemConfig(ModemConfigChoice index)
homzovam 4:77d6450f34d7 536 {
homzovam 4:77d6450f34d7 537 if (index > (sizeof(MODEM_CONFIG_TABLE) / sizeof(ModemConfig)))
homzovam 4:77d6450f34d7 538 return false;
homzovam 4:77d6450f34d7 539
homzovam 4:77d6450f34d7 540 RF22::ModemConfig cfg;
homzovam 4:77d6450f34d7 541 memcpy(&cfg, &MODEM_CONFIG_TABLE[index], sizeof(RF22::ModemConfig));
homzovam 4:77d6450f34d7 542 setModemRegisters(&cfg);
homzovam 4:77d6450f34d7 543
homzovam 4:77d6450f34d7 544 return true;
homzovam 4:77d6450f34d7 545 }
homzovam 4:77d6450f34d7 546
homzovam 4:77d6450f34d7 547 // REVISIT: top bit is in Header Control 2 0x33
homzovam 4:77d6450f34d7 548 void RF22::setPreambleLength(uint8_t nibbles)
homzovam 4:77d6450f34d7 549 {
homzovam 4:77d6450f34d7 550 spiWrite(RF22_REG_34_PREAMBLE_LENGTH, nibbles);
homzovam 4:77d6450f34d7 551 }
homzovam 4:77d6450f34d7 552
homzovam 4:77d6450f34d7 553 // Caution doesnt set sync word len in Header Control 2 0x33
homzovam 4:77d6450f34d7 554 void RF22::setSyncWords(const uint8_t* syncWords, uint8_t len)
homzovam 4:77d6450f34d7 555 {
homzovam 4:77d6450f34d7 556 spiBurstWrite(RF22_REG_36_SYNC_WORD3, syncWords, len);
homzovam 4:77d6450f34d7 557 }
homzovam 4:77d6450f34d7 558
homzovam 4:77d6450f34d7 559 void RF22::clearRxBuf()
homzovam 4:77d6450f34d7 560 {
homzovam 4:77d6450f34d7 561 __disable_irq(); // Disable Interrupts
homzovam 4:77d6450f34d7 562 _bufLen = 0;
homzovam 4:77d6450f34d7 563 _rxBufValid = false;
homzovam 4:77d6450f34d7 564 __enable_irq(); // Enable Interrupts
homzovam 4:77d6450f34d7 565 }
homzovam 4:77d6450f34d7 566
homzovam 4:77d6450f34d7 567 boolean RF22::available()
homzovam 4:77d6450f34d7 568 {
homzovam 4:77d6450f34d7 569 if (!_rxBufValid)
homzovam 4:77d6450f34d7 570 setModeRx(); // Make sure we are receiving
homzovam 4:77d6450f34d7 571 return _rxBufValid;
homzovam 4:77d6450f34d7 572 }
homzovam 4:77d6450f34d7 573
homzovam 4:77d6450f34d7 574 // Blocks until a valid message is received
homzovam 4:77d6450f34d7 575 void RF22::waitAvailable()
homzovam 4:77d6450f34d7 576 {
homzovam 4:77d6450f34d7 577 while (!available())
homzovam 4:77d6450f34d7 578 ;
homzovam 4:77d6450f34d7 579 }
homzovam 4:77d6450f34d7 580
homzovam 4:77d6450f34d7 581 // Blocks until a valid message is received or timeout expires
homzovam 4:77d6450f34d7 582 // Return true if there is a message available
homzovam 4:77d6450f34d7 583 bool RF22::waitAvailableTimeout(uint16_t timeout)
homzovam 4:77d6450f34d7 584 {
homzovam 4:77d6450f34d7 585 Timer t;
homzovam 4:77d6450f34d7 586 t.start();
homzovam 4:77d6450f34d7 587 unsigned long endtime = t.read_ms() + timeout;
homzovam 4:77d6450f34d7 588 while (t.read_ms() < endtime)
homzovam 4:77d6450f34d7 589 if (available())
homzovam 4:77d6450f34d7 590 return true;
homzovam 4:77d6450f34d7 591 return false;
homzovam 4:77d6450f34d7 592 }
homzovam 4:77d6450f34d7 593
homzovam 4:77d6450f34d7 594 void RF22::waitPacketSent()
homzovam 4:77d6450f34d7 595 {
homzovam 4:77d6450f34d7 596 while (_mode == RF22_MODE_TX)
homzovam 4:77d6450f34d7 597 ; // Wait for any previous transmit to finish
homzovam 4:77d6450f34d7 598 }
homzovam 4:77d6450f34d7 599
homzovam 4:77d6450f34d7 600 // Diagnostic help
homzovam 4:77d6450f34d7 601 void RF22::printBuffer(const uint8_t *buf, uint8_t len)
homzovam 4:77d6450f34d7 602 {
homzovam 4:77d6450f34d7 603
homzovam 4:77d6450f34d7 604 uint8_t i;
homzovam 4:77d6450f34d7 605
homzovam 4:77d6450f34d7 606 pc1.printf("\n\rObsah Bufferu ");
homzovam 4:77d6450f34d7 607 for (i = 0; i < len; i++) {
homzovam 4:77d6450f34d7 608 if (i % 16 == 15)
homzovam 4:77d6450f34d7 609 pc1.printf("%d", buf[i]);
homzovam 4:77d6450f34d7 610 else {
homzovam 4:77d6450f34d7 611 pc1.printf("%d", buf[i]);
homzovam 4:77d6450f34d7 612 pc1.printf(" ");
homzovam 4:77d6450f34d7 613 }
homzovam 4:77d6450f34d7 614 }
homzovam 4:77d6450f34d7 615 pc1.printf(" ");
homzovam 4:77d6450f34d7 616
homzovam 4:77d6450f34d7 617 }
homzovam 4:77d6450f34d7 618
homzovam 4:77d6450f34d7 619 boolean RF22::recv(uint8_t* buf, uint8_t* len)
homzovam 4:77d6450f34d7 620 {
homzovam 4:77d6450f34d7 621 if (!available())
homzovam 4:77d6450f34d7 622 return false;
homzovam 4:77d6450f34d7 623 __disable_irq(); // Disable Interrupts
homzovam 4:77d6450f34d7 624 if (*len > _bufLen)
homzovam 4:77d6450f34d7 625 *len = _bufLen;
homzovam 4:77d6450f34d7 626 memcpy(buf, _buf, *len);
homzovam 4:77d6450f34d7 627 printBuffer(_buf, *len);
homzovam 4:77d6450f34d7 628 clearRxBuf();
homzovam 4:77d6450f34d7 629 __enable_irq(); // Enable Interrupts
homzovam 4:77d6450f34d7 630 printBuffer( buf, *len);
homzovam 4:77d6450f34d7 631
homzovam 4:77d6450f34d7 632 return true;
homzovam 4:77d6450f34d7 633 }
homzovam 4:77d6450f34d7 634
homzovam 4:77d6450f34d7 635 void RF22::clearTxBuf()
homzovam 4:77d6450f34d7 636 {
homzovam 4:77d6450f34d7 637 __disable_irq(); // Disable Interrupts
homzovam 4:77d6450f34d7 638 _bufLen = 0;
homzovam 4:77d6450f34d7 639 _txBufSentIndex = 0;
homzovam 4:77d6450f34d7 640 _txPacketSent = false;
homzovam 4:77d6450f34d7 641 __enable_irq(); // Enable Interrupts
homzovam 4:77d6450f34d7 642 }
homzovam 4:77d6450f34d7 643
homzovam 4:77d6450f34d7 644 void RF22::startTransmit()
homzovam 4:77d6450f34d7 645 {
homzovam 4:77d6450f34d7 646 sendNextFragment(); // Actually the first fragment
homzovam 4:77d6450f34d7 647 spiWrite(RF22_REG_3E_PACKET_LENGTH, _bufLen); // Total length that will be sent
homzovam 4:77d6450f34d7 648 setModeTx(); // Start the transmitter, turns off the receiver
homzovam 4:77d6450f34d7 649 }
homzovam 4:77d6450f34d7 650
homzovam 4:77d6450f34d7 651 // Restart the transmission of a packet that had a problem
homzovam 4:77d6450f34d7 652 void RF22::restartTransmit()
homzovam 4:77d6450f34d7 653 {
homzovam 4:77d6450f34d7 654 _mode = RF22_MODE_IDLE;
homzovam 4:77d6450f34d7 655 _txBufSentIndex = 0;
homzovam 4:77d6450f34d7 656 // Serial.println("Restart");
homzovam 4:77d6450f34d7 657 startTransmit();
homzovam 4:77d6450f34d7 658 }
homzovam 4:77d6450f34d7 659
homzovam 4:77d6450f34d7 660 boolean RF22::send(const uint8_t* data, uint8_t len) //pocka, nez se odesle paket a potom odesle data
homzovam 4:77d6450f34d7 661 {
homzovam 4:77d6450f34d7 662 waitPacketSent();
homzovam 4:77d6450f34d7 663 {
homzovam 4:77d6450f34d7 664 if (!fillTxBuf(data, len))
homzovam 4:77d6450f34d7 665 return false;
homzovam 4:77d6450f34d7 666 startTransmit();
homzovam 4:77d6450f34d7 667 }
homzovam 4:77d6450f34d7 668 // printBuffer("send:", data, len);
homzovam 4:77d6450f34d7 669 return true;
homzovam 4:77d6450f34d7 670 }
homzovam 4:77d6450f34d7 671
homzovam 4:77d6450f34d7 672 boolean RF22::fillTxBuf(const uint8_t* data, uint8_t len)
homzovam 4:77d6450f34d7 673 {
homzovam 4:77d6450f34d7 674 clearTxBuf();
homzovam 4:77d6450f34d7 675 if (!len)
homzovam 4:77d6450f34d7 676 return false;
homzovam 4:77d6450f34d7 677 return appendTxBuf(data, len);
homzovam 4:77d6450f34d7 678 }
homzovam 4:77d6450f34d7 679
homzovam 4:77d6450f34d7 680 boolean RF22::appendTxBuf(const uint8_t* data, uint8_t len)
homzovam 4:77d6450f34d7 681 {
homzovam 4:77d6450f34d7 682 if (((uint16_t)_bufLen + len) > RF22_MAX_MESSAGE_LEN)
homzovam 4:77d6450f34d7 683 return false;
homzovam 4:77d6450f34d7 684 __disable_irq(); // Disable Interrupts
homzovam 4:77d6450f34d7 685 memcpy(_buf + _bufLen, data, len);
homzovam 4:77d6450f34d7 686 _bufLen += len;
homzovam 4:77d6450f34d7 687 __enable_irq(); // Enable Interrupts
homzovam 4:77d6450f34d7 688
homzovam 4:77d6450f34d7 689 // printBuffer("txbuf:", _buf, _bufLen);
homzovam 4:77d6450f34d7 690 return true;
homzovam 4:77d6450f34d7 691 }
homzovam 4:77d6450f34d7 692
homzovam 4:77d6450f34d7 693 // Assumption: there is currently <= RF22_TXFFAEM_THRESHOLD bytes in the Tx FIFO
homzovam 4:77d6450f34d7 694 void RF22::sendNextFragment()
homzovam 4:77d6450f34d7 695 {
homzovam 4:77d6450f34d7 696 if (_txBufSentIndex < _bufLen) {
homzovam 4:77d6450f34d7 697 // Some left to send?
homzovam 4:77d6450f34d7 698 uint8_t len = _bufLen - _txBufSentIndex;
homzovam 4:77d6450f34d7 699 // But dont send too much
homzovam 4:77d6450f34d7 700 if (len > (RF22_FIFO_SIZE - RF22_TXFFAEM_THRESHOLD - 1))
homzovam 4:77d6450f34d7 701 len = (RF22_FIFO_SIZE - RF22_TXFFAEM_THRESHOLD - 1);
homzovam 4:77d6450f34d7 702 spiBurstWrite(RF22_REG_7F_FIFO_ACCESS, _buf + _txBufSentIndex, len);
homzovam 4:77d6450f34d7 703 _txBufSentIndex += len;
homzovam 4:77d6450f34d7 704 }
homzovam 4:77d6450f34d7 705 }
homzovam 4:77d6450f34d7 706
homzovam 4:77d6450f34d7 707 // Assumption: there are at least RF22_RXFFAFULL_THRESHOLD in the RX FIFO
homzovam 4:77d6450f34d7 708 // That means it should only be called after a RXFFAFULL interrupt
homzovam 4:77d6450f34d7 709 void RF22::readNextFragment()
homzovam 4:77d6450f34d7 710 {
homzovam 4:77d6450f34d7 711 if (((uint16_t)_bufLen + RF22_RXFFAFULL_THRESHOLD) > RF22_MAX_MESSAGE_LEN)
homzovam 4:77d6450f34d7 712 return; // Hmmm receiver overflow. Should never occur
homzovam 4:77d6450f34d7 713
homzovam 4:77d6450f34d7 714 // Read the RF22_RXFFAFULL_THRESHOLD octets that should be there
homzovam 4:77d6450f34d7 715 spiBurstRead(RF22_REG_7F_FIFO_ACCESS, _buf + _bufLen, RF22_RXFFAFULL_THRESHOLD);
homzovam 4:77d6450f34d7 716 _bufLen += RF22_RXFFAFULL_THRESHOLD;
homzovam 4:77d6450f34d7 717 }
homzovam 4:77d6450f34d7 718
homzovam 4:77d6450f34d7 719 // Clear the FIFOs
homzovam 4:77d6450f34d7 720 void RF22::resetFifos()
homzovam 4:77d6450f34d7 721 {
homzovam 4:77d6450f34d7 722 spiWrite(RF22_REG_08_OPERATING_MODE2, RF22_FFCLRRX | RF22_FFCLRTX);
homzovam 4:77d6450f34d7 723 spiWrite(RF22_REG_08_OPERATING_MODE2, 0);
homzovam 4:77d6450f34d7 724 }
homzovam 4:77d6450f34d7 725
homzovam 4:77d6450f34d7 726 // Clear the Rx FIFO
homzovam 4:77d6450f34d7 727 void RF22::resetRxFifo()
homzovam 4:77d6450f34d7 728 {
homzovam 4:77d6450f34d7 729 spiWrite(RF22_REG_08_OPERATING_MODE2, RF22_FFCLRRX);
homzovam 4:77d6450f34d7 730 spiWrite(RF22_REG_08_OPERATING_MODE2, 0);
homzovam 4:77d6450f34d7 731 }
homzovam 4:77d6450f34d7 732
homzovam 4:77d6450f34d7 733 // CLear the TX FIFO
homzovam 4:77d6450f34d7 734 void RF22::resetTxFifo()
homzovam 4:77d6450f34d7 735 {
homzovam 4:77d6450f34d7 736 spiWrite(RF22_REG_08_OPERATING_MODE2, RF22_FFCLRTX);
homzovam 4:77d6450f34d7 737 spiWrite(RF22_REG_08_OPERATING_MODE2, 0);
homzovam 4:77d6450f34d7 738 }
homzovam 4:77d6450f34d7 739
homzovam 4:77d6450f34d7 740 // Default implmentation does nothing. Override if you wish
homzovam 4:77d6450f34d7 741 void RF22::handleExternalInterrupt()
homzovam 4:77d6450f34d7 742 {
homzovam 4:77d6450f34d7 743 }
homzovam 4:77d6450f34d7 744
homzovam 4:77d6450f34d7 745 // Default implmentation does nothing. Override if you wish
homzovam 4:77d6450f34d7 746 void RF22::handleWakeupTimerInterrupt()
homzovam 4:77d6450f34d7 747 {
homzovam 4:77d6450f34d7 748 }
homzovam 4:77d6450f34d7 749
homzovam 4:77d6450f34d7 750 void RF22::setHeaderTo(uint8_t to)
homzovam 4:77d6450f34d7 751 {
homzovam 4:77d6450f34d7 752 spiWrite(RF22_REG_3A_TRANSMIT_HEADER3, to);
homzovam 4:77d6450f34d7 753 }
homzovam 4:77d6450f34d7 754
homzovam 4:77d6450f34d7 755 void RF22::setHeaderFrom(uint8_t from)
homzovam 4:77d6450f34d7 756 {
homzovam 4:77d6450f34d7 757 spiWrite(RF22_REG_3B_TRANSMIT_HEADER2, from);
homzovam 4:77d6450f34d7 758 }
homzovam 4:77d6450f34d7 759
homzovam 4:77d6450f34d7 760 void RF22::setHeaderId(uint8_t id)
homzovam 4:77d6450f34d7 761 {
homzovam 4:77d6450f34d7 762 spiWrite(RF22_REG_3C_TRANSMIT_HEADER1, id);
homzovam 4:77d6450f34d7 763 }
homzovam 4:77d6450f34d7 764
homzovam 4:77d6450f34d7 765 void RF22::setHeaderFlags(uint8_t flags)
homzovam 4:77d6450f34d7 766 {
homzovam 4:77d6450f34d7 767 spiWrite(RF22_REG_3D_TRANSMIT_HEADER0, flags);
homzovam 4:77d6450f34d7 768 }
homzovam 4:77d6450f34d7 769
homzovam 4:77d6450f34d7 770 uint8_t RF22::headerTo()
homzovam 4:77d6450f34d7 771 {
homzovam 4:77d6450f34d7 772 return spiRead(RF22_REG_47_RECEIVED_HEADER3);
homzovam 4:77d6450f34d7 773 }
homzovam 4:77d6450f34d7 774
homzovam 4:77d6450f34d7 775 uint8_t RF22::headerFrom()
homzovam 4:77d6450f34d7 776 {
homzovam 4:77d6450f34d7 777 return spiRead(RF22_REG_48_RECEIVED_HEADER2);
homzovam 4:77d6450f34d7 778 }
homzovam 4:77d6450f34d7 779
homzovam 4:77d6450f34d7 780 uint8_t RF22::headerId()
homzovam 4:77d6450f34d7 781 {
homzovam 4:77d6450f34d7 782 return spiRead(RF22_REG_49_RECEIVED_HEADER1);
homzovam 4:77d6450f34d7 783 }
homzovam 4:77d6450f34d7 784
homzovam 4:77d6450f34d7 785 uint8_t RF22::headerFlags()
homzovam 4:77d6450f34d7 786 {
homzovam 4:77d6450f34d7 787 return spiRead(RF22_REG_4A_RECEIVED_HEADER0);
homzovam 4:77d6450f34d7 788 }
homzovam 4:77d6450f34d7 789
homzovam 4:77d6450f34d7 790 uint8_t RF22::lastRssi()
homzovam 4:77d6450f34d7 791 {
homzovam 4:77d6450f34d7 792 return _lastRssi;
homzovam 4:77d6450f34d7 793 }
homzovam 4:77d6450f34d7 794
homzovam 4:77d6450f34d7 795 void RF22::setPromiscuous(boolean promiscuous)
homzovam 4:77d6450f34d7 796 {
homzovam 4:77d6450f34d7 797 spiWrite(RF22_REG_43_HEADER_ENABLE3, promiscuous ? 0x00 : 0xff);
homzovam 4:77d6450f34d7 798 }