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.

msp430F5308串口接收不到数据

时钟设置为8M,串口可以发送数据,但是不能接收数据。

void main( void )
{
      // Stop watchdog timer to prevent time out reset
      WDTCTL = WDTPW + WDTHOLD;
     //UCSCTL4 |= SELA_2;
     UCSCTL3 = SELREF_2; //Set DCO FLL 参考REFO
     UCSCTL4 &= ~(SELS_4+SELM_4);
     UCSCTL4 |= SELA_4 + SELS_4 + SELM_4; //ACLk选择REFOCLK,SMCLK选择DCOCLKDIV,MCLK选择DCOCLKDIV

// Loop until XT1,XT2 & DCO stabilizes - In this case only DCO has to stabilize
do
{
    UCSCTL7 &= ~(XT2OFFG | XT1LFOFFG | DCOFFG);
     // Clear XT2,XT1,DCO fault flags
     SFRIFG1 &= ~OFIFG; // Clear fault flags
 }while (SFRIFG1&OFIFG); // Test oscillator fault flag

    __bis_SR_register(SCG0); // Disable the FLL control loop
    UCSCTL1 = DCORSEL_5; // Select DCO range 16MHz operation DCORSEL_5;
    UCSCTL2 |=243 ;               // Set DCO Multiplier for 8MHz =243 ;
                                                  // (N + 1) * FLLRef = Fdco //DCOCLKDIV=8M DCOCLK=16M
                                                  // (243 + 1) * 32768 = 8MHz
    __bic_SR_register(SCG0); // Enable the FLL control loop
    // 32 x 32 x 8 MHz / 32,768 Hz = 250000 = SMCLK cycles for DCO to settle
    __delay_cycles(250000);

   P4SEL |= BIT5 | BIT4; // P4.5,4 = USCI_A0 TXD/RXD
   UCA1CTL1 |= UCSWRST; // **Put state machine in reset**
   UCA1CTL1 |= UCSSEL_2; // SMCLK
   UCA1BR0 =52; // 8MHz 9600 (see User's Guide)
   UCA1BR1 = 0; // 8MHz 9600
   UCA1MCTL =UCBRS_0| UCBRF_1 | UCOS16; //UCBRS_0| UCBRF_13 | UCOS16; // Modln UCBRSx=0, UCBRFx=0,
   // over sampling
   UCA1CTL1 &= ~UCSWRST; // **Initialize USCI state machine**
   UCA1IE |= UCRXIE ; // Enable USCI_A0 RX interrupt
    __bis_SR_register(GIE);


   UCA1TXBUF=0x02;
   while(1);
}

#pragma vector=USCI_A1_VECTOR
__interrupt void USCI_A1_ISR(void)
{
    switch(__even_in_range(UCA1IV,4))
 {
    case 0:break; // Vector 0 - no interrupt
    case 2: // Vector 2 - RXIFG
     while (!(UCA1IFG&UCTXIFG)); // USCI_A0 TX buffer ready?
      UCA1TXBUF = UCA1RXBUF; // TX -> RXed character
     break;
    case 4:
    break; // Vector 4 - TXIFG
    default: break;
 }
}

现在这样设置串口可以发送数据,但是不能接收数据,不能进中断。

如果要是更改串口时钟频率,比如

    UCSCTL1 = DCORSEL_1; // Select DCO range 16MHz operation DCORSEL_5; 
    UCSCTL2 |=31 ;    

   时钟改为1M,串口UCA1BR0 ,UCA1BR1,UCA1MCTL也做相应设置 。就能够正常发数据和正常收数据。

  • RedStone 说:

    时钟设置为8M,串口可以发送数据,但是不能接收数据。

    void main( void )
    {
          // Stop watchdog timer to prevent time out reset
          WDTCTL = WDTPW + WDTHOLD;
         //UCSCTL4 |= SELA_2;
         UCSCTL3 = SELREF_2; //Set DCO FLL 参考REFO
         UCSCTL4 &= ~(SELS_4+SELM_4);
         UCSCTL4 |= SELA_4 + SELS_4 + SELM_4; //ACLk选择REFOCLK,SMCLK选择DCOCLKDIV,MCLK选择DCOCLKDIV

    // Loop until XT1,XT2 & DCO stabilizes - In this case only DCO has to stabilize
    do
    {
        UCSCTL7 &= ~(XT2OFFG | XT1LFOFFG | DCOFFG);
         // Clear XT2,XT1,DCO fault flags
         SFRIFG1 &= ~OFIFG; // Clear fault flags
     }while (SFRIFG1&OFIFG); // Test oscillator fault flag

        __bis_SR_register(SCG0); // Disable the FLL control loop
        UCSCTL1 = DCORSEL_5; // Select DCO range 16MHz operation DCORSEL_5;
        UCSCTL2 |=243 ;               // Set DCO Multiplier for 8MHz =243 ;
                                                      // (N + 1) * FLLRef = Fdco //DCOCLKDIV=8M DCOCLK=16M
                                                      // (243 + 1) * 32768 = 8MHz

    //DCO clock 设置8MHz  SMCLK 应该是4MHz


        __bic_SR_register(SCG0); // Enable the FLL control loop
        // 32 x 32 x 8 MHz / 32,768 Hz = 250000 = SMCLK cycles for DCO to settle
        __delay_cycles(250000);

       P4SEL |= BIT5 | BIT4; // P4.5,4 = USCI_A0 TXD/RXD
       UCA1CTL1 |= UCSWRST; // **Put state machine in reset**
       UCA1CTL1 |= UCSSEL_2; // SMCLK 

    //改为MCLK 才是8M


       UCA1BR0 =52; // 8MHz 9600 (see User's Guide)
       UCA1BR1 = 0; // 8MHz 9600
       UCA1MCTL =UCBRS_0| UCBRF_1 | UCOS16; //UCBRS_0| UCBRF_13 | UCOS16; // Modln UCBRSx=0, UCBRFx=0,
       // over sampling
       UCA1CTL1 &= ~UCSWRST; // **Initialize USCI state machine**
       UCA1IE |= UCRXIE ; // Enable USCI_A0 RX interrupt
        __bis_SR_register(GIE);


       UCA1TXBUF=0x02;
       while(1);
    }

    #pragma vector=USCI_A1_VECTOR
    __interrupt void USCI_A1_ISR(void)
    {
        switch(__even_in_range(UCA1IV,4))
     {
        case 0:break; // Vector 0 - no interrupt
        case 2: // Vector 2 - RXIFG
         while (!(UCA1IFG&UCTXIFG)); // USCI_A0 TX buffer ready?
          UCA1TXBUF = UCA1RXBUF; // TX -> RXed character
         break;
        case 4:
        break; // Vector 4 - TXIFG
        default: break;
     }
    }

    现在这样设置串口可以发送数据,但是不能接收数据,不能进中断。

    如果要是更改串口时钟频率,比如

        UCSCTL1 = DCORSEL_1; // Select DCO range 16MHz operation DCORSEL_5; 
        UCSCTL2 |=31 ;    

       时钟改为1M,串口UCA1BR0 ,UCA1BR1,UCA1MCTL也做相应设置 。就能够正常发数据和正常收数据。