SX1278 RA-01, RA-02 LoRa library

  1. This code is deprecated. Use this: https://github.com/luk6xff/DevLibs/tree/master/LORA instead.

platform/sx1278-mbed.cpp

Committer:
igbt6
Date:
2019-11-16
Revision:
0:4e8ef5758455

File content as of revision 0:4e8ef5758455:

/**
 *  @brief:  Implementation of a SX1278 platform dependent [MBED] radio functions
 *  @author: luk6xff
 *  @email:  luszko@op.pl
 *  @date:   2019-11-15
 */

#include "sx1278-mbed.h"


/**
 * SPI Interface
 */
SPI* spi; // mosimiso, sclk
DigitalOut* nss;

/**
 * SX1278 Reset pin
 */
DigitalInOut* reset;

/**
 * SX1278 DIO pins
 */
InterruptIn* dio0;
InterruptIn* dio1;
InterruptIn* dio2; 
InterruptIn* dio3;
InterruptIn* dio4;
DigitalIn* dio5;

/**
 * Tx and Rx timers
 */
Timeout txTimeoutTimer;
Timeout rxTimeoutTimer;
Timeout rxTimeoutSyncWord;


//-----------------------------------------------------------------------------
void SX1278MbedInit(RadioEvents_t *events,
                    PinName _mosi, PinName _miso, PinName _sclk, PinName _nss, 
                    PinName _reset,
                    PinName _dio0, PinName _dio1, PinName _dio2, PinName _dio3, PinName _dio4, PinName _dio5)

{
    spi = new SPI(_mosi, _miso, _sclk);
    nss = new DigitalOut(_nss);
    reset = new DigitalInOut(_reset);
    dio0 = new InterruptIn(_dio0);
    dio1 = new InterruptIn(_dio1);
    dio2 = new InterruptIn(_dio2);
    dio3 = new InterruptIn(_dio3);
    dio4 = new InterruptIn(_dio4);
    dio5 = new DigitalIn(_dio5);

    SX1278Init(events);
}

//-----------------------------------------------------------------------------
void SX1278MbedDeInit()
{
    // IO
    SX1278IoDeInit();
    // Timers
    txTimeoutTimer.detach();
    rxTimeoutTimer.detach();
    rxTimeoutSyncWord.detach();
}

//-----------------------------------------------------------------------------
void SX1278IoInit(void)
{
    // Init SPI
    *nss = 1;    
    spi->format(8,0);   
    uint32_t frequencyToSet = 8000000;
    spi->frequency(frequencyToSet);
    SX1278DelayMs(100);
}

//-----------------------------------------------------------------------------
void SX1278IoDeInit(void)
{
    delete(spi);
    delete(nss);
    delete(reset); 
    delete(dio0);
    delete(dio1);
    delete(dio2);
    delete(dio3);
    delete(dio4);
    delete(dio5);
}


//-----------------------------------------------------------------------------
void SX1278IoIrqInit(DioIrqHandler *irqHandlers)
{
    dio0->rise(mbed::callback(irqHandlers[0]));
    dio1->rise(mbed::callback(irqHandlers[1]));
    dio2->rise(mbed::callback(irqHandlers[2]));
    dio3->rise(mbed::callback(irqHandlers[3]));
    dio4->rise(mbed::callback(irqHandlers[4]));
}

//-----------------------------------------------------------------------------
void SX1278Reset(void)
{
    reset->output();
    *reset = 0;
    SX1278DelayMs(1);
    reset->input();
    SX1278DelayMs(6);
}

//-----------------------------------------------------------------------------
void SX1278WriteBuffer(uint8_t addr, uint8_t *buffer, uint8_t size)
{
    uint8_t i;

    *nss = 0;
    spi->write(addr | 0x80);
    for(i = 0; i < size; i++)
    {
        spi->write(buffer[i]);
    }
    *nss = 1;
}

//-----------------------------------------------------------------------------
void SX1278ReadBuffer(uint8_t addr, uint8_t *buffer, uint8_t size)
{
    uint8_t i;

    *nss = 0;
    spi->write(addr & 0x7F);
    for(i = 0; i < size; i++)
    {
        buffer[i] = spi->write(0);
    }
    *nss = 1;
}



//-----------------------------------------------------------------------------
void SX1278SetTimeout(TimeoutTimer_t timer, timeoutFuncPtr func, int timeout_ms)
{
    switch(timer)
    {
	    case RXTimeoutTimer:
        {
            if (func)
            {
                rxTimeoutTimer.attach_us(mbed::callback(func), timeout_ms*1000);
            }
            else
            {
                rxTimeoutTimer.detach();
            }
            break;
        }
        case TXTimeoutTimer:
        {
            if (func)
            {
                txTimeoutTimer.attach_us(mbed::callback(func), timeout_ms*1000);
            }
            else
            {
                txTimeoutTimer.detach();
            }
            break;
        }
        case RXTimeoutSyncWordTimer:
        {
            if (func)
            {
                rxTimeoutSyncWord.attach_us(mbed::callback(func), timeout_ms*1000);
            }
            else
            {
                rxTimeoutSyncWord.detach();
            }
            break;
        }
    }
}

//-----------------------------------------------------------------------------
void SX1278DelayMs(int ms)
{
    wait_us(ms*1000);
}

//-----------------------------------------------------------------------------