Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Diff: main.cpp
- 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

