关于MSP430FR4133串口收发数据的问题请教

2019-07-14 21:14发布

    最近在用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);
}


    谢谢。


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。