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.
TestCC1200.cpp
00001 // 00002 // Test suite for the CC1200 radio driver. 00003 // Provides a menu to configure radio options, and 00004 // attempts to send and receive a signal using two radios connected 00005 // to the processor. 00006 // 00007 00008 #include <mbed.h> 00009 #include <SerialStream.h> 00010 00011 #include <CC1200.h> 00012 #include <cinttypes> 00013 00014 // Pin definitions 00015 // change these to match your board setup 00016 #define PIN_SPI_MOSI P0_9 00017 #define PIN_SPI_MISO P0_8 00018 #define PIN_SPI_SCLK P0_7 00019 00020 #define PIN_TX_CS P0_6 00021 #define PIN_TX_RST P0_29 00022 00023 #define PIN_RX_CS P0_4 00024 #define PIN_RX_RST P0_30 00025 00026 BufferedSerial serial(USBTX, USBRX, 115200); 00027 SerialStream<BufferedSerial> pc(serial); 00028 00029 CC1200 txRadio(PIN_SPI_MOSI, PIN_SPI_MISO, PIN_SPI_SCLK, PIN_TX_CS, PIN_TX_RST, &pc); 00030 CC1200 rxRadio(PIN_SPI_MOSI, PIN_SPI_MISO, PIN_SPI_SCLK, PIN_RX_CS, PIN_RX_RST, &pc); 00031 00032 void checkExistance() 00033 { 00034 pc.printf("Checking TX radio.....\n"); 00035 bool txSuccess = txRadio.begin(); 00036 pc.printf("TX radio initialized: %s\n", txSuccess ? "true" : "false"); 00037 00038 pc.printf("Checking RX radio.....\n"); 00039 bool rxSuccess = rxRadio.begin(); 00040 pc.printf("RX radio initialized: %s\n", rxSuccess ? "true" : "false"); 00041 } 00042 00043 void checkSignalTransmit() 00044 { 00045 pc.printf("Initializing CC1200s.....\n"); 00046 txRadio.begin(); 00047 rxRadio.begin(); 00048 00049 pc.printf("Configuring RF settings.....\n"); 00050 00051 int config=-1; 00052 //MENU. ADD AN OPTION FOR EACH TEST. 00053 pc.printf("Select a config: \n"); 00054 // This is similar to the SmartRF "100ksps ARIB Standard" configuration, except it doesn't use zero-if 00055 pc.printf("1. 915MHz 100ksps 2-GFSK DEV=50kHz CHF=208kHz\n"); 00056 // This should be identical to the SmartRF "500ksps 4-GFSK Max Throughput ARIB Standard" configuration 00057 pc.printf("2. 915MHz 500ksps 4-GFSK DEV=400kHz CHF=1666kHz Zero-IF\n"); 00058 pc.printf("3. 915MHz 38.4ksps 2-GFSK DEV=20kHz CHF=833kHz\n"); 00059 pc.printf("4. 915MHz 100ksps 2-GFSK DEV=50kHz CHF=208kHz Fixed Length\n"); 00060 00061 00062 pc.scanf("%d", &config); 00063 printf("Running test with config %d:\n\n", config); 00064 00065 CC1200::PacketMode mode = CC1200::PacketMode::VARIABLE_LENGTH; 00066 CC1200::Band band = CC1200::Band::BAND_820_960MHz; 00067 float frequency = 915e6; 00068 const float txPower = 0; 00069 float fskDeviation; 00070 float symbolRate; 00071 float rxFilterBW; 00072 CC1200::ModFormat modFormat; 00073 CC1200::IFCfg ifCfg = CC1200::IFCfg::POSITIVE_DIV_8; 00074 bool imageCompEnabled = true; 00075 bool dcOffsetCorrEnabled = true; 00076 uint8_t agcRefLevel; 00077 00078 uint8_t dcFiltSettingCfg = 1; // default chip setting 00079 uint8_t dcFiltCutoffCfg = 4; // default chip setting 00080 uint8_t agcSettleWaitCfg = 2; 00081 00082 CC1200::SyncMode syncMode = CC1200::SyncMode::SYNC_32_BITS; 00083 uint32_t syncWord = 0x930B51DE; // default sync word 00084 uint8_t syncThreshold = 8; // TI seems to recommend this threshold for most configs above 100ksps 00085 00086 uint8_t preableLengthCfg = 5; // default chip setting 00087 uint8_t preambleFormatCfg = 0; // default chip setting 00088 00089 if(config == 1) 00090 { 00091 fskDeviation = 49896; 00092 symbolRate = 100000; 00093 rxFilterBW = 208300; 00094 modFormat = CC1200::ModFormat::GFSK_2; 00095 agcRefLevel = 0x2A; 00096 } 00097 else if(config == 2) 00098 { 00099 // SmartRF "500ksps 4-GFSK ARIB standard" config 00100 fskDeviation = 399169; 00101 symbolRate = 500000; 00102 rxFilterBW = 1666700; 00103 ifCfg = CC1200::IFCfg::ZERO; 00104 imageCompEnabled = false; 00105 dcOffsetCorrEnabled = true; 00106 modFormat = CC1200::ModFormat::GFSK_4; 00107 agcRefLevel = 0x2F; 00108 } 00109 else if(config == 3) 00110 { 00111 fskDeviation = 19989; 00112 symbolRate = 38400; 00113 rxFilterBW = 104200; 00114 modFormat = CC1200::ModFormat::GFSK_2; 00115 agcRefLevel = 0x27; 00116 agcSettleWaitCfg = 1; 00117 } 00118 else if(config == 4) 00119 { 00120 fskDeviation = 49896; 00121 symbolRate = 100000; 00122 rxFilterBW = 208300; 00123 modFormat = CC1200::ModFormat::GFSK_2; 00124 agcRefLevel = 0x2A; 00125 mode = CC1200::PacketMode::FIXED_LENGTH; 00126 } 00127 else 00128 { 00129 pc.printf("Invalid config number!"); 00130 return; 00131 } 00132 00133 for(CC1200 & radio : {std::ref(txRadio), std::ref(rxRadio)}) 00134 { 00135 00136 radio.configureFIFOMode(); 00137 radio.setPacketMode(mode); 00138 radio.setModulationFormat(modFormat); 00139 radio.setFSKDeviation(fskDeviation); 00140 radio.setSymbolRate(symbolRate); 00141 radio.setOutputPower(txPower); 00142 radio.setRadioFrequency(band, frequency); 00143 radio.setIFCfg(ifCfg, imageCompEnabled); 00144 radio.configureDCFilter(dcOffsetCorrEnabled, dcFiltSettingCfg, dcFiltCutoffCfg); 00145 radio.setRXFilterBandwidth(rxFilterBW); 00146 radio.configureSyncWord(syncWord, syncMode, syncThreshold); 00147 radio.configurePreamble(preableLengthCfg, preambleFormatCfg); 00148 00149 // AGC configuration (straight from SmartRF) 00150 radio.setAGCReferenceLevel(agcRefLevel); 00151 radio.setAGCSyncBehavior(CC1200::SyncBehavior::FREEZE_NONE); 00152 radio.setAGCSettleWait(agcSettleWaitCfg); 00153 if(ifCfg == CC1200::IFCfg::ZERO) 00154 { 00155 radio.setAGCGainTable(CC1200::GainTable::ZERO_IF, 11, 0); 00156 } 00157 else 00158 { 00159 // enable all AGC steps for NORMAL mode 00160 radio.setAGCGainTable(CC1200::GainTable::NORMAL, 17, 0); 00161 } 00162 radio.setAGCHysteresis(0b10); 00163 radio.setAGCSlewRate(0); 00164 } 00165 00166 // configure on-transmit actions 00167 txRadio.setOnTransmitState(CC1200::State::TX); 00168 rxRadio.setOnReceiveState(CC1200::State::RX, CC1200::State::RX); 00169 00170 pc.printf("Starting transmission.....\n"); 00171 00172 txRadio.startTX(); 00173 rxRadio.startRX(); 00174 00175 const char message[] = "Hello world!"; 00176 char receiveBuffer[sizeof(message)]; 00177 00178 if(mode == CC1200::PacketMode::FIXED_LENGTH) 00179 { 00180 txRadio.setPacketLength(sizeof(message) - 1); 00181 rxRadio.setPacketLength(sizeof(message) - 1); 00182 } 00183 00184 while(true) 00185 { 00186 ThisThread::sleep_for(1s); 00187 00188 pc.printf("\n---------------------------------\n"); 00189 00190 pc.printf("<<SENDING: %s\n", message); 00191 txRadio.enqueuePacket(message, sizeof(message) - 1); 00192 00193 00194 // update TX radio 00195 pc.printf("TX radio: state = 0x%" PRIx8 ", TX FIFO len = %zu, FS lock = 0x%u\n", 00196 static_cast<uint8_t>(txRadio.getState()), txRadio.getTXFIFOLen(), txRadio.readRegister(CC1200::ExtRegister::FSCAL_CTRL) & 1); 00197 00198 // wait a while for the packet to come in. 00199 ThisThread::sleep_for(10ms); 00200 00201 // wait the time we expect the message to take, with a safety factor of 2 00202 auto timeoutTime = std::chrono::microseconds(static_cast<int64_t>((1/symbolRate) * 1e-6f * sizeof(message) * 2)); 00203 00204 Timer packetReceiveTimeout; 00205 packetReceiveTimeout.start(); 00206 bool hasPacket; 00207 do 00208 { 00209 hasPacket = rxRadio.hasReceivedPacket(); 00210 } 00211 while(packetReceiveTimeout.elapsed_time() < timeoutTime && !hasPacket); 00212 00213 pc.printf("RX radio: state = 0x%" PRIx8 ", RX FIFO len = %zu\n", 00214 static_cast<uint8_t>(rxRadio.getState()), rxRadio.getRXFIFOLen()); 00215 if(hasPacket) 00216 { 00217 rxRadio.receivePacket(receiveBuffer, sizeof(message) - 1); 00218 receiveBuffer[sizeof(message)-1] = '\0'; 00219 pc.printf(">>RECEIVED: %s\n", receiveBuffer); 00220 } 00221 else 00222 { 00223 pc.printf(">>No packet received!\n"); 00224 } 00225 } 00226 } 00227 00228 00229 int main() 00230 { 00231 pc.printf("\nCC1200 Radio Test Suite:\n"); 00232 00233 while(1){ 00234 int test=-1; 00235 //MENU. ADD AN OPTION FOR EACH TEST. 00236 pc.printf("Select a test: \n"); 00237 pc.printf("1. Exit Test Suite\n"); 00238 pc.printf("2. Check Existence\n"); 00239 pc.printf("3. Check Transmitting Signal\n"); 00240 00241 pc.scanf("%d", &test); 00242 printf("Running test %d:\n\n", test); 00243 //SWITCH. ADD A CASE FOR EACH TEST. 00244 switch(test) { 00245 case 1: pc.printf("Exiting test suite.\n"); return 0; 00246 case 2: checkExistance(); break; 00247 case 3: checkSignalTransmit(); break; 00248 default: pc.printf("Invalid test number. Please run again.\n"); continue; 00249 } 00250 pc.printf("done.\r\n"); 00251 } 00252 00253 return 0; 00254 00255 }
Generated on Tue Jul 19 2022 21:31:07 by
1.7.2
CC1200