LimeSDR is a Software Defined Radio that balances price and functionality. It has 2 full-duplex channels, 20kHz to 5GHz coverage (in theory, we will come to this later), and the ability to use an external clock and power supply built into the system. It uses LMS7002M, which uses a dedicated driver made by MyriadRF. In this post, I will go through the basic configuration of the environment and hardware usage.
LimeSDR software and hardware
Some important concepts before we start working on the SDR are its hardware and software composition. This is especially important if this is your first time using SDR devices with FPGA (RTL-SDR devices do not have FPGA, hence the price).
Hardware
Unless specifically mentioned, the LimeSDR we talk about in this series all refers to the LimeSDR USB 1v4s, a 2-channel, USB-A typed SDR board. Aside from it, LimeSDR has a common version called LimeSDR Mini, a smaller, single-channel device. There is also a rarer PCIe version of LimeSDR. The hardware and firmware of the three are not interchangeable, and you should never think by default that a process working on one (say, installing a USB driver on Windows) will work on another. Doing so may brick the device or even damage the hardware.
Software
LimeSDR’s “software” concept is wider than the case we see every day. It can be divided into three parts:
Client
The client refers to the software or application running on a host machine. For example, LimeSuite is a client, as are GNU Radio applications or generic SDR software like gqrx. Clients communicate with the device through a USB interface and retrieve data from it.
Firmware
LimeSDR has two onboard controlling units: the USB controller (CY3014) and the FPRF (LMS7002M). Both have dedicated storage for their firmware, which controls how they behave. We can usually reprogram and update the FPRF, which is the official firmware. The only case where programming the CY3014 is necessary is if you accidentally wipe its storage and it enters bootloader mode.
Gateware
The gateware refers to the programming used by the onboard FPGA, a Cyclone-IV chip. It is also stored in FLASH and will be used to reprogram the FPGA on the power cycle.
LimeSuite
LimeSuite is the official GUI, driver, and SDK base for LMS7002M-based radios.
Installing on Linux
There’s a possibility that LimeSuite is already in the distribution source. Some distros that bundle radio software, like Dragon OS or PiSDR, may even have it pre-installed. If so, this would be the recommended way of installing:
apt-cache search limesuite
sudo apt install limesuite liblimesuite-dev limesuite-udev limesuite-images
For development purposes, all packages from LimeSuite (dev
, etc.) are recommended. If the package manager does not come with LimeSuite, and you’re on Ubuntu, MyriadRF provides a PPA source to install LimeSuite.
sudo add-apt-repository -y ppa:myriadrf/drivers
sudo apt update
sudo apt install limesuite liblimesuite-dev limesuite-udev limesuite-images
sudo apt install soapysdr-tools soapysdr-module-lms7
If you are on a different distro, the more generic method is to build from the source. This requires some other packages to be pre-installed. This includes SoapySDR, the interface tool used with LimeSDR (instead of designing everything from scratch, MyriadRF provides code to integrate the SoapySDR standard driver with LimeSDR, so the development file of SoapySDR is necessary). If any of the following packages or their variations are unavailable on your distro, refer to their document on building from source.
sudo apt install git g++ cmake libsqlite3-dev libsoapysdr-dev libi2c-dev libusb-1.0-0-dev libwxgtk3.0-dev freeglut3-dev
git clone https://github.com/myriadrf/LimeSuite.git
cd LimeSuite
# Somehow they used the "build" name for one of their folders
mkdir build_dist
cd build_dist
cmake ../
make -j
sudo make install
sudo ldconfig
This should build and install the LimeSuite and its tools into the system PATH.
Installing on Windows
The “official” way to install LimeSuite on Windows is through PothosSDR. However, at the time of writing, PothosSDR has not been updated in 3 years, and the LimeSuite version is still on 21, while the latest release is already 23.10. Thus, to get the latest version of LimeSuite (and GNU Radio 3.10 instead of 3.8), we shall use RadioConda.
RadioConda is a cross-platform SDR software bundle based on conda. It can either be installed via the graphical installer from their release page or if you already have conda/anaconda/miniconda installed, through the conda prompt:
conda create -n radioconda -c conda-forge -c ryanvolz --only-deps radioconda
And it can be updated with:
# In earlier version of radioconda, mamba is not installed
# If you're fine using conda-forge in every environment, you can install mamba in the base envrionment
conda install -c conda-forge mamba
# Check the channels
conda config --show channels --env
# If the conda-forge and ryanvolz is not present
conda config --env --add channels conda-forge
conda config --env --add channels ryanvolz
mamba upgrade --all
Use of mamba
here is recommended because the update prioritizes conda-forge
and ryanvolz
channel. Keep using conda
, in theory, may also be fine, but there is a possibility that it will pick the default
channel over conda-forge
for some packages, which are not compatible with the other packages installed from conda-forge
.
Once everything is installed, LimeSuite can be found in <your_conda_env_path>/radioconda/Library/bin/LimeSuiteGUI.exe
. It can also be started directly from the radioconda
environment. However, LimeSDR in Windows needs specific drivers. The drivers can be downloaded from the official repository. Before installing the driver, LimeSDR may appear under “other devices”; after installing the driver, it should be under “Universal Serial Bus Controllers”. This should be fine if you are using LimeSuite from the PothosSDR environment. The one supplied with radioconda
uses libusb
, not cyusb
driver, so it’s necessary to use Zadig to change the device’s driver. After changing the driver to winusb
on Windows, the SDR should now appear under “Universal Serial Bus devices”.
LimeSuiteNG
MyriadRF launched a new set of tools and packages to manage LimeSDR family devices called LimeSuiteNG. Compared to the LimeSuite classic, it has a different UI, code binding (which leads to different GNU Radio drivers and everything else), and more functions to operate the LimeSDR directly on a lower level. I prefer using the classic LimeSuite for now because the new binding is not entirely stable and may not be adopted by other tools. However, the latest driver might be better if you are developing an LTS application version that does not rely on different tools.
For now, LimeSuiteNG does not provide packages or installers; it must be compiled from the source. To build it, the following package is necessary (mostly the same as LimeSuite):
libusb-1.0-dev
: enables support of USB interface deviceswxWidgets
: enables a graphical user interfacelibsoapysdr-dev
: enables the building of the LimeSuiteNG plugin for SoapySDRlinux-kernel-headers
: enables building of PCIe driver module for Linux kernel.gnuradio-dev
: enables building of plugin for GNU Radio.
When building on Windows, the equivalent (except the Linux kernel headers, needs the VC runtime). Specifically, the GNU Radio needs to be 3.10. The plugin code between each GNU Radio version is not compatible. Then, to compile it:
git clone https://github.com/myriadrf/LimeSuiteNG.git
cd LimeSuiteNG
cmake -B build && cd build
make -j
sudo make install
sudo ldconfig
The new interface is the same as the old one.
Hardware quick test
To confirm that the hardware and its driver are working fine, a quick test can be performed through LimeSuite to check the hardware status. The test uses the onboard RF loopback switch to connect RX to TX and see if the signal transmission and receiving work. To run this test, MyriadRF provides the config file and example waveform. Download both and extract the waveform file. Then, in LimeSuite, connect the device, load the config from the config file and select GUI --> chip
to write the config into the LimeSDR.
Then, configure the SXT by going to the SXT tab and selecting “calculate” and “tune”. You should see the log emitting:
INFO: SXT frequency set to 2100.000000 MHz

