V0.5 library for the Pi Swarm robot
alpha433.cpp@1:b067a08ff54e, 2014-02-02 (annotated)
- Committer:
- jah128
- Date:
- Sun Feb 02 18:05:58 2014 +0000
- Revision:
- 1:b067a08ff54e
- Parent:
- 0:9ffe8ebd1c40
- Child:
- 4:52b3e4c5a425
updated comms library;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
jah128 | 0:9ffe8ebd1c40 | 1 | /* University of York Robot Lab Pi Swarm Library: 433MHz Alpha Transceiver |
jah128 | 0:9ffe8ebd1c40 | 2 | * |
jah128 | 0:9ffe8ebd1c40 | 3 | * (C) Dr James Hilder, Dept. Electronics & Computer Science, University of York |
jah128 | 1:b067a08ff54e | 4 | * |
jah128 | 0:9ffe8ebd1c40 | 5 | * Version 0.4 January 2014 |
jah128 | 0:9ffe8ebd1c40 | 6 | * |
jah128 | 0:9ffe8ebd1c40 | 7 | * Designed for use with the Pi Swarm Board (enhanced MBED sensor board) v1.2 |
jah128 | 0:9ffe8ebd1c40 | 8 | * |
jah128 | 1:b067a08ff54e | 9 | * Based on code developed by Tobias Dipper, University of Stuttgart (see copyright notice at end of file) |
jah128 | 0:9ffe8ebd1c40 | 10 | */ |
jah128 | 1:b067a08ff54e | 11 | |
jah128 | 0:9ffe8ebd1c40 | 12 | #include "main.h" |
jah128 | 0:9ffe8ebd1c40 | 13 | #include "communications.h" |
jah128 | 0:9ffe8ebd1c40 | 14 | |
jah128 | 0:9ffe8ebd1c40 | 15 | // Variables |
jah128 | 0:9ffe8ebd1c40 | 16 | |
jah128 | 0:9ffe8ebd1c40 | 17 | DigitalOut rf_led(LED1); |
jah128 | 0:9ffe8ebd1c40 | 18 | Timeout reset_timeout; |
jah128 | 0:9ffe8ebd1c40 | 19 | |
jah128 | 0:9ffe8ebd1c40 | 20 | |
jah128 | 0:9ffe8ebd1c40 | 21 | char cRFStatus = 0; |
jah128 | 0:9ffe8ebd1c40 | 22 | |
jah128 | 0:9ffe8ebd1c40 | 23 | signed short ssTransmitCount = 0; |
jah128 | 0:9ffe8ebd1c40 | 24 | signed short ssTransmitPointer = 0; |
jah128 | 0:9ffe8ebd1c40 | 25 | char cTXBuffer[64]; |
jah128 | 0:9ffe8ebd1c40 | 26 | |
jah128 | 0:9ffe8ebd1c40 | 27 | signed short ssReceiveCount = 0; |
jah128 | 0:9ffe8ebd1c40 | 28 | signed short ssReceivePointer = 0; |
jah128 | 0:9ffe8ebd1c40 | 29 | char cRXBuffer[64]; |
jah128 | 0:9ffe8ebd1c40 | 30 | |
jah128 | 0:9ffe8ebd1c40 | 31 | char cDataAvailable = 0; |
jah128 | 0:9ffe8ebd1c40 | 32 | |
jah128 | 1:b067a08ff54e | 33 | Alpha433::Alpha433(PinName mosi, PinName miso, PinName sck, PinName fss, PinName nirq) : Stream("Alpha433"), _spi(mosi,miso,sck), _fss(fss), _nirq_test(nirq), _nirq(nirq) |
jah128 | 1:b067a08ff54e | 34 | { |
jah128 | 1:b067a08ff54e | 35 | |
jah128 | 0:9ffe8ebd1c40 | 36 | } |
jah128 | 0:9ffe8ebd1c40 | 37 | |
jah128 | 1:b067a08ff54e | 38 | Alpha433::Alpha433() : Stream("Alpha433"), _spi(p5,p6,p7), _fss(p8), _nirq_test(p11), _nirq(p11) |
jah128 | 1:b067a08ff54e | 39 | { |
jah128 | 1:b067a08ff54e | 40 | |
jah128 | 0:9ffe8ebd1c40 | 41 | } |
jah128 | 0:9ffe8ebd1c40 | 42 | |
jah128 | 0:9ffe8ebd1c40 | 43 | |
jah128 | 0:9ffe8ebd1c40 | 44 | |
jah128 | 0:9ffe8ebd1c40 | 45 | |
jah128 | 0:9ffe8ebd1c40 | 46 | // RF Send Data |
jah128 | 0:9ffe8ebd1c40 | 47 | // |
jah128 | 0:9ffe8ebd1c40 | 48 | // Eg: |
jah128 | 0:9ffe8ebd1c40 | 49 | // unsigned char message[32]; |
jah128 | 0:9ffe8ebd1c40 | 50 | // unsigned char count; |
jah128 | 0:9ffe8ebd1c40 | 51 | // count = snprintf(message, 32, "Hello: %i", 42); |
jah128 | 0:9ffe8ebd1c40 | 52 | // sendString(count, message); |
jah128 | 0:9ffe8ebd1c40 | 53 | unsigned long Alpha433::sendString(char cCount, char* cBuffer) |
jah128 | 0:9ffe8ebd1c40 | 54 | { |
jah128 | 1:b067a08ff54e | 55 | // pc.printf("SendString called"); |
jah128 | 0:9ffe8ebd1c40 | 56 | unsigned char i = 0; |
jah128 | 0:9ffe8ebd1c40 | 57 | if(cRFStatus == ALPHA433_MODE_TRANSMITTING) {// RF already transmitting |
jah128 | 0:9ffe8ebd1c40 | 58 | if(RF_VERBOSE == 1)pc.printf("RF Error: Already transmitting\n"); |
jah128 | 0:9ffe8ebd1c40 | 59 | return 1; // Error |
jah128 | 1:b067a08ff54e | 60 | |
jah128 | 1:b067a08ff54e | 61 | } |
jah128 | 1:b067a08ff54e | 62 | |
jah128 | 0:9ffe8ebd1c40 | 63 | if(cCount > 62) {// Amount of data to high |
jah128 | 0:9ffe8ebd1c40 | 64 | if(RF_VERBOSE == 1)pc.printf("RF Error: Too much tx data\n"); |
jah128 | 0:9ffe8ebd1c40 | 65 | return 2; // Error |
jah128 | 1:b067a08ff54e | 66 | |
jah128 | 0:9ffe8ebd1c40 | 67 | } |
jah128 | 0:9ffe8ebd1c40 | 68 | if(cCount == 0) {// No Data |
jah128 | 0:9ffe8ebd1c40 | 69 | if(RF_VERBOSE == 1)pc.printf("RF Error: No tx data\n"); |
jah128 | 0:9ffe8ebd1c40 | 70 | return 3; // Error |
jah128 | 0:9ffe8ebd1c40 | 71 | } |
jah128 | 0:9ffe8ebd1c40 | 72 | cTXBuffer[i] = cCount; |
jah128 | 0:9ffe8ebd1c40 | 73 | |
jah128 | 1:b067a08ff54e | 74 | unsigned char checksum_byte = 0; |
jah128 | 0:9ffe8ebd1c40 | 75 | for(i=0; i<cCount; i++) {// make a copy |
jah128 | 0:9ffe8ebd1c40 | 76 | cTXBuffer[i+1] = cBuffer[i]; |
jah128 | 0:9ffe8ebd1c40 | 77 | checksum_byte ^= cBuffer[i]; |
jah128 | 1:b067a08ff54e | 78 | } |
jah128 | 0:9ffe8ebd1c40 | 79 | cTXBuffer[cCount+1] = checksum_byte; |
jah128 | 0:9ffe8ebd1c40 | 80 | if(RF_VERBOSE == 1)pc.printf("RF Message: \"%s\" Checksum: %2X\n",cBuffer,checksum_byte); |
jah128 | 0:9ffe8ebd1c40 | 81 | ssTransmitCount = cCount+3; // add count and checksum |
jah128 | 0:9ffe8ebd1c40 | 82 | ssTransmitPointer = -6; |
jah128 | 0:9ffe8ebd1c40 | 83 | cRFStatus = ALPHA433_MODE_SWITCHING; |
jah128 | 0:9ffe8ebd1c40 | 84 | disableReceiver(); |
jah128 | 0:9ffe8ebd1c40 | 85 | enableTransmitter(); |
jah128 | 1:b067a08ff54e | 86 | cRFStatus = ALPHA433_MODE_TRANSMITTING; |
jah128 | 1:b067a08ff54e | 87 | |
jah128 | 0:9ffe8ebd1c40 | 88 | if(RF_VERBOSE == 1)pc.printf("RF Transmitting"); |
jah128 | 0:9ffe8ebd1c40 | 89 | |
jah128 | 1:b067a08ff54e | 90 | while(ssTransmitPointer <= ssTransmitCount) { |
jah128 | 1:b067a08ff54e | 91 | while(_nirq_test); |
jah128 | 1:b067a08ff54e | 92 | if(ssTransmitPointer < -2) _write(0xB8AA); // send sync |
jah128 | 1:b067a08ff54e | 93 | else if(ssTransmitPointer == -2) _write(0xB82D); // send first part of the fifo pattern; |
jah128 | 1:b067a08ff54e | 94 | else if(ssTransmitPointer == -1) _write(0xB8D4); // send second part of the fifo pattern; |
jah128 | 1:b067a08ff54e | 95 | else if(ssTransmitPointer == ssTransmitCount) _write(0xB800); // send dummy byte |
jah128 | 1:b067a08ff54e | 96 | else _write(0xB800 | cTXBuffer[ssTransmitPointer]); // send data |
jah128 | 1:b067a08ff54e | 97 | ssTransmitPointer++; |
jah128 | 0:9ffe8ebd1c40 | 98 | } |
jah128 | 1:b067a08ff54e | 99 | |
jah128 | 0:9ffe8ebd1c40 | 100 | _write(0xB800); // send dummy byte, maybe redundant |
jah128 | 0:9ffe8ebd1c40 | 101 | disableTransmitter(); |
jah128 | 0:9ffe8ebd1c40 | 102 | enableReceiver(); |
jah128 | 0:9ffe8ebd1c40 | 103 | ssReceivePointer = 0; |
jah128 | 0:9ffe8ebd1c40 | 104 | cRFStatus = ALPHA433_MODE_RECEIVING; |
jah128 | 0:9ffe8ebd1c40 | 105 | return 0; |
jah128 | 0:9ffe8ebd1c40 | 106 | } |
jah128 | 0:9ffe8ebd1c40 | 107 | |
jah128 | 0:9ffe8ebd1c40 | 108 | // Enable RF Transmitter |
jah128 | 0:9ffe8ebd1c40 | 109 | void Alpha433::enableTransmitter(void) |
jah128 | 0:9ffe8ebd1c40 | 110 | { |
jah128 | 0:9ffe8ebd1c40 | 111 | if(RF_VERBOSE == 1)pc.printf("RF Enable TX\n"); |
jah128 | 0:9ffe8ebd1c40 | 112 | //RFCommand(0x8229); |
jah128 | 0:9ffe8ebd1c40 | 113 | _write(0x8229); |
jah128 | 0:9ffe8ebd1c40 | 114 | rf_led = 1; |
jah128 | 0:9ffe8ebd1c40 | 115 | } |
jah128 | 0:9ffe8ebd1c40 | 116 | |
jah128 | 0:9ffe8ebd1c40 | 117 | // Disable RF Transmitter |
jah128 | 0:9ffe8ebd1c40 | 118 | void Alpha433::disableTransmitter(void) |
jah128 | 0:9ffe8ebd1c40 | 119 | { |
jah128 | 0:9ffe8ebd1c40 | 120 | if(RF_VERBOSE == 1)pc.printf("RF Disable TX\n"); |
jah128 | 0:9ffe8ebd1c40 | 121 | //RFCommand(0x8209); |
jah128 | 0:9ffe8ebd1c40 | 122 | _write(0x8209); |
jah128 | 0:9ffe8ebd1c40 | 123 | rf_led = 0; |
jah128 | 0:9ffe8ebd1c40 | 124 | } |
jah128 | 0:9ffe8ebd1c40 | 125 | |
jah128 | 0:9ffe8ebd1c40 | 126 | |
jah128 | 0:9ffe8ebd1c40 | 127 | // Enable RF Receiver |
jah128 | 0:9ffe8ebd1c40 | 128 | void Alpha433::enableReceiver(void) |
jah128 | 0:9ffe8ebd1c40 | 129 | { |
jah128 | 0:9ffe8ebd1c40 | 130 | if(RF_VERBOSE == 1)pc.printf("RF Enable RX\n"); |
jah128 | 0:9ffe8ebd1c40 | 131 | //RFCommand(0x8288); |
jah128 | 0:9ffe8ebd1c40 | 132 | _write(0x8288); |
jah128 | 0:9ffe8ebd1c40 | 133 | //rx_led = 1; |
jah128 | 0:9ffe8ebd1c40 | 134 | enableFifoFill(); |
jah128 | 0:9ffe8ebd1c40 | 135 | } |
jah128 | 0:9ffe8ebd1c40 | 136 | |
jah128 | 0:9ffe8ebd1c40 | 137 | // Disable RF Receiver |
jah128 | 0:9ffe8ebd1c40 | 138 | void Alpha433::disableReceiver(void) |
jah128 | 1:b067a08ff54e | 139 | { |
jah128 | 1:b067a08ff54e | 140 | if(RF_VERBOSE == 1)pc.printf("RF Disable RX\n"); |
jah128 | 0:9ffe8ebd1c40 | 141 | //RFCommand(0x8208); |
jah128 | 0:9ffe8ebd1c40 | 142 | _write(0x8208); |
jah128 | 0:9ffe8ebd1c40 | 143 | //rx_led = 0; |
jah128 | 0:9ffe8ebd1c40 | 144 | disableFifoFill(); |
jah128 | 0:9ffe8ebd1c40 | 145 | } |
jah128 | 0:9ffe8ebd1c40 | 146 | |
jah128 | 0:9ffe8ebd1c40 | 147 | // SSI FiFo Clear |
jah128 | 0:9ffe8ebd1c40 | 148 | void Alpha433::clearBuffer(void) |
jah128 | 0:9ffe8ebd1c40 | 149 | { |
jah128 | 1:b067a08ff54e | 150 | while(_read(0xB000) != 0); |
jah128 | 0:9ffe8ebd1c40 | 151 | } |
jah128 | 0:9ffe8ebd1c40 | 152 | |
jah128 | 0:9ffe8ebd1c40 | 153 | // Reset RF |
jah128 | 0:9ffe8ebd1c40 | 154 | void Alpha433::rf_reset(void) |
jah128 | 0:9ffe8ebd1c40 | 155 | { |
jah128 | 0:9ffe8ebd1c40 | 156 | // Chip must be deselected |
jah128 | 0:9ffe8ebd1c40 | 157 | _fss = 1; |
jah128 | 0:9ffe8ebd1c40 | 158 | |
jah128 | 0:9ffe8ebd1c40 | 159 | // Setup the spi for 16 bit data, high steady state clock, second edge capture, with a 1MHz clock rate |
jah128 | 0:9ffe8ebd1c40 | 160 | _spi.format(16,0); //Was 16,3 |
jah128 | 0:9ffe8ebd1c40 | 161 | _spi.frequency(2000000); |
jah128 | 0:9ffe8ebd1c40 | 162 | _nirq.mode(PullUp); |
jah128 | 0:9ffe8ebd1c40 | 163 | _nirq.fall(this,&Alpha433::interrupt); |
jah128 | 0:9ffe8ebd1c40 | 164 | // Select the device by seting chip select low |
jah128 | 0:9ffe8ebd1c40 | 165 | _fss = 0; |
jah128 | 0:9ffe8ebd1c40 | 166 | //int_out=0; |
jah128 | 0:9ffe8ebd1c40 | 167 | |
jah128 | 0:9ffe8ebd1c40 | 168 | } |
jah128 | 0:9ffe8ebd1c40 | 169 | |
jah128 | 0:9ffe8ebd1c40 | 170 | void Alpha433::timeout(void) |
jah128 | 0:9ffe8ebd1c40 | 171 | { |
jah128 | 0:9ffe8ebd1c40 | 172 | if(RF_VERBOSE == 1)pc.printf("RF Error on read; resetting chip\n"); |
jah128 | 0:9ffe8ebd1c40 | 173 | rf_init(); |
jah128 | 0:9ffe8ebd1c40 | 174 | } |
jah128 | 0:9ffe8ebd1c40 | 175 | |
jah128 | 0:9ffe8ebd1c40 | 176 | // Initialise RF |
jah128 | 0:9ffe8ebd1c40 | 177 | void Alpha433::rf_init(void) |
jah128 | 0:9ffe8ebd1c40 | 178 | { |
jah128 | 1:b067a08ff54e | 179 | |
jah128 | 0:9ffe8ebd1c40 | 180 | if(RF_VERBOSE == 1)pc.printf("RF Init start\n"); |
jah128 | 0:9ffe8ebd1c40 | 181 | rf_reset(); // RF Hardware Reset |
jah128 | 1:b067a08ff54e | 182 | _write(0x0000); // read status to cancel prior interrupt |
jah128 | 0:9ffe8ebd1c40 | 183 | _write(0x8000 | ALPHA433_FREQUENCY | ALPHA433_CRYSTAL_LOAD | ALPHA433_USE_FIFO); |
jah128 | 0:9ffe8ebd1c40 | 184 | _write(0x9000 | ALPHA433_PIN20 | ALPHA433_VDI_RESPONSE | ALPHA433_BANDWIDTH | ALPHA433_LNA_GAIN | ALPHA433_RSSI); |
jah128 | 0:9ffe8ebd1c40 | 185 | _write(0xC228 | ALPHA433_CLOCK_RECOVERY | ALPHA433_FILTER | ALPHA433_DQD); |
jah128 | 0:9ffe8ebd1c40 | 186 | _write(0xCA00 | ALPHA433_FIFO_LEVEL | ALPHA433_FIFO_FILL | ALPHA433_HI_SENS_RESET); |
jah128 | 0:9ffe8ebd1c40 | 187 | _write(0xC400 | ALPHA433_AFC_MODE | ALPHA433_AFC_RANGE | ALPHA433_AFC_FINE_MODE | ALPHA433_AFC); |
jah128 | 0:9ffe8ebd1c40 | 188 | _write(0x9800 | ALPHA433_MOD_POLARITY | ALPHA433_MOD_FREQUENCY | ALPHA433_TX_POWER); |
jah128 | 0:9ffe8ebd1c40 | 189 | _write(0xC000 | ALPHA433_CLK_OUT | ALPHA433_LOW_BAT); |
jah128 | 0:9ffe8ebd1c40 | 190 | enableReceiver(); |
jah128 | 0:9ffe8ebd1c40 | 191 | ssReceivePointer = 0; |
jah128 | 0:9ffe8ebd1c40 | 192 | reset_timeout.attach(this,&Alpha433::timeout,TIMEOUT); |
jah128 | 0:9ffe8ebd1c40 | 193 | if(RF_VERBOSE == 1)pc.printf("RF Init end\n"); |
jah128 | 0:9ffe8ebd1c40 | 194 | cRFStatus = ALPHA433_MODE_RECEIVING; |
jah128 | 0:9ffe8ebd1c40 | 195 | } |
jah128 | 1:b067a08ff54e | 196 | |
jah128 | 1:b067a08ff54e | 197 | |
jah128 | 0:9ffe8ebd1c40 | 198 | // RF Interrupt |
jah128 | 0:9ffe8ebd1c40 | 199 | void Alpha433::interrupt(void) |
jah128 | 0:9ffe8ebd1c40 | 200 | { |
jah128 | 1:b067a08ff54e | 201 | if(cRFStatus == ALPHA433_MODE_RECEIVING) { |
jah128 | 1:b067a08ff54e | 202 | rf_led=1; |
jah128 | 1:b067a08ff54e | 203 | //Add reset timeout |
jah128 | 1:b067a08ff54e | 204 | reset_timeout.detach(); |
jah128 | 1:b067a08ff54e | 205 | reset_timeout.attach(this,&Alpha433::timeout,0.5); |
jah128 | 1:b067a08ff54e | 206 | //pc.printf("Rec. ISR\n"); |
jah128 | 1:b067a08ff54e | 207 | int res = _read(0x0000); |
jah128 | 1:b067a08ff54e | 208 | if(res==0) res = _read(0x0000); |
jah128 | 1:b067a08ff54e | 209 | char read_failure = 0; |
jah128 | 1:b067a08ff54e | 210 | |
jah128 | 1:b067a08ff54e | 211 | if (res & (ALPHA433_STATUS_TX_NEXT_BYTE | ALPHA433_STATUS_FIFO_LIMIT_REACHED)) { // RF: waiting for next Byte OR FIFO full |
jah128 | 1:b067a08ff54e | 212 | //pc.printf("Receiving"); |
jah128 | 1:b067a08ff54e | 213 | cRXBuffer[ssReceivePointer] = _read(0xB000) & 0xFF; // get data |
jah128 | 1:b067a08ff54e | 214 | if(ssReceivePointer == 0) { |
jah128 | 1:b067a08ff54e | 215 | ssReceiveCount = cRXBuffer[0]; |
jah128 | 0:9ffe8ebd1c40 | 216 | |
jah128 | 1:b067a08ff54e | 217 | if((ssReceiveCount == 0) || (ssReceiveCount > 62)) { // error amount of data |
jah128 | 1:b067a08ff54e | 218 | read_failure=1; |
jah128 | 1:b067a08ff54e | 219 | pc.printf("Error amount of RX data: %d\n",ssReceiveCount); |
jah128 | 1:b067a08ff54e | 220 | reset_timeout.detach(); |
jah128 | 1:b067a08ff54e | 221 | reset_timeout.attach(this,&Alpha433::timeout,TIMEOUT); |
jah128 | 1:b067a08ff54e | 222 | } else { |
jah128 | 1:b067a08ff54e | 223 | ssReceiveCount += 2; // add count + checksum |
jah128 | 1:b067a08ff54e | 224 | //pc.printf("\nBytes to receive: %d\n",ssReceiveCount); |
jah128 | 1:b067a08ff54e | 225 | } |
jah128 | 1:b067a08ff54e | 226 | |
jah128 | 1:b067a08ff54e | 227 | } |
jah128 | 1:b067a08ff54e | 228 | if(!read_failure) { |
jah128 | 1:b067a08ff54e | 229 | ssReceivePointer++; |
jah128 | 1:b067a08ff54e | 230 | if (ssReceivePointer >= ssReceiveCount) { // End transmission |
jah128 | 1:b067a08ff54e | 231 | disableFifoFill(); |
jah128 | 1:b067a08ff54e | 232 | enableFifoFill(); |
jah128 | 1:b067a08ff54e | 233 | //irqled=0; |
jah128 | 1:b067a08ff54e | 234 | reset_timeout.detach(); |
jah128 | 1:b067a08ff54e | 235 | reset_timeout.attach(this,&Alpha433::timeout,TIMEOUT); |
jah128 | 1:b067a08ff54e | 236 | ssReceivePointer = 0; |
jah128 | 1:b067a08ff54e | 237 | dataAvailable(cRXBuffer[0], &cRXBuffer[1]); |
jah128 | 1:b067a08ff54e | 238 | } |
jah128 | 1:b067a08ff54e | 239 | } else { |
jah128 | 1:b067a08ff54e | 240 | disableFifoFill(); |
jah128 | 1:b067a08ff54e | 241 | enableFifoFill(); |
jah128 | 1:b067a08ff54e | 242 | ssReceivePointer = 0; |
jah128 | 1:b067a08ff54e | 243 | reset_timeout.detach(); |
jah128 | 1:b067a08ff54e | 244 | reset_timeout.attach(this,&Alpha433::timeout,TIMEOUT); |
jah128 | 1:b067a08ff54e | 245 | } |
jah128 | 0:9ffe8ebd1c40 | 246 | } |
jah128 | 1:b067a08ff54e | 247 | } |
jah128 | 0:9ffe8ebd1c40 | 248 | } |
jah128 | 0:9ffe8ebd1c40 | 249 | |
jah128 | 0:9ffe8ebd1c40 | 250 | // RF Set Datarate |
jah128 | 0:9ffe8ebd1c40 | 251 | void Alpha433::setDatarate(unsigned long ulValue) |
jah128 | 0:9ffe8ebd1c40 | 252 | { |
jah128 | 0:9ffe8ebd1c40 | 253 | unsigned long ulRateCmd; |
jah128 | 0:9ffe8ebd1c40 | 254 | if(ulValue < 3000) ulRateCmd = 0x0080 | (10000000 / 29 / 8 / ulValue) - 1; |
jah128 | 0:9ffe8ebd1c40 | 255 | else ulRateCmd = 0x0000 | (10000000 / 29 / 1 / ulValue) - 1; |
jah128 | 0:9ffe8ebd1c40 | 256 | _write(0xC600 | ulRateCmd); |
jah128 | 0:9ffe8ebd1c40 | 257 | } |
jah128 | 0:9ffe8ebd1c40 | 258 | |
jah128 | 0:9ffe8ebd1c40 | 259 | // RF Set Frequency |
jah128 | 0:9ffe8ebd1c40 | 260 | void Alpha433::setFrequency(unsigned long ulValue) |
jah128 | 0:9ffe8ebd1c40 | 261 | { |
jah128 | 0:9ffe8ebd1c40 | 262 | unsigned long ulRateCmd; |
jah128 | 0:9ffe8ebd1c40 | 263 | |
jah128 | 0:9ffe8ebd1c40 | 264 | #if (ALPHA433_FREQUENCY == ALPHA433_FREQUENCY_315) |
jah128 | 0:9ffe8ebd1c40 | 265 | ulRateCmd = (ulValue - 10000000 * 1 * 31) * 4 / 10000; |
jah128 | 0:9ffe8ebd1c40 | 266 | |
jah128 | 0:9ffe8ebd1c40 | 267 | #elif (ALPHA433_FREQUENCY == ALPHA433_FREQUENCY_433) |
jah128 | 0:9ffe8ebd1c40 | 268 | ulRateCmd = (ulValue - 10000000 * 1 * 43) * 4 / 10000; |
jah128 | 0:9ffe8ebd1c40 | 269 | |
jah128 | 0:9ffe8ebd1c40 | 270 | #elif (ALPHA433_FREQUENCY == ALPHA433_FREQUENCY_868) |
jah128 | 0:9ffe8ebd1c40 | 271 | ulRateCmd = (ulValue - 10000000 * 2 * 43) * 4 / 10000; |
jah128 | 0:9ffe8ebd1c40 | 272 | |
jah128 | 0:9ffe8ebd1c40 | 273 | #elif (ALPHA433_FREQUENCY == ALPHA433_FREQUENCY_915) |
jah128 | 0:9ffe8ebd1c40 | 274 | ulRateCmd = (ulValue - 10000000 * 3 * 30) * 4 / 10000; |
jah128 | 0:9ffe8ebd1c40 | 275 | #endif |
jah128 | 0:9ffe8ebd1c40 | 276 | |
jah128 | 0:9ffe8ebd1c40 | 277 | _write(0xA000 | ulRateCmd); |
jah128 | 0:9ffe8ebd1c40 | 278 | } |
jah128 | 0:9ffe8ebd1c40 | 279 | |
jah128 | 0:9ffe8ebd1c40 | 280 | |
jah128 | 0:9ffe8ebd1c40 | 281 | |
jah128 | 0:9ffe8ebd1c40 | 282 | // Enable RF Receiver FiFo fill |
jah128 | 0:9ffe8ebd1c40 | 283 | void Alpha433::enableFifoFill(void) |
jah128 | 0:9ffe8ebd1c40 | 284 | { |
jah128 | 0:9ffe8ebd1c40 | 285 | _write(0xCA00 | ALPHA433_FIFO_LEVEL | ALPHA433_FIFO_FILL | ALPHA433_HI_SENS_RESET | 0x0002); |
jah128 | 0:9ffe8ebd1c40 | 286 | while((_read(0x0000) & ALPHA433_STATUS_FIFO_EMPTY) == 0); |
jah128 | 0:9ffe8ebd1c40 | 287 | } |
jah128 | 0:9ffe8ebd1c40 | 288 | |
jah128 | 0:9ffe8ebd1c40 | 289 | // Disable RF Receiver FiFo fill |
jah128 | 0:9ffe8ebd1c40 | 290 | void Alpha433::disableFifoFill(void) |
jah128 | 0:9ffe8ebd1c40 | 291 | { |
jah128 | 0:9ffe8ebd1c40 | 292 | _write(0xCA00 | ALPHA433_FIFO_LEVEL | ALPHA433_FIFO_FILL | ALPHA433_HI_SENS_RESET); |
jah128 | 0:9ffe8ebd1c40 | 293 | } |
jah128 | 0:9ffe8ebd1c40 | 294 | |
jah128 | 0:9ffe8ebd1c40 | 295 | // Handle new RF Data |
jah128 | 0:9ffe8ebd1c40 | 296 | void Alpha433::dataAvailable(char cCount, char* cBuffer) |
jah128 | 0:9ffe8ebd1c40 | 297 | { |
jah128 | 1:b067a08ff54e | 298 | char rstring [cCount+1]; |
jah128 | 1:b067a08ff54e | 299 | char checksum = 0; |
jah128 | 1:b067a08ff54e | 300 | int i; |
jah128 | 1:b067a08ff54e | 301 | for(i=0; i<cCount; i++) { |
jah128 | 1:b067a08ff54e | 302 | rstring[i]=cBuffer[i]; |
jah128 | 1:b067a08ff54e | 303 | checksum ^= rstring[i]; |
jah128 | 1:b067a08ff54e | 304 | } |
jah128 | 1:b067a08ff54e | 305 | rstring[cCount]=0; |
jah128 | 1:b067a08ff54e | 306 | if (cBuffer[cCount] != checksum) { |
jah128 | 0:9ffe8ebd1c40 | 307 | if(RF_VERBOSE == 1)pc.printf("RF Received [%d] \"%s\" (checksum failed: expected %02X, received %02X)%02X %02X\n",cCount,rstring,checksum,cBuffer[cCount],cBuffer[cCount-1],cBuffer[cCount+1]); |
jah128 | 1:b067a08ff54e | 308 | } else { |
jah128 | 1:b067a08ff54e | 309 | if(RF_VERBOSE == 1)pc.printf("RF Received [%d] \"%s\" (checksum passed)\n",cCount,rstring); |
jah128 | 1:b067a08ff54e | 310 | if(USE_COMMUNICATION_STACK == 1) { |
jah128 | 0:9ffe8ebd1c40 | 311 | processRadioData(rstring, cCount); |
jah128 | 1:b067a08ff54e | 312 | } else { |
jah128 | 1:b067a08ff54e | 313 | processRawRFData(rstring, cCount); |
jah128 | 1:b067a08ff54e | 314 | } |
jah128 | 1:b067a08ff54e | 315 | } |
jah128 | 0:9ffe8ebd1c40 | 316 | } |
jah128 | 0:9ffe8ebd1c40 | 317 | |
jah128 | 0:9ffe8ebd1c40 | 318 | |
jah128 | 0:9ffe8ebd1c40 | 319 | int Alpha433::readStatusByte() |
jah128 | 0:9ffe8ebd1c40 | 320 | { |
jah128 | 1:b067a08ff54e | 321 | if(RF_VERBOSE == 1)pc.printf("RF Reading status byte\n"); |
jah128 | 1:b067a08ff54e | 322 | return _read(0x0000); |
jah128 | 0:9ffe8ebd1c40 | 323 | } |
jah128 | 0:9ffe8ebd1c40 | 324 | |
jah128 | 0:9ffe8ebd1c40 | 325 | //-----PRIVATE FUNCTIONS----- |
jah128 | 0:9ffe8ebd1c40 | 326 | |
jah128 | 1:b067a08ff54e | 327 | void Alpha433::_write(int address) |
jah128 | 1:b067a08ff54e | 328 | { |
jah128 | 0:9ffe8ebd1c40 | 329 | _fss=0; //select the deivce |
jah128 | 0:9ffe8ebd1c40 | 330 | _spi.write(address); //write the address of where the data is to be written first |
jah128 | 0:9ffe8ebd1c40 | 331 | //pc.printf("Write data: %04X\n",address); |
jah128 | 0:9ffe8ebd1c40 | 332 | _fss=1; //deselect the device |
jah128 | 0:9ffe8ebd1c40 | 333 | } |
jah128 | 0:9ffe8ebd1c40 | 334 | |
jah128 | 1:b067a08ff54e | 335 | int Alpha433::_read(int address) |
jah128 | 1:b067a08ff54e | 336 | { |
jah128 | 0:9ffe8ebd1c40 | 337 | int _data; |
jah128 | 0:9ffe8ebd1c40 | 338 | _fss=0; //select the device |
jah128 | 0:9ffe8ebd1c40 | 339 | _data = _spi.write(address); //select the register |
jah128 | 0:9ffe8ebd1c40 | 340 | //pc.printf("Read data: %04X\n",_data); |
jah128 | 0:9ffe8ebd1c40 | 341 | _fss=1; //deselect the device |
jah128 | 0:9ffe8ebd1c40 | 342 | return _data; //return the data |
jah128 | 0:9ffe8ebd1c40 | 343 | |
jah128 | 0:9ffe8ebd1c40 | 344 | } |
jah128 | 0:9ffe8ebd1c40 | 345 | |
jah128 | 1:b067a08ff54e | 346 | int Alpha433::_putc (int c) |
jah128 | 1:b067a08ff54e | 347 | { |
jah128 | 0:9ffe8ebd1c40 | 348 | return(c); |
jah128 | 0:9ffe8ebd1c40 | 349 | } |
jah128 | 0:9ffe8ebd1c40 | 350 | |
jah128 | 1:b067a08ff54e | 351 | int Alpha433::_getc (void) |
jah128 | 1:b067a08ff54e | 352 | { |
jah128 | 0:9ffe8ebd1c40 | 353 | char r = 0; |
jah128 | 0:9ffe8ebd1c40 | 354 | return(r); |
jah128 | 0:9ffe8ebd1c40 | 355 | } |