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