xsf66 发表于 2012-5-26 08:47:53

帮忙看看这个程序-试用UART不成功

芯片是CC430F5137,板子是利尔达的评估板,硬件应该没有问题,修改一个样例程序,实际测试:单片机发送数据没有问题,可就是接收不行。按照程序逻辑,计算机发一个字节,单片机就返回一个字节,可实际测试发现,单片机总也不中断,不知道为什么。恳请帮忙指导一下。

#defineLED_RBIT         6
#defineLED_GBIT         7
#defineLED_DIR            P2DIR
#defineLED_OUT            P2OUT
#defineLED_SEL            P2SEL
#defineLEDR_ON()          LED_OUT|=(1<<LED_RBIT)
#defineLEDG_ON()          LED_OUT|=(1<<LED_GBIT)
#defineLEDR_OFF()         LED_OUT&=~(1<<LED_RBIT)
#defineLEDG_OFF()         LED_OUT&=~(1<<LED_GBIT)

#include "cc430x513x.h"

void Delay();
void InitChip();


void main(void)
{
InitChip();
while(1)
{
    LEDR_ON();
    Delay();
    LEDR_OFF();
    Delay();
//__bis_SR_register(LPM3_bits + GIE);       // Enter LPM3, interrupts enabled
    __no_operation();                         // For debugger
    //UCA0TXBUF=0x38;                  如果加上这条语句,计算机上可以收到数据0x38
}
}

// Echo back RXed character, confirm TX buffer is ready first
#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_A0 TX buffer ready?
    UCA0TXBUF = UCA0RXBUF;                  // TX -> RXed character
    LEDG_ON();
    break;
case 4:
    LEDG_ON();
    break;                           // Vector 4 - TXIFG
default: break;
}
}

void Delay()
{
    unsigned short intInx;
    unsigned short intCnt;

    for(intInx=0;intInx<100;intInx++)
      for(intCnt=0;intCnt<800;intCnt++);
}

void InitChip()
{
WDTCTL = WDTPW + WDTHOLD;               // Stop WDT

// Set up LEDs
LED_OUT&=~((1<<LED_RBIT)|(1<<LED_GBIT));    // LED端口输出0
LED_DIR|=(1<<LED_RBIT)|(1<<LED_GBIT);       // LED端口方向设置为输出

PMAPPWD = 0x02D52;                        // Get write-access to port mapping regs
P1MAP5 = PM_UCA0RXD;                      // Map UCA0RXD output to P1.5
P1MAP6 = PM_UCA0TXD;                      // Map UCA0TXD output to P1.6
PMAPPWD = 0;                              // Lock port mapping registers

P1DIR |= BIT6;                            // Set P1.6 as TX output
P1SEL |= (BIT5 + BIT6);                     // Select P1.5 & P1.6 to UART function

UCA0CTL1 |= UCSWRST;                      // **Put state machine in reset**
UCA0CTL1 |= UCSSEL_1;                     // CLK = ACLK
UCA0BR0 = 0x03;                           // 32kHz/9600=3.41 (see User's Guide)
UCA0BR1 = 0x00;                           //
UCA0MCTL = UCBRS_3+UCBRF_0;               // Modulation UCBRSx=3, UCBRFx=0
UCA0IE |= UCRXIE;                         // Enable USCI_A0 RX interrupt
UCA0CTL1 &= ~UCSWRST;                     // **Initialize USCI state machine**
_EINT();
}
页: [1]
查看完整版本: 帮忙看看这个程序-试用UART不成功