程序的目的是从A0口接收异步串口数据,目前是和电脑的串口调试助手连接,然后接收的数据由B口的SPI将数据发送出去。
遇到的问题是,当串口A接收数据进入中断后,给串口B的缓冲区赋值数据后,就会重复进入中断。
如果不检测B口接收中断,没有此问题。如果没有对B的发送缓冲区发送,没有此问题。
不是硬件的问题,换了几块相同的板子。不是SPI从设备问题,已经把1.5 1.6 1.7的杜邦线拔掉。
int main( void )
{
// Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW + WDTHOLD;
P1DIR |= BIT0;
P1OUT &= ~BIT0; BCSCTL1 = CALBC1_1MHZ; // Set DCO
DCOCTL = CALDCO_1MHZ;
UCA0CTL1 |= UCSWRST;
UCA0CTL1 |= UCSSEL_2; // SMCLK
P1SEL = BIT1 + BIT2; // P1.1为 RXD, P1.2为TXD
P1SEL2 = BIT1 + BIT2; // P1.1为 RXD, P1.2为TXD
UCA0BR0 = 104; // 1MHz 9600
UCA0BR1 = 0; // 1MHz 9600
// UCA0MCTL = UCBRS2 + UCBRS0; // 波特率=BRCLK/(UBR+(M7+…0)/8)
UCA0MCTL = UCBRS0; // 波特率=BRCLK/(UBR+(M7+…0)/8)
UCA0CTL1 &= ~UCSWRST;
UCB0CTL1 |= UCSWRST;
UCB0CTL1 |= UCSSEL_2; // SMCLK
P1SEL |= BIT5 + BIT6 + BIT7;
P1SEL2 |= BIT5 + BIT6 + BIT7;
UCB0CTL0 |= UCCKPL + UCMSB + UCMST + UCSYNC; // 3-pin, 8-bit SPI master
UCB0BR0 |= 0x02; // /2
UCB0BR1 = 0; //
// UCB0MCTL = 0; // No modulation
UCB0CTL1 &= ~UCSWRST;
//IE2 |= UCA0RXIE + UCB0RXIE; // 使能接收中断
IE2 |= UCA0RXIE;
IE2 |= UCB0RXIE;
__bis_SR_register(LPM0_bits + GIE);return 0;
}
#pragma vector=USCIAB0RX_VECTOR
__interrupt void USCI0RX_ISR(void)
{
UCA0TXBUF = UCA0RXBUF;
UCB0TXBUF = UCA0RXBUF;
}
HY LIU:
如果在中断中 加入清除中断,调试模式下不会反复中断,但是实际运行中会继续反复中断。
IFG2 &= ~UCA0TXIFG;IFG2 &= ~UCB0TXIFG;IFG2 &= ~UCA0RXIFG;IFG2 &= ~UCB0RXIFG;
灰小子:
回复 HY LIU:
楼主你好,UCA0RXIFG和UCB0RXIFG其实是一个中断标志位。UCA0TXIFG和UCB0TXIFG也是。
HY LIU:
回复 灰小子:
非常感谢,问题是 只使用一个串口 1.1 1.2 做为异步串口时,中断正常,调用一次后,可正常退出。
程序目的实现,1.1 1.2 接收发送的数据 与 1.6 1.7 接收发送的数据 进行交换,因此把1.6 1.7 加入中断,把A接收的数据,赋值给B发送数据,就会出现不停进入中断的情况。当在DEBUG模式下清除中断后,可观察断点不再进入中断,但是关掉IDE(IAR),上电单片机后,还会反复的把A接收的数据发送回来,也就是继续不停的进入中断。