def initialise(self): u'''Initialises the gpio pins, the SPI interface and configures the rfm22 module ''' wiringpi.wiringPiSetup() wiringpi.wiringPiSPISetup(RFM22_SPI_CHANNEL, 10000000) RPIO.setup(RFM22_NIRQ_GPIO_BCM_PIN, RPIO.IN) RPIO.cleanup_interrupts() RPIO.add_interrupt_callback(RFM22_NIRQ_GPIO_BCM_PIN, nirq_callback, edge='falling') wiringpi.pinMode(RFM22_SDN_GPIO_PIN, OUTPUT) wiringpi.pinMode(RFM22_TXEN_GPIO_PIN, OUTPUT) wiringpi.pinMode(RFM22_RXEN_GPIO_PIN, OUTPUT) self.__rx_ant_off() self.__tx_ant_off() self.__sdn_off() time.sleep(0.1) #reset module self.__sdn_on() #Wait 100ms to give rfm22 time to wake up time.sleep(0.1) #Read out chip version via SPI version = self.__read(self.__DEVICE_VERSION) debug_log("RFM22 chip version:", version) if (version[1] != 0): debug_log("SPI Communication working!") #Reset all registers, software reset self.__write(self.__OPERATING_FUNCTION_CONTROL_1, 0x80) #Wait 20ms to let the module boot up time.sleep(0.02) u'''Enable FIFO under/overflow, external, packet send, received and crc error interrupt.''' self.__write(self.__INTERRUPT_ENABLE_1, 0x87) u'''Enable rssi interrupt''' #self.__write(self.__INTERRUPT_ENABLE_2, 0x10) #Raspberry PI does not react fast enough to read correct value u'''Switch to ready mode. 200us to tx or rx''' self.__write(self.__OPERATING_FUNCTION_CONTROL_1, 0x01) self.__write(self.__CRYSTAL_OSCILLATOR_LOAD, 0x7f) u'''Enable AFC''' self.__write(self.__AFC_LOOP_GEARSHIFT_OVERRIDE, 0x40) u'''Set AFC timing''' self.__write(self.__AFC_TIMING_CONTROL, 0x0A) self.__write(self.__CLOCK_RECOVERY_GEARSHIFT_OVERRIDE, 0x05) u'''Set IF filter bandwidth''' self.__write(self.__IF_FILTER_BANDWIDTH, 0x9A) u'''Set clock recovery oversampling rate''' self.__write(self.__CLOCK_RECOVERY_OVERSAMPLING_RATIO, 0x3C) self.__write(self.__CLOCK_RECOVERY_OFFSET_2, 0x02) self.__write(self.__CLOCK_RECOVERY_OFFSET_1, 0x22) self.__write(self.__CLOCK_RECOVERY_OFFSET_0, 0x22) self.__write(self.__CLOCK_RECOVERY_TIMING_LOOP_GAIN_1, 0x07) self.__write(self.__CLOCK_RECOVERY_TIMING_LOOP_GAIN_0, 0xFF) u'''Set AFC Limiter''' self.__write(self.__AFC_LIMITER, 0x48) u'''Set RSSI threshold for clear channel assessment''' self.__write(self.__RSSI_THRESSHOLF_FOR_CLEAR_CHANNEL_INDICATOR, self.__RSSI_CLEAR_CHANNEL_THRESHOLD) u'''RX, TX packet handling, enable CCIT CRC''' self.__write(self.__DATA_ACCESS_CONTROL, 0xAC) u'''Header check, valid for broadcast or check byte''' self.__write(self.__HEADER_CONTROL_1, 0xFF) u'''4 byte header (Header 3,2,1,0) and 2 byte sync (Synchronization Word 3,2) ''' self.__write(self.__HEADER_CONTROL_2, 0x42) u'''Synchronization words''' self.__write(self.__SYNC_WORD_3, self.__PACKET_SYNC_BYTE_3) self.__write(self.__SYNC_WORD_2, self.__PACKET_SYNC_BYTE_2) self.__write(self.__SYNC_WORD_1, self.__PACKET_SYNC_BYTE_1) self.__write(self.__SYNC_WORD_0, self.__PACKET_SYNC_BYTE_0) u'''Transmit header''' self.__write(self.__TRANSMIT_HEADER_3, self.__TRANSMIT_HEADER_BYTE_3) self.__write(self.__TRANSMIT_HEADER_2, self.__TRANSMIT_HEADER_BYTE_2) self.__write(self.__TRANSMIT_HEADER_1, self.__TRANSMIT_HEADER_BYTE_1) self.__write(self.__TRANSMIT_HEADER_0, self.__TRANSMIT_HEADER_BYTE_0) self.__write(self.__CHECK_HEADER_3, self.__TRANSMIT_HEADER_BYTE_3) self.__write(self.__CHECK_HEADER_2, self.__TRANSMIT_HEADER_BYTE_2) self.__write(self.__CHECK_HEADER_1, self.__TRANSMIT_HEADER_BYTE_1) self.__write(self.__CHECK_HEADER_0, self.__TRANSMIT_HEADER_BYTE_0) u'''Check header enable mask, 0xFF means all bits of the corresponding * header will be checked. ''' self.__write(self.__HEADER_ENABLE_3, 0xFF) self.__write(self.__HEADER_ENABLE_2, 0xFF) self.__write(self.__HEADER_ENABLE_1, 0xFF) self.__write(self.__HEADER_ENABLE_0, 0xFF) u'''Switch on automatic RX gain control''' self.__write(self.__AGC_OVERRIDE_1, 0x60) u'''TODO: example check agc override Register 0x6a does not exist. Data sheet wrong?''' u'''Set TX power and LNA controller on if RFM22 != TX * TXPower equals * -1dbm 0x00 * 2dbm 0x01 set to 2dbm * 5dbm 0x02 * 8dbm 0x03 * 11dbm 0x04 * 14dbm 0x05 * 17dbm 0x06 * 20dbm 0x07 * ''' self.__write(self.__TX_POWER, (0x01 | 0x80)) u'''Set TX data rate to 0x199a = 100 kbps. * Datarate calculation: * TX_DR = 10^6 * 0x199a / 2^16 ''' self.__write(self.__TX_DATA_RATE_1, 0x19) #Bits 15:8 self.__write(self.__TX_DATA_RATE_0, 0x9a) #Bits 7:0 u'''Modulation control, manchester data inversion.''' self.__write(self.__MODULATION_MODE_CONTROL_1, 0x0C) u'''Modulation control, FIFO Mode, GFSK ''' self.__write(self.__MODULATION_MODE_CONTROL_2, 0x23) u'''Frequency deviation 50kHz * deviation = 625 * 0x50''' self.__write(self.__FREQUENCY_DEVIATION, 0x50) u'''Select frequency band, high band = >480 < 960 MHz, * 860- 879.9MHz * Regulations: 869,4 869,65 at 500mW ERP < 10% * ''' self.__write(self.__FREQUENCY_BAND_SELECT, 0x73) self.__write(self.__NOMINAL_CARRIER_FREQUENCY_1, 0x76) self.__write(self.__NOMINAL_CARRIER_FREQUENCY_0, 0xC0) u'''Set carrier ''' debug_log(u"RFM22 initialised")
def cleanupgpio(): """Release all GPIO resources.""" RPIO.cleanup_interrupts() RPIO.cleanup()
def exit_handler(): """ Auto-cleanup on exit """ RPIO.stop_waiting_for_interrupts() RPIO.cleanup_interrupts()
def signal_handler(signal, frame): print "Shutting down KatFud" GPIO.cleanup_interrupts() GPIO.cleanup() sys.exit(0)
def initialise(self): u'''Initialises the gpio pins, the SPI interface and configures the rfm22 module ''' wiringpi.wiringPiSetup() wiringpi.wiringPiSPISetup(RFM22_SPI_CHANNEL,10000000) RPIO.setup(RFM22_NIRQ_GPIO_BCM_PIN, RPIO.IN) RPIO.cleanup_interrupts() RPIO.add_interrupt_callback(RFM22_NIRQ_GPIO_BCM_PIN, nirq_callback, edge='falling') wiringpi.pinMode(RFM22_SDN_GPIO_PIN, OUTPUT) wiringpi.pinMode(RFM22_TXEN_GPIO_PIN, OUTPUT) wiringpi.pinMode(RFM22_RXEN_GPIO_PIN, OUTPUT) self.__rx_ant_off() self.__tx_ant_off() self.__sdn_off() time.sleep(0.1) #reset module self.__sdn_on() #Wait 100ms to give rfm22 time to wake up time.sleep(0.1) #Read out chip version via SPI version = self.__read(self.__DEVICE_VERSION) debug_log("RFM22 chip version:", version) if (version[1] != 0): debug_log("SPI Communication working!") #Reset all registers, software reset self.__write(self.__OPERATING_FUNCTION_CONTROL_1, 0x80) #Wait 20ms to let the module boot up time.sleep(0.02) u'''Enable FIFO under/overflow, external, packet send, received and crc error interrupt.''' self.__write(self.__INTERRUPT_ENABLE_1, 0x87) u'''Enable rssi interrupt''' #self.__write(self.__INTERRUPT_ENABLE_2, 0x10) #Raspberry PI does not react fast enough to read correct value u'''Switch to ready mode. 200us to tx or rx''' self.__write(self.__OPERATING_FUNCTION_CONTROL_1, 0x01) self.__write(self.__CRYSTAL_OSCILLATOR_LOAD, 0x7f); u'''Enable AFC''' self.__write(self.__AFC_LOOP_GEARSHIFT_OVERRIDE, 0x40); u'''Set AFC timing''' self.__write(self.__AFC_TIMING_CONTROL, 0x0A); self.__write(self.__CLOCK_RECOVERY_GEARSHIFT_OVERRIDE, 0x05); u'''Set IF filter bandwidth''' self.__write(self.__IF_FILTER_BANDWIDTH, 0x9A); u'''Set clock recovery oversampling rate''' self.__write(self.__CLOCK_RECOVERY_OVERSAMPLING_RATIO, 0x3C); self.__write(self.__CLOCK_RECOVERY_OFFSET_2, 0x02); self.__write(self.__CLOCK_RECOVERY_OFFSET_1, 0x22); self.__write(self.__CLOCK_RECOVERY_OFFSET_0, 0x22); self.__write(self.__CLOCK_RECOVERY_TIMING_LOOP_GAIN_1, 0x07); self.__write(self.__CLOCK_RECOVERY_TIMING_LOOP_GAIN_0, 0xFF); u'''Set AFC Limiter''' self.__write(self.__AFC_LIMITER, 0x48); u'''Set RSSI threshold for clear channel assessment''' self.__write(self.__RSSI_THRESSHOLF_FOR_CLEAR_CHANNEL_INDICATOR, self.__RSSI_CLEAR_CHANNEL_THRESHOLD); u'''RX, TX packet handling, enable CCIT CRC''' self.__write(self.__DATA_ACCESS_CONTROL, 0xAC); u'''Header check, valid for broadcast or check byte''' self.__write(self.__HEADER_CONTROL_1, 0xFF); u'''4 byte header (Header 3,2,1,0) and 2 byte sync (Synchronization Word 3,2) ''' self.__write(self.__HEADER_CONTROL_2, 0x42); u'''Synchronization words''' self.__write(self.__SYNC_WORD_3, self.__PACKET_SYNC_BYTE_3); self.__write(self.__SYNC_WORD_2, self.__PACKET_SYNC_BYTE_2); self.__write(self.__SYNC_WORD_1, self.__PACKET_SYNC_BYTE_1); self.__write(self.__SYNC_WORD_0, self.__PACKET_SYNC_BYTE_0); u'''Transmit header''' self.__write(self.__TRANSMIT_HEADER_3, self.__TRANSMIT_HEADER_BYTE_3); self.__write(self.__TRANSMIT_HEADER_2, self.__TRANSMIT_HEADER_BYTE_2); self.__write(self.__TRANSMIT_HEADER_1, self.__TRANSMIT_HEADER_BYTE_1); self.__write(self.__TRANSMIT_HEADER_0, self.__TRANSMIT_HEADER_BYTE_0); self.__write(self.__CHECK_HEADER_3, self.__TRANSMIT_HEADER_BYTE_3); self.__write(self.__CHECK_HEADER_2, self.__TRANSMIT_HEADER_BYTE_2); self.__write(self.__CHECK_HEADER_1, self.__TRANSMIT_HEADER_BYTE_1); self.__write(self.__CHECK_HEADER_0, self.__TRANSMIT_HEADER_BYTE_0); u'''Check header enable mask, 0xFF means all bits of the corresponding * header will be checked. ''' self.__write(self.__HEADER_ENABLE_3, 0xFF); self.__write(self.__HEADER_ENABLE_2, 0xFF); self.__write(self.__HEADER_ENABLE_1, 0xFF); self.__write(self.__HEADER_ENABLE_0, 0xFF); u'''Switch on automatic RX gain control''' self.__write(self.__AGC_OVERRIDE_1, 0x60); u'''TODO: example check agc override Register 0x6a does not exist. Data sheet wrong?''' u'''Set TX power and LNA controller on if RFM22 != TX * TXPower equals * -1dbm 0x00 * 2dbm 0x01 set to 2dbm * 5dbm 0x02 * 8dbm 0x03 * 11dbm 0x04 * 14dbm 0x05 * 17dbm 0x06 * 20dbm 0x07 * ''' self.__write(self.__TX_POWER, (0x01|0x80)); u'''Set TX data rate to 0x199a = 100 kbps. * Datarate calculation: * TX_DR = 10^6 * 0x199a / 2^16 ''' self.__write(self.__TX_DATA_RATE_1, 0x19); #Bits 15:8 self.__write(self.__TX_DATA_RATE_0, 0x9a); #Bits 7:0 u'''Modulation control, manchester data inversion.''' self.__write(self.__MODULATION_MODE_CONTROL_1, 0x0C); u'''Modulation control, FIFO Mode, GFSK ''' self.__write(self.__MODULATION_MODE_CONTROL_2, 0x23); u'''Frequency deviation 50kHz * deviation = 625 * 0x50''' self.__write(self.__FREQUENCY_DEVIATION, 0x50); u'''Select frequency band, high band = >480 < 960 MHz, * 860- 879.9MHz * Regulations: 869,4 869,65 at 500mW ERP < 10% * ''' self.__write(self.__FREQUENCY_BAND_SELECT, 0x73); self.__write(self.__NOMINAL_CARRIER_FREQUENCY_1, 0x76); self.__write(self.__NOMINAL_CARRIER_FREQUENCY_0, 0xC0); u'''Set carrier ''' debug_log(u"RFM22 initialised")
def clean(): print ("Cleaning interrupts") RPIO.cleanup() RPIO.cleanup_interrupts()