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.

MSP430F24x关于UART与SPI的中断问题

Other Parts Discussed in Thread: MSP430F5510

//******************************************************************************
// 针对MSP430F5510,IFG2&UCB0RXIFG 需要被替换为 UCB0IFG &= ~UCRXIFG;
// 而F2xx需要采用为 IFG2 &= ~UCB0RXIFG;
void TI_CC_SPISetup(void)
{
  TI_CC_CSn_PxOUT |= TI_CC_CSn_PIN;
  TI_CC_CSn_PxDIR |= TI_CC_CSn_PIN;                           // /CS disable
  TI_CC_SPI_USCIB0_PxSEL |= TI_CC_SPI_USCIB0_SIMO | TI_CC_SPI_USCIB0_SOMI | TI_CC_SPI_USCIB0_UCLK;
                                                                                                      // SPI option select
  TI_CC_SPI_USCIB0_PxDIR |= TI_CC_SPI_USCIB0_SIMO | TI_CC_SPI_USCIB0_UCLK;
                                                                                                       // SPI TXD out direction
  UCB0CTL0 |= UCMST+UCCKPL+UCMSB+UCSYNC;    // 3-pin, 8-bit SPI master
  UCB0CTL1 |= UCSSEL_2;                                                    // SMCLK
  UCB0BR0 |= 0x02;                                                                  // UCLK/2
  UCB0BR1 = 0;
//  UCA0MCTL = 0;                                                                     // No modulation,F5510新增设定
  UCB0CTL1 &= ~UCSWRST;                                                 // **Initialize USCI state machine**
}

void TI_CC_SPIWriteReg(char addr, char value)
{
    TI_CC_CSn_PxOUT &= ~TI_CC_CSn_PIN;                                             // /CS enable
    while (TI_CC_SPI_USCIB0_PxIN&TI_CC_SPI_USCIB0_SOMI);         // Wait for CCxxxx ready
    IFG2 &= ~UCB0RXIFG;                                                                                  // Clear flag,F2xx采用的代码
//    UCB0IFG &= ~UCRXIFG;                                                                            // Clear flag,F5510采用的代码
    UCB0TXBUF = addr;                                                                                      // Send address

    while (!(IFG2 &= ~UCB0RXIFG));                                                                 // Wait for TX to finish
    IFG2 &= ~UCB0RXIFG;                                                                                  // Clear flag
    UCB0TXBUF = value;                                                                                     // Send data

    while (!(IFG2 &= ~UCB0RXIFG));                                                                 // Wait for TX to finish
    TI_CC_CSn_PxOUT |= TI_CC_CSn_PIN;                                                 // /CS disable
}

 

//******** F5510用的UART0 RX中断 **************************************

#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
    RX0Buf[RX0Buf_in] = UCA0RXBUF;          // RXed character ->
    RX0Buf_in++;                                                 // 数组保存位置的指针
    TI_CC_Wait(20);                                            // 如果不加这个微量的延时,会出现丢包现象
    break;
  case 4:break;                                                    // Vector 4 - TXIFG
  default: break;
  }
}

 

//******** F247用的UART0 RX中断 **************************************

#pragma vector=USCIAB0RX_VECTOR
__interrupt void USCI_A0_ISR(void)
{
    RX0Buf[RX0Buf_in] = UCA0RXBUF;          // RXed character ->
    RX0Buf_in++;                                                 // 数组保存位置的指针
    TI_CC_Wait(20);                                            // 如果不加这个微量的延时,会出现丢包现象
}

 

F247的SPI使用P3.0~P3.3,UART0使用P3.4~P3.5;

F5510的SPI使用P2.7、P3.0~P3.2,UART0使用P3.3~P3.4。

现在发现F5510的SPI、UART0同时工作是正常的,而F247的中断向量使用的是同一个IFG2,如何避免冲突呢?

F247的UART0_RX中断,能否写成类似于F5510的形式?

 

  • 就是同时使用了USCIA0的UART 和USCIB0的SPI,由于它们共用一个UCB0RXIFG,不知道如何区别是UART0_RX的数据、或者是SPI的数据?

  • MSP430F2xx用户指南,Page484的介绍,如何用C语言实现呢?

    USCI Interrupt Usage

    USCI_Ax and USCI_Bx share the same interrupt vectors. The receive

    interrupt flags UCAxRXIFG and UCBxRXIFG are routed to one interrupt

    vector, the transmit interrupt flags UCAxTXIFG and UCBxTXIFG share

    another interrupt vector.

    Shared Interrupt Vectors Software Example

    The following software example shows an extract of an interrupt service

    routine to handle data receive interrupts from USCI_A0 in either UART or SPI

    mode and USCI_B0 in SPI mode.

     

    USCIA0_RX_USCIB0_RX_ISR

    BIT.B #UCA0RXIFG, &IFG2 ; USCI_A0 Receive Interrupt?

    JNZ USCIA0_RX_ISR

    USCIB0_RX_ISR?

    ; Read UCB0RXBUF (clears UCB0RXIFG)

    ...

    RETI

    USCIA0_RX_ISR

    ; Read UCA0RXBUF (clears UCA0RXIFG)

    ...

    RETI

     

    The following software example shows an extract of an interrupt service

    routine to handle data transmit interrupts from USCI_A0 in either UART or SPI

    mode and USCI_B0 in SPI mode.

     

    USCIA0_TX_USCIB0_TX_ISR

    BIT.B #UCA0TXIFG, &IFG2 ; USCI_A0 Transmit Interrupt?

    JNZ USCIA0_TX_ISR

    USCIB0_TX_ISR

    ; Write UCB0TXBUF (clears UCB0TXIFG)

    ...

    RETI

    USCIA0_TX_ISR

    ; Write UCA0TXBUF (clears UCA0TXIFG)

    ...

    RETI

  • 改成这样,行不?

    //******** F247用的UART0 RX中断 **************************************

    #pragma vector=USCIAB0RX_VECTOR

    __interrupt void USCI_A0_ISR(void)

    {

       if (IFG2 & UCA0RXIFG)

       {

         RX0Buf[RX0Buf_in] = UCA0RXBUF;          // RXed character ->

         RX0Buf_in++;                                                 // 数组保存位置的指针

         TI_CC_Wait(20);                                            // 如果不加这个微量的延时,会出现丢包现象

       }

    }

  • F2xx系列的USCI和F5xx系列的USCI在中断向量的配置上有略微的不同,F2xx是USCIA和USCIB的RX公用一个中断向量,TX公用一个中断向量。楼主最后的针对F247的代码是可行的。而F5xx是A和B各自用一个中断向量,且多了UCAxIV和UCBxIV来做中断源的判断。