TI中文支持网
TI专业的中文技术问题搜集分享网站

关于MSP430F6736的串口接收中断问题

你好下面是我使用的程序,我使用单步调试时发现它一直在检查XT1 fault flag的do while循环中出不来。后来我把 do while那段程序注释掉时,只有在波特率是43000和38400时才能进入接收中断,但是接收的数据是乱的, 如我在接收中断中发UCA0TXBUF = 0xa时, 调试助手接收到的是80 78;UCA0TXBUF = 0xc时,调试助手显示00 00。请问为什么在do while跳不出来?波特率为什么是43000才能进入接收中断但是数据还是乱的?谢谢!

#include <msp430.h>

void main(void)
{
WDTCTL = WDTPW | WDTHOLD; // Stop WDT

// Setup P1.2 UCA0RXD, P1.3 UCA0TXD
P1SEL |= BIT2 | BIT3; // Set P1.2, P1.3 to non-IO
P1DIR |= BIT2 | BIT3; // Enable UCA0RXD, UCA0TXD

// Setup LFXT1
UCSCTL6 &= ~(XT1OFF); // XT1 On
UCSCTL6 |= XCAP_3; // Internal load cap

// Loop until XT1 fault flag is cleared
do
{
UCSCTL7 &= ~(XT2OFFG | XT1LFOFFG | DCOFFG);
// Clear XT2,XT1,DCO fault flags
SFRIFG1 &= ~OFIFG; // Clear fault flags
} while (SFRIFG1 & OFIFG); // Test oscillator fault flag

// Setup eUSCI_A0
UCA0CTLW0 |= UCSWRST; // **Put state machine in reset**
UCA0CTLW0 |= UCSSEL_2; // SMCLK
UCA0BRW_L = 6; // 1MHz 9600 (see User's Guide)
UCA0BRW_H = 0; // 1MHz 9600
UCA0MCTLW = UCBRF_13 | UCOS16; // Modln UCBRSx=0, UCBRFx=0x13,
// over sampling
UCA0CTLW0 &= ~UCSWRST; // **Initialize USCI state machine**
UCA0IE |= UCRXIE; // Enable USCI_A0 RX interrupt

__bis_SR_register(LPM0_bits | GIE); // Enter LPM0, interrupts enabled
__no_operation(); // For debugger
}

// USCI_A0 interrupt service routine
#pragma vector=USCI_A0_VECTOR
__interrupt void USCI_A0_ISR(void)
{
switch (__even_in_range(UCA0IV, 4))
{
case USCI_NONE: break; // No interrupt
case USCI_UART_UCRXIFG: // RXIFG
while (!(UCA0IFG & UCTXIFG)) ; // USCI_A0 TX buffer ready?
UCA0TXBUF = UCA0RXBUF; // TX -> RXed character
break;
case USCI_UART_UCTXIFG: break; // TXIFG
case USCI_UART_UCSTTIFG: break; // TTIFG
case USCI_UART_UCTXCPTIFG: break; // TXCPTIFG
default: break;
}
}

Fangwen Xu:

我又试了不注释那段直接go,波特率43000和38400也可以进入中断,但是调试助手接收的都是00 00 00。。为什么啊?

灰小子:

回复 Fangwen Xu:

建议先检查晶振是否正常起振。

do while那一段代码是等待晶振起振的,注释掉有可能晶振没正常起振,MCLK和SMCLK会默认使用DCO,这时mcu的运行频率可能就不是你要设定的数值了。

而串口的通讯依赖于mcu的运行频率,从而会造成乱码等情况。

你可以用io输出MCLK和SMCLK,用示波器或者逻辑分析仪测量一下

Fangwen Xu:

回复 灰小子:

你好 ,我确认了晶振没有正常起振。但是因为F6736本身自带了REFO时钟就是32768.不连XT1本身默认就是refo的32768。MCLK和SMCLK默认的是1M。所以我注释掉后,应该影响不大,就按默认配置。按如下配置波特率

