msp430F5529 在与DAC8571进行i2c通讯时会进死循环 abort();
需要重启单片机或者同时对dac8571重新上电才能恢复正常工作状态。
需要加看门狗吗,还是其他方法?
能提供好的解决方案吗?谢谢。
以下是我的程序部分:
#include <msp430.h>
const unsigned char Sine_Tab[] = // 16 Point 16-bit Sine Table
{
0xFF, // MSB Word 0
0xFF, // LSB
0xF6, // MSB Word 1
0x40, // LSB
0xDA, // MSB Word 2
0x81, // LSB
……………………….//中间的是正弦波参数表
0xF6, // MSB Word 15
0x40 // LSB
};
int main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop Watchdog Timer
P4SEL |= BIT1 + BIT2; // Assign I2C pins to USCI_B0
P4DS|= BIT1 + BIT2; UCB1CTL1 |= UCSWRST; // Enable SW reset
UCB1CTL0 = UCMST + UCMODE_3 + UCSYNC; // I2C Master, synchronous mode
UCB1CTL1 = UCSSEL_2 + UCSWRST; // Use SMCLK, keep SW reset
UCB1BR0 = 12; // fSCL = SMCLK/12 = ~100kHz
UCB1BR1 = 0;
UCB1I2CSA = 0x4c; // Set slave address
UCB1CTL1 &= ~UCSWRST; // Clear SW reset, resume operation
UCB1IE |= UCTXIE; // Enable TX ready interrupt
UCB1CTL1 |= UCTR + UCTXSTT; // I2C TX, start condition
UCB1TXBUF = 0x010; // Write DAC control byte
__bis_SR_register(GIE); // Enter LPM0 w/ interrupts
}
//中断
// USCI_B0 Data ISR
#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
#pragma vector = USCI_B1_VECTOR
__interrupt void USCI_B1_ISR(void)
#elif defined(__GNUC__)
void __attribute__ ((interrupt(USCI_B1_VECTOR))) USCI_B1_ISR (void)
#else
#error Compiler not supported!
#endif
{
static unsigned char ByteCtr;
UCB1TXBUF = Sine_Tab[ByteCtr++]; // Transmit data byte
ByteCtr &= 0x1f;
}
keda lv:
下面这个函数就是在main函数执行完后就进入的程序,中断也没进。
文件为 BOOT.C
/*****************************************************************************/
/* C_INT00_NOEXIT() – Specialized version of _c_int00 that directly calls */
/* abort and skips cleanup in exit. */
/*****************************************************************************/
#pragma CLINK(_c_int00_noexit)
extern void __interrupt _c_int00_noexit()
{ STACK_INIT();
INIT_LOCKS();
if(_system_pre_init() != 0) _auto_init();
main(0);
abort();
}
文件为 exit.C
/****************************************************************************/
/* ABORT – ABNORMAL PROGRAM TERMINATION. CURRENTLY JUST HALTS EXECUTION. */
/****************************************************************************/
void abort(void) {
/*——————————————————————-*/
/* SET C$$EXIT LABEL SO THE DEBUGGER KNOWS WHEN THE C++ PROGRAM HAS */
/* COMPLETED. THIS CAN BE REMOVED IF THE DEBUGGER IS NOT USED. */
/*——————————————————————-*/
__asm(" .global C$$EXIT");
__asm("C$$EXIT: nop");
for (;;); /* SPINS FOREVER */ //这里就一直在死循环了
}