Simple SX1272 Test Application

Dependencies:   SX1272Lib mbed

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?

UserRevisionLine numberNew 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 }