UCA0CTLW0 |= UCSWRST; // **Put state machine in reset** UCA0CTLW0 |= UCSSEL_2; // SMCLK UCA0BRW_L = 6; // 1MHz 9600 (see User's Guide) UCA0BRW_H = 0; // 1MHz 9600 UCA0MCTLW = UCBRF_13 | UCOS16; // Modln UCBRSx=0, UCBRFx=0x13, // over sampling UCA0CTLW0 &= ~UCSWRST; // **Initialize USCI state machine**

while(1){UCA0TXBUF=0xa;delay(100);UCA0TXBUF=UCA0RXBUF;delay(100);}

串口发出0A很准确说明波特率没问题。但是无论我从电脑怎么向串口发送数据,输出的都是 0A 00;说明根本没接收到数据啊??我后来配置接收中断,9600根本不能进入中断,只有波特率时43000,38400时才能进入接收中断,而且把接收到的数据发出去也是乱的??难道发送与接收的波特率不一样??不会吧,求指导啊!谢谢!

;

灰小子:

回复 Fangwen Xu:

你的接收中断服务程序怎么写的?

HG:

你先试一下TI的例程,看看外部条件是不是好的,特别是串口线不要太长,或者换一个串口调试助手。

Fangwen Xu:

回复 灰小子:

你好,这是我的接收中断程序,就在官方程序中加了P1OUT ^= BIT1接入LED灯调试检测,从灯泡亮度变化知只有在波特率43000和38400才进入中断。我测了一下时钟,因为我XT1不能正常启动,进入LMP0模式,ACLK为0,MCLK为0,SMCLK为270K。把检测外部晶振代码注释了,进入LMP0模式,ACLK为32768,MCLK为0,SMCLK为1M。可见注释后时钟是正常的。串口波特率9600发出去一切正常,9600根本进入不了接收中断?谢谢!

// USCI_A0 interrupt service routine#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)#pragma vector=USCI_A0_VECTOR__interrupt void USCI_A0_ISR(void)#elif defined(__GNUC__)void __attribute__ ((interrupt(USCI_A0_VECTOR))) USCI_A0_ISR (void)#else#error Compiler not supported!#endif{ switch (__even_in_range(UCA0IV, 4)) { case USCI_NONE: break; // No interrupt case USCI_UART_UCRXIFG: // RXIFG while (!(UCA0IFG & UCTXIFG)) ; // USCI_A0 TX buffer ready? UCA0TXBUF = UCA0RXBUF; // TX -> RXed character P1OUT ^= BIT1; break; case USCI_UART_UCTXIFG: break; // TXIFG case USCI_UART_UCSTTIFG: break; // TTIFG case USCI_UART_UCTXCPTIFG: break; // TXCPTIFG default: break; }}

Fangwen Xu:

回复 HG:

你好,我基本就是按照这个例程来的,换了好多调试助手都一样,串口线也不长的。因为不知道为什么我的外部晶振不能正常启振,所以我注释掉检测XT1部分代码,时钟用的都是默认的,ACLK32768,MCLK1M, SMCLK1M;应该是没问题的,串口波特率调9600发出去数据也很准确。就是接受有问题,接受中断必须在波特率43000和38400才能进去,数据还是乱的。难道串口发送和接受波特率不一样?不会吧。不知道是为什么啊?感谢您的指教!

Fangwen Xu:

回复 灰小子:

你好,我后来找到问题所在了,程序是没有问题的。问题是只用JTAG供电时通信一切正常,采用外接3.3V到DVCC供电时串口接收就有问题了,但是只发送时没问题的。请问怎么解决谢谢!

Fangwen Xu:

回复 HG:

你好,我后来找到问题所在了,程序是没有问题的。问题是只用JTAG供电时通信一切正常,采用外接3.3V到DVCC供电时串口接收就有问题了,但是只发送时没问题的。请问怎么解决谢谢!

灰小子:

回复 Fangwen Xu:

建议先观察一下电源的纹波和上电波形

赞(0)
未经允许不得转载:TI中文支持网 » 关于MSP430F6736的串口接收中断问题
分享到: 更多 (0)