Mick Mick
/
SX1272_TestApp
Simple SX1272 Test Application
main.cpp@4:fac0fc95a644, 2017-04-28 (annotated)
- 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?
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 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 | } |