jery0711 发表于 2010-11-5 13:18:07

急啊~!还是串口问题,不知道原因,各位帮帮忙~! 在线等

我的5438接了16M的晶振,要实现简单的把温度传感器数据通过串口发送给PC观察,弄了好久,串口调试助手硬是收不到数据,时钟函数和UART如下
void Init_Clock(void)
{
    P11DIR = BIT0 | BIT1 | BIT2; // P11.1-2 to output direction
    P11SEL |= BIT0 | BIT1 | BIT2; // P11.1-2 to output SMCLK,MCLK

    // configure clock system
   // P5SEL &= ~0x0C;
    P7SEL |= 0x03;
    UCSCTL6 &= ~XT1DRIVE_3;
    UCSCTL6 |= XT1DRIVE_2;
    UCSCTL6 &= ~(SMCLKOFF | XT1BYPASS | XT1OFF);
    UCSCTL6 |= XTS;
    UCSCTL3 |= SELREF_0 | FLLREFDIV_0;
    UCSCTL4 &= 0x00;
    UCSCTL5 &= 0x00;
    do {
      UCSCTL7 &= ~(XT1LFOFFG + XT1HFOFFG + DCOFFG);
      SFRIFG1 &= ~OFIFG;
    }while(SFRIFG1&OFIFG);
}


void Uart_Init(void)
{
P3SEL = 0x30;                           // P3.4,5 = USCI_A0 TXD/RXD
P3DIR |= BIT4;//bit4 tx
P3DIR &= ~BIT5; // bit5 rx
UCA0CTL1 |= UCSWRST; // **Put state machine in reset**
UCA0CTL0 = UCMODE_0;//uart mode;
UCA0CTL0 &= ~UC7BIT; // 8 bit
UCA0CTL1 |= UCSSEL_2;// CLK = SMCLK
UCA0BR0 = 0x8a;                        // 16M/115200 (see User's Guide)
UCA0BR1 = 0x00;                           //
UCA0MCTL = UCBRS_7+UCBRF_0;            // Modulation UCBRSx=7, UCBRFx=0
UCA0CTL1 &= ~UCSWRST;                     // **Initialize USCI state machine**
UCA0IE |= UCTXIE;//UCRXIE;                         // Enable USCI_A1 RX interrupt

__bis_SR_register(LPM3_bits + GIE );//      // Enter LPM3, interrupts enabled
// __no_operation();                         // For debugger
}


void main(void)
{
    WDTCTL = WDTPW + WDTHOLD;//关狗
    Init_Clock();
    Uart_Init();
}

#pragma vector=USCI_A0_VECTOR
__interrupt void USCI_A0_ISR(void)
{
switch(__even_in_range(UCA0IV,4))
{
case 0:break;                           // Vector 0 - no interrupt
case 2:                                 // Vector 2 - RXIFG
    while (!(UCA0IFG&UCTXIFG));             // USCI_A1 TX buffer ready?
    UCA0TXBUF = UCA0RXBUF;                  // TX -> RXed character
    break;
case 4:
    UCA0TXBUF = 0x00;
   while (!(UCA0IFG&UCTXIFG)); // USCI_A1 TX buffer ready?
   temture_h = temture & 0xff00;
   UCA0TXBUF = temture >> 8;
   while (!(UCA0IFG&UCTXIFG));
   temture_l = temture & 0x00ff;
   UCA0TXBUF = temture_l;
    break;                           // Vector 4 - TXIFG
default: break;
}
}

请给我帮我看看,谢谢了,看有什么错误,怎么处理

dengting 发表于 2010-11-5 13:21:52

用示波器

jery0711 发表于 2010-11-5 13:25:32

回复【1楼】dengting守望者
用示波器
-----------------------------------------------------------------------

谢谢,看程序有没有错误,比如各寄存器设置方面?

liquan1010 发表于 2010-11-5 16:13:15

可能是没有产生TX中断

jery0711 发表于 2010-11-5 16:24:22

回复【3楼】liquan1010
可能是没有产生tx中断
-----------------------------------------------------------------------

有中断,我调试的时候能进入中断,并且UA0TXBUF的值也会变动

jery0711 发表于 2010-11-5 16:50:34

回复【5楼】hameyou
可能是没配置好吧
-----------------------------------------------------------------------

上面是我的程序,请问哪里要改,谢谢,请指出下

jery0711 发表于 2010-11-5 19:44:43

怎么没有人给出更好的解答呀? 各位大虾没不要吝啬赐教啊

cunlingwang 发表于 2012-2-17 08:46:10

好久的帖子,主函数没有while(1)?

guoran12 发表于 2012-2-17 15:32:18

串口调试不通需从硬件和软件两个方面找问题。硬件方面考虑电路及串口线。软件方面就要考虑你初始化的问题了。要善于使用调试助手来配合调试。给你一个串口的程序吧
#include "msp430x14x.h"
#define uchar unsigned char
void init(void);
uchar data1={'a','b','c','d','e'};
uchar buff;
uchar i=0,flag=0,k=0,n=0;
uchar j=0;
/*PC机发以Oxff开头,最后发送的数据为前几个数据的和结束的数据包,430发送字符串"abcde"给PC机*/
void main( void )
{
    WDTCTL=WDTPW+WDTHOLD;
    //BCSCTL1=0x07;
    //BCSCTL2=0x88;
    init();
    _EINT();
    while(1)
    {
    //TXBUF1=0xff;
    //while(UTCTL1&0x01==0);
   //i=0;
      if(j==1)
   {
      //i=0;
      for(n=0;n<6;n++)
      {
      TXBUF1=data1;
      //for(i=0;i<10;i++);
      while((UTCTL1&0x01)==0);
      }
      j=0;
      
   }
    }
}

void init(void)
{
UCTL1|=SWRST;
//UCTL1&=~SWRST;
UCTL1=0x10;            //8 bit数据,1bit停止位,无校验
UBR01=0x03;            //9600波特率
UBR11=0x00;
UMCTL1=0x4A;             //位调整
UTCTL1=0x10;             //选32768ACLK为时钟源
ME2|=0x30;               //发送接受均允许
//ME2|=UTXE0+URXE0;       //发送接受均允许
//P3SEL=0x31;            //设置端口。P3.0,P3.4,P3.5
//ME2|=0x20;
P3SEL=0xC0;
P3DIR=0x40;         // P3.0,P3.4为输出
//P3OUT|=BIT0;         //设置75176的DE为1,表示使能发送。
UCTL1&=~SWRST;
IE2|=URXIE1;             //中断使能接收
//IE2|=UTXIE1;             //中断使能发送
}                                                                                                                                                                                                                                                                                                   

#pragma vector=UART1RX_VECTOR
__interrupt void UART1RX(void)
{
// if(!RXERR)
//{
if(flag==0)
{
if(RXBUF1==0xff)
    {
      flag=1;
      i=0;
    }
}
else
{
    buff=RXBUF1;
    if(i>0)
    {
   k+=buff;
    }
    //i++;
    //k+=buff;
    if(buff==k)
    {
      flag=0;
      j=1;
      k=0;
    }
    i++;
}
//}
}

guoran12 发表于 2012-2-17 15:32:46

430串口例程ourdev_719635NEL1AL.txt(文件大小:2K) (原文件名:232.c.txt)
页: [1]
查看完整版本: 急啊~!还是串口问题,不知道原因,各位帮帮忙~! 在线等