diff --git a/src/energenie/hrf69.h b/src/energenie/hrf69.h index 6fa06c5..f17242a 100644 --- a/src/energenie/hrf69.h +++ b/src/energenie/hrf69.h @@ -7,115 +7,138 @@ //# 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 +#ifndef _HRF69_H +#define _HRF69_H -//# 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 +typedef uint8_t HRF_RESULT; -//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 +typedef struct +{ + uint8_t addr; + uint8_t value; +} HRF_CONFIG_REC; -//def HRF_writereg(addr, data): +// Register addresses +#define HRF_ADDR_FIFO = 0x00 +#define HRF_ADDR_OPMODE = 0x01 +#define HRF_ADDR_REGDATAMODUL = 0x02 +#define HRF_ADDR_BITRATEMSB = 0x03 +#define HRF_ADDR_BITRATELSB = 0x04 +#define HRF_ADDR_FDEVMSB = 0x05 +#define HRF_ADDR_FDEVLSB = 0x06 +#define HRF_ADDR_FRMSB = 0x07 +#define HRF_ADDR_FRMID = 0x08 +#define HRF_ADDR_FRLSB = 0x09 +#define HRF_ADDR_AFCCTRL = 0x0B +#define HRF_ADDR_LNA = 0x18 +#define HRF_ADDR_RXBW = 0x19 +#define HRF_ADDR_AFCFEI = 0x1E +#define HRF_ADDR_IRQFLAGS1 = 0x27 +#define HRF_ADDR_IRQFLAGS2 = 0x28 +#define HRF_ADDR_RSSITHRESH = 0x29 +#define HRF_ADDR_PREAMBLELSB = 0x2D +#define HRF_ADDR_SYNCCONFIG = 0x2E +#define HRF_ADDR_SYNCVALUE1 = 0x2F +#define HRF_ADDR_SYNCVALUE2 = 0x30 +#define HRF_ADDR_SYNCVALUE3 = 0x31 +#define HRF_ADDR_SYNCVALUE4 = 0x32 +#define HRF_ADDR_PACKETCONFIG1 = 0x37 +#define HRF_ADDR_PAYLOADLEN = 0x38 +#define HRF_ADDR_NODEADDRESS = 0x39 +#define HRF_ADDR_FIFOTHRESH = 0x3C -//def HRF_readreg(addr): +// Masks to set and clear bits +#define HRF_MASK_REGDATAMODUL_OOK = 0x08 +#define HRF_MASK_REGDATAMODUL_FSK = 0x00 +#define HRF_MASK_WRITE_DATA = 0x80 +#define HRF_MASK_MODEREADY = 0x80 +#define HRF_MASK_FIFONOTEMPTY = 0x40 +#define HRF_MASK_FIFOLEVEL = 0x20 +#define HRF_MASK_FIFOOVERRUN = 0x10 +#define HRF_MASK_PACKETSENT = 0x08 +#define HRF_MASK_TXREADY = 0x20 +#define HRF_MASK_PACKETMODE = 0x60 +#define HRF_MASK_MODULATION = 0x18 +#define HRF_MASK_PAYLOADRDY = 0x04 -//def HRF_writefifo_burst(buf): +// Radio modes +#define HRF_MODE_STANDBY = 0x04 // Standby +#define HRF_MODE_TRANSMITER = 0x0C // Transmiter +#define HRF_MODE_RECEIVER = 0x10 // Receiver -//def HRF_readfifo_burst(): +// Values to store in registers +//TODO some of these are energenie radio config specific -//def HRF_checkreg(addr, mask, value): +#define HRF_VAL_REGDATAMODUL_FSK = 0x00 // Modulation scheme FSK +#define HRF_VAL_REGDATAMODUL_OOK = 0x08 // Modulation scheme OOK +#define HRF_VAL_FDEVMSB30 = 0x01 // frequency deviation 5kHz 0x0052 -> 30kHz 0x01EC +#define HRF_VAL_FDEVLSB30 = 0xEC // frequency deviation 5kHz 0x0052 -> 30kHz 0x01EC +#define HRF_VAL_FRMSB434 = 0x6C // carrier freq -> 434.3MHz 0x6C9333 +#define HRF_VAL_FRMID434 = 0x93 // carrier freq -> 434.3MHz 0x6C9333 +#define HRF_VAL_FRLSB434 = 0x33 // carrier freq -> 434.3MHz 0x6C9333 +#define HRF_VAL_FRMSB433 = 0x6C // carrier freq -> 433.92MHz 0x6C7AE1 +#define HRF_VAL_FRMID433 = 0x7A // carrier freq -> 433.92MHz 0x6C7AE1 +#define HRF_VAL_FRLSB433 = 0xE1 // carrier freq -> 433.92MHz 0x6C7AE1 +#define HRF_VAL_AFCCTRLS = 0x00 // standard AFC routine +#define HRF_VAL_AFCCTRLI = 0x20 // improved AFC routine +#define HRF_VAL_LNA50 = 0x08 // LNA input impedance 50 ohms +#define HRF_VAL_LNA50G = 0x0E // LNA input impedance 50 ohms, LNA gain -> 48db +#define HRF_VAL_LNA200 = 0x88 // LNA input impedance 200 ohms +#define HRF_VAL_RXBW60 = 0x43 // channel filter bandwidth 10kHz -> 60kHz page:26 +#define HRF_VAL_RXBW120 = 0x41 // channel filter bandwidth 120kHz +#define HRF_VAL_AFCFEIRX = 0x04 // AFC is performed each time RX mode is entered -//def HRF_pollreg(addr, mask, value): +//TODO: These might be energenie config specific +#define HRF_VAL_RSSITHRESH220 = 0xDC // RSSI threshold 0xE4 -> 0xDC (220) +#define HRF_VAL_PREAMBLELSB3 = 0x03 // preamble size LSB 3 +#define HRF_VAL_PREAMBLELSB5 = 0x05 // preamble size LSB 5 +#define HRF_VAL_SYNCCONFIG2 = 0x88 // Size of the Synch word = 2 (SyncSize + 1) +#define HRF_VAL_SYNCCONFIG4 = 0x98 // Size of the Synch word = 4 (SyncSize + 1) +#define HRF_VAL_SYNCVALUE1FSK = 0x2D // 1st byte of Sync word +#define HRF_VAL_SYNCVALUE2FSK = 0xD4 // 2nd byte of Sync word +#define HRF_VAL_SYNCVALUE1OOK = 0x80 // 1nd byte of Sync word +#define HRF_VAL_PACKETCONFIG1FSK = 0xA2 // Variable length, Manchester coding, Addr must match NodeAddress +#define HRF_VAL_PACKETCONFIG1FSKNO = 0xA0 // Variable length, Manchester coding +#define HRF_VAL_PACKETCONFIG1OOK = 0 // Fixed length, no Manchester coding +#define HRF_VAL_PAYLOADLEN255 = 0xFF // max Length in RX, not used in Tx +#define HRF_VAL_PAYLOADLEN66 = 66 // max Length in RX, not used in Tx +#define HRF_VAL_PAYLOADLEN_OOK = (13 + 8 * 17) // Payload Length +#define HRF_VAL_NODEADDRESS01 = 0x01 // Node address used in address filtering +#define HRF_VAL_NODEADDRESS04 = 0x04 // Node address used in address filtering +#define HRF_VAL_FIFOTHRESH1 = 0x81 // Condition to start packet transmission: at least one byte in FIFO +#define HRF_VAL_FIFOTHRESH30 = 0x1E // Condition to start packet transmission: wait for 30 bytes in FIFO -//def HRF_wait_ready(): -//def HRF_wait_txready(): +extern void HRF_writereg(uint8_t addr, uint8_t data); -//def HRF_change_mode(mode): +extern uint8_t HRF_readreg(uint8_t addr); -//def HRF_clear_fifo(): +extern void HRF_writefifo_burst(uint8_t* buf uint8_t len); -//def HRF_check_payload(): +extern uint8_t* HRF_readfifo_burst(void); -//def HRF_receive_payload(): +extern HRF_RESULT HRF_checkreg(uint8_t addr, uint8_t mask, uint8_t value); -//def HRF_send_payload(payload): +extern void HRF_pollreg(uint8_t addr, uint8_t mask, uint8_t value); -//def HRF_config(config): +extern void HRF_wait_ready(void); -//# END +extern void HRF_wait_txready(void); + +extern void HRF_change_mode(uint8_t mode); + +extern void HRF_clear_fifo(void); + +extern HRF_RESULT HRF_check_payload(void); + +extern uint8_t* HRF_receive_payload(void); + +extern void HRF_send_payload(uint8_t* payload, uint8_t len); + +extern void HRF_config(HRF_CONFIG_REC* config, uint8_t len); + +#endif + +/***** END OF FILE *****/ + diff --git a/src/energenie/radio.h b/src/energenie/radio.h index 3cb897c..5fd45b0 100644 --- a/src/energenie/radio.h +++ b/src/energenie/radio.h @@ -3,23 +3,33 @@ * Energenie radio interface */ +#ifndef _RADIO_H +#define _RADIO_H -//def HRF_send_OOK_payload(payload): +typedef uint8_t RADIO_RESULT; -//def init(): +typedef uint8_t RADIO_MODULATION +#define RADIO_MODULATION_OOK 0 +#define RADIO_MODULATION_FSK 1 -//def modulation(fsk=None, ook=None): +extern void radio_init(void); -//def transmitter(fsk=None, ook=None): +extern void radio_modulation(RADIO_MODULATION mod); -//def transmit(payload): +extern void radio_transmitter(RADIO_MODULATION mod); -//def receiver(fsk=None, ook=None): +extern void radio_transmit(uint8_t* payload, uint8_t len); -//def isReceiveWaiting(): +extern void radio_send_OOK_payload(uint8_t* payload, uint8_t len); -//def receive(): +extern void radio_receiver(RADIO_MODULATION mod); -//def finished(): +extern RADIO_RESULT radio_isReceiveWaiting(void); -//# END +extern uint8_t* radio_receive(uint8_t maxlen); + +extern void radio_finished(void); + +#endif + +/***** END OF FILE *****/