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:
dudmuck
Date:
Thu Aug 31 23:14:55 2017 +0000
Revision:
1:6a3a48d657a9
Parent:
0:b6ec8db2edbf
Child:
2:bf201940a9db
use 4 output pins

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dudmuck 0:b6ec8db2edbf 1 #include "sx127x_lora.h"
dudmuck 0:b6ec8db2edbf 2
dudmuck 0:b6ec8db2edbf 3 DigitalOut myled(LED1);
dudmuck 0:b6ec8db2edbf 4
dudmuck 0:b6ec8db2edbf 5 SPI spi(D11, D12, D13); // mosi, miso, sclk
dudmuck 0:b6ec8db2edbf 6 // dio0, dio1, nss, spi, rst
dudmuck 0:b6ec8db2edbf 7 SX127x radio( D2, D3, D10, spi, A0); // sx1276 arduino shield
dudmuck 0:b6ec8db2edbf 8
dudmuck 0:b6ec8db2edbf 9 SX127x_lora lora(radio);
dudmuck 0:b6ec8db2edbf 10 DigitalInOut rfsw(A4); // for SX1276 arduino shield
dudmuck 0:b6ec8db2edbf 11
dudmuck 0:b6ec8db2edbf 12 void rfsw_callback()
dudmuck 0:b6ec8db2edbf 13 {
dudmuck 0:b6ec8db2edbf 14 if (radio.RegOpMode.bits.Mode == RF_OPMODE_TRANSMITTER)
dudmuck 0:b6ec8db2edbf 15 rfsw = 1;
dudmuck 0:b6ec8db2edbf 16 else
dudmuck 0:b6ec8db2edbf 17 rfsw = 0;
dudmuck 0:b6ec8db2edbf 18 }
dudmuck 0:b6ec8db2edbf 19 /**********************************************************************/
dudmuck 1:6a3a48d657a9 20 DigitalOut pc3(PC_3);
dudmuck 1:6a3a48d657a9 21 DigitalOut pc2(PC_2);
dudmuck 1:6a3a48d657a9 22 DigitalOut pc6(PC_6);
dudmuck 1:6a3a48d657a9 23 DigitalOut pc8(PC_8);
dudmuck 1:6a3a48d657a9 24 DigitalOut* pin;
dudmuck 0:b6ec8db2edbf 25 Timeout to;
dudmuck 0:b6ec8db2edbf 26
dudmuck 1:6a3a48d657a9 27 #define PIN_ASSERT_us 500000
dudmuck 1:6a3a48d657a9 28
dudmuck 1:6a3a48d657a9 29 #define CMD_PC2 0x02
dudmuck 1:6a3a48d657a9 30 #define CMD_PC3 0x03
dudmuck 1:6a3a48d657a9 31 #define CMD_PC6 0x06
dudmuck 1:6a3a48d657a9 32 #define CMD_PC8 0x08
dudmuck 0:b6ec8db2edbf 33
dudmuck 0:b6ec8db2edbf 34 void alarm_pin_clr()
dudmuck 0:b6ec8db2edbf 35 {
dudmuck 1:6a3a48d657a9 36 pin->write(0);
dudmuck 0:b6ec8db2edbf 37 }
dudmuck 0:b6ec8db2edbf 38
dudmuck 0:b6ec8db2edbf 39 void alarm_pin_set()
dudmuck 0:b6ec8db2edbf 40 {
dudmuck 1:6a3a48d657a9 41 pin->write(1);
dudmuck 0:b6ec8db2edbf 42 to.attach_us(&alarm_pin_clr, PIN_ASSERT_us);
dudmuck 0:b6ec8db2edbf 43 }
dudmuck 0:b6ec8db2edbf 44
dudmuck 0:b6ec8db2edbf 45 static uint16_t crc_ccitt( uint8_t *buffer, uint16_t length )
dudmuck 0:b6ec8db2edbf 46 {
dudmuck 0:b6ec8db2edbf 47 // The CRC calculation follows CCITT
dudmuck 0:b6ec8db2edbf 48 const uint16_t polynom = 0x1021;
dudmuck 0:b6ec8db2edbf 49 // CRC initial value
dudmuck 0:b6ec8db2edbf 50 uint16_t crc = 0x0000;
dudmuck 0:b6ec8db2edbf 51
dudmuck 0:b6ec8db2edbf 52 if( buffer == NULL )
dudmuck 0:b6ec8db2edbf 53 {
dudmuck 0:b6ec8db2edbf 54 return 0;
dudmuck 0:b6ec8db2edbf 55 }
dudmuck 0:b6ec8db2edbf 56
dudmuck 0:b6ec8db2edbf 57 for( uint16_t i = 0; i < length; ++i )
dudmuck 0:b6ec8db2edbf 58 {
dudmuck 0:b6ec8db2edbf 59 crc ^= ( uint16_t ) buffer[i] << 8;
dudmuck 0:b6ec8db2edbf 60 for( uint16_t j = 0; j < 8; ++j )
dudmuck 0:b6ec8db2edbf 61 {
dudmuck 0:b6ec8db2edbf 62 crc = ( crc & 0x8000 ) ? ( crc << 1 ) ^ polynom : ( crc << 1 );
dudmuck 0:b6ec8db2edbf 63 }
dudmuck 0:b6ec8db2edbf 64 }
dudmuck 0:b6ec8db2edbf 65
dudmuck 0:b6ec8db2edbf 66 return crc;
dudmuck 0:b6ec8db2edbf 67 }
dudmuck 0:b6ec8db2edbf 68
dudmuck 0:b6ec8db2edbf 69 void get_alarm()
dudmuck 0:b6ec8db2edbf 70 {
dudmuck 0:b6ec8db2edbf 71 uint16_t rx_crc, crc = crc_ccitt(radio.rx_buf, 5);
dudmuck 0:b6ec8db2edbf 72 rx_crc = radio.rx_buf[5];
dudmuck 0:b6ec8db2edbf 73 rx_crc <<= 8;
dudmuck 0:b6ec8db2edbf 74 rx_crc += radio.rx_buf[6];
dudmuck 0:b6ec8db2edbf 75 //printf("%u) crc rx:%04x, calc:%04x\r\n", lora.RegRxNbBytes, rx_crc, crc);
dudmuck 0:b6ec8db2edbf 76 if (crc == rx_crc) {
dudmuck 1:6a3a48d657a9 77 uint8_t c = radio.rx_buf[0];
dudmuck 1:6a3a48d657a9 78 //if (radio.rx_buf[0] == CMD_ALARM)
dudmuck 1:6a3a48d657a9 79 if (c == CMD_PC2 || c == CMD_PC3 || c == CMD_PC6 || c == CMD_PC8) {
dudmuck 0:b6ec8db2edbf 80 unsigned delay;
dudmuck 0:b6ec8db2edbf 81 delay = radio.rx_buf[1];
dudmuck 0:b6ec8db2edbf 82 delay <<= 8;
dudmuck 0:b6ec8db2edbf 83 delay += radio.rx_buf[2];
dudmuck 0:b6ec8db2edbf 84 delay <<= 8;
dudmuck 0:b6ec8db2edbf 85 delay += radio.rx_buf[3];
dudmuck 0:b6ec8db2edbf 86 delay <<= 8;
dudmuck 0:b6ec8db2edbf 87 delay += radio.rx_buf[4];
dudmuck 1:6a3a48d657a9 88 switch (c) {
dudmuck 1:6a3a48d657a9 89 case CMD_PC2: pin = &pc2; break;
dudmuck 1:6a3a48d657a9 90 case CMD_PC3: pin = &pc3; break;
dudmuck 1:6a3a48d657a9 91 case CMD_PC6: pin = &pc6; break;
dudmuck 1:6a3a48d657a9 92 case CMD_PC8: pin = &pc8; break;
dudmuck 1:6a3a48d657a9 93 }
dudmuck 0:b6ec8db2edbf 94 to.attach_us(&alarm_pin_set, delay);
dudmuck 0:b6ec8db2edbf 95 printf("delay:%u\r\n", delay);
dudmuck 0:b6ec8db2edbf 96 } else
dudmuck 0:b6ec8db2edbf 97 printf("cmd? %02x\r\n", radio.rx_buf[0]);
dudmuck 0:b6ec8db2edbf 98 } else
dudmuck 0:b6ec8db2edbf 99 printf("crc fail %04x, %04x\r\n", rx_crc, crc);
dudmuck 0:b6ec8db2edbf 100 }
dudmuck 0:b6ec8db2edbf 101
dudmuck 0:b6ec8db2edbf 102 int main()
dudmuck 0:b6ec8db2edbf 103 {
dudmuck 0:b6ec8db2edbf 104 printf("\r\nreset-rx\r\n");
dudmuck 0:b6ec8db2edbf 105 radio.rf_switch = rfsw_callback;
dudmuck 0:b6ec8db2edbf 106
dudmuck 0:b6ec8db2edbf 107 radio.set_frf_MHz(910.8);
dudmuck 0:b6ec8db2edbf 108 lora.enable();
dudmuck 0:b6ec8db2edbf 109 lora.setBw_KHz(500);
dudmuck 0:b6ec8db2edbf 110 lora.setSf(11);
dudmuck 0:b6ec8db2edbf 111
dudmuck 0:b6ec8db2edbf 112 /* RFO or PABOOST choice:
dudmuck 0:b6ec8db2edbf 113 * SX1276 shield: RFO if using 900MHz, or PA_BOOST if using 433MHz
dudmuck 0:b6ec8db2edbf 114 */
dudmuck 0:b6ec8db2edbf 115 rfsw.input();
dudmuck 0:b6ec8db2edbf 116 if (rfsw.read()) {
dudmuck 0:b6ec8db2edbf 117 printf("LAS\r\n");
dudmuck 0:b6ec8db2edbf 118 /* LAS HF=PA_BOOST LF=RFO */
dudmuck 0:b6ec8db2edbf 119 if (radio.HF)
dudmuck 0:b6ec8db2edbf 120 radio.RegPaConfig.bits.PaSelect = 1;
dudmuck 0:b6ec8db2edbf 121 else
dudmuck 0:b6ec8db2edbf 122 radio.RegPaConfig.bits.PaSelect = 0;
dudmuck 0:b6ec8db2edbf 123 } else {
dudmuck 0:b6ec8db2edbf 124 /* MAS shield board, only RFO TX */
dudmuck 0:b6ec8db2edbf 125 radio.RegPaConfig.bits.PaSelect = 0;
dudmuck 0:b6ec8db2edbf 126 printf("MAS\r\n");
dudmuck 0:b6ec8db2edbf 127 }
dudmuck 0:b6ec8db2edbf 128 rfsw.output();
dudmuck 0:b6ec8db2edbf 129 radio.write_reg(REG_PACONFIG, radio.RegPaConfig.octet);
dudmuck 0:b6ec8db2edbf 130
dudmuck 0:b6ec8db2edbf 131 lora.start_rx(RF_OPMODE_RECEIVER);
dudmuck 0:b6ec8db2edbf 132
dudmuck 0:b6ec8db2edbf 133 for (;;) {
dudmuck 0:b6ec8db2edbf 134 if (lora.service() == SERVICE_READ_FIFO) {
dudmuck 0:b6ec8db2edbf 135 /*int i;
dudmuck 0:b6ec8db2edbf 136 for (i = 0; i < lora.RegRxNbBytes; i++) {
dudmuck 0:b6ec8db2edbf 137 printf("%02x ", radio.rx_buf[i]);
dudmuck 0:b6ec8db2edbf 138 }
dudmuck 0:b6ec8db2edbf 139 printf("\r\n");*/
dudmuck 0:b6ec8db2edbf 140 get_alarm();
dudmuck 0:b6ec8db2edbf 141 }
dudmuck 0:b6ec8db2edbf 142 }
dudmuck 0:b6ec8db2edbf 143 }