SX1278 RA-01, RA-02 LoRa library

  1. This code is deprecated. Use this: https://github.com/luk6xff/DevLibs/tree/master/LORA instead.
Committer:
igbt6
Date:
Sat Nov 16 16:34:57 2019 +0000
Revision:
0:4e8ef5758455
SX1278 - RA-01 Lora library

Who changed what in which revision?

UserRevisionLine numberNew contents of line
igbt6 0:4e8ef5758455 1 /**
igbt6 0:4e8ef5758455 2 * @brief: Implementation of a SX1278 platform dependent [MBED] radio functions
igbt6 0:4e8ef5758455 3 * @author: luk6xff
igbt6 0:4e8ef5758455 4 * @email: luszko@op.pl
igbt6 0:4e8ef5758455 5 * @date: 2019-11-15
igbt6 0:4e8ef5758455 6 */
igbt6 0:4e8ef5758455 7
igbt6 0:4e8ef5758455 8 #include "sx1278-mbed.h"
igbt6 0:4e8ef5758455 9
igbt6 0:4e8ef5758455 10
igbt6 0:4e8ef5758455 11 /**
igbt6 0:4e8ef5758455 12 * SPI Interface
igbt6 0:4e8ef5758455 13 */
igbt6 0:4e8ef5758455 14 SPI* spi; // mosimiso, sclk
igbt6 0:4e8ef5758455 15 DigitalOut* nss;
igbt6 0:4e8ef5758455 16
igbt6 0:4e8ef5758455 17 /**
igbt6 0:4e8ef5758455 18 * SX1278 Reset pin
igbt6 0:4e8ef5758455 19 */
igbt6 0:4e8ef5758455 20 DigitalInOut* reset;
igbt6 0:4e8ef5758455 21
igbt6 0:4e8ef5758455 22 /**
igbt6 0:4e8ef5758455 23 * SX1278 DIO pins
igbt6 0:4e8ef5758455 24 */
igbt6 0:4e8ef5758455 25 InterruptIn* dio0;
igbt6 0:4e8ef5758455 26 InterruptIn* dio1;
igbt6 0:4e8ef5758455 27 InterruptIn* dio2;
igbt6 0:4e8ef5758455 28 InterruptIn* dio3;
igbt6 0:4e8ef5758455 29 InterruptIn* dio4;
igbt6 0:4e8ef5758455 30 DigitalIn* dio5;
igbt6 0:4e8ef5758455 31
igbt6 0:4e8ef5758455 32 /**
igbt6 0:4e8ef5758455 33 * Tx and Rx timers
igbt6 0:4e8ef5758455 34 */
igbt6 0:4e8ef5758455 35 Timeout txTimeoutTimer;
igbt6 0:4e8ef5758455 36 Timeout rxTimeoutTimer;
igbt6 0:4e8ef5758455 37 Timeout rxTimeoutSyncWord;
igbt6 0:4e8ef5758455 38
igbt6 0:4e8ef5758455 39
igbt6 0:4e8ef5758455 40 //-----------------------------------------------------------------------------
igbt6 0:4e8ef5758455 41 void SX1278MbedInit(RadioEvents_t *events,
igbt6 0:4e8ef5758455 42 PinName _mosi, PinName _miso, PinName _sclk, PinName _nss,
igbt6 0:4e8ef5758455 43 PinName _reset,
igbt6 0:4e8ef5758455 44 PinName _dio0, PinName _dio1, PinName _dio2, PinName _dio3, PinName _dio4, PinName _dio5)
igbt6 0:4e8ef5758455 45
igbt6 0:4e8ef5758455 46 {
igbt6 0:4e8ef5758455 47 spi = new SPI(_mosi, _miso, _sclk);
igbt6 0:4e8ef5758455 48 nss = new DigitalOut(_nss);
igbt6 0:4e8ef5758455 49 reset = new DigitalInOut(_reset);
igbt6 0:4e8ef5758455 50 dio0 = new InterruptIn(_dio0);
igbt6 0:4e8ef5758455 51 dio1 = new InterruptIn(_dio1);
igbt6 0:4e8ef5758455 52 dio2 = new InterruptIn(_dio2);
igbt6 0:4e8ef5758455 53 dio3 = new InterruptIn(_dio3);
igbt6 0:4e8ef5758455 54 dio4 = new InterruptIn(_dio4);
igbt6 0:4e8ef5758455 55 dio5 = new DigitalIn(_dio5);
igbt6 0:4e8ef5758455 56
igbt6 0:4e8ef5758455 57 SX1278Init(events);
igbt6 0:4e8ef5758455 58 }
igbt6 0:4e8ef5758455 59
igbt6 0:4e8ef5758455 60 //-----------------------------------------------------------------------------
igbt6 0:4e8ef5758455 61 void SX1278MbedDeInit()
igbt6 0:4e8ef5758455 62 {
igbt6 0:4e8ef5758455 63 // IO
igbt6 0:4e8ef5758455 64 SX1278IoDeInit();
igbt6 0:4e8ef5758455 65 // Timers
igbt6 0:4e8ef5758455 66 txTimeoutTimer.detach();
igbt6 0:4e8ef5758455 67 rxTimeoutTimer.detach();
igbt6 0:4e8ef5758455 68 rxTimeoutSyncWord.detach();
igbt6 0:4e8ef5758455 69 }
igbt6 0:4e8ef5758455 70
igbt6 0:4e8ef5758455 71 //-----------------------------------------------------------------------------
igbt6 0:4e8ef5758455 72 void SX1278IoInit(void)
igbt6 0:4e8ef5758455 73 {
igbt6 0:4e8ef5758455 74 // Init SPI
igbt6 0:4e8ef5758455 75 *nss = 1;
igbt6 0:4e8ef5758455 76 spi->format(8,0);
igbt6 0:4e8ef5758455 77 uint32_t frequencyToSet = 8000000;
igbt6 0:4e8ef5758455 78 spi->frequency(frequencyToSet);
igbt6 0:4e8ef5758455 79 SX1278DelayMs(100);
igbt6 0:4e8ef5758455 80 }
igbt6 0:4e8ef5758455 81
igbt6 0:4e8ef5758455 82 //-----------------------------------------------------------------------------
igbt6 0:4e8ef5758455 83 void SX1278IoDeInit(void)
igbt6 0:4e8ef5758455 84 {
igbt6 0:4e8ef5758455 85 delete(spi);
igbt6 0:4e8ef5758455 86 delete(nss);
igbt6 0:4e8ef5758455 87 delete(reset);
igbt6 0:4e8ef5758455 88 delete(dio0);
igbt6 0:4e8ef5758455 89 delete(dio1);
igbt6 0:4e8ef5758455 90 delete(dio2);
igbt6 0:4e8ef5758455 91 delete(dio3);
igbt6 0:4e8ef5758455 92 delete(dio4);
igbt6 0:4e8ef5758455 93 delete(dio5);
igbt6 0:4e8ef5758455 94 }
igbt6 0:4e8ef5758455 95
igbt6 0:4e8ef5758455 96
igbt6 0:4e8ef5758455 97 //-----------------------------------------------------------------------------
igbt6 0:4e8ef5758455 98 void SX1278IoIrqInit(DioIrqHandler *irqHandlers)
igbt6 0:4e8ef5758455 99 {
igbt6 0:4e8ef5758455 100 dio0->rise(mbed::callback(irqHandlers[0]));
igbt6 0:4e8ef5758455 101 dio1->rise(mbed::callback(irqHandlers[1]));
igbt6 0:4e8ef5758455 102 dio2->rise(mbed::callback(irqHandlers[2]));
igbt6 0:4e8ef5758455 103 dio3->rise(mbed::callback(irqHandlers[3]));
igbt6 0:4e8ef5758455 104 dio4->rise(mbed::callback(irqHandlers[4]));
igbt6 0:4e8ef5758455 105 }
igbt6 0:4e8ef5758455 106
igbt6 0:4e8ef5758455 107 //-----------------------------------------------------------------------------
igbt6 0:4e8ef5758455 108 void SX1278Reset(void)
igbt6 0:4e8ef5758455 109 {
igbt6 0:4e8ef5758455 110 reset->output();
igbt6 0:4e8ef5758455 111 *reset = 0;
igbt6 0:4e8ef5758455 112 SX1278DelayMs(1);
igbt6 0:4e8ef5758455 113 reset->input();
igbt6 0:4e8ef5758455 114 SX1278DelayMs(6);
igbt6 0:4e8ef5758455 115 }
igbt6 0:4e8ef5758455 116
igbt6 0:4e8ef5758455 117 //-----------------------------------------------------------------------------
igbt6 0:4e8ef5758455 118 void SX1278WriteBuffer(uint8_t addr, uint8_t *buffer, uint8_t size)
igbt6 0:4e8ef5758455 119 {
igbt6 0:4e8ef5758455 120 uint8_t i;
igbt6 0:4e8ef5758455 121
igbt6 0:4e8ef5758455 122 *nss = 0;
igbt6 0:4e8ef5758455 123 spi->write(addr | 0x80);
igbt6 0:4e8ef5758455 124 for(i = 0; i < size; i++)
igbt6 0:4e8ef5758455 125 {
igbt6 0:4e8ef5758455 126 spi->write(buffer[i]);
igbt6 0:4e8ef5758455 127 }
igbt6 0:4e8ef5758455 128 *nss = 1;
igbt6 0:4e8ef5758455 129 }
igbt6 0:4e8ef5758455 130
igbt6 0:4e8ef5758455 131 //-----------------------------------------------------------------------------
igbt6 0:4e8ef5758455 132 void SX1278ReadBuffer(uint8_t addr, uint8_t *buffer, uint8_t size)
igbt6 0:4e8ef5758455 133 {
igbt6 0:4e8ef5758455 134 uint8_t i;
igbt6 0:4e8ef5758455 135
igbt6 0:4e8ef5758455 136 *nss = 0;
igbt6 0:4e8ef5758455 137 spi->write(addr & 0x7F);
igbt6 0:4e8ef5758455 138 for(i = 0; i < size; i++)
igbt6 0:4e8ef5758455 139 {
igbt6 0:4e8ef5758455 140 buffer[i] = spi->write(0);
igbt6 0:4e8ef5758455 141 }
igbt6 0:4e8ef5758455 142 *nss = 1;
igbt6 0:4e8ef5758455 143 }
igbt6 0:4e8ef5758455 144
igbt6 0:4e8ef5758455 145
igbt6 0:4e8ef5758455 146
igbt6 0:4e8ef5758455 147 //-----------------------------------------------------------------------------
igbt6 0:4e8ef5758455 148 void SX1278SetTimeout(TimeoutTimer_t timer, timeoutFuncPtr func, int timeout_ms)
igbt6 0:4e8ef5758455 149 {
igbt6 0:4e8ef5758455 150 switch(timer)
igbt6 0:4e8ef5758455 151 {
igbt6 0:4e8ef5758455 152 case RXTimeoutTimer:
igbt6 0:4e8ef5758455 153 {
igbt6 0:4e8ef5758455 154 if (func)
igbt6 0:4e8ef5758455 155 {
igbt6 0:4e8ef5758455 156 rxTimeoutTimer.attach_us(mbed::callback(func), timeout_ms*1000);
igbt6 0:4e8ef5758455 157 }
igbt6 0:4e8ef5758455 158 else
igbt6 0:4e8ef5758455 159 {
igbt6 0:4e8ef5758455 160 rxTimeoutTimer.detach();
igbt6 0:4e8ef5758455 161 }
igbt6 0:4e8ef5758455 162 break;
igbt6 0:4e8ef5758455 163 }
igbt6 0:4e8ef5758455 164 case TXTimeoutTimer:
igbt6 0:4e8ef5758455 165 {
igbt6 0:4e8ef5758455 166 if (func)
igbt6 0:4e8ef5758455 167 {
igbt6 0:4e8ef5758455 168 txTimeoutTimer.attach_us(mbed::callback(func), timeout_ms*1000);
igbt6 0:4e8ef5758455 169 }
igbt6 0:4e8ef5758455 170 else
igbt6 0:4e8ef5758455 171 {
igbt6 0:4e8ef5758455 172 txTimeoutTimer.detach();
igbt6 0:4e8ef5758455 173 }
igbt6 0:4e8ef5758455 174 break;
igbt6 0:4e8ef5758455 175 }
igbt6 0:4e8ef5758455 176 case RXTimeoutSyncWordTimer:
igbt6 0:4e8ef5758455 177 {
igbt6 0:4e8ef5758455 178 if (func)
igbt6 0:4e8ef5758455 179 {
igbt6 0:4e8ef5758455 180 rxTimeoutSyncWord.attach_us(mbed::callback(func), timeout_ms*1000);
igbt6 0:4e8ef5758455 181 }
igbt6 0:4e8ef5758455 182 else
igbt6 0:4e8ef5758455 183 {
igbt6 0:4e8ef5758455 184 rxTimeoutSyncWord.detach();
igbt6 0:4e8ef5758455 185 }
igbt6 0:4e8ef5758455 186 break;
igbt6 0:4e8ef5758455 187 }
igbt6 0:4e8ef5758455 188 }
igbt6 0:4e8ef5758455 189 }
igbt6 0:4e8ef5758455 190
igbt6 0:4e8ef5758455 191 //-----------------------------------------------------------------------------
igbt6 0:4e8ef5758455 192 void SX1278DelayMs(int ms)
igbt6 0:4e8ef5758455 193 {
igbt6 0:4e8ef5758455 194 wait_us(ms*1000);
igbt6 0:4e8ef5758455 195 }
igbt6 0:4e8ef5758455 196
igbt6 0:4e8ef5758455 197 //-----------------------------------------------------------------------------