Simple SX1272 Test Application

Dependencies:   SX1272Lib mbed

Committer:
mick_ccc
Date:
Fri Apr 28 15:24:27 2017 +0000
Revision:
4:fac0fc95a644
Parent:
3:e42efecbbe1b
Child:
5:8d3e18491667
Added SendPacket function

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