GNU Radio Out-of-Tree module providing: - Complete TX chain: PHYEncode → FrameGen → CSSMod - Complete RX chain: CSSDemod → FrameSync → PHYDecode - NETWORKID extraction/encoding (0-255 range) - All SF (7-12) and CR (4/5-4/8) combinations - Loopback tested with 24/24 configurations passing Key features: - Fractional SFD (2.25 downchirp) handling - Gray encode/decode with proper inverse operations - gr-lora_sdr compatible decode modes - GRC block definitions and example flowgraphs - Comprehensive documentation Discovered RYLR998 sync word mapping: sync_bin_1 = (NETWORKID >> 4) * 8 sync_bin_2 = (NETWORKID & 0x0F) * 8
160 lines
5.1 KiB
XML
160 lines
5.1 KiB
XML
<?xml version="1.0"?>
|
|
<flow_graph>
|
|
<timestamp>2024-01-01 00:00:00</timestamp>
|
|
<block>
|
|
<key>options</key>
|
|
<param>
|
|
<key>id</key>
|
|
<value>rylr998_bladerf_tx</value>
|
|
</param>
|
|
<param>
|
|
<key>title</key>
|
|
<value>RYLR998 BladeRF Transmitter</value>
|
|
</param>
|
|
<param>
|
|
<key>author</key>
|
|
<value>gr-rylr998</value>
|
|
</param>
|
|
<param>
|
|
<key>description</key>
|
|
<value>Transmit RYLR998-compatible LoRa frames via BladeRF SDR</value>
|
|
</param>
|
|
<param>
|
|
<key>generate_options</key>
|
|
<value>qt_gui</value>
|
|
</param>
|
|
</block>
|
|
|
|
<!-- Variables -->
|
|
<block>
|
|
<key>variable</key>
|
|
<param><key>id</key><value>sf</value></param>
|
|
<param><key>value</key><value>9</value></param>
|
|
</block>
|
|
<block>
|
|
<key>variable</key>
|
|
<param><key>id</key><value>sample_rate</value></param>
|
|
<param><key>value</key><value>125e3</value></param>
|
|
</block>
|
|
<block>
|
|
<key>variable</key>
|
|
<param><key>id</key><value>bw</value></param>
|
|
<param><key>value</key><value>125e3</value></param>
|
|
</block>
|
|
<block>
|
|
<key>variable</key>
|
|
<param><key>id</key><value>center_freq</value></param>
|
|
<param><key>value</key><value>915e6</value></param>
|
|
</block>
|
|
<block>
|
|
<key>variable</key>
|
|
<param><key>id</key><value>networkid</value></param>
|
|
<param><key>value</key><value>18</value></param>
|
|
</block>
|
|
<block>
|
|
<key>variable</key>
|
|
<param><key>id</key><value>tx_gain</value></param>
|
|
<param><key>value</key><value>-10</value></param>
|
|
</block>
|
|
<block>
|
|
<key>variable</key>
|
|
<param><key>id</key><value>tx_interval_ms</value></param>
|
|
<param><key>value</key><value>5000</value></param>
|
|
</block>
|
|
|
|
<!-- GUI Controls -->
|
|
<block>
|
|
<key>variable_qtgui_range</key>
|
|
<param><key>id</key><value>gain_slider</value></param>
|
|
<param><key>label</key><value>TX Gain (dB)</value></param>
|
|
<param><key>value</key><value>tx_gain</value></param>
|
|
<param><key>start</key><value>-20</value></param>
|
|
<param><key>stop</key><value>0</value></param>
|
|
<param><key>step</key><value>1</value></param>
|
|
</block>
|
|
|
|
<block>
|
|
<key>variable_qtgui_entry</key>
|
|
<param><key>id</key><value>tx_message</value></param>
|
|
<param><key>label</key><value>TX Message</value></param>
|
|
<param><key>value</key><value>"Hello from BladeRF!"</value></param>
|
|
</block>
|
|
|
|
<!-- Message Source -->
|
|
<block>
|
|
<key>blocks_message_strobe</key>
|
|
<param><key>id</key><value>message_strobe</value></param>
|
|
<param><key>msg</key><value>pmt.intern(tx_message)</value></param>
|
|
<param><key>period</key><value>tx_interval_ms</value></param>
|
|
</block>
|
|
|
|
<!-- RYLR998 Transmitter -->
|
|
<block>
|
|
<key>rylr998_tx</key>
|
|
<param><key>id</key><value>rylr998_tx_0</value></param>
|
|
<param><key>sf</key><value>sf</value></param>
|
|
<param><key>sample_rate</key><value>sample_rate</value></param>
|
|
<param><key>bw</key><value>bw</value></param>
|
|
<param><key>cr</key><value>1</value></param>
|
|
<param><key>has_crc</key><value>True</value></param>
|
|
<param><key>networkid</key><value>networkid</value></param>
|
|
<param><key>preamble_len</key><value>8</value></param>
|
|
</block>
|
|
|
|
<!-- BladeRF Sink (using SoapySDR) -->
|
|
<block>
|
|
<key>soapy_bladerf_sink</key>
|
|
<param><key>id</key><value>bladerf_sink</value></param>
|
|
<param><key>dev_args</key><value></value></param>
|
|
<param><key>samp_rate</key><value>sample_rate</value></param>
|
|
<param><key>center_freq0</key><value>center_freq</value></param>
|
|
<param><key>bandwidth0</key><value>bw</value></param>
|
|
<param><key>gain0</key><value>gain_slider</value></param>
|
|
</block>
|
|
|
|
<!-- QT GUI Displays -->
|
|
<block>
|
|
<key>qtgui_time_sink_x</key>
|
|
<param><key>id</key><value>time_sink</value></param>
|
|
<param><key>size</key><value>4096</value></param>
|
|
<param><key>srate</key><value>sample_rate</value></param>
|
|
<param><key>name</key><value>TX IQ Signal</value></param>
|
|
<param><key>type</key><value>complex</value></param>
|
|
</block>
|
|
|
|
<block>
|
|
<key>qtgui_freq_sink_x</key>
|
|
<param><key>id</key><value>freq_sink</value></param>
|
|
<param><key>fft_size</key><value>1024</value></param>
|
|
<param><key>samp_rate</key><value>sample_rate</value></param>
|
|
<param><key>center_freq</key><value>0</value></param>
|
|
<param><key>name</key><value>TX Spectrum</value></param>
|
|
</block>
|
|
|
|
<!-- Connections -->
|
|
<connection>
|
|
<source_block_id>message_strobe</source_block_id>
|
|
<sink_block_id>rylr998_tx_0</sink_block_id>
|
|
<source_key>strobe</source_key>
|
|
<sink_key>payload</sink_key>
|
|
</connection>
|
|
<connection>
|
|
<source_block_id>rylr998_tx_0</source_block_id>
|
|
<sink_block_id>bladerf_sink</sink_block_id>
|
|
<source_key>out</source_key>
|
|
<sink_key>0</sink_key>
|
|
</connection>
|
|
<connection>
|
|
<source_block_id>rylr998_tx_0</source_block_id>
|
|
<sink_block_id>time_sink</sink_block_id>
|
|
<source_key>out</source_key>
|
|
<sink_key>0</sink_key>
|
|
</connection>
|
|
<connection>
|
|
<source_block_id>rylr998_tx_0</source_block_id>
|
|
<sink_block_id>freq_sink</sink_block_id>
|
|
<source_key>out</source_key>
|
|
<sink_key>0</sink_key>
|
|
</connection>
|
|
</flow_graph>
|