This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

cc430串口程序

Other Parts Discussed in Thread: CC430F5137, MAX3232

请教大家一个问题:我在利尔达的ez430-RF5137-433板子运行串口例程,可是不能收发数据,程序如下:

void main(void)
{

 WDTCTL = WDTPW + WDTHOLD; // Stop WDT

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

P1DIR |= BIT6; // Set P2.7 as TX output
P1SEL |= BIT5 + BIT6; // Select P2.6 & P2.7 to UART function

UCA0CTL1 |= UCSWRST; // **Put state machine in reset**
UCA0CTL1 |= UCSSEL_2; // SMCLK
UCA0BR0 = 9; // 1MHz 115200 (see User's Guide)
UCA0BR1 = 0; // 1MHz 115200
UCA0MCTL |= UCBRS_1 + UCBRF_0; // Modulation UCBRSx=1, UCBRFx=0
UCA0CTL1 &= ~UCSWRST; // **Initialize USCI state machine**
UCA0IE |= UCRXIE; // Enable USCI_A0 RX interrupt

__bis_SR_register(LPM0_bits + GIE); // Enter LPM0, interrupts enabled
__no_operation(); // For debugger
}

// 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
break;
case 4:break; // Vector 4 - TXIFG
default: break;
}
}

  • //******************************************************************************
    // CC430F513x Demo - USCI_A0, 115200 UART Echo ISR, DCO SMCLK
    //
    // Description: Echo a received character, RX ISR used. Normal mode is LPM0.
    // USCI_A0 RX interrupt triggers TX Echo.
    // Baud rate divider with 1048576hz = 1048576/115200 = ~9.1 (009h|01h)
    // ACLK = REFO = ~32768Hz, MCLK = SMCLK = default DCO = 32 x ACLK = 1048576Hz
    // See User Guide for baud rate divider table
    //
    // CC430F5137
    // -----------------
    // /|\| |
    // | | |
    // --|RST |
    // | |
    // | P2.7/UCA0TXD|------------>
    // | | 115200 - 8N1
    // | P2.6/UCA0RXD|<------------
    //
    // M Morales
    // Texas Instruments Inc.
    // April 2009
    // Built with CCE Version: 3.2.2 and IAR Embedded Workbench Version: 4.11B
    //******************************************************************************

    #include "cc430x513x.h"

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

    PMAPPWD = 0x02D52; // Get write-access to port mapping regs
    P2MAP6 = PM_UCA0RXD; // Map UCA0RXD output to P2.6
    P2MAP7 = PM_UCA0TXD; // Map UCA0TXD output to P2.7
    PMAPPWD = 0; // Lock port mapping registers

    P2DIR |= BIT7; // Set P2.7 as TX output
    P2SEL |= BIT6 + BIT7; // Select P2.6 & P2.7 to UART function

    UCA0CTL1 |= UCSWRST; // **Put state machine in reset**
    UCA0CTL1 |= UCSSEL_2; // SMCLK
    UCA0BR0 = 9; // 1MHz 115200 (see User's Guide)
    UCA0BR1 = 0; // 1MHz 115200
    UCA0MCTL |= UCBRS_1 + UCBRF_0; // Modulation UCBRSx=1, UCBRFx=0
    UCA0CTL1 &= ~UCSWRST; // **Initialize USCI state machine**
    UCA0IE |= UCRXIE; // Enable USCI_A0 RX interrupt

    __bis_SR_register(LPM0_bits + GIE); // Enter LPM0, interrupts enabled
    __no_operation(); // For debugger
    }

    // 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
    break;
    case 4:break; // Vector 4 - TXIFG
    default: break;
    }
    }

    请对照官方例程。

  • 非常感谢您的指点,不过利尔达的板子上串口收发脚分别是P1.5和P1.6,请问怎样配置呢,刚开始接触430,还请多指教。

  • du yz,

    我发现你的程序和Peter提供的例程的不同点就在UART的TX和RX使用的管脚不同,其他都是相同的。应该是可以使用的。请问你是如何得知不能收发数据的?

    这段例程的作用是RX收到数据后,TX将受到的数据再发送出去。故为了验证其可以工作,需要先以115200 baud, LSB first, 8bit 数据,1bit stop位向板子发送数据,然后看看版则他和TX是否发送出了相同的数据。

  • 您好,如果您是TI的工程师,我可以很荣幸的告诉您,利尔达提供的开发板ez430调试器上的串口除了9600baud其他都不能使用,但是当用户自己制板并使用max3232芯片进行转换后,就可以解决问题