关于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);
}


    谢谢。


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
13条回答
dirtwillfly
1楼-- · 2019-07-15 23:18
没看懂你为什么要在中断服务程序里失能发送中断,并且延时两秒。我觉得问题出在这里
ytjzhjun
2楼-- · 2019-07-15 23:57
dirtwillfly 发表于 2017-11-1 22:36
没看懂你为什么要在中断服务程序里失能发送中断,并且延时两秒。我觉得问题出在这里 ...

中断发送,数据全发完后在中断里关闭发送中断是可以的吧?
为了保证最后一个字节发送完,延时了2个毫秒,之后切换485总线为接收方向。
你说的这个情况我试验过,确定不是这里原因。
ytjzhjun
3楼-- · 2019-07-16 02:27
selongli 发表于 2017-11-1 22:34
测量IO的电平信号了吗?

示波器看波形质量良好。
ytjzhjun
4楼-- · 2019-07-16 07:50
minzisc 发表于 2017-11-1 22:29
msp430的电压是否稳定?

电源质量是首先要保证的,电压稳定,且系统简单,没有大功率器件。
ytjzhjun
5楼-- · 2019-07-16 11:10
 精彩回答 2  元偷偷看……
qinlicn
6楼-- · 2019-07-16 13:55
ytjzhjun 发表于 2017-11-2 08:25
影响电源了?示波器观察电源是稳定的呀。
我试验过,虽然不能进中断发送了,但查询发送还是正常的,系统 ...

仿真看一下进不了中断时的UART各寄存器值

一周热门 更多>