// get random seed from wideband noise rssi void radio_init () { hal_disableIRQs(); // manually reset radio #ifdef CFG_sx1276_radio hal_pin_rst(0); // drive RST pin low #else hal_pin_rst(1); // drive RST pin high #endif hal_waitUntil(os_getTime()+ms2osticks(1)); // wait >100us hal_pin_rst(2); // configure RST pin floating! hal_waitUntil(os_getTime()+ms2osticks(5)); // wait 5ms opmode(OPMODE_SLEEP); // some sanity checks, e.g., read version number u1_t v = readReg(RegVersion); #ifdef CFG_sx1276_radio ASSERT(v == 0x12 ); #elif CFG_sx1272_radio ASSERT(v == 0x22); #else #error Missing CFG_sx1272_radio/CFG_sx1276_radio #endif // seed 15-byte randomness via noise rssi rxlora(RXMODE_RSSI); while( (readReg(RegOpMode) & OPMODE_MASK) != OPMODE_RX ); // continuous rx for(int i=1; i<16; i++) { for(int j=0; j<8; j++) { u1_t b; // wait for two non-identical subsequent least-significant bits while( (b = readReg(LORARegRssiWideband) & 0x01) == (readReg(LORARegRssiWideband) & 0x01) ); randbuf[i] = (randbuf[i] << 1) | b; } } randbuf[0] = 16; // set initial index #ifdef CFG_sx1276mb1_board // chain calibration writeReg(RegPaConfig, 0); // Launch Rx chain calibration for LF band writeReg(FSKRegImageCal, (readReg(FSKRegImageCal) & RF_IMAGECAL_IMAGECAL_MASK)|RF_IMAGECAL_IMAGECAL_START); while((readReg(FSKRegImageCal)&RF_IMAGECAL_IMAGECAL_RUNNING) == RF_IMAGECAL_IMAGECAL_RUNNING){ ; } // Sets a Frequency in HF band u4_t frf = 868000000; writeReg(RegFrfMsb, (u1_t)(frf>>16)); writeReg(RegFrfMid, (u1_t)(frf>> 8)); writeReg(RegFrfLsb, (u1_t)(frf>> 0)); // Launch Rx chain calibration for HF band writeReg(FSKRegImageCal, (readReg(FSKRegImageCal) & RF_IMAGECAL_IMAGECAL_MASK)|RF_IMAGECAL_IMAGECAL_START); while((readReg(FSKRegImageCal) & RF_IMAGECAL_IMAGECAL_RUNNING) == RF_IMAGECAL_IMAGECAL_RUNNING) { ; } #endif /* CFG_sx1276mb1_board */ opmode(OPMODE_SLEEP); hal_enableIRQs(); }
// called by EXTI_IRQHandler // (set preprocessor option CFG_EXTI_IRQ_HANDLER=sensorirq) void sensorirq () { if((EXTI->PR & (1<<INP_PIN)) != 0) { // pending EXTI->PR = (1<<INP_PIN); // clear irq // run application callback function in 50ms (debounce) os_setTimedCallback(&irqjob, os_getTime()+ms2osticks(50), irqjob.func); } }
static void blinkfunc (osjob_t* j) { // toggle LED ledstate = !ledstate; debug_led(ledstate); // reschedule blink job os_setTimedCallback(j, os_getTime()+ms2osticks(100), blinkfunc); }