diff --git a/src/energenie/radio.py b/src/energenie/radio.py index a4bf429..965e9b2 100644 --- a/src/energenie/radio.py +++ b/src/energenie/radio.py @@ -14,7 +14,7 @@ print("warning:" + str(msg)) def trace(msg): - pass #print(str(msg)) + print(str(msg)) #----- REGISTER ACCESS -------------------------------------------------------- @@ -39,14 +39,18 @@ def HRF_writefifo_burst(buf): """Write all bytes in buf to the payload FIFO, in a single burst""" - spi.select() # Don't modify buf, in case caller reuses it - txbuf = [ADDR_FIFO | MASK_WRITE_DATA] - for b in buf: - txbuf.append(b) - spi.frame(txbuf) - spi.deselect() + #txbuf = [ADDR_FIFO | MASK_WRITE_DATA] + #for b in buf: + # txbuf.append(b) + #print("write FIFO %s" % ashex(txbuf)) + # This is buggy as it modifies user buffer, but it works at present + spi.select() + buf.insert(0, ADDR_FIFO | MASK_WRITE_DATA) + spi.frame(buf) + spi.deselect() + print("written: %s" % ashex(buf)) def ashex(buf): result = [] @@ -91,141 +95,141 @@ #----- HRF REGISTER PROTOCOL -------------------------------------------------- # HopeRF register addresses -# Precise register description can be found on: +# Precise register descriptions can be found on: # www.hoperf.com/upload/rf/RFM69W-V1.3.pdf # on page 63 - 74 -ADDR_FIFO = 0x00 -ADDR_OPMODE = 0x01 -ADDR_REGDATAMODUL = 0x02 -ADDR_BITRATEMSB = 0x03 -ADDR_BITRATELSB = 0x04 -ADDR_FDEVMSB = 0x05 -ADDR_FDEVLSB = 0x06 -ADDR_FRMSB = 0x07 -ADDR_FRMID = 0x08 -ADDR_FRLSB = 0x09 -ADDR_AFCCTRL = 0x0B -ADDR_LNA = 0x18 -ADDR_RXBW = 0x19 -ADDR_AFCFEI = 0x1E -ADDR_IRQFLAGS1 = 0x27 -ADDR_IRQFLAGS2 = 0x28 -ADDR_RSSITHRESH = 0x29 -ADDR_PREAMBLELSB = 0x2D -ADDR_SYNCCONFIG = 0x2E -ADDR_SYNCVALUE1 = 0x2F -ADDR_SYNCVALUE2 = 0x30 -ADDR_SYNCVALUE3 = 0x31 -ADDR_SYNCVALUE4 = 0x32 -ADDR_PACKETCONFIG1 = 0x37 -ADDR_PAYLOADLEN = 0x38 -ADDR_NODEADDRESS = 0x39 -ADDR_FIFOTHRESH = 0x3C +ADDR_FIFO = 0x00 +ADDR_OPMODE = 0x01 +ADDR_REGDATAMODUL = 0x02 +ADDR_BITRATEMSB = 0x03 +ADDR_BITRATELSB = 0x04 +ADDR_FDEVMSB = 0x05 +ADDR_FDEVLSB = 0x06 +ADDR_FRMSB = 0x07 +ADDR_FRMID = 0x08 +ADDR_FRLSB = 0x09 +ADDR_AFCCTRL = 0x0B +ADDR_LNA = 0x18 +ADDR_RXBW = 0x19 +ADDR_AFCFEI = 0x1E +ADDR_IRQFLAGS1 = 0x27 +ADDR_IRQFLAGS2 = 0x28 +ADDR_RSSITHRESH = 0x29 +ADDR_PREAMBLELSB = 0x2D +ADDR_SYNCCONFIG = 0x2E +ADDR_SYNCVALUE1 = 0x2F +ADDR_SYNCVALUE2 = 0x30 +ADDR_SYNCVALUE3 = 0x31 +ADDR_SYNCVALUE4 = 0x32 +ADDR_PACKETCONFIG1 = 0x37 +ADDR_PAYLOADLEN = 0x38 +ADDR_NODEADDRESS = 0x39 +ADDR_FIFOTHRESH = 0x3C # HopeRF masks to set and clear bits -MASK_REGDATAMODUL_OOK = 0x08 -MASK_REGDATAMODUL_FSK = 0x00 -MASK_WRITE_DATA = 0x80 -MASK_MODEREADY = 0x80 -MASK_FIFONOTEMPTY = 0x40 -MASK_FIFOLEVEL = 0x20 -MASK_FIFOOVERRUN = 0x10 -MASK_PACKETSENT = 0x08 -MASK_TXREADY = 0x20 -MASK_PACKETMODE = 0x60 -MASK_MODULATION = 0x18 -MASK_PAYLOADRDY = 0x04 +MASK_REGDATAMODUL_OOK = 0x08 +MASK_REGDATAMODUL_FSK = 0x00 +MASK_WRITE_DATA = 0x80 +MASK_MODEREADY = 0x80 +MASK_FIFONOTEMPTY = 0x40 +MASK_FIFOLEVEL = 0x20 +MASK_FIFOOVERRUN = 0x10 +MASK_PACKETSENT = 0x08 +MASK_TXREADY = 0x20 +MASK_PACKETMODE = 0x60 +MASK_MODULATION = 0x18 +MASK_PAYLOADRDY = 0x04 -MODE_STANDBY = 0x04 # Standby -MODE_TRANSMITER = 0x0C # Transmiter -MODE_RECEIVER = 0x10 # Receiver -VAL_REGDATAMODUL_FSK = 0x00 # Modulation scheme FSK -VAL_REGDATAMODUL_OOK = 0x08 # Modulation scheme OOK -VAL_FDEVMSB30 = 0x01 # frequency deviation 5kHz 0x0052 -> 30kHz 0x01EC -VAL_FDEVLSB30 = 0xEC # frequency deviation 5kHz 0x0052 -> 30kHz 0x01EC -VAL_FRMSB434 = 0x6C # carrier freq -> 434.3MHz 0x6C9333 -VAL_FRMID434 = 0x93 # carrier freq -> 434.3MHz 0x6C9333 -VAL_FRLSB434 = 0x33 # carrier freq -> 434.3MHz 0x6C9333 -VAL_FRMSB433 = 0x6C # carrier freq -> 433.92MHz 0x6C7AE1 -VAL_FRMID433 = 0x7A # carrier freq -> 433.92MHz 0x6C7AE1 -VAL_FRLSB433 = 0xE1 # carrier freq -> 433.92MHz 0x6C7AE1 -VAL_AFCCTRLS = 0x00 # standard AFC routine -VAL_AFCCTRLI = 0x20 # improved AFC routine -VAL_LNA50 = 0x08 # LNA input impedance 50 ohms -VAL_LNA50G = 0x0E # LNA input impedance 50 ohms, LNA gain -> 48db -VAL_LNA200 = 0x88 # LNA input impedance 200 ohms -VAL_RXBW60 = 0x43 # channel filter bandwidth 10kHz -> 60kHz page:26 -VAL_RXBW120 = 0x41 # channel filter bandwidth 120kHz -VAL_AFCFEIRX = 0x04 # AFC is performed each time RX mode is entered -VAL_RSSITHRESH220 = 0xDC # RSSI threshold 0xE4 -> 0xDC (220) -VAL_PREAMBLELSB3 = 0x03 # preamble size LSB 3 -VAL_PREAMBLELSB5 = 0x05 # preamble size LSB 5 -VAL_SYNCCONFIG2 = 0x88 # Size of the Synch word = 2 (SyncSize + 1) -VAL_SYNCCONFIG4 = 0x98 # Size of the Synch word = 4 (SyncSize + 1) -VAL_SYNCVALUE1FSK = 0x2D # 1st byte of Sync word -VAL_SYNCVALUE2FSK = 0xD4 # 2nd byte of Sync word -VAL_SYNCVALUE1OOK = 0x80 # 1nd byte of Sync word -VAL_PACKETCONFIG1FSK = 0xA2 # Variable length, Manchester coding, Addr must match NodeAddress -VAL_PACKETCONFIG1FSKNO = 0xA0 # Variable length, Manchester coding -VAL_PACKETCONFIG1OOK = 0 # Fixed length, no Manchester coding -VAL_PAYLOADLEN255 = 0xFF # max Length in RX, not used in Tx -VAL_PAYLOADLEN66 = 66 # max Length in RX, not used in Tx -VAL_PAYLOADLEN_OOK = (13 + 8 * 17) # Payload Length -VAL_NODEADDRESS01 = 0x01 # Node address used in address filtering -VAL_NODEADDRESS04 = 0x04 # Node address used in address filtering -VAL_FIFOTHRESH1 = 0x81 # Condition to start packet transmission: at least one byte in FIFO -VAL_FIFOTHRESH30 = 0x1E # Condition to start packet transmission: wait for 30 bytes in FIFO +MODE_STANDBY = 0x04 # Standby +MODE_TRANSMITER = 0x0C # Transmiter +MODE_RECEIVER = 0x10 # Receiver +VAL_REGDATAMODUL_FSK = 0x00 # Modulation scheme FSK +VAL_REGDATAMODUL_OOK = 0x08 # Modulation scheme OOK +VAL_FDEVMSB30 = 0x01 # frequency deviation 5kHz 0x0052 -> 30kHz 0x01EC +VAL_FDEVLSB30 = 0xEC # frequency deviation 5kHz 0x0052 -> 30kHz 0x01EC +VAL_FRMSB434 = 0x6C # carrier freq -> 434.3MHz 0x6C9333 +VAL_FRMID434 = 0x93 # carrier freq -> 434.3MHz 0x6C9333 +VAL_FRLSB434 = 0x33 # carrier freq -> 434.3MHz 0x6C9333 +VAL_FRMSB433 = 0x6C # carrier freq -> 433.92MHz 0x6C7AE1 +VAL_FRMID433 = 0x7A # carrier freq -> 433.92MHz 0x6C7AE1 +VAL_FRLSB433 = 0xE1 # carrier freq -> 433.92MHz 0x6C7AE1 +VAL_AFCCTRLS = 0x00 # standard AFC routine +VAL_AFCCTRLI = 0x20 # improved AFC routine +VAL_LNA50 = 0x08 # LNA input impedance 50 ohms +VAL_LNA50G = 0x0E # LNA input impedance 50 ohms, LNA gain -> 48db +VAL_LNA200 = 0x88 # LNA input impedance 200 ohms +VAL_RXBW60 = 0x43 # channel filter bandwidth 10kHz -> 60kHz page:26 +VAL_RXBW120 = 0x41 # channel filter bandwidth 120kHz +VAL_AFCFEIRX = 0x04 # AFC is performed each time RX mode is entered +VAL_RSSITHRESH220 = 0xDC # RSSI threshold 0xE4 -> 0xDC (220) +VAL_PREAMBLELSB3 = 0x03 # preamble size LSB 3 +VAL_PREAMBLELSB5 = 0x05 # preamble size LSB 5 +VAL_SYNCCONFIG2 = 0x88 # Size of the Synch word = 2 (SyncSize + 1) +VAL_SYNCCONFIG4 = 0x98 # Size of the Synch word = 4 (SyncSize + 1) +VAL_SYNCVALUE1FSK = 0x2D # 1st byte of Sync word +VAL_SYNCVALUE2FSK = 0xD4 # 2nd byte of Sync word +VAL_SYNCVALUE1OOK = 0x80 # 1nd byte of Sync word +VAL_PACKETCONFIG1FSK = 0xA2 # Variable length, Manchester coding, Addr must match NodeAddress +VAL_PACKETCONFIG1FSKNO = 0xA0 # Variable length, Manchester coding +VAL_PACKETCONFIG1OOK = 0 # Fixed length, no Manchester coding +VAL_PAYLOADLEN255 = 0xFF # max Length in RX, not used in Tx +VAL_PAYLOADLEN66 = 66 # max Length in RX, not used in Tx +VAL_PAYLOADLEN_OOK = (13 + 8 * 17) # Payload Length +VAL_NODEADDRESS01 = 0x01 # Node address used in address filtering +VAL_NODEADDRESS04 = 0x04 # Node address used in address filtering +VAL_FIFOTHRESH1 = 0x81 # Condition to start packet transmission: at least one byte in FIFO +VAL_FIFOTHRESH30 = 0x1E # Condition to start packet transmission: wait for 30 bytes in FIFO + + +#----- CONFIGURATION TABLES ------------------------------------------------------------ config_FSK = [ - [ADDR_REGDATAMODUL, VAL_REGDATAMODUL_FSK], # modulation scheme FSK - [ADDR_FDEVMSB, VAL_FDEVMSB30], # frequency deviation 5kHz 0x0052 -> 30kHz 0x01EC - [ADDR_FDEVLSB, VAL_FDEVLSB30], # frequency deviation 5kHz 0x0052 -> 30kHz 0x01EC - [ADDR_FRMSB, VAL_FRMSB434], # carrier freq -> 434.3MHz 0x6C9333 - [ADDR_FRMID, VAL_FRMID434], # carrier freq -> 434.3MHz 0x6C9333 - [ADDR_FRLSB, VAL_FRLSB434], # carrier freq -> 434.3MHz 0x6C9333 - [ADDR_AFCCTRL, VAL_AFCCTRLS], # standard AFC routine - [ADDR_LNA, VAL_LNA50], # 200ohms, gain by AGC loop -> 50ohms - [ADDR_RXBW, VAL_RXBW60], # channel filter bandwidth 10kHz -> 60kHz page:26 - [ADDR_BITRATEMSB, 0x1A], # 4800b/s - [ADDR_BITRATELSB, 0x0B], # 4800b/s - #[ADDR_AFCFEI, VAL_AFCFEIRX], # AFC is performed each time rx mode is entered - #[ADDR_RSSITHRESH, VAL_RSSITHRESH220], # RSSI threshold 0xE4 -> 0xDC (220) - #[ADDR_PREAMBLELSB, VAL_PREAMBLELSB5], # preamble size LSB set to 5 - [ADDR_SYNCCONFIG, VAL_SYNCCONFIG2], # Size of the Synch word = 2 (SyncSize + 1) - [ADDR_SYNCVALUE1, VAL_SYNCVALUE1FSK], # 1st byte of Sync word - [ADDR_SYNCVALUE2, VAL_SYNCVALUE2FSK], # 2nd byte of Sync word - #[ADDR_PACKETCONFIG1, VAL_PACKETCONFIG1FSK], # Variable length, Manchester coding, Addr must match NodeAddress - [ADDR_PACKETCONFIG1, VAL_PACKETCONFIG1FSKNO], # Variable length, Manchester coding - [ADDR_PAYLOADLEN, VAL_PAYLOADLEN66], # max Length in RX, not used in Tx - #[ADDR_NODEADDRESS, VAL_NODEADDRESS01], # Node address used in address filtering - [ADDR_NODEADDRESS, 0x06], # Node address used in address filtering - [ADDR_FIFOTHRESH, VAL_FIFOTHRESH1], # Condition to start packet transmission: at least one byte in FIFO - [ADDR_OPMODE, MODE_RECEIVER] # Operating mode to Receiver + [ADDR_REGDATAMODUL, VAL_REGDATAMODUL_FSK], # modulation scheme FSK + [ADDR_FDEVMSB, VAL_FDEVMSB30], # frequency deviation 5kHz 0x0052 -> 30kHz 0x01EC + [ADDR_FDEVLSB, VAL_FDEVLSB30], # frequency deviation 5kHz 0x0052 -> 30kHz 0x01EC + [ADDR_FRMSB, VAL_FRMSB434], # carrier freq -> 434.3MHz 0x6C9333 + [ADDR_FRMID, VAL_FRMID434], # carrier freq -> 434.3MHz 0x6C9333 + [ADDR_FRLSB, VAL_FRLSB434], # carrier freq -> 434.3MHz 0x6C9333 + [ADDR_AFCCTRL, VAL_AFCCTRLS], # standard AFC routine + [ADDR_LNA, VAL_LNA50], # 200ohms, gain by AGC loop -> 50ohms + [ADDR_RXBW, VAL_RXBW60], # channel filter bandwidth 10kHz -> 60kHz page:26 + [ADDR_BITRATEMSB, 0x1A], # 4800b/s + [ADDR_BITRATELSB, 0x0B], # 4800b/s + #[ADDR_AFCFEI, VAL_AFCFEIRX], # AFC is performed each time rx mode is entered + #[ADDR_RSSITHRESH, VAL_RSSITHRESH220], # RSSI threshold 0xE4 -> 0xDC (220) + #[ADDR_PREAMBLELSB, VAL_PREAMBLELSB5], # preamble size LSB set to 5 + [ADDR_SYNCCONFIG, VAL_SYNCCONFIG2], # Size of the Synch word = 2 (SyncSize + 1) + [ADDR_SYNCVALUE1, VAL_SYNCVALUE1FSK], # 1st byte of Sync word + [ADDR_SYNCVALUE2, VAL_SYNCVALUE2FSK], # 2nd byte of Sync word + #[ADDR_PACKETCONFIG1, VAL_PACKETCONFIG1FSK], # Variable length, Manchester coding, Addr must match NodeAddress + [ADDR_PACKETCONFIG1, VAL_PACKETCONFIG1FSKNO], # Variable length, Manchester coding + [ADDR_PAYLOADLEN, VAL_PAYLOADLEN66], # max Length in RX, not used in Tx + #[ADDR_NODEADDRESS, VAL_NODEADDRESS01], # Node address used in address filtering + [ADDR_NODEADDRESS, 0x06], # Node address used in address filtering + [ADDR_FIFOTHRESH, VAL_FIFOTHRESH1], # Condition to start packet transmission: at least one byte in FIFO + [ADDR_OPMODE, MODE_RECEIVER] # Operating mode to Receiver ] config_OOK = [ - [ADDR_REGDATAMODUL, VAL_REGDATAMODUL_OOK], # modulation scheme OOK - [ADDR_FDEVMSB, 0], # frequency deviation -> 0kHz - [ADDR_FDEVLSB, 0], # frequency deviation -> 0kHz - [ADDR_FRMSB, VAL_FRMSB433], # carrier freq -> 433.92MHz 0x6C7AE1 - [ADDR_FRMID, VAL_FRMID433], # carrier freq -> 433.92MHz 0x6C7AE1 - [ADDR_FRLSB, VAL_FRLSB433], # carrier freq -> 433.92MHz 0x6C7AE1 - [ADDR_RXBW, VAL_RXBW120], # channel filter bandwidth 120kHz - [ADDR_BITRATEMSB, 0x40], # 1938b/s - [ADDR_BITRATELSB, 0x80], # 1938b/s - #[ADDR_BITRATEMSB, 0x1A], # 4800b/s - #[ADDR_BITRATELSB, 0x0B], # 4800b/s - [ADDR_PREAMBLELSB, 0], # preamble size LSB 3 - [ADDR_SYNCCONFIG, VAL_SYNCCONFIG4], # Size of the Synch word = 4 (SyncSize + 1) - [ADDR_SYNCVALUE1, VAL_SYNCVALUE1OOK], # sync value 1 - [ADDR_SYNCVALUE2, 0], # sync value 2 - [ADDR_SYNCVALUE3, 0], # sync value 3 - [ADDR_SYNCVALUE4, 0], # sync value 4 - [ADDR_PACKETCONFIG1, VAL_PACKETCONFIG1OOK], # Fixed length, no Manchester coding, OOK - [ADDR_PAYLOADLEN, VAL_PAYLOADLEN_OOK], # Payload Length - [ADDR_FIFOTHRESH, VAL_FIFOTHRESH30], # Condition to start packet transmission: wait for 30 bytes in FIFO - #[ADDR_OPMODE, MODE_TRANSMITER] # Transmitter mode + [ADDR_REGDATAMODUL, VAL_REGDATAMODUL_OOK], # modulation scheme OOK + [ADDR_FDEVMSB, 0], # frequency deviation -> 0kHz + [ADDR_FDEVLSB, 0], # frequency deviation -> 0kHz + [ADDR_FRMSB, VAL_FRMSB433], # carrier freq -> 433.92MHz 0x6C7AE1 + [ADDR_FRMID, VAL_FRMID433], # carrier freq -> 433.92MHz 0x6C7AE1 + [ADDR_FRLSB, VAL_FRLSB433], # carrier freq -> 433.92MHz 0x6C7AE1 + [ADDR_RXBW, VAL_RXBW120], # channel filter bandwidth 120kHz + [ADDR_BITRATEMSB, 0x40], # 1938b/s + [ADDR_BITRATELSB, 0x80], # 1938b/s + [ADDR_PREAMBLELSB, 0], # preamble size LSB 3 + [ADDR_SYNCCONFIG, VAL_SYNCCONFIG4], # Size of the Sync word = 4 (SyncSize + 1) + [ADDR_SYNCVALUE1, VAL_SYNCVALUE1OOK], # sync value 1 + [ADDR_SYNCVALUE2, 0], # sync value 2 + [ADDR_SYNCVALUE3, 0], # sync value 3 + [ADDR_SYNCVALUE4, 0], # sync value 4 + [ADDR_PACKETCONFIG1, VAL_PACKETCONFIG1OOK], # Fixed length, no Manchester coding, OOK + [ADDR_PAYLOADLEN, VAL_PAYLOADLEN_OOK], # Payload Length + [ADDR_FIFOTHRESH, VAL_FIFOTHRESH30], # Condition to start packet transmission: wait for 30 bytes in FIFO ] @@ -368,7 +372,7 @@ # Looks like: 0000 00BA gets encoded as: # 128 64 32 16 8 4 2 1 - # 1 0 B B 1 A A 0 + # 1 B B 0 1 A A 0 #payload = [] #for i in range(10): @@ -396,23 +400,28 @@ return payload -def OLD_send_payload_repeat(payload, times=0): +def OLD_send_payload_repeat(payload): """Send a payload multiple times""" # 32 bits enclosed in sync words + #print("waiting for mode and tx ready") HRF_pollreg(ADDR_IRQFLAGS1, MASK_MODEREADY|MASK_TXREADY, MASK_MODEREADY|MASK_TXREADY) #write first payload without sync preamble HRF_writefifo_burst(payload) # preceed all future payloads with a sync-word preamble - if times > 0: - preamble = [0x00,0x80,0x00,0x00,0x00] - preamble_payload = preamble + payload - for i in range(times): # Repeat the message a number of times - HRF_pollreg(ADDR_IRQFLAGS2, MASK_FIFOLEVEL, 0) - HRF_writefifo_burst(preamble_payload) + preamble = [0x00,0x80,0x00,0x00,0x00] + preamble_payload = preamble + payload + # Note, payload length configured in OOK table is based on this + for i in range(8): # Repeat the message a number of times + #print("waiting for fifo empty") + HRF_pollreg(ADDR_IRQFLAGS2, MASK_FIFOLEVEL, 0) + HRF_writefifo_burst(preamble_payload) + #print("waiting for fifo empty") + HRF_pollreg(ADDR_IRQFLAGS2, MASK_FIFOLEVEL, 0) + #print("waiting for packet sent") HRF_pollreg(ADDR_IRQFLAGS2, MASK_PACKETSENT, MASK_PACKETSENT) # wait for Packet sent reg = HRF_readreg(ADDR_IRQFLAGS2) diff --git a/src/legacy.py b/src/legacy.py index 96fb9a7..d03dcd6 100644 --- a/src/legacy.py +++ b/src/legacy.py @@ -91,6 +91,19 @@ print("waiting") time.sleep(2) +def legacy_test(): + ON = radio.OLD_build_OOK_relay_msg(True) + OFF = radio.OLD_build_OOK_relay_msg(False) + + while True: + print("ON") + radio.OLD_send_payload_repeat(ON) + time.sleep(1) + + print("OFF") + radio.OLD_send_payload_repeat(OFF) + time.sleep(1) + if __name__ == "__main__": @@ -99,8 +112,9 @@ radio.transmitter(ook=True) try: - legacy_learn_mode() - legacy_switch_loop() + #legacy_learn_mode() + #legacy_switch_loop() + legacy_test() finally: radio.finished()