Part Number: MSP430I2041
We use the msp430i2041 in our products(thermostat), but there’s some problems in the use of this product .work crashed after a period of time, all IO don't have any output. It seems that CPU did not enter its working condition. The thermostat can run normally when just installed , but after running for a few days this problem occurred. Three such thermostats appeared this problem to a customer. We estimate that it is caused by the interference. The circuit is shown at the appended drawings, relatively simple. Interference is introduced only with power and analog input. Both the power and analog input are filtered (the power is added to the two-level filter, the analog input increases the capacitance), but crashes occur again, electricity to restart.Later we found by doing experiments, if we give the chip’s IO some interference (give high static impulses to JTAG ), the CPU crashes, all IO turn to input mode, but the WDT software is open. When interference disappeared, the CPU still cannot be started.
The other found a problem during the experiments, When external reset circuit is added to SP706 or not, if the voltage drop is not to zero, keeping at about 2.1V, then power it on, CPU can no longer start, the manual RST signal can not be restarted. It has to be Completely power off so the power can start. SP706 is less than 2.6V when the voltage is given RST low signal, CPU should enter the reset state, until the voltage meets the requirement.When given high voltage signal, CPU should start. But the CPU did not started, this is not absolutely.
Please analyse the, what causes. What is the solution. Thank you very much!
Add: part of the code, the schematic diagram.

int __low_level_init(void)
{
unsigned long *jtagPwd = (unsigned long *)JTAG_DIS_PWD1;
/* Feed the watchdog timer */
WDTCTL = WDTPW | WDTCNTCL;
/* Check JTAG password locations and disable JTAG if passwords don't match.
* Else the JTAG will be enabled in the 64th cycle after reset.
*/
if ((*jtagPwd != 0x00000000) && (*jtagPwd != 0xFFFFFFFF))
{
/* Disable JTAG */
SYSJTAGDIS = JTAGDISKEY;
}
/* Calibration section
* Check for the BORIFG flag in IFG1. Execute calibration if this was a BORIFG.
* Else skip calibration
*/
if (IFG1 & BORIFG)
{
// Perform 2's complement checksum on 62 bytes of TLV data
unsigned int checksum = 0;
unsigned char *TLV_address_for_parse = ((unsigned char *)TLV_START);
unsigned int *TLV_address_for_checksum = ((unsigned int *)TLV_START + 1);
do
{
checksum ^= *TLV_address_for_checksum++;
} while (TLV_address_for_checksum <= (unsigned int *)TLV_END);
checksum ^= 0xFFFF;
checksum++;
// If check sum is not correct go to LPM4
if (*((unsigned int *)TLV_START) != checksum)
{
// Enter LPM4 if checksum failed
__bis_SR_register(LPM4_bits);
}
// Check sum matched, now set calibration values
//Calibrate REF
REFCAL1 = *(TLV_address_for_parse + TLV_CAL_REFCAL1);
REFCAL0 = *(TLV_address_for_parse + TLV_CAL_REFCAL0);
// Calibrate DCO
CSIRFCAL = *(TLV_address_for_parse + TLV_CAL_CSIRFCAL);
CSIRTCAL = *(TLV_address_for_parse + TLV_CAL_CSIRTCAL);
CSERFCAL = *(TLV_address_for_parse + TLV_CAL_CSERFCAL);
CSERTCAL = *(TLV_address_for_parse + TLV_CAL_CSERTCAL);
// Calibrate SD24
SD24TRIM = *(TLV_address_for_parse + TLV_CAL_SD24TRIM);
// Clear BORIFG
IFG1 &= ~(BORIFG);
}
/* Feed the watchdog timer */
WDTCTL = WDTPW | WDTCNTCL;
/* Return value:
* 1 - Perform data segment initialization.
* 0 - Skip data segment initialization.
*/
return 1;
}
void main(void)
{
static int adjustState=0;
u8 temp;
_DINT();
_NOP();
WDTCTL = WDTPW | WDTHOLD;// close WDT
CSCTL1 = DIVS__4 + DIVM__4; // MCLK=SMCLK=4096K
FCTL2 = FWKEY | FSSEL_1 |FN2 |FN3; // FN1 | FN3 |FN5; // MCLK/12 for Flash Timing Generator 257k~476K
// FCTL2 = FWKEY | FSSEL_1 |FN1 | FN3 |FN5; // MCLK/42 for Flash Timing Generator 257k~476K
WDTCTL=WDT_ARST_1000;
Init_TimerA0();
InitTimeA1Pwm();
InitCfg(); //congif init
Init_ADI(); //AD init
Init_485(); //UART init
_EINT();
while(1)
{
if(needRset==0)
WDTCTL=WDT_ARST_1000;
if((needInitAd==1)&&(CommSending()==0))
{
needInitAd=0;
_DINT();
Init_ADI(); //AD init
_EINT();
}
if(GetBeChanged()==YES)
{
DealData(0);
}
temp = GetKeyCode();
if(temp == KEY_SETUP_QQ)
{
SetRange(1);
adjustState = SET_RANGE1;
}
}
}


this waveforms of Vrst VCC when working normally are shown ,VCC is yellow ,Vrst is green .



