SurreyEARS / Mbed 2 deprecated EARS-FlightCTRL

Dependencies:   mbed USBDevice

Branch:
dev-RFM69
Revision:
9:2a26eec46988
Parent:
5:f7c32f548d53
Child:
10:6fe476ec05aa
diff -r f7c32f548d53 -r 2a26eec46988 main.cpp
--- a/main.cpp	Sat Aug 01 16:33:45 2015 +0000
+++ b/main.cpp	Sat Aug 01 22:59:16 2015 +0000
@@ -1,5 +1,429 @@
 #include "mbed.h"
 
+#define FSTEP 61
+#define FXOSC 32000000
+
+enum Registers{
+    REG_FIFO = 0x00,
+    REG_OP_MODE = 0x01,
+    REG_DATA_MODULATION = 0x02,
+    REG_BITRATE_MSB = 0x03,
+    REG_BITRATE_LSB = 0x04,
+    REG_FDEV_MSB = 0x05,
+    REG_FDEV_LSB = 0x06,
+    REG_FREQ_MSB = 0x07,
+    REG_FREQ_MID = 0x08,
+    REG_FREQ_LSB = 0x09,
+    REG_OSC1 = 0x0A,
+    REG_AFC_CTRL = 0x0B,
+    REG_LISTEN_1 = 0x0D,
+    REG_LISTEN_2 = 0x0E,
+    REG_LISTEN_3 = 0x0F,
+    REG_VERSION = 0x10,
+    REG_PA_LEVEL = 0x11,
+    REG_PA_RAMP = 0x12,
+    REG_OCP = 0x13,
+    REG_LNA = 0x18,
+    REG_RX_BW = 0x19,
+    REG_AFC_BW = 0x1A,
+    REG_OOK_PEAK = 0x1B,
+    REG_OOK_AVG = 0x1C,
+    REG_OOK_FIX = 0x1D,
+    REG_AFC_FEI = 0x1E,
+    REG_AFC_MSB = 0x1F,
+    REG_AFC_LSB = 0x20,
+    REG_FEI_MSB = 0x21,
+    REG_FEI_LSB = 0x22,
+    REG_RSSI_CONFIG = 0x23,
+    REG_RSSI_VALUE = 0x24,
+    REG_DIO_MAPPING_1 = 0x25,
+    REG_DIO_MAPPING_2 = 0x26,
+    REG_IRQ_FLAGS_1 = 0x27,
+    REG_IRQ_FLAGS_2 = 0x28,
+    REG_RSSI_THRESH = 0x29,
+    REG_RX_TIMEOUT_1 = 0x2A,
+    REG_RX_TIMEOUT_2 =0x2B,
+    REG_PREAMBLE_MSB = 0x2C,
+    REG_PREAMBLE_LSB = 0x2D,
+    REG_SYNC_CONFIG = 0x2E,
+    REG_SYNC_VALUE_1 = 0x2F,
+    REG_SYNC_VALUE_2 = 0x30,
+    REG_SYNC_VALUE_3 = 0x31,
+    REG_SYNC_VALUE_4 = 0x32,
+    REG_SYNC_VALUE_5 = 0x33,
+    REG_SYNC_VALUE_6 = 0x34,
+    REG_SYNC_VALUE_7 = 0x35,
+    REG_SYNC_VALUE_8 = 0x36,
+    REG_PACKET_CONFIG_1 = 0x37,
+    REG_PAYLOAD_LENGTH = 0x38,
+    REG_NODE_ADRS = 0x39,
+    REG_BROADCAST_ADRS = 0x3A,
+    REG_AUTO_MODES = 0x3B,
+    REG_FIFO_THRESH = 0x3C,
+    REG_PACKET_CONFIG_2 = 0x3D,
+    REG_AES_KEY_1 = 0x3E,
+    REG_AES_KEY_2 = 0x3F,
+    REG_AES_KEY_3 = 0x40,
+    REG_AES_KEY_4 = 0x41,
+    REG_AES_KEY_5 = 0x42,
+    REG_AES_KEY_6 = 0x43,
+    REG_AES_KEY_7 = 0x44,
+    REG_AES_KEY_8 = 0x45,
+    REG_AES_KEY_9 = 0x46,
+    REG_AES_KEY_10 = 0x47,
+    REG_AES_KEY_11 = 0x48,
+    REG_AES_KEY_12 = 0x49,
+    REG_AES_KEY_13 = 0x4A,
+    REG_AES_KEY_14 = 0x4B,
+    REG_AES_KEY_15 = 0x4C,
+    REG_AES_KEY_16 = 0x4D,
+    REG_TEMP_1 = 0x4E,
+    REG_TEMP_2 = 0x4F
+};
+
+enum DataMode{
+   MODE_PACKET = 0x00,
+   MODE_CONTINUOUS_SYNC = 0x02,
+   MODE_CONTINUOUS_NOSYNC = 0x03
+};
+
+enum Modulation{
+    MODULATION_FSK,
+    MODULATION_OOK
+};   
+
+enum Shaping{
+    NONE,
+    GAUSSIAN_FULL,
+    GAUSSIAN_HALF,
+    GAUSSIAN_THIRD
+};
+
+SPI radio(PB_15, PB_14, PB_13);
+DigitalOut radioCS(PB_12,1);
+Serial pc(USBTX,USBRX);
+
+int getVersion(){
+    int version;
+    radioCS = 0;
+    radio.write(REG_VERSION);
+    version = radio.write(0x00);
+    radioCS = 1;
+    return version;
+}
+
+void setFreq(int freq){
+    freq /= FSTEP;
+    radioCS = 0;
+    radio.write(REG_FREQ_MSB | 0x80);
+    radio.write((freq>>16)&0xFF);
+    radio.write((freq>>8)&0xFF);
+    radio.write((freq)&0xFF);
+    radioCS=1;
+}
+
+int getFreq(){
+    int freq;
+    radioCS = 0;
+    radio.write(REG_FREQ_MSB);
+    freq = radio.write(0x00)<<16;
+    freq|= radio.write(0x00)<<8;
+    freq|= radio.write(0x00);
+    radioCS = 1;
+    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;
+    radio.write(REG_OP_MODE);
+    mode = radio.write(0x00);
+    radioCS = 1;
+    return mode;
+}
+
+void setFdev(int fdev){
+    fdev /= FSTEP;
+    radioCS = 0;
+    radio.write(REG_FDEV_MSB | 0x80);
+    radio.write((fdev >> 8) & 0x1F);
+    radio.write(fdev & 0xFF);
+    radioCS = 1;
+}
+
+int getFdev(){
+    int fdev;
+    radioCS = 0;
+    radio.write(REG_FDEV_MSB);
+    fdev = radio.write(0x00)<<8;
+    fdev |= radio.write(fdev)&0xFF;
+    radioCS = 1;
+    fdev *= FSTEP;
+    return fdev;
+}
+
+void setModulation(DataMode mode, Modulation modul, Shaping shape){
+    radioCS = 0;
+    radio.write(REG_DATA_MODULATION | 0x80);
+    radio.write((mode << 5)&0x60 | ((modul <<3)&0x18) | (shape&0x03));
+}
+
+void getModulation(DataMode mode, Modulation modul, Shaping shape){
+    //WRITE A GOOD THING HERE
+}
+
+void setBitrate(int bitrate){
+    bitrate /= FXOSC;
+    radioCS = 1;
+    radio.write(REG_BITRATE_MSB | 0x80);
+    radio.write((bitrate>>8)&0xFF);
+    radio.write(bitrate&0xFF);
+    radioCS = 1;
+}
+
+void getBitrate(){
+    int bitrate;
+    radioCS = 1;
+    radio.write(REG_BITRATE_MSB | 0x80);
+    bitrate = radio.write(0x00)<<8;
+    bitrate |= radio.write(0x00)&0xFF;
+    radioCS = 1;
+    bitrate *= FXOSC;
+}
+
+void setPALevel(int level){
+    char regPALevel;
+    if(level <= -2){//PA0
+        regPALevel = 0x80;
+        regPALevel |= (level + 18)&0xFF;
+    }else if(level <= 13){//PA1
+        regPALevel = 0x40;
+        regPALevel |= (level + 18)&0xFF;
+    }else if(level<=17){//PA1,PA2
+        regPALevel = 0xA0;
+        regPALevel |= (level + 14)&0xFF;
+    }else{
+        return;
+    }
+    radioCS = 0;
+    radio.write(REG_PA_LEVEL | 0x80);
+    radio.write(regPALevel);
+    radioCS = 1;
+}
+
+int getPALevel(){
+    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
+        regPALevel = 0xA0;
+        regPALevel |= (level + 14)&0xFF;
+    }else if(regPALevel&0x80){//PA0
+        level |= (regPALevel&0x1F - 18);
+    }else if(regPALevel&0x40){//PA1
+        regPALevel = 0x40;
+        regPALevel |= (level&0x1F - 18);
+    }else{
+        return 0;
+    }
+    return level;
+}
+
+void setOCP(bool enabled, char maxCurrent){
+    char regOCP = 0;
+    if(enabled){
+        regOCP = 0x10;
+    }
+    regOCP |= ((maxCurrent - 45)/5) & 0xFF;
+    radioCS = 0;
+    radio.write(REG_OCP | 0x80);
+    radio.write(regOCP);
+    radioCS = 1;
+}
+
+void getOCP(){
+    //SOMETHING GOOD HERE
+}
+
+void setLNA(char lnaZIn, bool agc, char gain){
+    char regLNA = 0;
+    if(lnaZIn == 200){
+        regLNA = 0x80;
+    }
+    if(!agc){        
+        if(gain>48){
+            regLNA |= 0x01;
+        }else{
+            regLNA |= (gain&0x07);
+        }
+    }
+    radioCS = 0;
+    radio.write(REG_LNA | 0x80);
+    radio.write(regLNA);
+    radioCS = 1;
+}
+
+void setLNA(char lnaZIn, bool agc, char gain){
+    //SOMETHING GOOD HERE
+}
+
+void setDIOMapping(int regValue){
+    radioCS = 0;
+    radio.write(REG_DIO_MAPPING_1|0x80);
+    radio.write((regValue>>8)&0xFF);
+    radio.write(regValue&0xFF);
+    radioCS = 1;
+}
+
+int setDIOMapping(){
+    int regValue;
+    radioCS = 0;
+    radio.write(REG_DIO_MAPPING_1|0x80);
+    regValue = radio.write(0x00)<<8;
+    regValue |= radio.write(0x00)&0xFF;
+    radioCS = 1;
+    return regValue;
+}
+
+void setSyncConfig(bool syncOn, bool fifoFillCondition, char syncSize, char syncTol){
+    char regSync = 0;
+    if(syncOn){
+        regSync |= 0x80;
+    }
+    if(fifoFillCondition){
+        regSync |= 0x40;
+    }
+    regSync |= ((syncSize&0x07)<<3);
+    regSync |= (syncTol&0x07);
+}
+
+void getSyncConfig(){
+    //SOMETHING GOOD
+}
+
+void setSyncValue(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)&0xFF);
+    radioCS = 1;
+}
+
+long long getSyncValue(){
+    long long value;
+    radioCS = 0;
+    radio.write(REG_SYNC_VALUE_1 | 0x80);
+    value = (radio.write(0x00)&0xFF)<<55;
+    value |= (radio.write(0x00)&0xFF)<<47;
+    value |= (radio.write(0x00)&0xFF)<<39;
+    value |= (radio.write(0x00)&0xFF)<<31;
+    value |= (radio.write(0x00)&0xFF)<<23;
+    value |= (radio.write(0x00)&0xFF)<<15;
+    value |= (radio.write(0x00)&0xFF)<<7;
+    value |= (radio.write(0x00)&0xFF);
+    radioCS = 1;
+    return value;
+}
+
+void setPacketConfig(bool variableLength, char dcFree, bool crcOn, bool crcAutoClearOff, char addressFiltering, char interPacketRxDelay,bool restartRx,bool autoRxRestartOn, bool aesOn){
+    char regPacketConfig1 = 0x00;
+    char regPacketConfig2 = 0x00;
+    if(variableLength){
+        regPacketConfig1 |= 0x80;
+    }
+    regPacketConfig1 |= (dcFree&0x03)<<5;
+    if(crcOn){
+        regPacketConfig1 |= 0x10;
+    }
+    if(crcAutoClearOff){
+        regPacketConfig1 |= 0x08;
+    }
+    regPacketConfig1 |= ((addressFiltering & 0x03)<<1);
+    
+    radioCS = 0;
+    radio.write(REG_PACKET_CONFIG_1|0x80);
+    radio.write(regPacketConfig1);
+    radioCS = 1;
+    
+    regPacketConfig2 |= ((interPacketRxDelay&0x0F)<<4);
+    if(restartRx){
+        regPacketConfig2 |= (1<<2);
+    }
+    if(autoRxRestartOn){
+        regPacketConfig2 |= (1<<1);
+    }
+    if(aesOn){
+        regPacketConfig2 |= 0x01;
+    }
+    radioCS = 0;
+    radio.write(REG_PACKET_CONFIG_2|0x80);
+    radio.write(regPacketConfig2);
+    radioCS = 1;
+}
+
+void getPacketConfig(){
+    //SOMETHING GOOD HERE
+}
+
+void setPayloadLength(char payloadLength){
+    radioCS = 0;
+    radio.write(REG_PAYLOAD_LENGTH | 0x80);
+    radio.write(payloadLength);
+    radioCS = 1;
+}
+
+
+char setPayloadLength(){
+    char payloadLength;
+    radioCS = 0;
+    radio.write(REG_PAYLOAD_LENGTH);
+    payloadLength = radio.write(0x00);
+    radioCS = 1;
+    return payloadLength;
+}
+
+void setFifoThreshold(char txStartCondition, char fifoThreshold){
+    radioCS = 0;
+    radio.write(REG_FIFO_THRESH | 0x80);
+    radio.write((txStartCondition<<7)|(fifoThreshold&0x7F));
+    radioCS = 1;
+}
+
+void getFifoThreshold(){
+    //SOMETHING GOOD HERE
+}
+
 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());
+    while(1){
+        //pc.printf("%d\n\r",getFreq());
+        //wait(1);
+        __WFI();
+    }
 }
\ No newline at end of file