Difference between revisions of "User:JF/JF's note on PineDio devices"

Jump to navigation Jump to search
(Created page with "== USB LoRa adapter == 500px The Pine64 USB LoRa adapter is based on the Semtech SX1262 LoRa module and the CH341 USB bus converter chip....")
Tags: mobile web edit mobile edit
 
Line 244: Line 244:
* CH341 datasheet : [[File:CH341DS1.pdf]]
* CH341 datasheet : [[File:CH341DS1.pdf]]
* Semtech SX1262 datasheet : [https://semtech.my.salesforce.com/sfc/p/#E0000000JelG/a/2R000000HT76/7Nka9W5WgugoZe.xwIHJy6ebj1hW8UJ.USO_Pt2CLLo File on Semtech website (file is too big for the wiki)]
* Semtech SX1262 datasheet : [https://semtech.my.salesforce.com/sfc/p/#E0000000JelG/a/2R000000HT76/7Nka9W5WgugoZe.xwIHJy6ebj1hW8UJ.USO_Pt2CLLo File on Semtech website (file is too big for the wiki)]
== RAW LoRa communication between USB LoRa adapter and PineDio STACK ==
=== Test setup ===
* One Pine64 USB LoRa adapter (SX1262 + CH341)
* One PineDio STACK (BL604 + SX1262)
* One PyCom Lopy board (dev board based on ESP32 + LoRa module, MicroPython)
* One NooElec SDR adapter and GQRX running on my PC
The goal is to implement RAW LoRa communication between Pine64 LoRa devices (USB adapter + PineDio STACK at first, pinephone adapter later on).
The Lopy board allows me to debug my setup easily, as I know it's working correctly in both RX and TX.
I'm writing this section to share my experiments with RAW LoRa on those devices and maybe get some help on some issues. I'm a noob in RF and LoRa technologies !
=== RX on Pine64 devices ===
Setup : The Lopy board emits 16 Bytes every 5s
Using default TX settings on the Lopy (868Mhz, BW 125Khz, SF7, 8 preamble symbols, CR 4/5, IQ not inverted), the reception on both Pine64 devices was really poor : they would detect the preamble most of the time, but fail to check the CRC of the header or of the payload.
Then I change those settings : 868Mhz, BW 500Khz, SF12, 8 preamble symbols, CR 4/5, IQ inverted. Magically, the reception on both device was perfect!
Question : why the RX was not working with original settings and would work with the new ones?
=== TX from Pine64 devices ===
Using the same TX parameters as the previous test : 868Mhz, BW 500Khz, SF12, 8 preamble symbols, CR 4/5, IQ inverted
==== TX from the USB LoRa Adapter ====
On the SDR acquisition, the TX power seems lower than the Lopy board, even with TX power set to +22dB
[[File:USB-tx.png]]
The Lopy does not receive anything.
The STACK detects the message but detects a bad CRC. Indeed, the messages is scrambled...
[[File:Stack-rx.png]]
The RSSI and SNR are displayed. I notice that the RSSI is much lower for messages coming from the USB adapter than for messages coming from the Lopy
Questions :
- Is it normal that the power of the TX from the USB adapter looks much lower than the power from the lopy?
- What about the RSSI that is much lower on messages comng from the USB adapter?
- Why are the messages and CRC corrupted ?
==== TX from the PineDio STACK ====
On the SDR acquisition, the signal power looks similar than the Lopy.
[[File:Tx-stack.png]]
The Pine64 USB adapter receives the message but detects a bad CRC.
[[File:USB-rx.png]]
The Lopy board does not receive anything (probably because of messages with bad CRC that are dropped in lower level layers).
Questions :
- Why are the messages corrupted?
=== Code ===
==== PineDio STACK ====
Based on this driver: https://github.com/lupyuen/bl_iot_sdk/blob/pinedio/components/3rdparty/lora-sx1262/src/radio.c
  <nowiki>
  RadioEvents_t RadioEvents;
  RadioEvents.RxDone = OnRadioRxDone;
  RadioEvents.RxError = OnRadioRxError;
  RadioEvents.TxDone = OnRadioTxDone;
  Radio.Init(&RadioEvents);
  Radio.SetPublicNetwork(false);
  Radio.SetChannel(868000000);
  Radio.SetRxConfig(
          MODEM_LORA,
          2, //500khz
          12, //SF12
          1, // CR 4/5
          0, // N/A
          8, // preamble
          7, // symbol timeout
          0, // dynamic length
          0, // payload length
          1, // crc enabled
          0, // freq hoping disabled
          0, // hop period
          1, // no iq inversion
          1// continous receive
          );
  Radio.SetTxConfig(
          RadioModems_t::MODEM_LORA,
          0, // power
          0, //N/A
          2, // 500 khz
          12, // SF12
          1, // CR4/5
          8, // preamble
          false, // dynamic length
          true, // CRC ON
          false, // hop
          0, // hop period
          true, // invert iq
          0xffffffff // timeout
          );
  // RX
  Radio.Rx(0);
  while(1) {
    Radio.IrqProcess();
    vTaskDelay(100);
  }
  // OR TX
  const char msg[] = {"Hello, I'm a PineDio STACK!"};
  int i = 0;
  while(1) {
    Radio.IrqProcess();
    vTaskDelay(100);
    if((i % 30) ==0){
      printf("send...\r\n");
      Radio.Send((uint8_t *) msg, strlen(msg));
    }
    i++;
  }
</nowiki>
==== USB adapter ====
Based on this driver: https://github.com/YukiWorkshop/sx126x_driver
<nowiki>
  radio.Init();
  radio.SetRfFrequency(868000000);
  radio.SetBufferBaseAddresses(0, 0);
  SX126x::ModulationParams_t modulationParams;
  modulationParams.PacketType = SX126x::RadioPacketTypes_t::PACKET_TYPE_LORA;
  modulationParams.Params.LoRa.SpreadingFactor = SX126x::RadioLoRaSpreadingFactors_t::LORA_SF12;
  modulationParams.Params.LoRa.CodingRate = SX126x::RadioLoRaCodingRates_t::LORA_CR_4_5;
  modulationParams.Params.LoRa.Bandwidth = SX126x::RadioLoRaBandwidths_t::LORA_BW_500;
  modulationParams.Params.LoRa.LowDatarateOptimize = false;
  radio.SetModulationParams(modulationParams);
  SX126x::PacketParams_t packetParams;
  packetParams.PacketType = SX126x::RadioPacketTypes_t::PACKET_TYPE_LORA;
  packetParams.Params.LoRa.PreambleLength = 8;
  packetParams.Params.LoRa.HeaderType = SX126x::RadioLoRaPacketLengthsMode_t::LORA_PACKET_VARIABLE_LENGTH;
  packetParams.Params.LoRa.PayloadLength = 27;
  packetParams.Params.LoRa.CrcMode = SX126x::RadioLoRaCrcModes_t::LORA_CRC_ON;
  packetParams.Params.LoRa.InvertIQ = SX126x::RadioLoRaIQModes_t::LORA_IQ_INVERTED;
  radio.SetPacketParams(packetParams);
  radio.SetTxParams(22, SX126x::RADIO_RAMP_3400_US);
  radio.SetRegulatorMode(SX126x::RadioRegulatorMode_t::USE_DCDC);
  radio.SetDioIrqParams(0xffff, 0x0001, 0, 0);
 
// RX
  radio.SetRx(0xffffffff);
  while (1) {
    radio.ProcessIrqs();
    std::this_thread::sleep_for(std::chrono::milliseconds(500));
    }
// OR TX
  while (1) {
    radio.SetPayload(data, 27);
    radio.SetTx(0xffffffff);
    radio.ProcessIrqs();
    std::this_thread::sleep_for(std::chrono::milliseconds(500));
  }
</nowiki>