prijimac-zaloha

Dependencies:   mbed

Committer:
homzovam
Date:
Thu Apr 02 10:29:44 2015 +0000
Revision:
1:9f3cc092b9aa
ddd

Who changed what in which revision?

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