TMS570LS0914: CAN1 is not communicating after wake-up from sleep mode.

Part Number: TMS570LS0914

CAN1 is not communicating after the Sleep-to-Wake-up transition, while CAN2 resumes communication successfully. Both CAN channels use the same wake-up triggers and follow the same software communication flow. Since CAN2 communication is functioning as expected after wake-up, the issue appears to be specific to the CAN1 channel. Further investigation is required to verify the CAN1 controller state, transceiver status, initialization sequence, and network conditions after wake-up.

The TCAN1043ADRQ1 transceiver is used for both channels.
  • Hi,

    Please check the DCAN CTL register for CAN1. If the PDR (Power Down Request) bit is still stuck high or the Init bit refuses to clear, the internal state machine is frozen.

  • Have you cleared the bit in PSPWRDWNCLRx register for DCAN1 clock domain? If the DCAN1 clock is still gated at the PCR level post-wake, register writes to CAN1 will have no effect.

    What are the values of the DCAN1 CTL and DCAN1 ES registers right after the failed wake-up?

    Is CAN transceiver is enabled by a GPIO? are the transceivers controlled by the same GIO pin?

  • We captured the DCAN1 CTL register values immediately after wake-up and compared them with the working case.

    Working case: DCAN1->CTL = 0x00021402
    Failed wake-up case: DCAN1->CTL = 0x00021403


    The only difference between the two values is the INIT bit (Bit 0). In the failed wake-up scenario, the INIT bit remains set, indicating that DCAN1 stays in Initialization Mode and does not enter Normal Communication Mode.


    As a test, we manually cleared the INIT bit:

    canREG1->CTL &= ~1U;

    After clearing the INIT bit, CAN1 immediately started communicating normally.

    This indicates that the CAN controller is functional, however DCAN1 is getting stuck in Initialization Mode after wake-up. We would like to understand the possible reasons why the INIT bit is not getting cleared automatically during the wake-up sequence.

    Also, our periphInit() function clears all PSPWRDWNCLRx registers (0xFFFFFFFF), enabling all peripheral clock domains. Could there be any other condition during wake-up that prevents DCAN1 from exiting Initialization Mode even though the peripheral clock appears to be enabled?

  • Failed wake-up case: DCAN1->CTL = 0x00021403

    The INIT is set which means the CAN is not in normal operation mode.

    In the Bosch DCAN IP used by TI Hercules microcontrollers, the INIT bit is never automatically cleared by hardware when exiting a power-down state. It always requires software intervention. Clearing PSPWRDWNCLRx only restores the peripheral clock domain to the module.

    After clearing the INIT bit, CAN1 immediately started communicating normally.

    Since your manual test confirms the hardware is perfectly operational, you should explicitly handle the INIT bit removal at the end of your wake-up sequence。

    1. Clear PSPWRDWNCLRx bit to enable CAN1 peripheral clock

    2. Add a short delay to guarantee the clock propagation

    3. Clear INIT to enter normal operation mode

    4. Wait for the module to sync to the bus (11 recessive bit) and verify INIT bit is cleared 

    while ((canREG1->CTL & 1U) == 1U);

    In the failed wake-up scenario

    Can you verify the wake-up configuration? How the wake-up sequence is triggered (e.g., via an external GPIO, a CAN transceiver RX edge, or an internal timer? Are you using HalCoGen-generated drivers?

    BTW, What are the value of these two bits (PDA, WakeUpPnd) in ES register?

  • 1. Clear PSPWRDWNCLRx bit to enable CAN1 peripheral clock

    The PSPWRDWNCLR registers are already cleared in _c_int00() by writing 0xFFFFFFFF to PSPWRDWNCLR0-3, which releases all peripheral clock domains, including CAN1. Hence, CAN1 clock gating at the PCR level is already taken care of during startup.
  • Can you verify the wake-up configuration? How the wake-up sequence is triggered (e.g., via an external GPIO, a CAN transceiver RX edge, or an internal timer? Are you using HalCoGen-generated drivers?

    The wake-up is triggered by a GPIO wake-up source as well as an analog wake-up condition when the monitored signal exceeds the configured threshold.
  • In the Bosch DCAN IP used by TI Hercules microcontrollers, the INIT bit is never automatically cleared by hardware when exiting a power-down state. It always requires software intervention. Clearing PSPWRDWNCLRx only restores the peripheral clock domain to the modul

    We are already clearing the INIT bit once after wake-up in the initialization sequence. However, the issue was still observed. For testing, we implemented a polling-based check/clear of the INIT bit after wake-up, and communication is working consistently with this approach.

  • Failed wake-up case: DCAN1->CTL = 0x00021403

    The ABO (Auto-Bus-On) bit and WUBA bit in CTL are not enabled. If the ABO is disabled, any physical line disturbance during the transceiver power-up phase could hard-lock the module into INIT = 1 until software manually clears it. If WUBA=0, no detection of a dominant CAN bus level while in local power down mode.

       

    The wake-up is triggered by a GPIO wake-up source as well as an analog wake-up condition when the monitored signal exceeds the configured threshold.

    Analog wake-up condition: is it CAN bus activity?

    How do you use a GPIO to wake-up CAN? My understanding is to force the Global Clock Module (GCM) to restore the core clocks (GCLK, HCLK) the exact moment the GPIO edge is detected. Please refer to the section "VIM Wakeup Interrupt" in device TRM. Is the GPIO connected to CAN transceiver? 

  • What are the values of the DCAN1 CTL and DCAN1 ES registers right after the failed wake-up?

    During wake-up, we occasionally observe the DCAN1 ES register = 231 (0xE7) immediately after the communication failure.

  • Hi Delna,

    Because bits 8, 9, and 10 (PER, WakeUpPnd, and PDA) are all 0 in this specific value (0x00E7), the node is trapped in a permanent Bus-Off state without any active wake-up pending flags at the exact millisecond of the read.

    Since LEC is 7h (No Error), the DCAN module isn't actively seeing stuffing, form, or acknowledgment errors on the line right now. Instead, it has already shut down its analog transmission drivers because the error counters previously hit their absolute maximum limits before or during the initialization phase.
    To see why it immediately gave up on waking up, let's look at the initialization process:
    The Init bit of DCAN1 CTL is stuck at 1.
    Do you know if your code manually clears the BOff state by resetting the Init bit, or are you relying on Auto-Bus-On (ABO)? Can you please double check if the any CAN signal (RX, TX) is shorted to GND, or 3.3V, or shorted together?