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