//******************************************************************************
// 针对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来做中断源的判断。
TI中文支持网



