I'm using CC1110 and need to stay in PM2 about 30-100ms. This is not a problem, so datasheet says it shoud be larger than 11ms.
But, what I need is stay only 30us in active mode.
I'm using Simpliciti and this code:
event = BSP_SleepFor( POWER_MODE_2, SLEEP_1_MS_RESOLUTION , 30); BSP_TURN_ON_LED2();
Inside BSP_SleepFor(), I turn off led before bsp_PowerMode():
What I get is 30ms with led in OFF state. This part is OK.
But the minimum time I get with led in ON state is 2,5ms. I need 30us.
is it normal spend this time only to go to PM2 mode?? is it possible reduce this time to 30us?
It should not be necessary for the CC1110 to be awake for 2.5 ms, but I will need to see some code to try to explain why this is happening. I downloaded SimpliciTI but I could not find any of the function calls you say that you use (bsp_PowerMode(): and BSP_SleepFor():
In which files are these files located?
In reply to Siri:
I’m using SimpliciTI v.1.2.0 with bsp_extended.c included in swrc133 (CC1110 and CC2510 Mini DK Software Example)
In reply to xforus:
I have looked at the code and I think I can explain why it takes so long in active before you can enter PM again.
There is one alignment to the 32 kHz clock edge in the bsp_PowerMode function (while( temp == WORTIME0);) and two alignments in the BSP_SleepFor function.
With WOR_RES = 1, waiting for these 3 clock edges will in worst case take: 3*32/32768 = 2.93 ms.
In the BSP_SleepFor function you can try to set WOR_RES to 0 when updating the Sleep timer:
// Update Sleep timer
WORCTL = 0x04 + (res&0x03); // Reset timer and set resolution, mask out the 2 LSB's.uint8_t temp = WORTIME0; // Wait one full 32kHz cycle to allow sleep timer to resetwhile( temp == WORTIME0);temp = WORTIME0;while( temp == WORTIME0);WOREVT1 = (steps>>8); // Set timer high byteWOREVT0 = (uint8_t)steps; // Set timer Low byte
and then set it back to 1.
In the bsp_PowerMode function you cannot do this as there should not be any intervening code between aligning to the 32 kHz clock and entering power mode (please see the CC1110 errata note).
I have done what you say and here are the results:
With res =1
Original code: 2,80ms
Without "While": 2.10ms
Original code: 1,80ms
Without "While": 1,75ms
When res=0 "while" only waste 50us.
I win 1ms using res=0, but this is not enough.
So I have been timing every function inside BSP_SleepFor() using res=0.
SMPL_Ioctl(IOCTL_OBJ_RADIO,IOCTL_ACT_RADIO_SLEEP,0); (uses 130us)
BSP_SET_MAIN_CLOCK_RC(); (uses 1.35ms !!!!!!)
SMPL_Ioctl(IOCTL_OBJ_RADIO, IOCTL_ACT_RADIO_AWAKE,0); (uses 100us)
BSP_SET_MAIN_CLOCK_XOSC(); (uses 265us)
So, I found the function that waste a lot of time. Function called BSP_SET_MAIN_CLOCK_RC(); spends 1.35 ms.
Here is the definition:
#define BSP_SET_MAIN_CLOCK_RC() st(SLEEP &= ~0x04; /* turn on both oscs */ \ while(!(SLEEP & 0x20)); /* wait for RC osc */ \ CLKCON = (0x49 | BV(7)); /* select RC osc */ \ /* wait for requested settings to take effect */ \ while (CLKCON != (0x49 | BV(7))); \ SLEEP |= 0x04;) /* turn off XOSC */
Is there any possibilities to make this function goes faster?
Thank you very much.
Please see page 81 of the data sheet. It says that the low power RCOSC will be calibrated whenever the HS XOSC is running and that the first calibration after the XOSC is started is not possible to abort. The calibration can take up to 2 ms.
I assume that you are using the radio and hence the XOSC is running when the device is in active mode. If this is the case, the calibration of the low power RCOSC is the reason why it takes so long to enter power mode again.
Yes, I'm using radio, so XOSC is running and need to calibrate RCOSC before power off.
In this part of program, radio is not necessary for me. Radio only will be active every 30 seconds.
So, I have tried to not use XOSC in order to not make a calibration every time, and now it works!
Now, CC1110 only stay in active mode a minimum of 80us. Before was 1.85ms!!
I have two more questions:
1- Is 80us a reasonable minimum time in active mode? Or It could be less?
2- Which is the lowest Power Mode that I can use PWM with CC1110? And with CC430?
I do not think you can manage much less than 80 us. The three alignments to the 32 kHz clock takes worst case 2/32768 = 91.55 us with WOR_RES = 0.
PM0 is the lowest power mode you can use PWM with the CC1110. Unfortunately I do not know the CC430 very well, but I will try to get someone from the MSP team answer you.
Here is the response I gor from the MSP team:
"In CC430, LPM3 can effectively support 32kHz operations with the peripherals such as the timers, which can be used to generate the PWM signals. So if the PWM only requires such a slow clock source, it can be enabled in LPM3.
If the PWM requires a higher speed source, you’re most likely looking at LPM0 being the most common low power mode used with high frequency peripheral operations (LPM1/2 could be considered for some marginal power saving if they’re somehow usable for the specific application)."
Siri, thank you for the information.
All content and materials on this site are provided "as is". TI and its respective suppliers and providers of content make no representations about the suitability of these materials for any purpose and disclaim all warranties and conditions with regard to these materials, including but not limited to all implied warranties and conditions of merchantability, fitness for a particular purpose, title and non-infringement of any third party intellectual property right. TI and its respective suppliers and providers of content make no representations about the suitability of these materials for any purpose and disclaim all warranties and conditions with respect to these materials. No license, either express or implied, by estoppel or otherwise, is granted by TI. Use of the information on this site may require a license from a third party, or a license from TI.
TI is a global semiconductor design and manufacturing company. Innovate with 100,000+ analog ICs andembedded processors, along with software, tools and the industry’s largest sales/support staff.