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.

TMS570LC4357: ESM error pin always high state

Part Number: TMS570LC4357
Other Parts Discussed in Thread: HALCOGEN

Hi Team,

I recently started working on the ESM module of TMS570LC4357. I'm looking for some detailed description or an example to configure and produce an error to check the ESM functionality since im not getting an expected result.

Steps I followed after reading the manual and the questions from the forum to inject DCC error and check the ESM functionality:

Halcogen configurations:

Code:

/** @file HL_sys_main.c
*   @brief Application main file
*   @date 11-Dec-2018
*   @version 04.07.01
*
*   This file contains an empty main function,
*   which can be used for the application.
*/

/*
* Copyright (C) 2009-2018 Texas Instruments Incorporated - www.ti.com  
*
*
*  Redistribution and use in source and binary forms, with or without
*  modification, are permitted provided that the following conditions
*  are met:
*
*    Redistributions of source code must retain the above copyright
*    notice, this list of conditions and the following disclaimer.
*
*    Redistributions in binary form must reproduce the above copyright
*    notice, this list of conditions and the following disclaimer in the
*    documentation and/or other materials provided with the  
*    distribution.
*
*    Neither the name of Texas Instruments Incorporated nor the names of
*    its contributors may be used to endorse or promote products derived
*    from this software without specific prior written permission.
*
*  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
*  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
*  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
*  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
*  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
*  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
*  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
*  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
*  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
*  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
*  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*/


/* USER CODE BEGIN (0) */
/* USER CODE END */

/* Include Files */

#include "HL_sys_common.h"

/* USER CODE BEGIN (1) */
#include "HL_het.h"
#include "HL_gio.h"
#include "HL_reg_gio.h"
#include "HL_dcc.h"
#include "HL_reg_dcc.h"
#include "HL_esm.h"
#include "HL_reg_esm.h"
#include "HL_hal_stdtypes.h"


/* Standard includes. */
#include <stdio.h>
#include <stdlib.h>

/* USER CODE END */

/** @fn void main(void)
*   @brief Application main function
*   @note This function is empty by default.
*
*   This function is called after startup.
*   The user can use this function to implement the application.
*/

/* USER CODE BEGIN (2) */
uint64 channel_status;
uint32 ErrPin_State;
void delay(void);
void blinky(void);
/* USER CODE END */

int main(void)
{
/* USER CODE BEGIN (3) */
    int i;
    ErrPin_State=3U;

    esmInit();                                                        // Initializing the ESM driver
    dccInit();                                                        // initializes the DCC module
    gioInit();                                                        // Initializes the GIO module
    gioSetDirection(gioPORTB, 0xff);                                  // Setting port B direction as output

    esmActivateNormalOperation();                                     // Activates normal operation mode

    dccEnable(dccREG1);                                               // This function enables the dcc counters to begin counting.
    dccSetCounter0Seed(dccREG1,0U);                                   // sets the seed value for Clock source 0 counter.
    dccGetErrStatus(dccREG1);                                         // Returns the error status of selected dcc1

    esmSetCounterPreloadValue(ESM_LTCPR_CONFIGVALUE);                 // Setting counter pre-load value (esmREG->LTCPR = value & 0xC000U;)

    esmEnableInterrupt(esmCHANNEL30);                                 // Enabling Group-1 Channels Interrupts
                                                                       
    esmSetInterruptLevel(esmCHANNEL30,1);                             // Setting Group-1 Channels Interrupts levels for channels 0-63.
                                                                     

    channel_status = esmGetStatus(esmGROUP1,esmCHANNEL30);            // Return's the channels status of group1
                                                                      // 0 - No error, no interrupt is pending    1 - Error occurred, interrupt pending
     
    ErrPin_State = esmError();
    //esmTriggerErrorPinReset();
       

/* USER CODE END */

    return 0;
}


/* USER CODE BEGIN (4) */

/* USER CODE END */

I am testing some code that monitors the ESM flags in group 1. With this error, the pin state is always high. 

How can I inject DCC error OR in ESM? 

  • If there is no error generated at the end of the sequence, then the DONE status flag is set and a DONE interrupt is generated, and no ESM flag is set.

    After your test, is the ESM 1.30 bit set?

    The ESM preload value and ESM interrupt channel should be set and enabled before DCC counter starts counting ( dccEnable(dccREG1); ):

        esmSetCounterPreloadValue(ESM_LTCPR_CONFIGVALUE); // Setting counter pre-load value (esmREG->LTCPR = value & 0xC000U;)

        esmEnableInterrupt(esmCHANNEL30); // Enabling Group-1 Channels Interrupts

        esmSetInterruptLevel(esmCHANNEL30,1);

  • Hi QJ  Wang,

    I have tried changes as you mentioned above. After my test, the ESM 1.30 bit is not set. And the expected result is not seen on the Erron pin.

    Could you please provide an example code to check the ESM working w.r.t an error injected? 

  • Just did a test. I use OSCIN as cnt0 clock source, and PLL1 as cnt1 cock source. OSCIN=16MHz, and PLL1=300MHz

    cnt0 seed is 39204  ----> 39204*300/16 = 735075

    cnt0 valid is 792       ---->(39204+792)*300/16 =  749925      

    The cnt1 see should be between 735075 and 749925

    If  cnt1 seed = 742500, test passes without error

    If  cnt1 seed is 74250 which is out of the range (735075, 749925), the test failed:

    1. ERR bit is set

    2. ESM 1:30 is set

  • This is the code used for my test:

    /* Include Files */

    #include "HL_sys_common.h"

    /* USER CODE BEGIN (1) */
    #include "HL_dcc.h"

    /* USER CODE END */

    /* USER CODE BEGIN (2) */

    /* USER CODE END */


    uint32 crc_selftest(void);

    uint32 crc_selftest()
    {
    /* Setup DCC1 */
    dccInit();

    /** DCC1 Clock0 Counter Seed value configuration */
    dccREG1->CNT0SEED = 39204U;

    /** DCC1 Clock0 Valid Counter Seed value configuration */
    dccREG1->VALID0SEED = 792U;

    /** DCC1 Clock1 Counter Seed value configuration */
    //dccREG1->CNT1SEED = 742500U;
    dccREG1->CNT1SEED = 74250U;


    /** DCC1 Clock1 Source 1 Select */
    dccREG1->CNT1CLKSRC = (uint32)((uint32)10U << 12U) | /** DCC Enable / Disable Key */
    (uint32) DCC1_CNT1_PLL1; /** DCC1 Clock Source 1 */

    dccREG1->CNT0CLKSRC = (uint32)DCC1_CNT0_OSCIN; /** DCC1 Clock Source 0 */

    /** DCC1 Global Control register configuration */
    dccREG1->GCTRL = (uint32)0xAU | /** Enable / Disable DCC1 */
    (uint32)((uint32)0xAU << 4U) | /** Error Interrupt */
    (uint32)((uint32)0x5U << 8U) | /** Single Shot mode */
    (uint32)((uint32)0xAU << 12U); /** Done Interrupt */


    /* Wait until counter0 seed and valid expires */
    while (dccREG1->STAT == 0);

    dccDisable(dccREG1);
    }

  • This is the status of error pin. The error pin is pulled low.