uint8_t loraRead(uint8_t reg)
{
    SPI.beginTransaction(loraSPI);
    digitalWrite(LORA_CS, LOW);
    SPI.transfer(reg & 0x7F);
    uint8_t val = SPI.transfer(0x00);
    digitalWrite(LORA_CS, HIGH);
    SPI.endTransaction();
    return val;
}

void loraWrite(uint8_t reg, uint8_t val)
{
    SPI.beginTransaction(loraSPI);
    digitalWrite(LORA_CS, LOW);
    SPI.transfer(reg | 0x80);
    SPI.transfer(val);
    digitalWrite(LORA_CS, HIGH);
    SPI.endTransaction();
}

void loraBurstRead(uint8_t reg, uint8_t *buf, uint8_t len)
{
    SPI.beginTransaction(loraSPI);
    digitalWrite(LORA_CS, LOW);
    SPI.transfer(reg & 0x7F);
    while (len--) *buf++ = SPI.transfer(0);
    digitalWrite(LORA_CS, HIGH);
    SPI.endTransaction();
}

void loraBurstWrite(uint8_t reg, const uint8_t *buf, uint8_t len)
{
    SPI.beginTransaction(loraSPI);
    digitalWrite(LORA_CS, LOW);
    SPI.transfer(reg | 0x80);
    while (len--) SPI.transfer(*buf++);
    digitalWrite(LORA_CS, HIGH);
    SPI.endTransaction();
}