SX1278 RA-01, RA-02 LoRa library
Embed:
(wiki syntax)
Show/hide line numbers
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 //-----------------------------------------------------------------------------
Generated on Tue Jul 12 2022 18:29:20 by 1.7.2