EFR32 SOC as a small SDR

I recently participated in a project involving Silicon Labs EFR32 series sub-GHz transceiver SOCs. We noticed their documentation mentioned a raw IQ reception mode in a couple of places but did not tell much more about it. I've sometimes wondered if some of those low power transceiver chips with DSP modems would provide access to samples from their internal ADC and this seemed to be the first one I've seen that might actually do that.

Around the same time we happened to find some surplus 2.4 GHz EFR32MG1 modules. I thought they could become pretty interesting if I could make the IQ mode work. Something like a cheap single chip AM/FM/SSB/PSK31 receiver should be possible.

Trying to use a new microcontroller isn't usually easy and I'm not a big fan of embedded development. One has to install the compiler and possible IDE, learn to use them, find correct compiler parameters and programmer connections, find the documentation for the chip and spend hours learning the documentation just to get each peripheral working. It can take days of frustrating trial and error before anything actually happens. Having already gone through this with help of a couple of friends and thus being already somewhat familiar with the Simplicity Studio IDE, it felt easier to start experimenting with these EFR32 modules.

Some googling revealed that the mode does indeed exist and can be used by operating the receiver in FIFO mode. Simplicity Studio had an example project for using the transceiver in FIFO mode and it actually worked on the module without too much trouble. By slightly modifying the example, I eventually managed to get the IQ reception working!

I modified the example to transmit the IQ samples to UART and transferred them to a Linux PC through a USB-UART converter. With a small additional program at the PC doing type conversion, I had the signal going to gqrx and got some of the first waterfall views:

I was transmitting a frequency sweep from a signal generator but the received signal looked somehow strange. The reason was that at least part of the demodulator in the SOC was still running and its AFC was still enabled. You can see how the AFC starts to track the sweep when it has reached center of the passband. After disabling AFC the results started to make sense. Spectrum is still upside down even though I think I and Q are in the order specified in the documentation but that can be fixed by swapping them (or inverting one of them) anyway.

The receiver internally uses a low intermediate frequency but the provided IQ samples seem to have gone through a digital downconverter that shifts the signal to zero center frequency, filters it to the desired channel bandwidth and provides samples at a reasonable sample rate. This is generally a good thing as it makes it practical to process the samples on the 40 MHz Cortex-M4 core on the SOC when using sufficiently low bandwidths.

Radio configuration generator in the IDE somehow chooses the sample rate based on the selected symbol rate and channel bandwidth. After generating a configuration, the sample rate is reported in the generated file efr32_radio_configurator_log.txt.

To get started experimenting with them, download a git repository bundle of my first experiments and clone it with git clone -b master efr_fifotesti.bundle

Now it should be possible to make a small receiver with a band scope by connecting a few buttons, an SPI-connected display and driving headphones simply from a PWM output through a resistor and a capacitor. Now that's starting to require some real programming and construction effort so I did not immediately start doing it.

The SOC does not support IQ on transmit which limits the possibility to transmit arbitrary modulations. Crude FM transmission should be possible by using the modem in 4-FSK mode and quantizing speech to 4 levels. Dithering or delta-sigma modulation could be used to reduce quantization distortion but that would cause additional noise sidebands around the transmission. When using low power on UHF bands it may be acceptable though. MFSK based digital modes such as MFSK16, JT65 etc could work with the same principle, although short term frequency stability may not be good enough for them especially on 2.4 GHz. Decoding them might need an additional CPU as the SOC has only 32 kB RAM and the CPU isn't very fast either.

Building a handheld transceiver

After some of the initial experiments, I started to write software to display a spectrogram to show that it is indeed possible. OH2FTG started building an actual handheld transceiver using the same parts. We realized it is actually feasible to build a usable radio by connecting a few readily available modules and a few additional components together. This inspired me to continue developing the software and I also built my own handheld:

The software is still really limited and you can't really have a QSO with it yet but the concept looks promising. With an additional faster processor, one could also make a handheld for FSK-based FreeDV modes with a proper SDR demodulator, even though I'm personally not sufficiently interested in digital voice to start developing it just yet.

The software is available in geckokapula repository in github and I also occassionally update a compiled binary of it.