Hi there,
Something doesn’t add up? I did some additional checking… AL agrees
there is a Spreading Factor 6 (SF6) in the LoRa spec — but it’s a special case with strict limitations, and here’s the scoop:
Spreading Factor 6 (SF6) – Overview
Property | Value |
---|---|
Spreading Factor | SF6 |
Fastest SF | ![]() |
Shortest air time | ![]() |
Range | ![]() |
Sensitivity | ![]() |
Support | ![]() |
Why SF6 Is Rarely Used
SF6 has some serious caveats:
- Requires implicit header mode only (no automatic payload length).
- Short preamble — which can affect detection sensitivity.
- Not supported in many LoRa chips unless you dive deep into manual register configuration.
- RadioLib does not currently support SF6, as of latest stable releases.
Use Cases (if any)
- Super short-range links.
- When you need ultra-low latency (like 5–10 ms airtime).
- Controlled environments (e.g., inter-chip comms or testing setups).
Example Air Times Comparison (Payload = 12 bytes, 125 kHz BW)
SF | Air Time (approx) |
---|---|
6 | ~20 ms (fast!) |
7 | ~41 ms |
8 | ~72 ms |
12 | ~987 ms |
Recommended Minimum SF
For most SX1262 and LoRa setups (and for RadioLib), the minimum valid and usable SF is SF7.
Bottom Line
- Yes, SF6 exists.
- But: Not supported in RadioLib or most normal configurations.
- Use SF7–SF12 for compatibility, reliability, and real-world range.
I thought initially you needed more delay, but your not doing HDX, most setups use it this way. and my Pong times improved a lot.
1. Spreading Factor (SF) Increases On-Air Time
The Spreading Factor (SF) defines how much time it takes to send a packet. Higher SF = slower transmission, but longer range and better sensitivity.
SF | Approx. Air Time for 12 bytes (at BW 125 kHz, CR 4/5) |
---|---|
7 | ~41 ms |
8 | ~72 ms |
9 | ~144 ms |
10 | ~246 ms |
11 | ~494 ms |
12 | ~987 ms (! almost 1 second) |
So if you’re using SF12, it can take nearly a second just to send one packet. And the same goes for the response (e.g. PONG).
2. Turnaround Time Between TX and RX
After transmitting (e.g., a “PING”), the module has to switch from TX mode to RX mode. While fast, there’s still some processing time:
- Some delay in exiting TX mode
- Switching the hardware into RX mode (plus RadioLib library logic)
- Receiver may not be immediately ready if you switch too quickly
If you start listening too soon, you might miss the response, especially at longer ranges and higher SF.
3. Propagation Delay (Distance)
LoRa is long-range, and the speed of radio waves is finite — though small, propagation delay becomes measurable over kilometers.
Example:
- Speed of light = ~300,000 km/s
- At 10 km: Delay = ~33 µs
- This is tiny, but combined with RX startup time and processing, it adds up.
- LoRa RX Timeout and Missed Windows I was thinking this, but only in HDX setups
In the receiver, you often define a timeout — how long it waits for a packet. If this window is too short, the response may arrive late and be ignored.
For example:
radio.receive(buffer, length, timeout_ms);
If the timeout is too small (say 50 ms) and you’re using SF11 or SF12, you’ll miss packets — because the air time is longer than your RX window.
Best Practice: Match Timing to SF
- Use longer timeouts for higher SF (longer range).
- Insert short delays after TX before RX to allow full air time.
- Log air times or pre-calculate them using formulas or LoRa calculators (like Semtech’s spreadsheet).
Pro Tip:
Some folks dynamically calculate the airtime using:
float airTime = radio.getTimeOnAir(payloadLength); // ms
Then wait that long (+ a margin) before enabling RX.
Maybe a dynamic timeout system based on SF and payload size — it can improve your PING/PONG reliability significantly
Sorry but I think if your using Radio Lib, You never did post any code so what your thinking probably isn’t going to work like you think.
HTH
GL PJ