SX1278 RA-01, RA-02 LoRa library
- This code is deprecated. Use this: https://github.com/luk6xff/DevLibs/tree/master/LORA instead.
platform/sx1278-mbed.cpp@0:4e8ef5758455, 2019-11-16 (annotated)
- 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?
User | Revision | Line number | New 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 | //----------------------------------------------------------------------------- |