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.

CCS/UCD3138A: CPU crashed by interference

Part Number: UCD3138A

Tool/software: Code Composer Studio

Hi TI experts,

My UCD3138A crashed when power circuits starts. Details is as follows:

1.Instruction stream of main program crashed when power circuits starts working.(All monitored by osciloscope.) CPU is reset until watchdog time(2s) is up.

2.Although main program is crashed, interrupt services are still normally works.

3.No abnormal signals with Reset Pin. CPU hasn't been reset when the program is asserted to be crashed.

4.The more Vin is high, the more the crash is serious.

5.The more the tempreture is low, the more the situation is serious. Occured only when tempreture is below -30 degrees celcius.

6.Voltage on 3.3V digital power supply and BP18 pin are normal, no apparent interference signals on it. Both of these two pins are connected to capacitors and grounds of osciloscope probes are connected nearly to the chip pin.

Please help me if you have any idea about what and how the interference crash the CPU!

Thanks!

Here are two pictures when the CPU starts and reset.

  • Hello Arthur

    It would be worth looking at our practical design guide for layout guidelines and checking it against your layout as the UCD is sensitive to layout, if you have not done so already. It can be found here: http://www.ti.com/lit/an/slua779b/slua779b.pdf

    One of the ARM7 exception handlers may be getting invoked: abort pre-fetch exception, abort data fetch exception or undefined instruction exception.

    I guess it is also possible that you program is getting stuck somewhere in main(), before it reaches the infinite loop.

    I would recommend setting a spare GPIO in main() to determine exactly where it crashes via a scope, and if it is repeatable. 

    So set the GPIO in main() at different positions (using a binary search approach), re-compiling and downloading the new code each time, until you have narrowed in at the location in main() at which the processor is bombing out. Obviously this will only work if it is repeatable.

    I would also use the same approach to check if one of the exception handlers is being invoked: toggle a GPIO in the exception handlers one by one to check which one is getting triggered, like so

    void abort_data_fetch_exception(void)
    {
        toggle GPIO here 
    }

    Again do this in each exception handler one by one to determine which one is being triggered.

    I would recommend that you reset the ARM7 in the exception handlers. I'm guessing you are not doing this already, as if you were the interrupt handlers would not work after the processor bombs out. Obviously when you add the reset you can't debug via toggle GPIOs anymore like I recommend above.

    For example, for the abort data fetch exception handler, you should add the code below (highlighted), same for the other exception handlers abort data fetch exception and undefined instruction exception.

    #pragma INTERRUPT(abort_data_fetch_exception,DABT)

    #pragma CODE_STATE(abort_data_fetch_exception, 32) // this will ensure that this code builds in ARM mode
    void abort_data_fetch_exception(void)
    {
        SysRegs.SYSECR.bit.RESET = 2;
    }

    Best Regards

    Cormac

  • Thank you, Cormac,

    Your suggestions are helpful and I will do more test with the exceptions and improving my PCB designing.