May 2021 test

Dependencies:   sx128x sx12xx_hal

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 }