TI中文支持网
TI专业的中文技术问题搜集分享网站

MSP430F24x关于UART与SPI的中断问题

//******************************************************************************
// 针对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的形式?

 

Yun Zhang:

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

Yun Zhang:

回复 Yun Zhang:

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

Yun Zhang:

回复 Yun Zhang:

改成这样,行不?

//******** 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);                                            // 如果不加这个微量的延时,会出现丢包现象

   }

}

Charles Wu:

回复 Yun Zhang:

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

赞(0)
未经允许不得转载:TI中文支持网 » MSP430F24x关于UART与SPI的中断问题
分享到: 更多 (0)