This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
Hello, this is our first post here.
Our design includes a CC2500 for communication. We send it an SIDLE
command followed by an SPWD to put it to sleep. We then try communicating
with it
and sure enough we get an interrupt on the GDO0 line to tell us that a
packet is available. The SIDLE should remove any possibility of a wake on
radio occuring thus we can't understand why we can still communicate. When
we try to talk to it, it received the message that it is sent.
Any help is appreciated.
Oliver
Hi.
Don't have a good explanation here. As you say, issuing a SIDLE will remove the possibility of WOR occuring. I assume you have read the datasheet which states that SPWD will first be executed when CSn goes high? What is the status byte returned when issuing the SPWD command?The 4 msb should be 0s.
You write “then try to communicating with it”
If this implies pulling CSn low, the Circuit naturally reenter active mode.
If you are testing in SmartRF studio you also need to turn of SPI polling
Settings>Polling Interval>Never
Monitoring current consumption is the only method to observe if the transceiver enter WOR or sleep mode. Any other activity will activate it, causing it to leave low power mode.
I am finding a similar problem with the CC2500.
I have a loop that you can see in the code below.
I am monitoring the current drawn by the board. If I issue an SPWD strobe shortly after power-up, in the beginning of the main() function, then the radio chip goes to sleep, and the total power consumption is extremely low.
But if I issue the SPWD strobe in the loop below, the board continues to draw 26 mA continuously. It does not reduce in current for the 4 seconds that it is waiting between transmits.
I am using the EZ430-RF2500 board for this. Do you have any ideas? Thanks.
Sage
while(1)
{
// acquire sensor data
sensorsAllAcq(&SensorData);
// flush transmit buffer
halRfStrobe( CC2500_SFTX );
// Turn on Tx mode
halRfStrobe( CC2500_STX );
// Pack the data into the payload packet
PackPayload (&Payload, &SensorData);
for (i=0; i<20000; i++){i=i+1;}
// Transmit the data
halRfWriteFifo( (uint8*) &Payload, sizeof(struct_Payload) );
for (i=0; i<5000; i++){i=i+1;}
// Power down the radio chip
halRfStrobe(CC2500_SIDLE); // switch to IDLE state first
for (i=0; i<100; i++){i=i+1;}
halRfStrobe(CC2500_SPWD);
// delay 'n' times 4 seconds until next sense event
for (i = 0; i<n; i++)
{
__bis_SR_register(LPM3_bits + GIE); // Enter LPM3, enable interrupts
BLINK_RED(3000);
} // delay loop
} // while
I had similar problem and spent pretty lot time on it. In case if someone would use search and find this topic here is the solution for my case. First of all as it was written, it is necessary to set and keep high level for CE after SPWD to have readio in sleep mode. But I also had to set some delays (after receiving status via SPI that shows that the data was received by radio. I have not measured acurately what their value should be, I simply set very big ones as it is ok for my case) between sending SIDLE and SPWD strobes and between SPWD and switching CE to high. Suppose the accurate values for this delays could be found somewhere in datasheet.
Could you tell me how can I measure the current so as to verify that my radio is/is not in idle or sleep state?
Moreover, lets make sure that i've understood the actions to be taken in order to get in Sleep Mode:
1) give SIDLE command strobe
2)wait a bit
3)give SPWD command strobe
4)wait a bit
5) set CSn high
Is that all? Are we done?
**What about that polling thing from the smartRF studio? Is there another register that
I should make sure that its value doesn't provoke polling?
I would be grateful if I got some answers here.
Thanks a lot !
Panos Markopoulos said:Could you tell me how can I measure the current so as to verify that my radio is/is not in idle or sleep state?
To measure the consumed current you should insert a serial resistor of several Ohms in Vcc or Gnd circuit (the results should be the same). If you use Rf2500, suppose, the easiest way is to make a fuse with resistor and insert it instead of jumper on battery board. (although, it is better to use some stabilized voltage for measurements, or, at least to control the Vcc). After that you can connect the oscilloscope to this resistor and see the picture. You will hardly be able to measure the sleep mode current (as voltage would be to small), but at least you would be able to detect when radio is sleeping, when it is in idle mode and when it is in RX/TX.
For more details - look SLAA378B, page 11.
Panos Markopoulos said:Moreover, lets make sure that i've understood the actions to be taken in order to get in Sleep Mode:
1) give SIDLE command strobe
2)wait a bit
3)give SPWD command strobe
4)wait a bit
5) set CSn high
Is that all? Are we done?
As for the sleep procedure, seems all is correct (if you already have selected chip before). As for me, I am using the following simple code: (with RF2500 boards)
P3OUT &= ~0x01; //chip select
UCB0TXBUF = 0x36; //IDLE RADIO STROBE
while (!(IFG2 & UCB0TXIFG));
while (!(IFG2 & UCB0RXIFG));
UCB0TXBUF = 0x39; //LPM RADIO STROBE
while (!(IFG2 & UCB0TXIFG));
while (!(IFG2 & UCB0RXIFG));
P3OUT |= 0x01;
But it would be better to check with oscilloscope if all is ok. And test the communication with radio - for example try to write something to radio register and the read it back to make sure that communication is working.
Panos Markopoulos said:**What about that polling thing from the smartRF studio? Is there another register that
I should make sure that its value doesn't provoke polling?
I suppose, there should not be any polling issues, as wake-on-radio requires special strobe. But again, better to check with oscilloscope.