SurreyEARS / Mbed 2 deprecated EARS-FlightCTRL

Dependencies:   mbed USBDevice

Branch:
dev-RFM69
Revision:
11:8f3e72f6a1e0
Parent:
10:6fe476ec05aa
--- a/main.cpp	Sat Aug 01 23:57:06 2015 +0000
+++ b/main.cpp	Tue Aug 18 12:32:13 2015 +0000
@@ -88,15 +88,23 @@
 };
 
 enum Modulation{
-    MODULATION_FSK,
-    MODULATION_OOK
+    MODULATION_FSK = 0x00,
+    MODULATION_OOK = 0x01
 };   
 
 enum Shaping{
-    NONE,
-    GAUSSIAN_FULL,
-    GAUSSIAN_HALF,
-    GAUSSIAN_THIRD
+    SHAPING_NONE = 0x00,
+    SHAPING_GAUSSIAN_FULL = 0x01,
+    SHAPING_GAUSSIAN_HALF = 0x02,
+    SHAPING_GAUSSIAN_THIRD = 0x03
+};
+
+enum OperatingMode{
+    MODE_SLEEP = 0x00,
+    MODE_STDBY = 0x01,
+    MODE_FS = 0x02,
+    MODE_TX = 0x03,
+    MODE_RX = 0x04
 };
 
 struct ModulationSetting{
@@ -142,7 +150,10 @@
 
 SPI radio(PB_15, PB_14, PB_13);
 DigitalOut radioCS(PB_12,1);
+DigitalOut led(LED1);
 Serial pc(USBTX,USBRX);
+InterruptIn dio2(PA_8);
+DigitalIn fifoNE(PA_8);
 
 int getVersion(){
     int version;
@@ -174,13 +185,6 @@
     return freq*FSTEP;
 }
 
-void setMode(char mode){
-    radioCS = 0;
-    radio.write(REG_OP_MODE|0x80);
-    radio.write(mode);
-    radioCS = 1;
-}
-
 char getMode(){
     char mode;
     radioCS = 0;
@@ -190,6 +194,42 @@
     return mode;
 }
 
+int getFlags(){
+    int flags;
+    radioCS = 0;
+    radio.write(REG_IRQ_FLAGS_1);
+    flags = radio.write(0x00)<<8;
+    radioCS = 1;
+    wait_ms(1);
+    radioCS = 0;
+    radio.write(REG_IRQ_FLAGS_2);
+    flags |= radio.write(0x00);
+    radioCS = 1;
+    return flags;
+}
+void setMode(char mode){
+    char localMode = getMode();
+    radioCS = 0;
+    radio.write(REG_OP_MODE|0x80);
+    radio.write((localMode&0xE3) | (mode<<2));
+    radioCS = 1;
+    if(mode!=0x00){
+        while(true){
+            if(mode == MODE_RX && getFlags()&0x8000){
+                break;
+            }
+            if(mode == MODE_TX && getFlags()&0x2000){
+                break;
+            }
+            pc.printf("Target:%02x,Current:%02x,FLags:%04x\n\r",mode,getMode(),getFlags());
+            wait_ms(1000);
+        }
+    }else{
+        pc.printf("%02x,%02x,%04x\n\r",mode,getMode(),getFlags());
+    }
+        
+}
+
 void setFdev(int fdev){
     fdev /= FSTEP;
     radioCS = 0;
@@ -239,14 +279,15 @@
     radioCS = 1;
 }
 
-void getBitrate(){
+int getBitrate(){
     int bitrate;
     radioCS = 1;
-    radio.write(REG_BITRATE_MSB | 0x80);
+    radio.write(REG_BITRATE_MSB);
     bitrate = radio.write(0x00)<<8;
     bitrate |= radio.write(0x00)&0xFF;
     radioCS = 1;
     bitrate *= FXOSC;
+    return bitrate;
 }
 
 void setPALevel(int level){
@@ -256,7 +297,7 @@
         regPALevel |= (level + 18)&0xFF;
     }else if(level <= 13){//PA1
         regPALevel = 0x40;
-        regPALevel |= (level + 18)&0xFF;
+        regPALevel |= (level + 18)&0x1F;
     }else if(level<=17){//PA1,PA2
         regPALevel = 0xA0;
         regPALevel |= (level + 14)&0xFF;
@@ -270,13 +311,13 @@
 }
 
 int getPALevel(){
-    int level = 0;
+    //int level = 0;
     char regPALevel;
     radioCS = 0;
     radio.write(REG_PA_LEVEL);
     regPALevel = radio.write(0x00);
     radioCS = 1;
-    if((regPALevel&0x80) || (regPALevel&0x40)){//PA1,PA2
+    /*if((regPALevel&0x80) || (regPALevel&0x40)){//PA1,PA2
         regPALevel = 0xA0;
         regPALevel |= (level + 14)&0xFF;
     }else if(regPALevel&0x80){//PA0
@@ -286,8 +327,8 @@
         regPALevel |= (level&0x1F - 18);
     }else{
         return 0;
-    }
-    return level;
+    }*/
+    return regPALevel;
 }
 
 void setOCP(ocpSetting ocp){
@@ -321,7 +362,7 @@
     }
     if(!lna.agc){        
         if(lna.gain>48){
-            regLNA |= 0x01;
+            regLNA |= 0x00;
         }else{
             regLNA |= (lna.gain&0x07);
         }
@@ -364,7 +405,7 @@
 int getDIOMapping(){
     int regValue;
     radioCS = 0;
-    radio.write(REG_DIO_MAPPING_1|0x80);
+    radio.write(REG_DIO_MAPPING_1);
     regValue = radio.write(0x00)<<8;
     regValue |= radio.write(0x00)&0xFF;
     radioCS = 1;
@@ -409,24 +450,24 @@
     return sync;
 }
 
-void setSyncValue(long long value){
+void setSyncValue(unsigned long long value){
     radioCS = 0;
     radio.write(REG_SYNC_VALUE_1 | 0x80);
-    radio.write((value>>55)&0xFF);
-    radio.write((value>>47)&0xFF);
-    radio.write((value>>39)&0xFF);
-    radio.write((value>>31)&0xFF);
-    radio.write((value>>23)&0xFF);
-    radio.write((value>>15)&0xFF);
-    radio.write((value>>7)&0xFF);
+    radio.write((value>>56)&0xFF);
+    radio.write((value>>48)&0xFF);
+    radio.write((value>>40)&0xFF);
+    radio.write((value>>32)&0xFF);
+    radio.write((value>>24)&0xFF);
+    radio.write((value>>16)&0xFF);
+    radio.write((value>>8)&0xFF);
     radio.write((value)&0xFF);
     radioCS = 1;
 }
 
-long long getSyncValue(){
-    long long value;
+unsigned long long getSyncValue(){
+    unsigned long long value;
     radioCS = 0;
-    radio.write(REG_SYNC_VALUE_1 | 0x80);
+    radio.write(REG_SYNC_VALUE_1);
     value = (radio.write(0x00)&0xFF)<<55;
     value |= (radio.write(0x00)&0xFF)<<47;
     value |= (radio.write(0x00)&0xFF)<<39;
@@ -480,11 +521,11 @@
     char regPacketConfig1;
     char regPacketConfig2;
     radioCS = 0;
-    radio.write(REG_PACKET_CONFIG_1|0x80);
+    radio.write(REG_PACKET_CONFIG_1);
     regPacketConfig1 = radio.write(0x00);
     radioCS = 1;
     radioCS = 0;
-    radio.write(REG_PACKET_CONFIG_2|0x80);
+    radio.write(REG_PACKET_CONFIG_2);
     regPacketConfig2 = radio.write(0x00);
     radioCS = 1;
     if(regPacketConfig1 & 0x80){
@@ -560,21 +601,246 @@
     return fifo;
 }
 
+void writeFifo(char value){
+    radioCS = 0;
+    radio.write(REG_FIFO | 0x80);
+    radio.write(value);
+    radioCS = 1;
+}
+
+char readFifo(){
+    char value;
+    radioCS = 0;
+    radio.write(REG_FIFO);
+    value = radio.write(0x00);
+    radioCS = 1;
+    return value;
+}
+
+int getRSSI(){
+    
+    int RSSI;
+    bool success = false;
+    char retryCount=0;
+    radioCS = 0;
+    radio.write(REG_RSSI_CONFIG|0x80);
+    radio.write(0x01);
+    radioCS = 1;
+    wait_ms(10);/*
+    while(retryCount<10){
+        radioCS = 0;
+        radio.write(REG_RSSI_CONFIG);
+        RSSI = radio.write(0x00);
+        radioCS = 1;
+        if(RSSI & 0x02){*/
+            radioCS = 0;
+            radio.write(REG_RSSI_VALUE);
+            RSSI = radio.write(0x00);
+            radioCS = 1;/*
+            success = true;
+            break;
+        }
+        retryCount++;
+        wait_ms(100);
+    }
+    if(success){*/
+        return RSSI;/*
+    }else{
+        return -999;
+    }*/
+}
+
+void setRSSIThreshold(signed char rssiThresh){
+    char local = rssiThresh * (-2);
+    radioCS = 0;
+    radio.write(REG_RSSI_THRESH | 0x80);
+    radio.write(local);
+    radioCS = 1;
+}
+
+signed char getRSSIThreshold(){
+    signed char local;
+    radioCS = 0;
+    radio.write(REG_RSSI_THRESH);
+    local = radio.write(0x00);
+    radioCS = 1;
+    return local / (-2);
+}
+
+void setPreamble(int preambleLength){
+    radioCS = 0;
+    radio.write(REG_PREAMBLE_MSB | 0x80);
+    radio.write((preambleLength>>8)&0xFF);
+    radio.write(preambleLength&0xFF);
+    radioCS = 1;
+}
+
+int getPreamble(){
+    int preambleLength;
+    radioCS = 0;
+    radio.write(REG_PREAMBLE_MSB);
+    preambleLength = radio.write(0x00)<<8;
+    preambleLength |= radio.write(0x00);
+    radioCS = 1;
+    return preambleLength;
+}
+
+char pcInBuff[255];
+char radioInBuff[255];
+
+void printRegisters(){
+    radioCS = 0;
+    radio.write(0x01);
+    for(int i=1;i<=0x4F;i++){
+        pc.printf("%02x,%02x\n\r",i,radio.write(0x00));
+    }
+    radioCS = 1;
+}
+
+void radioInit(){
+    ModulationSetting modSet;
+    modSet.mode = MODE_PACKET;
+    modSet.modulation = MODULATION_FSK;
+    modSet.shaping = SHAPING_NONE;
+    setModulation(modSet);
+    modSet = getModulation();
+    pc.printf("Modulation: %d,%d,%d\n\r",modSet.mode,modSet.modulation,modSet.shaping);
+    
+    setBitrate(2000);
+    pc.printf("Bitrate: %d\n\r",getBitrate());
+    
+    setFdev(5000);
+    pc.printf("Fdev: %d\n\r",getFdev());
+    
+    setFreq(434600000);
+    pc.printf("Frequency: %d\n\r",getFreq());
+    
+    //setPALevel(10);
+    pc.printf("PA Level: %02x\n\r",getPALevel());
+    
+    ocpSetting ocpSet;
+    ocpSet.enabled = true;
+    ocpSet.maxCurrent = 95;
+    setOCP(ocpSet);
+    ocpSet= getOCP();
+    pc.printf("OCP: %d,%d\n\r",ocpSet.enabled,ocpSet.maxCurrent);
+    
+    lnaSetting lnaSet;
+    lnaSet.ZIn = 50;
+    lnaSet.agc = false;
+    lnaSet.gain = 24;
+    setLNA(lnaSet);
+    lnaSet=getLNA();
+    pc.printf("LNA: %d,%d,%d\n\r",lnaSet.ZIn,lnaSet.agc,lnaSet.gain);
+
+    setDIOMapping(0x07);
+    pc.printf("DIO: %02x\n\r",getDIOMapping());
+    
+    syncSetting syncSet;
+    syncSet.syncOn = true;
+    syncSet.fifoFillCondition = true;
+    syncSet.syncSize = 3;
+    syncSet.syncTol = 0;
+    setSyncConfig(syncSet);
+    setSyncValue(0xFECFECFECFECFECA);
+    syncSet = getSyncConfig();
+    pc.printf("Sync: %d,%d,%d,%d,%d\n\r",syncSet.syncOn,syncSet.fifoFillCondition,syncSet.syncSize,syncSet.syncTol,getSyncValue());
+
+    packetSetting packetSet;
+    packetSet.variableLength = true;
+    packetSet.dcFree = 0;
+    packetSet.crcOn = true;
+    packetSet.crcAutoClearOff = 0;
+    packetSet.addressFiltering = 0;
+    packetSet.interPacketRxDelay = 0;
+    packetSet.restartRx = false;
+    packetSet.autoRxRestartOn = true;
+    packetSet.aesOn = false;
+    setPacketConfig(packetSet);
+    packetSet=getPacketConfig();
+    pc.printf("Packet: %d,%d,%d,%d,%d,%d,%d,%d,%d\n\r",packetSet.variableLength,packetSet.dcFree,packetSet.crcOn,packetSet.crcAutoClearOff,packetSet.addressFiltering,packetSet.interPacketRxDelay,packetSet.restartRx,packetSet.autoRxRestartOn,packetSet.aesOn);
+        
+    setRSSIThreshold(-3);
+    
+    setMode(MODE_RX);
+    pc.printf("Mode: %02x\n\r",getMode());
+    
+    printRegisters();
+}
+
+void radioTransmit(char* stringToSend, unsigned char length){
+        //dio2.disable_irq();
+        //set length
+        setPayloadLength(length);
+        //set tx mode
+        pc.printf("TX ");
+        setMode(MODE_TX);
+        //write to fifo
+        //add length
+        writeFifo(length);
+        for(int i=0;i<length;i++){
+            pc.putc(stringToSend[i]);
+            writeFifo(stringToSend[i]);
+        }
+        
+        while(getFlags()&0x04);
+        //set rx mode
+        pc.printf(" RX\n\r");
+        setMode(MODE_RX);
+        //dio2.enable_irq();
+    
+}
+
+void pcRxISR(){
+    char character = pc.getc();
+    static char counter=0;
+    pc.putc(character);
+    if(character == 13){
+        pcInBuff[counter] = 0;
+        pc.printf("%s\n\r",pcInBuff);
+        radioTransmit(pcInBuff,counter);
+        counter = 0;
+    }else{
+        pcInBuff[counter] = character;
+        counter++;
+    }
+}
+
+void radioReceive(){
+    static char counter=0;
+    while(fifoNE){
+        //char character = 
+        pc.putc(readFifo());
+        /*if(character == 13){
+            radioInBuff[counter] = 0;
+            counter = 0;
+            pc.printf("\n\rString: %s\n\r",radioInBuff);
+        }else{
+            radioInBuff[counter] = character;
+            counter++;
+        }*/
+    }
+}
 int main(){
     //Radio Dev  branch
-    radio.format(8,0);
-    //radio.frequency(1000000);
-    setMode(0x04);
-    wait(1);
-    pc.printf("Start\n\r");
-    pc.printf("%d\n\r",getFreq());
-    //wait(1);
-    setFreq(434650000);
-    wait(1);
-    pc.printf("%d\n\r",getFreq());
+    
+    pc.attach(&pcRxISR,Serial::RxIrq);
+    //dio2.rise(radioReceive);
+    
+    //setup radio
+    radioInit();
+    
+    //dio2.enable_irq();
+    
     while(1){
-        //pc.printf("%d\n\r",getFreq());
-        //wait(1);
-        __WFI();
+        //pc.printf("Mode: %02x,Flags: %04x, RSSI: %d\n\r",getMode(),getFlags(),getRSSI());
+        if((getFlags()&0x04)){
+            led = 1;
+            radioReceive();
+        }else{
+            led=0;
+        }
+        wait(1);
+        //__WFI();
     }
 }
\ No newline at end of file