Interfacing with RFEM24-250!

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

Interfacing with RFEM24-250!

3,107 Views
ganesh3
Contributor II

Hello People,

I'm not able to properly interface with RFEM24-250 RF Energy Module via I2C. Specifically, I cannot set the device mode to operating as it is always in standby mode. I followed all the basic command sequences mentioned in the user manual specifications. Any help or extra documentation would be appreciated.

-Ganesh

0 Kudos
10 Replies

2,987 Views
Braveheart53
Contributor I

@ganesh3 

Were you able to successfully interface with the module?

I am attempting to do the same using I2C with a Total Phase Aardvark as the Master OR an Arduino Uno as the maser both through Matlab.

 

I can do python as well, but the customer preferred matlab. Please advise.

0 Kudos

2,957 Views
ganesh3
Contributor II

Yes. I was able to connect. Please let me know which step you are stuck on.

-Ganesh

-Ganesh

0 Kudos

3,090 Views
LPP
NXP Employee
NXP Employee

At first, try to determine the reason of the standby using LED indication as described in the Interface Reference Manual.
Then read "Read Alerts" register and investigate all the status bits.
If CMD_ERR Alert bit is set, read an error code that will provide more information as to the cause of the error.


Have a great day,
Pavel
TIC
-------------------------------------------------------------------------------
Note:
- If this post answers your question, please click the "Mark Correct" button. Thank you!
- We are following threads for 7 weeks after the last post, later replies are ignored
Please open a new thread and refer to the closed one, if you have a related question at a later point in time.
-------------------------------------------------------------------------------

0 Kudos

2,975 Views
Braveheart53
Contributor I

@LPP 

Pavel, the LED is awaiting ID assignment in my case. Yet, I cannot get it to assign address. The arduino uno dioes not detect it either by 0x7F address or by bus search. A total phase aardvark as master does see the device at the 0X7F address, but device does not seem to respond.

Ideally, I would like to control with an Arduino Uno as master through matlab. This method allows the user to monitor other pins and device status. Please advise.

0 Kudos

2,956 Views
ganesh3
Contributor II

Hello!

I got the Module to work and its worth the money. Firstly, I hope you were able to download the interface datasheet from NXP.

I followed the following steps to assign the ID after your regular initializations:

  • Reset by pulling the pin LOW and pulling it HIGH after a second
  • Send Reset Command via I2C Interface (0x00, 0x65(CRC))
  • Read Alerts Command vial I2C Interface (0x46, 0xB0) and Read the alerts (Alert-Status, Error-Code, CRC)
  • Verify the incoming CRC
  • Send 'Assign-Command' via I2C Interface (0x01, newID, CRC(based on newID))

This should work. Verify by LED Status! (It should change to Standby)

Also, I would recommend the following troubleshooting tips before you actually connect your load:

  • What is the status LED indicating as you send the instructions
  • Did you make sure that all the pins are properly connected? Verify the data and clock lines with an oscilloscope
  • Did you follow the CRC Generation process as described in the manual? Make sure that you did set the seed to 0x01? Use an online CRC calculator to verify as well.
  • Check the reset pin!

Do let me know if you need more help.

-Ganesh

0 Kudos

2,432 Views
RC_Argo
Contributor I

Hey Ganesh, reviving an old thread.  I am also trying to use an Arduino UNO as the host for this module.  I am stuck on figuring out the CRC calculation function.  For the reset command, 0x00, the supplied function (and lookup table) generates 0x65 which matches your comment and seems to have the desired effect.  However, when I try the CRC calculation for the Read Alerts command I am missing something.

Sending 0x46 0xB0 as you suggest above does seem successful, as I am able to then read alert bytes back (ie Wire.available() = 2).  However, when I try to use the supplied CRC functions (either lookup or the alternate implementation shown on page 25 of the interface doc) with an input of 0x46 I get 0x97 (151) instead of the 0xB0 value suggested.

Can you provide the code you used to get the module running, or comment on what may be going wrong with my understanding of the CRC code?

0 Kudos

2,418 Views
ganesh3
Contributor II

CRC Table:

