好久之前就弄過這個開發板了,感覺是沒什么問題。串口實驗也做過,不料今天再次使用,卻出現這么嚴重的問題。
程序如下,
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,和剛才的錯誤數據一樣。從新編譯,煩了,這次全速吧,意外,
結果居然是對的,好吧,在試試全速->單步->全速,第一個全速可以接收正確的數據,然后單步數據出錯,在全速還是錯誤的數據。還是試試接收中斷來個單步,數據沒有問題,
搞不明白在主循環不能單步,在中斷卻行?先記下這個問題,只能慢慢解決了!
|