Mick Mick
/
SX1272_TestApp
Simple SX1272 Test Application
main.cpp@5:8d3e18491667, 2017-05-11 (annotated)
- Committer:
- mick_ccc
- Date:
- Thu May 11 14:59:23 2017 +0000
- Revision:
- 5:8d3e18491667
- Parent:
- 4:fac0fc95a644
Defined LoRaWAN EU channels
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
mick_ccc | 0:7e7575bda256 | 1 | #include "mbed.h" |
mick_ccc | 0:7e7575bda256 | 2 | |
mick_ccc | 3:e42efecbbe1b | 3 | #include "sx1272-hal.h" |
mick_ccc | 0:7e7575bda256 | 4 | #include "radio.h" |
mick_ccc | 3:e42efecbbe1b | 5 | #include "main.h" |
mick_ccc | 0:7e7575bda256 | 6 | |
mick_ccc | 3:e42efecbbe1b | 7 | #define TX_LOOP 1 |
mick_ccc | 4:fac0fc95a644 | 8 | #define PAYLOAD_SIZE_LONG 112 //97 |
mick_ccc | 4:fac0fc95a644 | 9 | #define PAYLOAD_SIZE_SHORT 12 |
mick_ccc | 4:fac0fc95a644 | 10 | |
mick_ccc | 5:8d3e18491667 | 11 | uint32_t Channels[10] = { |
mick_ccc | 5:8d3e18491667 | 12 | 867100000, |
mick_ccc | 5:8d3e18491667 | 13 | 867300000, |
mick_ccc | 5:8d3e18491667 | 14 | 867500000, |
mick_ccc | 5:8d3e18491667 | 15 | 867700000, |
mick_ccc | 5:8d3e18491667 | 16 | 867900000, |
mick_ccc | 5:8d3e18491667 | 17 | 868100000, |
mick_ccc | 5:8d3e18491667 | 18 | 868300000, |
mick_ccc | 5:8d3e18491667 | 19 | 868500000, |
mick_ccc | 5:8d3e18491667 | 20 | 868300000, |
mick_ccc | 5:8d3e18491667 | 21 | 868800000 |
mick_ccc | 5:8d3e18491667 | 22 | }; |
mick_ccc | 4:fac0fc95a644 | 23 | |
mick_ccc | 4:fac0fc95a644 | 24 | typedef enum Modulation |
mick_ccc | 4:fac0fc95a644 | 25 | { |
mick_ccc | 4:fac0fc95a644 | 26 | MOD_LORA, |
mick_ccc | 4:fac0fc95a644 | 27 | MOD_FSK |
mick_ccc | 4:fac0fc95a644 | 28 | } Modulation_t; |
mick_ccc | 4:fac0fc95a644 | 29 | |
mick_ccc | 4:fac0fc95a644 | 30 | typedef enum LoRaBandwidth |
mick_ccc | 4:fac0fc95a644 | 31 | { |
mick_ccc | 4:fac0fc95a644 | 32 | LORA_BW_125K, |
mick_ccc | 4:fac0fc95a644 | 33 | LORA_BW_250K, |
mick_ccc | 4:fac0fc95a644 | 34 | LORA_BW_500K, |
mick_ccc | 4:fac0fc95a644 | 35 | LORA_BW_NA |
mick_ccc | 4:fac0fc95a644 | 36 | } LoRaBandwidth_t; |
mick_ccc | 3:e42efecbbe1b | 37 | |
mick_ccc | 3:e42efecbbe1b | 38 | /*! |
mick_ccc | 3:e42efecbbe1b | 39 | * Serial communication for debug logs |
mick_ccc | 3:e42efecbbe1b | 40 | */ |
mick_ccc | 0:7e7575bda256 | 41 | Serial pc(USBTX, USBRX); // tx, rx |
mick_ccc | 3:e42efecbbe1b | 42 | |
mick_ccc | 3:e42efecbbe1b | 43 | /*! |
mick_ccc | 3:e42efecbbe1b | 44 | * Interrupt handler for nucleo user button |
mick_ccc | 3:e42efecbbe1b | 45 | */ |
mick_ccc | 3:e42efecbbe1b | 46 | InterruptIn DatarateButton( USER_BUTTON ); |
mick_ccc | 0:7e7575bda256 | 47 | |
mick_ccc | 3:e42efecbbe1b | 48 | /*! |
mick_ccc | 3:e42efecbbe1b | 49 | * Radio events function pointer |
mick_ccc | 3:e42efecbbe1b | 50 | */ |
mick_ccc | 3:e42efecbbe1b | 51 | static RadioEvents_t RadioEvents; |
mick_ccc | 3:e42efecbbe1b | 52 | |
mick_ccc | 3:e42efecbbe1b | 53 | /* |
mick_ccc | 3:e42efecbbe1b | 54 | * Global variables declarations |
mick_ccc | 3:e42efecbbe1b | 55 | */ |
mick_ccc | 3:e42efecbbe1b | 56 | SX1272MB2xAS Radio( NULL ); |
mick_ccc | 3:e42efecbbe1b | 57 | |
mick_ccc | 1:4c82bff12ad0 | 58 | static uint8_t LoRaWANBuffer[255]; |
mick_ccc | 1:4c82bff12ad0 | 59 | static uint16_t FCnt = 0; |
mick_ccc | 0:7e7575bda256 | 60 | |
mick_ccc | 3:e42efecbbe1b | 61 | /* |
mick_ccc | 3:e42efecbbe1b | 62 | * ISR variables declarations |
mick_ccc | 3:e42efecbbe1b | 63 | */ |
mick_ccc | 1:4c82bff12ad0 | 64 | static volatile bool SingleDatarate = true; |
mick_ccc | 3:e42efecbbe1b | 65 | static volatile uint8_t CurrentDatarate = 7; |
mick_ccc | 1:4c82bff12ad0 | 66 | static volatile bool ButtonPressed = false; |
mick_ccc | 0:7e7575bda256 | 67 | |
mick_ccc | 0:7e7575bda256 | 68 | /* -------------- */ |
mick_ccc | 0:7e7575bda256 | 69 | |
mick_ccc | 0:7e7575bda256 | 70 | void UserButtonPressed( void ) |
mick_ccc | 0:7e7575bda256 | 71 | { |
mick_ccc | 3:e42efecbbe1b | 72 | if( ButtonPressed == true ) |
mick_ccc | 3:e42efecbbe1b | 73 | { |
mick_ccc | 3:e42efecbbe1b | 74 | return; |
mick_ccc | 3:e42efecbbe1b | 75 | } |
mick_ccc | 3:e42efecbbe1b | 76 | |
mick_ccc | 1:4c82bff12ad0 | 77 | if( SingleDatarate == false ) |
mick_ccc | 0:7e7575bda256 | 78 | { |
mick_ccc | 1:4c82bff12ad0 | 79 | // Increase datarate by 1 |
mick_ccc | 1:4c82bff12ad0 | 80 | CurrentDatarate = (CurrentDatarate == 7) ? 12 : CurrentDatarate-1; |
mick_ccc | 0:7e7575bda256 | 81 | } |
mick_ccc | 1:4c82bff12ad0 | 82 | |
mick_ccc | 0:7e7575bda256 | 83 | ButtonPressed = true; |
mick_ccc | 0:7e7575bda256 | 84 | } |
mick_ccc | 0:7e7575bda256 | 85 | |
mick_ccc | 0:7e7575bda256 | 86 | /* -------------- */ |
mick_ccc | 0:7e7575bda256 | 87 | |
mick_ccc | 4:fac0fc95a644 | 88 | uint32_t SendPacket( uint32_t freq_hz, RadioModems_t modulation, LoRaBandwidth_t bw, uint8_t pkt_size ) |
mick_ccc | 4:fac0fc95a644 | 89 | { |
mick_ccc | 4:fac0fc95a644 | 90 | uint32_t TimeOnAir; |
mick_ccc | 4:fac0fc95a644 | 91 | |
mick_ccc | 4:fac0fc95a644 | 92 | Radio.SetChannel( freq_hz ); |
mick_ccc | 4:fac0fc95a644 | 93 | |
mick_ccc | 4:fac0fc95a644 | 94 | switch( modulation ) |
mick_ccc | 4:fac0fc95a644 | 95 | { |
mick_ccc | 4:fac0fc95a644 | 96 | case MODEM_LORA: |
mick_ccc | 5:8d3e18491667 | 97 | Radio.SetTxConfig( MODEM_LORA, 0, 0, bw, CurrentDatarate, 1, 8, false, true, 0, 0, false, 10e3 ); |
mick_ccc | 4:fac0fc95a644 | 98 | TimeOnAir = Radio.TimeOnAir( MODEM_LORA, pkt_size ); |
mick_ccc | 4:fac0fc95a644 | 99 | break; |
mick_ccc | 4:fac0fc95a644 | 100 | case MODEM_FSK: |
mick_ccc | 5:8d3e18491667 | 101 | Radio.SetTxConfig( MODEM_FSK, 0, 25e3, 0, 50e3, 0, 5, false, true, 0, 0, false, 3e3 ); |
mick_ccc | 4:fac0fc95a644 | 102 | TimeOnAir = Radio.TimeOnAir( MODEM_FSK, pkt_size ); |
mick_ccc | 4:fac0fc95a644 | 103 | break; |
mick_ccc | 4:fac0fc95a644 | 104 | default: |
mick_ccc | 4:fac0fc95a644 | 105 | break; |
mick_ccc | 4:fac0fc95a644 | 106 | } |
mick_ccc | 4:fac0fc95a644 | 107 | |
mick_ccc | 4:fac0fc95a644 | 108 | Radio.Send( LoRaWANBuffer, pkt_size ); |
mick_ccc | 4:fac0fc95a644 | 109 | |
mick_ccc | 4:fac0fc95a644 | 110 | return TimeOnAir; |
mick_ccc | 4:fac0fc95a644 | 111 | } |
mick_ccc | 4:fac0fc95a644 | 112 | |
mick_ccc | 4:fac0fc95a644 | 113 | /* -------------- */ |
mick_ccc | 4:fac0fc95a644 | 114 | |
mick_ccc | 0:7e7575bda256 | 115 | int main() { |
mick_ccc | 1:4c82bff12ad0 | 116 | Timer t; |
mick_ccc | 2:61713a461cf1 | 117 | double PktToA; |
mick_ccc | 3:e42efecbbe1b | 118 | int i; |
mick_ccc | 1:4c82bff12ad0 | 119 | |
mick_ccc | 3:e42efecbbe1b | 120 | pc.printf( "\n > Initializing... < \n" ); |
mick_ccc | 0:7e7575bda256 | 121 | |
mick_ccc | 0:7e7575bda256 | 122 | // Get USER button pressed |
mick_ccc | 0:7e7575bda256 | 123 | DatarateButton.fall( &UserButtonPressed ); |
mick_ccc | 0:7e7575bda256 | 124 | |
mick_ccc | 3:e42efecbbe1b | 125 | // Initialize Radio driver |
mick_ccc | 3:e42efecbbe1b | 126 | RadioEvents.TxDone = OnTxDone; |
mick_ccc | 3:e42efecbbe1b | 127 | RadioEvents.RxDone = OnRxDone; |
mick_ccc | 3:e42efecbbe1b | 128 | RadioEvents.RxError = OnRxError; |
mick_ccc | 3:e42efecbbe1b | 129 | RadioEvents.TxTimeout = OnTxTimeout; |
mick_ccc | 3:e42efecbbe1b | 130 | RadioEvents.RxTimeout = OnRxTimeout; |
mick_ccc | 3:e42efecbbe1b | 131 | Radio.Init( &RadioEvents ); |
mick_ccc | 3:e42efecbbe1b | 132 | |
mick_ccc | 3:e42efecbbe1b | 133 | // verify the connection with the board |
mick_ccc | 3:e42efecbbe1b | 134 | while( Radio.Read( REG_VERSION ) == 0x00 ) |
mick_ccc | 3:e42efecbbe1b | 135 | { |
mick_ccc | 3:e42efecbbe1b | 136 | pc.printf( "Radio could not be detected!\n", NULL ); |
mick_ccc | 3:e42efecbbe1b | 137 | wait( 1 ); |
mick_ccc | 3:e42efecbbe1b | 138 | } |
mick_ccc | 3:e42efecbbe1b | 139 | |
mick_ccc | 3:e42efecbbe1b | 140 | pc.printf( "\n > Board Type: SX1272MB2xAS < \n" ); |
mick_ccc | 3:e42efecbbe1b | 141 | |
mick_ccc | 3:e42efecbbe1b | 142 | Radio.SetPublicNetwork( true ); |
mick_ccc | 0:7e7575bda256 | 143 | |
mick_ccc | 0:7e7575bda256 | 144 | while( 1 ) |
mick_ccc | 0:7e7575bda256 | 145 | { |
mick_ccc | 2:61713a461cf1 | 146 | // Check if there is a packet to be sent |
mick_ccc | 0:7e7575bda256 | 147 | if( ButtonPressed == true ) |
mick_ccc | 0:7e7575bda256 | 148 | { |
mick_ccc | 1:4c82bff12ad0 | 149 | // Set packet payload |
mick_ccc | 3:e42efecbbe1b | 150 | LoRaWANBuffer[0] = 0x40; // Unconfirmed Data Up |
mick_ccc | 3:e42efecbbe1b | 151 | //LoRaWANBuffer[0] = 0x80; // Confirmed Data Up |
mick_ccc | 1:4c82bff12ad0 | 152 | LoRaWANBuffer[1] = 0x03; // DevAddr |
mick_ccc | 1:4c82bff12ad0 | 153 | LoRaWANBuffer[2] = 0x00; |
mick_ccc | 1:4c82bff12ad0 | 154 | LoRaWANBuffer[3] = 0xFE; |
mick_ccc | 1:4c82bff12ad0 | 155 | LoRaWANBuffer[4] = 0xCA; |
mick_ccc | 1:4c82bff12ad0 | 156 | LoRaWANBuffer[5] = 0x0; // FCtrl |
mick_ccc | 3:e42efecbbe1b | 157 | LoRaWANBuffer[6] = 0; // FCnt, filled later |
mick_ccc | 3:e42efecbbe1b | 158 | LoRaWANBuffer[7] = 0; // FCnt, filled later |
mick_ccc | 1:4c82bff12ad0 | 159 | LoRaWANBuffer[8] = 1; // FPort |
mick_ccc | 1:4c82bff12ad0 | 160 | LoRaWANBuffer[9] = 0x0; // FRMPayload |
mick_ccc | 5:8d3e18491667 | 161 | |
mick_ccc | 5:8d3e18491667 | 162 | #if 1 |
mick_ccc | 5:8d3e18491667 | 163 | FCnt = 0; |
mick_ccc | 5:8d3e18491667 | 164 | while( 1 ) |
mick_ccc | 5:8d3e18491667 | 165 | { |
mick_ccc | 5:8d3e18491667 | 166 | LoRaWANBuffer[6] = FCnt; |
mick_ccc | 5:8d3e18491667 | 167 | LoRaWANBuffer[7] = FCnt >> 8; |
mick_ccc | 5:8d3e18491667 | 168 | |
mick_ccc | 5:8d3e18491667 | 169 | // Send LoRa packet |
mick_ccc | 5:8d3e18491667 | 170 | PktToA = SendPacket( Channels[FCnt % 8], MODEM_LORA, LORA_BW_125K, PAYLOAD_SIZE_SHORT ); |
mick_ccc | 5:8d3e18491667 | 171 | //pc.printf( "(%d) Sending LoRa packet: Freq=%u, SF%u (%.1lfms), FCnt=%u...\n", i, TxFreq, CurrentDatarate, PktToA, FCnt ); |
mick_ccc | 5:8d3e18491667 | 172 | wait_ms( PktToA ); |
mick_ccc | 5:8d3e18491667 | 173 | Radio.Sleep( ); |
mick_ccc | 5:8d3e18491667 | 174 | |
mick_ccc | 5:8d3e18491667 | 175 | FCnt += 1; |
mick_ccc | 5:8d3e18491667 | 176 | } |
mick_ccc | 5:8d3e18491667 | 177 | #endif |
mick_ccc | 5:8d3e18491667 | 178 | |
mick_ccc | 5:8d3e18491667 | 179 | #if 0 |
mick_ccc | 3:e42efecbbe1b | 180 | FCnt = 0; |
mick_ccc | 3:e42efecbbe1b | 181 | for( i = 0; i < (int)TX_LOOP; i++ ) |
mick_ccc | 3:e42efecbbe1b | 182 | { |
mick_ccc | 3:e42efecbbe1b | 183 | LoRaWANBuffer[6] = FCnt; |
mick_ccc | 3:e42efecbbe1b | 184 | LoRaWANBuffer[7] = FCnt >> 8; |
mick_ccc | 3:e42efecbbe1b | 185 | |
mick_ccc | 3:e42efecbbe1b | 186 | // Send LoRa packet |
mick_ccc | 5:8d3e18491667 | 187 | PktToA = SendPacket( Channels[0], MODEM_LORA, LORA_BW_125K, PAYLOAD_SIZE_LONG ); |
mick_ccc | 4:fac0fc95a644 | 188 | //pc.printf( "(%d) Sending LoRa packet: Freq=%u, SF%u (%.1lfms), FCnt=%u...\n", i, TxFreq, CurrentDatarate, PktToA, FCnt ); |
mick_ccc | 3:e42efecbbe1b | 189 | wait_ms( PktToA ); |
mick_ccc | 4:fac0fc95a644 | 190 | Radio.Sleep( ); |
mick_ccc | 3:e42efecbbe1b | 191 | |
mick_ccc | 3:e42efecbbe1b | 192 | FCnt += 1; |
mick_ccc | 3:e42efecbbe1b | 193 | LoRaWANBuffer[6] = FCnt; |
mick_ccc | 3:e42efecbbe1b | 194 | LoRaWANBuffer[7] = FCnt >> 8; |
mick_ccc | 3:e42efecbbe1b | 195 | |
mick_ccc | 3:e42efecbbe1b | 196 | // Send FSK packet |
mick_ccc | 5:8d3e18491667 | 197 | PktToA = SendPacket( Channels[0], MODEM_FSK, LORA_BW_NA, PAYLOAD_SIZE_SHORT ); |
mick_ccc | 4:fac0fc95a644 | 198 | //pc.printf( "(%d) Sending FSK packet: Freq=%u, FCnt=%u...\n", i, TxFreq, PktToA, FCnt ); |
mick_ccc | 3:e42efecbbe1b | 199 | wait_ms( PktToA ); |
mick_ccc | 4:fac0fc95a644 | 200 | Radio.Sleep( ); |
mick_ccc | 5:8d3e18491667 | 201 | |
mick_ccc | 4:fac0fc95a644 | 202 | FCnt += 1; |
mick_ccc | 4:fac0fc95a644 | 203 | LoRaWANBuffer[6] = FCnt; |
mick_ccc | 4:fac0fc95a644 | 204 | LoRaWANBuffer[7] = FCnt >> 8; |
mick_ccc | 4:fac0fc95a644 | 205 | |
mick_ccc | 4:fac0fc95a644 | 206 | // Send LoRa packet |
mick_ccc | 5:8d3e18491667 | 207 | PktToA = SendPacket( Channels[8], MODEM_LORA, LORA_BW_500K, PAYLOAD_SIZE_SHORT ); |
mick_ccc | 4:fac0fc95a644 | 208 | //pc.printf( "(%d) Sending LoRa packet: Freq=%u, SF%u (%.1lfms), FCnt=%u...\n", i, TxFreq, CurrentDatarate, PktToA, FCnt ); |
mick_ccc | 4:fac0fc95a644 | 209 | wait_ms( PktToA ); |
mick_ccc | 4:fac0fc95a644 | 210 | Radio.Sleep( ); |
mick_ccc | 4:fac0fc95a644 | 211 | |
mick_ccc | 3:e42efecbbe1b | 212 | FCnt += 1; |
mick_ccc | 3:e42efecbbe1b | 213 | } |
mick_ccc | 5:8d3e18491667 | 214 | #endif |
mick_ccc | 0:7e7575bda256 | 215 | |
mick_ccc | 0:7e7575bda256 | 216 | // Stop sending |
mick_ccc | 0:7e7575bda256 | 217 | ButtonPressed = false; |
mick_ccc | 0:7e7575bda256 | 218 | } |
mick_ccc | 2:61713a461cf1 | 219 | |
mick_ccc | 2:61713a461cf1 | 220 | // Receive packets |
mick_ccc | 3:e42efecbbe1b | 221 | // TODO |
mick_ccc | 0:7e7575bda256 | 222 | } |
mick_ccc | 0:7e7575bda256 | 223 | } |
mick_ccc | 3:e42efecbbe1b | 224 | |
mick_ccc | 3:e42efecbbe1b | 225 | void OnTxDone( void ) |
mick_ccc | 3:e42efecbbe1b | 226 | { |
mick_ccc | 4:fac0fc95a644 | 227 | //Radio.Sleep( ); |
mick_ccc | 4:fac0fc95a644 | 228 | //pc.printf( "> OnTxDone\n\r" ); |
mick_ccc | 3:e42efecbbe1b | 229 | } |
mick_ccc | 3:e42efecbbe1b | 230 | |
mick_ccc | 3:e42efecbbe1b | 231 | void OnRxDone( uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr ) |
mick_ccc | 3:e42efecbbe1b | 232 | { |
mick_ccc | 3:e42efecbbe1b | 233 | Radio.Sleep( ); |
mick_ccc | 3:e42efecbbe1b | 234 | pc.printf( "> OnRxDone\n\r" ); |
mick_ccc | 3:e42efecbbe1b | 235 | } |
mick_ccc | 3:e42efecbbe1b | 236 | |
mick_ccc | 3:e42efecbbe1b | 237 | void OnTxTimeout( void ) |
mick_ccc | 3:e42efecbbe1b | 238 | { |
mick_ccc | 3:e42efecbbe1b | 239 | Radio.Sleep( ); |
mick_ccc | 3:e42efecbbe1b | 240 | pc.printf( "> OnTxTimeout\n\r" ); |
mick_ccc | 3:e42efecbbe1b | 241 | } |
mick_ccc | 3:e42efecbbe1b | 242 | |
mick_ccc | 3:e42efecbbe1b | 243 | void OnRxTimeout( void ) |
mick_ccc | 3:e42efecbbe1b | 244 | { |
mick_ccc | 3:e42efecbbe1b | 245 | Radio.Sleep( ); |
mick_ccc | 3:e42efecbbe1b | 246 | pc.printf( "> OnRxTimeout\n\r" ); |
mick_ccc | 3:e42efecbbe1b | 247 | } |
mick_ccc | 3:e42efecbbe1b | 248 | |
mick_ccc | 3:e42efecbbe1b | 249 | void OnRxError( void ) |
mick_ccc | 3:e42efecbbe1b | 250 | { |
mick_ccc | 3:e42efecbbe1b | 251 | Radio.Sleep( ); |
mick_ccc | 3:e42efecbbe1b | 252 | pc.printf( "> OnRxError\n\r" ); |
mick_ccc | 3:e42efecbbe1b | 253 | } |