CC1110 Minimum time in active mode

Hi,

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:

while(1)

  {

 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():

BSP_TURN_OFF_LED2();
bsp_PowerMode(mode);

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?

Thanks.

  • Hi

    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?

    Br

    Siri

     

  • 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:

    Hi

    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 reset
    while( temp == WORTIME0);
    temp = WORTIME0;
    while( temp == WORTIME0);
    WOREVT1 = (steps>>8);                   // Set timer high byte
    WOREVT0 = (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).

    BR

    Siri

     

  • In reply to Siri:

    Hello Siri,

    I have done what you say and here are the results: 

    With res =1

    Original code: 2,80ms

    Without "While": 2.10ms

    With res=0

    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.

    For example:

    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)

    Others....

    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.

  • In reply to xforus:

     

    Hi

    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.

    BR

    Siri 

  • In reply to Siri:

    Hello Siri,

    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?

    Thank you very much.

  • In reply to xforus:

    Hi

    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.

    BR

    Siri

  • In reply to Siri:

    Hi

    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)."

    BR

    Siri

  • In reply to Siri:

    Siri, thank you for the information.