May 2021 test
Dependencies: sx128x sx12xx_hal
Diff: main.cpp
- Revision:
- 0:b6ec8db2edbf
- Child:
- 1:6a3a48d657a9
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Tue Aug 22 10:16:06 2017 -0700 @@ -0,0 +1,127 @@ +#include "sx127x_lora.h" + +DigitalOut myled(LED1); + +SPI spi(D11, D12, D13); // mosi, miso, sclk +// dio0, dio1, nss, spi, rst +SX127x radio( D2, D3, D10, spi, A0); // sx1276 arduino shield + +SX127x_lora lora(radio); +DigitalInOut rfsw(A4); // for SX1276 arduino shield + +void rfsw_callback() +{ + if (radio.RegOpMode.bits.Mode == RF_OPMODE_TRANSMITTER) + rfsw = 1; + else + rfsw = 0; +} +/**********************************************************************/ +DigitalOut pc_3(PC_3); +Timeout to; + +#define PIN_ASSERT_us 200000 +#define CMD_ALARM 0x01 + +void alarm_pin_clr() +{ + pc_3 = 0; +} + +void alarm_pin_set() +{ + pc_3 = 1; + to.attach_us(&alarm_pin_clr, PIN_ASSERT_us); +} + +static uint16_t crc_ccitt( uint8_t *buffer, uint16_t length ) +{ + // The CRC calculation follows CCITT + const uint16_t polynom = 0x1021; + // CRC initial value + uint16_t crc = 0x0000; + + if( buffer == NULL ) + { + return 0; + } + + for( uint16_t i = 0; i < length; ++i ) + { + crc ^= ( uint16_t ) buffer[i] << 8; + for( uint16_t j = 0; j < 8; ++j ) + { + crc = ( crc & 0x8000 ) ? ( crc << 1 ) ^ polynom : ( crc << 1 ); + } + } + + return crc; +} + +void get_alarm() +{ + uint16_t rx_crc, crc = crc_ccitt(radio.rx_buf, 5); + rx_crc = radio.rx_buf[5]; + rx_crc <<= 8; + rx_crc += radio.rx_buf[6]; + //printf("%u) crc rx:%04x, calc:%04x\r\n", lora.RegRxNbBytes, rx_crc, crc); + if (crc == rx_crc) { + if (radio.rx_buf[0] == CMD_ALARM) { + unsigned delay; + delay = radio.rx_buf[1]; + delay <<= 8; + delay += radio.rx_buf[2]; + delay <<= 8; + delay += radio.rx_buf[3]; + delay <<= 8; + delay += radio.rx_buf[4]; + to.attach_us(&alarm_pin_set, delay); + printf("delay:%u\r\n", delay); + } else + printf("cmd? %02x\r\n", radio.rx_buf[0]); + } else + printf("crc fail %04x, %04x\r\n", rx_crc, crc); +} + +int main() +{ + printf("\r\nreset-rx\r\n"); + radio.rf_switch = rfsw_callback; + + radio.set_frf_MHz(910.8); + lora.enable(); + lora.setBw_KHz(500); + lora.setSf(11); + + /* RFO or PABOOST choice: + * SX1276 shield: RFO if using 900MHz, or PA_BOOST if using 433MHz + */ + rfsw.input(); + if (rfsw.read()) { + printf("LAS\r\n"); + /* LAS HF=PA_BOOST LF=RFO */ + if (radio.HF) + radio.RegPaConfig.bits.PaSelect = 1; + else + radio.RegPaConfig.bits.PaSelect = 0; + } else { + /* MAS shield board, only RFO TX */ + radio.RegPaConfig.bits.PaSelect = 0; + printf("MAS\r\n"); + } + rfsw.output(); + radio.write_reg(REG_PACONFIG, radio.RegPaConfig.octet); + + lora.start_rx(RF_OPMODE_RECEIVER); + + for (;;) { + if (lora.service() == SERVICE_READ_FIFO) { + /*int i; + for (i = 0; i < lora.RegRxNbBytes; i++) { + printf("%02x ", radio.rx_buf[i]); + } + printf("\r\n");*/ + get_alarm(); + } + } +}