|
好久之前就弄过这个开发板了,感觉是没什么问题。串口实验也做过,不料今天再次使用,却出现这么严重的问题。
程序如下,
uchar txbuf[6]={0x01,0x02,0x03,0x04,0x05,0x06};
void Uart_Init(void)
{
P1DIR |= BIT2;
P1DIR &=~BIT1;
P1SEL |= BIT1+BIT2;
P1SEL2|=BIT1+BIT2;
//UCA0CTL0|=UCMSB;
UCA0CTL1|=UCSWRST;
UCA0CTL1|=UCSSEL_2;
//UCA0STAT|=UCLISTEN;
UCA0BR0 = 833%256;
UCA0BR1 = 833/256;
UCA0MCTL= UCBRS1;
UCA0CTL1&=~UCSWRST;
IE2|=UCA0RXIE;
}
int main( void )
{
uchar i=0;
WDTCTL = WDTPW + WDTHOLD;
BCSCTL1=CALBC1_16MHZ;
BCSCTL2|=DIVS0;
DCOCTL=CALDCO_16MHZ;
Uart_Init();
_EINT();
while(1)
{
UCA0TXBUF=txbuf;
i++;
if(i==6)i=0;
while(!(IFG2&UCA0TXIFG));
IFG2&=~UCA0TXIFG;
}
}
感觉网上大都是这样程序,官方例程也不过如此!不知怎么,串口助手总是收到错误的数据。
当然,这是单步调试的结果,数组的两次循环。最后基本稳定的是D0 40 A0 20 D0 41(对应上面的数组)。
感觉好像波特率不对,用其他频率来产生波特率吧,一样的结果。
好吧,测试一下接收吧,
接收中断如下
#pragma vector=USCIAB0RX_VECTOR
__interrupt void RX_ISP(void)
{
UCA0TXBUF=UCA0RXBUF;
IFG2&=~UCA0RXIFG;
}
接收中断打个断点吧,好家伙,收到之后发出去竟然没有问题,
这不是坑嘛,波特率是对的啊,接收再发送没有问题。继续改接收中断服务函数
#pragma vector=USCIAB0RX_VECTOR
__interrupt void RX_ISP(void)
{
UCA0TXBUF=0x03;
IFG2&=~UCA0RXIFG;
}
接收还是没有问题,把这个放到主函数运行吧,改主循环
while(1)
{
UCA0TXBUF=0x03;
i++;
if(i==6)i=0;
while(!(IFG2&UCA0TXIFG));
IFG2&=~UCA0TXIFG;
}
继续单步,串口助手收到A0,和刚才的错误数据一样。从新编译,烦了,这次全速吧,意外,
结果居然是对的,好吧,在试试全速->单步->全速,第一个全速可以接收正确的数据,然后单步数据出错,在全速还是错误的数据。还是试试接收中断来个单步,数据没有问题,
|
|