Class to communicate with ELV(R) MAX! wireless devices with RFM22B-Modules. Based on Library RF22. Initial version unable to send! Only receive! See http://mbed.org/users/charly/notebook/reading-a-max-wireless-window-sensor-with-rfm22-an/
Dependents: RF22_MAX_test_Send
Revision 2:f75e51ce001b, committed 2013-10-22
- Comitter:
- charly
- Date:
- Tue Oct 22 19:41:52 2013 +0000
- Parent:
- 1:6321e6784ada
- Commit message:
- Changes for Sending Messages
Changed in this revision
RF22Max.cpp | Show annotated file Show diff for this revision Revisions of this file |
RF22Max.h | Show annotated file Show diff for this revision Revisions of this file |
--- a/RF22Max.cpp Wed Sep 18 20:03:26 2013 +0000 +++ b/RF22Max.cpp Tue Oct 22 19:41:52 2013 +0000 @@ -1,3 +1,6 @@ +//show debug output on Serial pc +#define DEBUG + #include "mbed.h" #include <RF22Max.h> @@ -8,9 +11,9 @@ } static const RF22::ModemConfig max_config = { // for MAX! protocol - .reg_1c = 0x01, - .reg_1f = 0x03, - .reg_20 = 0x90, + .reg_1c = 0x01, //POR-Value : 75KHzBW? + .reg_1f = 0x03, //POR-Value: + .reg_20 = 0x90, //?? Oversampling Rate .reg_21 = 0x20, .reg_22 = 0x51, .reg_23 = 0xea, @@ -22,10 +25,12 @@ .reg_2e = 0x00, .reg_58 = 0x80, // Copied from RF22 defaults .reg_69 = 0x60, // Copied from RF22 defaults - .reg_6e = 0x08, - .reg_6f = 0x31, - .reg_70 = 0x24, - .reg_71 = RF22_DTMOD_FIFO | RF22_MODTYP_FSK, + //.reg_6e = 0x08, // TX Data Rate 1 + //.reg_6f = 0x31, // TX Data Rate 0 + .reg_6e = 0x51, // TX Data Rate 1 + .reg_6f = 0xDC, // TX Data Rate 0 + .reg_70 = 0x20, //<30kps,no manchaster, no dewithening + .reg_71 = RF22_DTMOD_FIFO | RF22_MODTYP_FSK, //=0x22 .reg_72 = 0x1e, }; @@ -169,7 +174,7 @@ if (ret) { //Max! specific settings this->RF22::setModemRegisters(&max_config); - this->RF22::setFrequency(868.3, 0.035); + this->RF22::setFrequency(868.299866, 0.035); /* Disable TX packet control, since the RF22 doesn't do proper * whitening so can't read the length header or CRC. We need RX packet * control so the RF22 actually sends pkvalid interrupts when the @@ -181,8 +186,8 @@ this->RF22::setSyncWords(max_sync_words, lengthof(max_sync_words)); /* Detect preamble after 4 nibbles */ this->RF22::spiWrite(RF22_REG_35_PREAMBLE_DETECTION_CONTROL1, (0x4 << 3)); - /* Send 8 bytes of preamble */ - this->RF22::setPreambleLength(8); // in nibbles + /* Send 4 nibbles of preamble */ + this->RF22::setPreambleLength(4); // in nibbles this->RF22::spiWrite(RF22_REG_3E_PACKET_LENGTH, 30); // maximum length of a MAX!-packet } return ret; @@ -310,6 +315,52 @@ } } +#if 0 + if (message->type == 0x00 && len >= 11) { //PairPing + char serial[20]=""; + uint8_t sbuf[RF22_MAX_MESSAGE_LEN]; + uint8_t slen =0; + + strncpy(serial,(char*)buf+14,10); //10 Characters for Seial Number + serial[11] = '\0'; +#ifdef DEBUG + pc.printf("Serial: %s\n\r",serial); +#endif + + // try to send PairPong + // wait some time + wait_ms(20); // seen at moritz-code + sbuf[0] = 11; // MsgLen + sbuf[1] = buf[1]+1 &0xFF; // MsgCount ?? + sbuf[2] = 0x00; // Flag + sbuf[3] = 0x01; // Type = Cmd = PairPong + sbuf[4] = 0x11; // From Fake Address + sbuf[5] = 0x11; // From + sbuf[6] = 0x11; // From + sbuf[7] = buf[4] ; // To Address = From address of Windowcontact + sbuf[8] = buf[5] ; + sbuf[9] = buf[6] ; + sbuf[10] = 0x00; // GroupId + sbuf[11] = 0x00; //Payload is 0x00 for pairpong? + slen = 12+2; //+2Byte CRC???? + /* Calculate CRC */ + uint16_t scrc = calc_crc(sbuf, slen - 2); + sbuf[12] = crc >> 8; + sbuf[13] = crc & 0xff; + + + if (RF22::send(sbuf,slen)) { +#ifdef DEBUG + pc.printf("Send PairPong OK\n\r"); +#endif + } else { +#ifdef DEBUG + pc.printf("Send PairPong NOT OK\n\r"); +#endif + } + + } +#endif return true; } else return false;
--- a/RF22Max.h Wed Sep 18 20:03:26 2013 +0000 +++ b/RF22Max.h Tue Oct 22 19:41:52 2013 +0000 @@ -113,15 +113,19 @@ boolean init(); /// start receiver and see if a valid MAX!-message is available and return it undecoded to the caller + /// /// nonblocking - /// check crc and do dewithening + /// + /// do NOT check crc and DO dewithening /// \param[in] buf Location to copy the received message /// \param[in,out] len Pointer to available space in buf(copies maximum len bytes!). Set to the actual number of octets copied. /// \return true if a valid message was copied to buf boolean recv(uint8_t* buf, uint8_t* len); /// start receiver and see if a valid MAX!-message is available and return the decoded message to the caller + /// /// nonblocking + /// /// check crc and do dewithening and do decoding of fields /// \param[in] message A pointer to a RF22Max::max_message /// \return true if a valid message was copied to buf @@ -134,10 +138,14 @@ void printHex(uint8_t *buf, size_t len, bool nl); #endif + /// calc_crc_setup setup crc-calculation uint16_t calc_crc_step(uint8_t crcData, uint16_t crcReg); - - /// calc_crc calculate crc for the data in buf + +public: + /// calculate crc for the data in buf with len + /// \param[in] buf message to calculate crc for + /// \param[in,out] len of message uint16_t calc_crc(uint8_t *buf, size_t len);