static const uint8_t crc8_table_[256] = {
0x00, 0x65, 0xCA, 0xAF, 0xF1, 0x94, 0x3B, 0x5E, 0x87, 0xE2, 0x4D, 0x28, 0x76, 0x13, 0xBC, 0xD9,
0x6B, 0x0E, 0xA1, 0xC4, 0x9A, 0xFF, 0x50, 0x35, 0xEC, 0x89, 0x26, 0x43, 0x1D, 0x78, 0xD7, 0xB2,
0xD6, 0xB3, 0x1C, 0x79, 0x27, 0x42, 0xED, 0x88, 0x51, 0x34, 0x9B, 0xFE, 0xA0, 0xC5, 0x6A, 0x0F,
0xBD, 0xD8, 0x77, 0x12, 0x4C, 0x29, 0x86, 0xE3, 0x3A, 0x5F, 0xF0, 0x95, 0xCB, 0xAE, 0x01, 0x64,
0xC9, 0xAC, 0x03, 0x66, 0x38, 0x5D, 0xF2, 0x97, 0x4E, 0x2B, 0x84, 0xE1, 0xBF, 0xDA, 0x75, 0x10,
0xA2, 0xC7, 0x68, 0x0D, 0x53, 0x36, 0x99, 0xFC, 0x25, 0x40, 0xEF, 0x8A, 0xD4, 0xB1, 0x1E, 0x7B,
0x1F, 0x7A, 0xD5, 0xB0, 0xEE, 0x8B, 0x24, 0x41, 0x98, 0xFD, 0x52, 0x37, 0x69, 0x0C, 0xA3, 0xC6,
0x74, 0x11, 0xBE, 0xDB, 0x85, 0xE0, 0x4F, 0x2A, 0xF3, 0x96, 0x39, 0x5C, 0x02, 0x67, 0xC8, 0xAD,
0xF7, 0x92, 0x3D, 0x58, 0x06, 0x63, 0xCC, 0xA9, 0x70, 0x15, 0xBA, 0xDF, 0x81, 0xE4, 0x4B, 0x2E,
0x9C, 0xF9, 0x56, 0x33, 0x6D, 0x08, 0xA7, 0xC2, 0x1B, 0x7E, 0xD1, 0xB4, 0xEA, 0x8F, 0x20, 0x45,
0x21, 0x44, 0xEB, 0x8E, 0xD0, 0xB5, 0x1A, 0x7F, 0xA6, 0xC3, 0x6C, 0x09, 0x57, 0x32, 0x9D, 0xF8,
0x4A, 0x2F, 0x80, 0xE5, 0xBB, 0xDE, 0x71, 0x14, 0xCD, 0xA8, 0x07, 0x62, 0x3C, 0x59, 0xF6, 0x93,
0x3E, 0x5B, 0xF4, 0x91, 0xCF, 0xAA, 0x05, 0x60, 0xB9, 0xDC, 0x73, 0x16, 0x48, 0x2D, 0x82, 0xE7,
0x55, 0x30, 0x9F, 0xFA, 0xA4, 0xC1, 0x6E, 0x0B, 0xD2, 0xB7, 0x18, 0x7D, 0x23, 0x46, 0xE9, 0x8C,
0xE8, 0x8D, 0x22, 0x47, 0x19, 0x7C, 0xD3, 0xB6, 0x6F, 0x0A, 0xA5, 0xC0, 0x9E, 0xFB, 0x54, 0x31,
0x83, 0xE6, 0x49, 0x2C, 0x72, 0x17, 0xB8, 0xDD, 0x04, 0x61, 0xCE, 0xAB, 0xF5, 0x90, 0x3F, 0x5A
};

uint8_t GetCRCByte(uint8_t* DATA, uint8_t LENGTH, uint8_t CRC_SEED)
{
//Keep Decrementing the Data length!
while(LENGTH--)
{
CRC_SEED = crc8_table_[(uint8_t)(CRC_SEED ^ *DATA++)];
}

return CRC_SEED;
}

2,393 Views
RC_Argo
Contributor I

Awesome, thank you for the response - my problem actually ended up being with the I2C bus which is now sorted.  Now that I have that fixed though, I am unsure how to supply the required 32MHz clock (or standalone crystal as I'm only using one module).  I have 32 MHz crystal oscillators but the interface document is very scarce on how this should be input to the RFEM. What was your solution for that?

0 Kudos

2,385 Views
ganesh3
Contributor II

Hey Bud! see the picture for details on my setup for the crystal. I used an enable line to control this crystal oscillator (it is optional)

crystal.PNG

0 Kudos

2,327 Views
RC_Argo
Contributor I

Great, many thanks for the helpful responses.  I have a functioning clock set up and the module is entering operating mode.  Unfortunately it is now failing the pulse test with error code 0xA1, "under forward power" in the low power portion of the test.  Did you run into anything similar?  The interface manual again doesn't give any information on troubleshooting.

0 Kudos