Got old code working again.
Looks like the extra bytes inserted by the buffer bug actually make it work.
This is probably related to sync bytes
1 parent afa662c commit 79b0114fc67518087f926c2b0a40f9b99332bd4e
@David Whale David Whale authored on 28 Mar 2016
Showing 2 changed files
View
304
src/energenie/radio.py
def warning(msg):
print("warning:" + str(msg))
 
def trace(msg):
pass #print(str(msg))
print(str(msg))
 
 
#----- REGISTER ACCESS --------------------------------------------------------
 
 
 
def HRF_writefifo_burst(buf):
"""Write all bytes in buf to the payload FIFO, in a single burst"""
# Don't modify buf, in case caller reuses it
#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()
# 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)
buf.insert(0, ADDR_FIFO | MASK_WRITE_DATA)
spi.frame(buf)
spi.deselect()
 
print("written: %s" % ashex(buf))
 
def ashex(buf):
result = []
for b in buf:
 
#----- 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
 
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
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
 
 
#----- 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
]
 
 
def HRF_wait_ready():
# Wait until we get the OOK spec from Energenie to better document this.
 
# 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):
# j = i + 5
 
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)
trace(" irqflags2=%s" % hex(reg))
View
19
src/legacy.py
radio.transmit(ALL_OFF)
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__":
 
print("starting legacy switch tester")
radio.init()
radio.transmitter(ook=True)
 
try:
legacy_learn_mode()
legacy_switch_loop()
#legacy_learn_mode()
#legacy_switch_loop()
legacy_test()
 
finally:
radio.finished()