raises pin at time instructed by received LoRa packet.

Dependencies:   sx126x sx12xx_hal

radio chip selection

Radio chip driver is not included, allowing choice of radio device.
If you're using SX1272 or SX1276, then import sx127x driver into your program.
if you're using SX1261 or SX1262, then import sx126x driver into your program.
if you're using SX1280, then import sx1280 driver into your program.
If you're using NAmote72 or Murata discovery, then you must import only sx127x driver.

Transmitter side is at Alarm Slave project page.
Output is observed on nucleo morpho connector pins pin[A-D]: see code for actual pins used.

Committer:
Wayne Roberts
Date:
Wed Jul 18 18:50:19 2018 -0700
Revision:
3:f81d64ff0164
Parent:
2:bf201940a9db
use sx12xx_hal

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Wayne Roberts 3:f81d64ff0164 1 #include "radio.h"
dudmuck 0:b6ec8db2edbf 2
dudmuck 0:b6ec8db2edbf 3 DigitalOut myled(LED1);
dudmuck 2:bf201940a9db 4
Wayne Roberts 3:f81d64ff0164 5 #if defined(SX127x_H) || defined(SX126x_H)
Wayne Roberts 3:f81d64ff0164 6 #define BW_KHZ 500
Wayne Roberts 3:f81d64ff0164 7 #define SPREADING_FACTOR 11
Wayne Roberts 3:f81d64ff0164 8 #define CF_HZ 910800000
Wayne Roberts 3:f81d64ff0164 9 #elif defined(SX128x_H)
Wayne Roberts 3:f81d64ff0164 10 #define BW_KHZ 200
Wayne Roberts 3:f81d64ff0164 11 #define SPREADING_FACTOR 11
Wayne Roberts 3:f81d64ff0164 12 #define CF_HZ 2487000000
Wayne Roberts 3:f81d64ff0164 13 #endif
Wayne Roberts 3:f81d64ff0164 14
Wayne Roberts 3:f81d64ff0164 15 #ifdef TARGET_DISCO_L072CZ_LRWAN1
dudmuck 2:bf201940a9db 16 DigitalOut pinA(PB_12);
dudmuck 2:bf201940a9db 17 DigitalOut pinB(PB_13);
dudmuck 2:bf201940a9db 18 DigitalOut pinC(PB_14);
dudmuck 2:bf201940a9db 19 DigitalOut pinD(PB_15);
dudmuck 2:bf201940a9db 20 #else
dudmuck 2:bf201940a9db 21 DigitalOut pinA(PC_3);
dudmuck 2:bf201940a9db 22 DigitalOut pinB(PC_2);
dudmuck 2:bf201940a9db 23 DigitalOut pinC(PC_6);
dudmuck 2:bf201940a9db 24 DigitalOut pinD(PC_8);
dudmuck 2:bf201940a9db 25 #endif /* !TARGET_DISCO_L072CZ_LRWAN1 */
dudmuck 2:bf201940a9db 26
dudmuck 1:6a3a48d657a9 27 DigitalOut* pin;
dudmuck 0:b6ec8db2edbf 28 Timeout to;
dudmuck 0:b6ec8db2edbf 29
dudmuck 1:6a3a48d657a9 30 #define PIN_ASSERT_us 500000
dudmuck 1:6a3a48d657a9 31
dudmuck 2:bf201940a9db 32 #define CMD_PINA 0x02
dudmuck 2:bf201940a9db 33 #define CMD_PINB 0x03
dudmuck 2:bf201940a9db 34 #define CMD_PINC 0x06
dudmuck 2:bf201940a9db 35 #define CMD_PIND 0x08
dudmuck 0:b6ec8db2edbf 36
Wayne Roberts 3:f81d64ff0164 37 /**********************************************************************/
Wayne Roberts 3:f81d64ff0164 38
dudmuck 0:b6ec8db2edbf 39 void alarm_pin_clr()
dudmuck 0:b6ec8db2edbf 40 {
dudmuck 1:6a3a48d657a9 41 pin->write(0);
dudmuck 0:b6ec8db2edbf 42 }
dudmuck 0:b6ec8db2edbf 43
dudmuck 0:b6ec8db2edbf 44 void alarm_pin_set()
dudmuck 0:b6ec8db2edbf 45 {
dudmuck 1:6a3a48d657a9 46 pin->write(1);
dudmuck 0:b6ec8db2edbf 47 to.attach_us(&alarm_pin_clr, PIN_ASSERT_us);
dudmuck 0:b6ec8db2edbf 48 }
dudmuck 0:b6ec8db2edbf 49
dudmuck 0:b6ec8db2edbf 50 static uint16_t crc_ccitt( uint8_t *buffer, uint16_t length )
dudmuck 0:b6ec8db2edbf 51 {
dudmuck 0:b6ec8db2edbf 52 // The CRC calculation follows CCITT
dudmuck 0:b6ec8db2edbf 53 const uint16_t polynom = 0x1021;
dudmuck 0:b6ec8db2edbf 54 // CRC initial value
dudmuck 0:b6ec8db2edbf 55 uint16_t crc = 0x0000;
dudmuck 0:b6ec8db2edbf 56
dudmuck 0:b6ec8db2edbf 57 if( buffer == NULL )
dudmuck 0:b6ec8db2edbf 58 {
dudmuck 0:b6ec8db2edbf 59 return 0;
dudmuck 0:b6ec8db2edbf 60 }
dudmuck 0:b6ec8db2edbf 61
dudmuck 0:b6ec8db2edbf 62 for( uint16_t i = 0; i < length; ++i )
dudmuck 0:b6ec8db2edbf 63 {
dudmuck 0:b6ec8db2edbf 64 crc ^= ( uint16_t ) buffer[i] << 8;
dudmuck 0:b6ec8db2edbf 65 for( uint16_t j = 0; j < 8; ++j )
dudmuck 0:b6ec8db2edbf 66 {
dudmuck 0:b6ec8db2edbf 67 crc = ( crc & 0x8000 ) ? ( crc << 1 ) ^ polynom : ( crc << 1 );
dudmuck 0:b6ec8db2edbf 68 }
dudmuck 0:b6ec8db2edbf 69 }
dudmuck 0:b6ec8db2edbf 70
dudmuck 0:b6ec8db2edbf 71 return crc;
dudmuck 0:b6ec8db2edbf 72 }
dudmuck 0:b6ec8db2edbf 73
dudmuck 0:b6ec8db2edbf 74 void get_alarm()
dudmuck 0:b6ec8db2edbf 75 {
Wayne Roberts 3:f81d64ff0164 76 uint16_t rx_crc, crc = crc_ccitt(Radio::radio.rx_buf, 5);
Wayne Roberts 3:f81d64ff0164 77 rx_crc = Radio::radio.rx_buf[5];
dudmuck 0:b6ec8db2edbf 78 rx_crc <<= 8;
Wayne Roberts 3:f81d64ff0164 79 rx_crc += Radio::radio.rx_buf[6];
dudmuck 0:b6ec8db2edbf 80 //printf("%u) crc rx:%04x, calc:%04x\r\n", lora.RegRxNbBytes, rx_crc, crc);
dudmuck 0:b6ec8db2edbf 81 if (crc == rx_crc) {
Wayne Roberts 3:f81d64ff0164 82 uint8_t c = Radio::radio.rx_buf[0];
dudmuck 2:bf201940a9db 83 if (c == CMD_PINA || c == CMD_PINB || c == CMD_PINC || c == CMD_PIND) {
dudmuck 0:b6ec8db2edbf 84 unsigned delay;
Wayne Roberts 3:f81d64ff0164 85 delay = Radio::radio.rx_buf[1];
dudmuck 0:b6ec8db2edbf 86 delay <<= 8;
Wayne Roberts 3:f81d64ff0164 87 delay += Radio::radio.rx_buf[2];
dudmuck 0:b6ec8db2edbf 88 delay <<= 8;
Wayne Roberts 3:f81d64ff0164 89 delay += Radio::radio.rx_buf[3];
dudmuck 0:b6ec8db2edbf 90 delay <<= 8;
Wayne Roberts 3:f81d64ff0164 91 delay += Radio::radio.rx_buf[4];
dudmuck 1:6a3a48d657a9 92 switch (c) {
dudmuck 2:bf201940a9db 93 case CMD_PINA: pin = &pinA; break;
dudmuck 2:bf201940a9db 94 case CMD_PINB: pin = &pinB; break;
dudmuck 2:bf201940a9db 95 case CMD_PINC: pin = &pinC; break;
dudmuck 2:bf201940a9db 96 case CMD_PIND: pin = &pinD; break;
dudmuck 1:6a3a48d657a9 97 }
dudmuck 0:b6ec8db2edbf 98 to.attach_us(&alarm_pin_set, delay);
dudmuck 0:b6ec8db2edbf 99 printf("delay:%u\r\n", delay);
dudmuck 0:b6ec8db2edbf 100 } else
Wayne Roberts 3:f81d64ff0164 101 printf("cmd? %02x\r\n", Radio::radio.rx_buf[0]);
dudmuck 0:b6ec8db2edbf 102 } else
dudmuck 0:b6ec8db2edbf 103 printf("crc fail %04x, %04x\r\n", rx_crc, crc);
dudmuck 0:b6ec8db2edbf 104 }
Wayne Roberts 3:f81d64ff0164 105
Wayne Roberts 3:f81d64ff0164 106 void txDoneCB()
Wayne Roberts 3:f81d64ff0164 107 {
Wayne Roberts 3:f81d64ff0164 108 }
Wayne Roberts 3:f81d64ff0164 109
Wayne Roberts 3:f81d64ff0164 110 void rxDoneCB(uint8_t size, float Rssi, float Snr)
Wayne Roberts 3:f81d64ff0164 111 {
Wayne Roberts 3:f81d64ff0164 112 get_alarm();
Wayne Roberts 3:f81d64ff0164 113 printf("%.1fdBm snr:%.1fdB ", Rssi, Snr);
Wayne Roberts 3:f81d64ff0164 114 }
Wayne Roberts 3:f81d64ff0164 115
Wayne Roberts 3:f81d64ff0164 116 const RadioEvents_t rev = {
Wayne Roberts 3:f81d64ff0164 117 /* Dio0_top_half */ NULL,
Wayne Roberts 3:f81d64ff0164 118 /* TxDone_topHalf */ NULL,
Wayne Roberts 3:f81d64ff0164 119 /* TxDone_botHalf */ txDoneCB,
Wayne Roberts 3:f81d64ff0164 120 /* TxTimeout */ NULL,
Wayne Roberts 3:f81d64ff0164 121 /* RxDone */ rxDoneCB,
Wayne Roberts 3:f81d64ff0164 122 /* RxTimeout */ NULL,
Wayne Roberts 3:f81d64ff0164 123 /* RxError */ NULL,
Wayne Roberts 3:f81d64ff0164 124 /* FhssChangeChannel */NULL,
Wayne Roberts 3:f81d64ff0164 125 /* CadDone */ NULL
Wayne Roberts 3:f81d64ff0164 126 };
Wayne Roberts 3:f81d64ff0164 127
dudmuck 0:b6ec8db2edbf 128
dudmuck 0:b6ec8db2edbf 129 int main()
dudmuck 0:b6ec8db2edbf 130 {
dudmuck 0:b6ec8db2edbf 131 printf("\r\nreset-rx\r\n");
Wayne Roberts 3:f81d64ff0164 132
Wayne Roberts 3:f81d64ff0164 133
Wayne Roberts 3:f81d64ff0164 134 Radio::Init(&rev);
Wayne Roberts 3:f81d64ff0164 135
Wayne Roberts 3:f81d64ff0164 136 Radio::Standby();
Wayne Roberts 3:f81d64ff0164 137 Radio::LoRaModemConfig(BW_KHZ, SPREADING_FACTOR, 1);
Wayne Roberts 3:f81d64ff0164 138 Radio::LoRaPacketConfig(8, false, true, false); // preambleLen, fixLen, crcOn, invIQ
Wayne Roberts 3:f81d64ff0164 139 Radio::SetChannel(CF_HZ);
dudmuck 0:b6ec8db2edbf 140
Wayne Roberts 3:f81d64ff0164 141 Radio::Rx(0);
dudmuck 0:b6ec8db2edbf 142
dudmuck 0:b6ec8db2edbf 143 for (;;) {
Wayne Roberts 3:f81d64ff0164 144 Radio::service();
dudmuck 0:b6ec8db2edbf 145 }
dudmuck 0:b6ec8db2edbf 146 }