一个简单程序(UART),不晓得问题出在那里,请大家帮哈忙!
以下代码是UART0操作:收到上位机的字符然后转送回去。结果是能收到,但是是错误的,如发 01 收到 C0,请大家看看是那里出错了,小弟刚开始用430。
/****************************************************
说明:串口测试程序
波特率:9600bps
****************************************************/
#include"msp430x16x.h"
#include"UartTest.h"
#include"initialize.h"
extern unsigned char chr;
void intiuart0(void)
{
// UCTL0&=~SWRST;
UCTL0=CHAR;
UTCTL0|=SSEL0;
UBR00=0x03;
UBR10=0x00;
UMCTL0=0x4A;
// ME1|=URXE0;
ME1 |= UTXE0 + URXE0; // Ena××e USART0 TXD/RXD
IE1 |= URXIE0; //允许接收中断
P3SEL|=0X30;
P3DIR|=BIT34; //设置为输出
P3DIR&=~BIT35; //设置为输入
_EINT();
}
/**************
串口中断服务
**************/
#pragma vector=UART0RX_VECTOR
__interrupt void usart0_rx(void)
{
while ((IFG1 & UTXIFG0) == 0); // USART0 TX buffer ready?
chr = RXBUF0;
TXBUF0 = chr;
}
while ( ((UTXIFG0 & IFG1) == 0) && ((U0TCTL & TXEPT) == 0)) { };
初始化时
先
U0CTL |= SWRST;
.....
然后
U0CTL &= ~SWRST;
用这个程序试试
#include <msp430x16x.h>
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
P3SEL |= 0x30; // P3.4,5 = USART0 TXD/RXD
ME1 |= UTXE0 + URXE0; // Ena××e USART0 TXD/RXD
UCTL0 |= CHAR; // 8-bit character
UTCTL0 |= SSEL0; // UCLK = ACLK
UBR00 = 0x03; // 32k/9600 - 3.41
UBR10 = 0x00; //
UMCTL0 = 0x4A; // Modulation
UCTL0 &= ~SWRST; // Initialize USART state machine
IE1 |= URXIE0; // Ena××e USART0 RX interrupt
_BIS_SR(LPM3_bits + GIE); // Enter LPM3 w/ interrupt
}
#pragma vector=UART0RX_VECTOR
__interrupt void usart0_rx (void)
{
while (!(IFG1 & UTXIFG0)); // USART0 TX buffer ready?
TXBUF0 = RXBUF0; // RXBUF0 to TXBUF0
}
多谢楼上各位热心人!!
原先我在主程序里加过测过代码,结果是上位机能正确收到下位机发送的字符;也测试过上位机发送数据时的波形,进430之前都是正确的,就是不能正确收到上位机的数据。
我照楼上各位给的方法去试一下。
还是一样的问题。
仿真时,接收缓冲RXBUF里数据不是上位机发送的数据,接收到的是错误数据,但是430能把接收到的错误数据正确送回上位机,不明白是怎么回事。
不晓得论坛能不能贴图,我想把串口部分电路贴上来给大家看哈 是不是硬件有问题。
查查232的通讯芯片包括相关电路,斑竹的程序是否使用测试了?问题解决了没有?
代码我试过了,也是一样的问题。
不过发现一个这样的现象:不论是斑竹的代码还是我原来的代码,在仿真时(不外加电、由仿真器供电的情况),发现能正确的收发数据,此时测了一下仿真器供电为:2.5V左右;一旦外加电源(超过2.7V)问题就出来了,这是怎么回事呢?很着急啊,这个问题不解决后面的事情就没法做了!!
请各位430高手指点一下迷津,问题在出那部分??
是这样的:仿真器上有个跳针,为允许外加电仿真和禁止外加电仿真。外加电超过2.7V时就出问题了,即使不仿真、全速运行时,也是同样问题。
另外我用的是网上的串口调试助手,自动发送数据,间隔1S,这应该不是很快吧,还有,手动发送也是这样啊
while ((IFG1 & URXIFG0) == 0);
ME2 |= UTXE0 + URXE0; // Ena××e USART0 TXD/RXD