May 2021 test
Dependencies: sx128x sx12xx_hal
main.cpp@1:6a3a48d657a9, 2017-08-31 (annotated)
- 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?
User | Revision | Line number | New 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 | } |