SX1278 RA-01, RA-02 LoRa library

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers sx1278-mbed.cpp Source File

sx1278-mbed.cpp

00001 /**
00002  *  @brief:  Implementation of a SX1278 platform dependent [MBED] radio functions
00003  *  @author: luk6xff
00004  *  @email:  luszko@op.pl
00005  *  @date:   2019-11-15
00006  */
00007 
00008 #include "sx1278-mbed.h"
00009 
00010 
00011 /**
00012  * SPI Interface
00013  */
00014 SPI* spi; // mosimiso, sclk
00015 DigitalOut* nss;
00016 
00017 /**
00018  * SX1278 Reset pin
00019  */
00020 DigitalInOut* reset;
00021 
00022 /**
00023  * SX1278 DIO pins
00024  */
00025 InterruptIn* dio0;
00026 InterruptIn* dio1;
00027 InterruptIn* dio2; 
00028 InterruptIn* dio3;
00029 InterruptIn* dio4;
00030 DigitalIn* dio5;
00031 
00032 /**
00033  * Tx and Rx timers
00034  */
00035 Timeout txTimeoutTimer;
00036 Timeout rxTimeoutTimer;
00037 Timeout rxTimeoutSyncWord;
00038 
00039 
00040 //-----------------------------------------------------------------------------
00041 void SX1278MbedInit(RadioEvents_t *events,
00042                     PinName _mosi, PinName _miso, PinName _sclk, PinName _nss, 
00043                     PinName _reset,
00044                     PinName _dio0, PinName _dio1, PinName _dio2, PinName _dio3, PinName _dio4, PinName _dio5)
00045 
00046 {
00047     spi = new SPI(_mosi, _miso, _sclk);
00048     nss = new DigitalOut(_nss);
00049     reset = new DigitalInOut(_reset);
00050     dio0 = new InterruptIn(_dio0);
00051     dio1 = new InterruptIn(_dio1);
00052     dio2 = new InterruptIn(_dio2);
00053     dio3 = new InterruptIn(_dio3);
00054     dio4 = new InterruptIn(_dio4);
00055     dio5 = new DigitalIn(_dio5);
00056 
00057     SX1278Init(events);
00058 }
00059 
00060 //-----------------------------------------------------------------------------
00061 void SX1278MbedDeInit()
00062 {
00063     // IO
00064     SX1278IoDeInit();
00065     // Timers
00066     txTimeoutTimer.detach();
00067     rxTimeoutTimer.detach();
00068     rxTimeoutSyncWord.detach();
00069 }
00070 
00071 //-----------------------------------------------------------------------------
00072 void SX1278IoInit(void)
00073 {
00074     // Init SPI
00075     *nss = 1;    
00076     spi->format(8,0);   
00077     uint32_t frequencyToSet = 8000000;
00078     spi->frequency(frequencyToSet);
00079     SX1278DelayMs(100);
00080 }
00081 
00082 //-----------------------------------------------------------------------------
00083 void SX1278IoDeInit(void)
00084 {
00085     delete(spi);
00086     delete(nss);
00087     delete(reset); 
00088     delete(dio0);
00089     delete(dio1);
00090     delete(dio2);
00091     delete(dio3);
00092     delete(dio4);
00093     delete(dio5);
00094 }
00095 
00096 
00097 //-----------------------------------------------------------------------------
00098 void SX1278IoIrqInit(DioIrqHandler *irqHandlers)
00099 {
00100     dio0->rise(mbed::callback(irqHandlers[0]));
00101     dio1->rise(mbed::callback(irqHandlers[1]));
00102     dio2->rise(mbed::callback(irqHandlers[2]));
00103     dio3->rise(mbed::callback(irqHandlers[3]));
00104     dio4->rise(mbed::callback(irqHandlers[4]));
00105 }
00106 
00107 //-----------------------------------------------------------------------------
00108 void SX1278Reset(void)
00109 {
00110     reset->output();
00111     *reset = 0;
00112     SX1278DelayMs(1);
00113     reset->input();
00114     SX1278DelayMs(6);
00115 }
00116 
00117 //-----------------------------------------------------------------------------
00118 void SX1278WriteBuffer(uint8_t addr, uint8_t *buffer, uint8_t size)
00119 {
00120     uint8_t i;
00121 
00122     *nss = 0;
00123     spi->write(addr | 0x80);
00124     for(i = 0; i < size; i++)
00125     {
00126         spi->write(buffer[i]);
00127     }
00128     *nss = 1;
00129 }
00130 
00131 //-----------------------------------------------------------------------------
00132 void SX1278ReadBuffer(uint8_t addr, uint8_t *buffer, uint8_t size)
00133 {
00134     uint8_t i;
00135 
00136     *nss = 0;
00137     spi->write(addr & 0x7F);
00138     for(i = 0; i < size; i++)
00139     {
00140         buffer[i] = spi->write(0);
00141     }
00142     *nss = 1;
00143 }
00144 
00145 
00146 
00147 //-----------------------------------------------------------------------------
00148 void SX1278SetTimeout(TimeoutTimer_t timer, timeoutFuncPtr func, int timeout_ms)
00149 {
00150     switch(timer)
00151     {
00152         case RXTimeoutTimer:
00153         {
00154             if (func)
00155             {
00156                 rxTimeoutTimer.attach_us(mbed::callback(func), timeout_ms*1000);
00157             }
00158             else
00159             {
00160                 rxTimeoutTimer.detach();
00161             }
00162             break;
00163         }
00164         case TXTimeoutTimer:
00165         {
00166             if (func)
00167             {
00168                 txTimeoutTimer.attach_us(mbed::callback(func), timeout_ms*1000);
00169             }
00170             else
00171             {
00172                 txTimeoutTimer.detach();
00173             }
00174             break;
00175         }
00176         case RXTimeoutSyncWordTimer:
00177         {
00178             if (func)
00179             {
00180                 rxTimeoutSyncWord.attach_us(mbed::callback(func), timeout_ms*1000);
00181             }
00182             else
00183             {
00184                 rxTimeoutSyncWord.detach();
00185             }
00186             break;
00187         }
00188     }
00189 }
00190 
00191 //-----------------------------------------------------------------------------
00192 void SX1278DelayMs(int ms)
00193 {
00194     wait_us(ms*1000);
00195 }
00196 
00197 //-----------------------------------------------------------------------------