MCU se despierta del sueño periódicamente

1

Estoy enfrentando un comportamiento extraño en ALGUNOS tableros basados en CC3220SF.

Escenario

  • Tengo 20 unidades de mi PCB personalizado, diseñado siguiendo las Pautas de referencia de diseño de Texas Instruments y, como sugieren, "copiando" el diseño de la placa de demostración
  • la mayoría de ellos funciona bien y han pasado las pruebas de CE

El problema

Algunos de ellos, en cambio, se despiertan periódicamente del estado de hibernación alegando que un GPIO interrumpe la causa de reinicio. Esto no debería ocurrir porque deshabilité cualquier política de activación para GPIO:

const PowerCC32XX_ConfigV1 PowerCC32XX_config = {
    .policyInitFxn = &PowerCC32XX_initPolicy,
    .policyFxn = &PowerCC32XX_sleepPolicy,
    .enterLPDSHookFxn = NULL,
    .resumeLPDSHookFxn = NULL,
    .enablePolicy = false, 
    .enableGPIOWakeupLPDS = false,
    .enableGPIOWakeupShutdown = false,
    .enableNetworkWakeupLPDS = false,
    .wakeupGPIOSourceLPDS = PRCM_LPDS_GPIO13,
    .wakeupGPIOTypeLPDS = PRCM_LPDS_RISE_EDGE,
    .wakeupGPIOFxnLPDS = NULL,
    .wakeupGPIOFxnLPDSArg = 0,
    .wakeupGPIOSourceShutdown = 0, 
    .wakeupGPIOTypeShutdown = PRCM_HIB_RISE_EDGE,
    .ramRetentionMaskLPDS = PRCM_SRAM_COL_1 | PRCM_SRAM_COL_2 | PRCM_SRAM_COL_3 | PRCM_SRAM_COL_4,
    .keepDebugActiveDuringLPDS = true,
    .ioRetentionShutdown = PRCM_IO_RET_GRP_1,
    .pinParkDefs = parkInfo,
    .numPins = sizeof(parkInfo) / sizeof(PowerCC32XX_ParkInfo)
};

Llamo a Power_shutdown (0, 300000); pero cuando MCU se despierta encuentro:

PRCMSysResetCauseGet() == PRCM_HIB_EXIT 
PRCMHibernateWakeupCauseGet() == PRCM_HIB_WAKEUP_CAUSE_GPIO.

Prueba que he realizado

Como se ha dicho, esto no sucederá a todas las tablas. Entonces, al principio, estaba buscando algo de hardware. Configuré un firmware de prueba:

void ApplicationTask(void)
{
    InitSimplelink(ROLE_STA);
    ledOn(); // turn on a LED so I can easily see when the MCU is active

    for (;;)
    {
        Platform_Sleep(5000);
        powerShutdown(300000);
    }
}

La placa de "referencia" (una que funciona bien) muestra el comportamiento esperado: el LED se enciende durante 5 s, luego la MCU hiberna durante 300 s (también cambié esta vez, no importa).

Una de las placas DUT se despierta cada 2 segundos, mientras que otra cada 20 segundos a temperatura ambiente. Al cambiar la temperatura, el intervalo cambia mucho: a unos 40 ° C, el intervalo es más corto, aproximadamente 4 s. A unos 10 ° C es de unos 39 s.

No pude reproducir el problema en los tableros "en funcionamiento", incluso cambiando la temperatura.

Además, traté de leer el contador de reloj lento (el reloj que funciona incluso en estado de hibernación) y parece coherente con el tiempo real, es decir, no cambia (¿mucho?) con la temperatura.

Question

La pregunta es bastante sencilla: ¿qué recomienda en una situación de este tipo para comprender profundamente lo que está sucediendo?

ACTUALIZACIÓN

Usando una boquilla muy delgada para mi pistola de aire caliente, pude calentar cada IC en mi tablero. No tuvo ningún efecto hasta que fui a la MCU: justo después de aplicarle aire caliente, el intervalo se redujo instantáneamente de 22 s a 1 s.

Esquema

    
pregunta Mark

0 respuestas

Lea otras preguntas en las etiquetas