最近在用MSP430FR4133做一个项目,用到串行通信接口A (eUSCI_A)串口收发数据。主频设置为1MHz,串口通讯2400,E,8,1。具体问题如下:
1、使用中断的方式接收数据,一直很正常;
2、使用查询的方式发送数据,一直正常;但使用中断的方式发送数据,当刚上电开机后发送第一帧数据(约30字节)正常,但之后再发送则失败,在线跟踪发现失败原因是发送数据不能进入中断。
相关部分代码如下,请大神帮忙分析一下:
a、串口初始化
void USCIA0_UART1_Init(void)
{
PM5CTL0 &= ~LOCKLPM5;
// Configure UART pins
P1SEL0 |= BIT0 | BIT1; // set 2-UART pin as second function
// Configure UART
UCA0CTLW0 = UCSWRST;
UCA0CTLW0 |= UCPEN + UCPAR + UCSSEL_3; //设置成UART模式,8位偶校验1停止位,
//下面参数设置波特率为2400.
UCA0BR0 = 27;
UCA0BR1 = 0x00;
UCA0MCTLW = 0xfb00 | UCOS16 | UCBRF_4;
UCA0CTLW0 &= ~UCSWRST; // Initialize eUSCI
UCA0IE |= UCRXIE; // Enable USCI_A0 RX interrupt
UCA0IE &= ~(UCTXIE);
//485方向控制管脚P5.7 初始化
P5DIR |= BIT7;
P5OUT &= ~BIT7; //初始化为接收方向。
}
b、中断处理函数
#pragma vector=USCI_A0_VECTOR
__interrupt void USCI_A0_ISR(void)
{
uint8 lu8data = 0;
switch(__even_in_range(UCA0IV,USCI_UART_UCTXCPTIFG)){
case USCI_NONE:
break;
case USCI_UART_UCRXIFG:
lu8data = (uint8)UCA0RXBUF;
//省略入队列的处理
break;
case USCI_UART_UCTXIFG:
UCA0IFG &=~(UCTXIFG);
if(TxBytesCnt < TxBytesNum){
UCA0TXBUF = Usart1TxBuf[TxBytesCnt++];
}
else{
UCA0IE &= ~(UCTXIE); // disable USCI_A0 TX interrupt
delay_ms(2);
//设置485接收方向。
P5OUT &= ~BIT7; //切换为接收方向。
}
break;
case USCI_UART_UCSTTIFG:
break;
case USCI_UART_UCTXCPTIFG:
break;
default:
break;
}
}
c、发送数据的处理,在这里使能发送中断,将其他地方准备好的数据 在以上的中断处理函数中发送。
void Uart1Data_Send(void)
{
P5OUT |= BIT7; //发送方向
delay_ms(2);
UCA0IE |= (UCTXIE);
}
谢谢。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
中断发送,数据全发完后在中断里关闭发送中断是可以的吧?
为了保证最后一个字节发送完,延时了2个毫秒,之后切换485总线为接收方向。
你说的这个情况我试验过,确定不是这里原因。
示波器看波形质量良好。
电源质量是首先要保证的,电压稳定,且系统简单,没有大功率器件。
仿真看一下进不了中断时的UART各寄存器值
一周热门 更多>