Quantcast
Channel: MSP 低功耗微控制器论坛 - 最近的话题
Viewing all articles
Browse latest Browse all 3634

msp430F5308串口接收不到数据

$
0
0

时钟设置为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也做相应设置 。就能够正常发数据和正常收数据。


Viewing all articles
Browse latest Browse all 3634

Trending Articles