先说说我的开发环境:
IAR + 430LaunchPad + msp430F2252目标板。
电路上断开launchpad的J3跳线(VCC保留),连接到目标板上,可以调试,仿真和串口。
问题来了,我写了一段双工的串口程序,结果:可以收到PC端的,却不能发送到PC,怪异的是示波器查看TXD有输出,9600波特率每位约103.5us,应该算标准了,但PC就是收不到,换了几个软件都不行。
我又用launchpad带的G2553试了模拟串口的程序,收发都可以,所以硬件应该没问题
下面把程序贴出来,大家帮我检查一下那里配置错了。其实程序参考例程的。
#include "io430.h"
#include "led.h"
#define UCA0_TXD BIT4
#define UCA0_RXD BIT5
char string1[8]="u hello";
char i;
char j = 0;
void uart_init(void)
{
P3SEL = UCA0_TXD + UCA0_RXD; // P3.4,5 = USCI_A0 TXD/RXD
UCA0CTL1 |= UCSSEL_2; // CLK = ACLK
UCA0BR0 = 0x68; // 1.MHz/9600 = 125
UCA0BR1 = 0x00; //
UCA0MCTL = UCBRS2; // Modulation UCBRSx = 0x04
UCA0CTL1 &= ~UCSWRST; // **Initialize USCI state machine**
IE2 |= UCA0RXIE; // Enable USCI_A0 RX interrupt
}
#pragma vector=USCIAB0TX_VECTOR
__interrupt void USCI0TX_ISR(void)
{
UCA0TXBUF = string1[i++]; // TX next character
//LED_PWR_GRN_BLINK;
if (i == sizeof string1 – 1) // TX over?
{
IE2 &= ~UCA0TXIE; // Disable USCI_A0 TX interrupt
i=0;
}
}
#pragma vector=USCIAB0RX_VECTOR
__interrupt void USCI0RX_ISR(void)
{
if (UCA0RXBUF == 'u') // 'u' received?
{
i = 0;
UCA0TXBUF = string1[i++];
//LED_GAME_RED_BLINK;
IE2 |= UCA0TXIE; // Enable USCI_A0 TX interrupt }
}
我时钟选得smclk = dco =1MHZ
主函数调用
uart_init();
__bis_SR_register(GIE); // interrupts enabled while(1);
请各位指点下。
Bruce Wei:
楼主你好!
试一下超级终端,参考附件
zhenyu xu:
回复 Bruce Wei:
试过了,一样不行。我用timer模拟的uart可以工作,所以估计是程序问题
zhenyu xu:
回复 Bruce Wei:
谢谢你的回复。
我用一块单独的usb转串口的板子接到目标板上通讯成功,你提供的和我以前的均能正常工作。
可能是launchpad串口的问题,我不知道有人在上面试过硬件串口收发送没有?
Bruce Wei:
回复 zhenyu xu:
有一个版本的launch pad硬件布线有问题,楼主需要检查下跳线连接。
Peter_Zheng:
回复 zhenyu xu:
你看你的lanuchpad是1.4的还是1.5的版本。1.4的uart的tx跟rx引脚接反了,需要自己跳线校正。
zhenyu xu:
回复 Peter_Zheng:
我的是V1.4的板子,请问引脚标记错误的问题有相关说明吗,另外我接收PC的字符是正确的哦。奇怪
Leon Yan:
回复 zhenyu xu:
楼主,有一版本LaunchPad的串口引脚更改了,所以仔细看一下你那个版本的原理图;
然后用示波器仔细看看波形情况。
谢谢。