Unfinished v0.7, added bearing detection

Fork of Pi_Swarm_Library_v06_alpha by piswarm

Committer:
jah128
Date:
Mon Jun 30 07:58:31 2014 +0000
Revision:
11:5ebcb52726cf
Parent:
10:5c111c07a2ed
Added prototype bearing detection to pi swarm library;

Who changed what in which revision?

UserRevisionLine numberNew 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 11:5ebcb52726cf 7 * Version 0.7 May 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 }