Beispiel #1
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")
Beispiel #2
0
def cleanupgpio():
    """Release all GPIO resources."""
    RPIO.cleanup_interrupts()
    RPIO.cleanup()
Beispiel #3
0
def exit_handler():
    """ Auto-cleanup on exit """
    RPIO.stop_waiting_for_interrupts()
    RPIO.cleanup_interrupts()
Beispiel #4
0
def exit_handler():
    """ Auto-cleanup on exit """
    RPIO.stop_waiting_for_interrupts()
    RPIO.cleanup_interrupts()
Beispiel #5
0
 def signal_handler(signal, frame):
     print "Shutting down KatFud"
     GPIO.cleanup_interrupts()
     GPIO.cleanup()
     sys.exit(0)
Beispiel #6
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")
Beispiel #7
0
def clean():
    print ("Cleaning interrupts")
    RPIO.cleanup()
    RPIO.cleanup_interrupts()