Similarly, configure the CLKGEN by going to the CLKGEN tab and selecting “calculate” and “tune”. You should see this other log:
INFO: CGEN frequency set to 245.760000 MHz

Then, enable RF loopback by going into Modules --> Board controls
, and select loopback on both channels:

And load the W-CDMA signal by going to Modules --> FPGA controls
, select W-CDMA and enable MIMO:

Now, the signal is playing automatically. You can go to the FFT viewer, pick the channels and start observing:

As long as the signal shows up correctly, the hardware is functioning. If not, LimeSuite most likely generated error logs from the attempt to configure the SDR, transmit, and receive the signal. Refer to the logs for possible faults.
Hardware calibration
When a new LimeSDR is produced, it loads the default configs, while each device has a slight difference in the RF front end and the clock. This usually shows up as signal frequency drift caused by hardware (as opposed to temperature), inaccuracy in filtering, etc. The firmware is designed to acknowledge this inaccuracy, has built-in essential calibration functions, and can accept some configurations to rectify the issue. Most applications designed to work with SDR can also calibrate the input and output on an application level. LimeSuite provides functions to perform such automatic calibrations. Because this requires the MCU to be reprogrammed, most other software using the LimeSuite library calls the LimeSuite to handle this part, so the effect would be the same as if you note the configurations in LimeSuite and replicate them somewhere else.
Power supply and cooling
LimeSDR has specific power supply requirements. It only runs on the USB 3.0 interface because it draws more power than the 2.5W USB 2.0 can provide. If your computer has a weak power supply to its USB ports and uses many USB devices, you may also need an individually powered hub.
The power supplied by the USB interface is likely not enough during transmission. LimeSDR can be used with a 3.5/1.35mm DC power supply between 6-12V. I use a power supply rated 9V, maximum 1.5A, which works fine in all my use cases. If you use an external power supply, check its quality and that it’s properly isolated, as it may introduce extra interference.
The device’s temperature may also get high when using the transmission function. This not only risks damaging the device (there is no built-in throttling mechanism based on temperature), but also affects the accuracy of the on-board TCO. To deal with this, I use an aluminium case for shielding and put a heating pad between the device and the case, turning the casing into an oversized heatsink. I also use a thermoelectric cooler for phones to attach to the case. This usually keeps the temperature at around 50 Celsius, even at maximum transmission power.
External reference clock
If there is a need to use a high-accuracy clock with LimeSDR, for example, one that remains stable across various temperature conditions, an external clock can be connected to LimeSDR. There are three requirements for the external clock:
- The frequency needs to be 10MHz. On LimeSDR, the reference clock is connected to ADF4002, which has a fixed external reference frequency. This is not a typical frequency from a reference clock, 1MHz/2MHz is more common.
- The P2P voltage must be above 0.8V, while the absolute voltage (relative to GND) is above -0.3V. This means the input is not symmetric to 0V but should stay above 0V—a digital clock signal instead of a reference signal for analogue devices.
- Some posts said that sine waves work fine, but I find that sometimes PLL cannot lock on to a frequency if I use a sine wave. Square waves are preferred.
My solution is a programmable GPSDO set to output 10MHz. If you use a clock intended for analogue signal mixing, you can add a DC bias to keep it above 0V and remove the low-pass filter to get something similar to a square wave.
Leave a Reply