MSP430FR5739 EVM - eUSCI SPI 통신 테스트
MSP430FR5739의 SPI역시 기존과 약간의 변화가 있는것 같다.
설계 할때 잘 해둘필요가 있는데... 아무튼 다시 한번 정리해 본다.
MSP430FR5739 SPI 블록도
MSP430FR5739 SPI 핀맵 설정
SEL 레지스터를 이용하여 SPI기능을 할당할 수 있다. 다른 MSP430시리즈와 달리 SEL0, SEL1으로 두개의 레지스터가 있다.
//USCIA1 for MSP430FR5739
#define _SPI1_PxSEL P2SEL0
#define _SPI1_PxSEL1 P2SEL1
#define _SPI1_PxDIR P2DIR
#define _SPI1_PxIN P2IN
#define _SPI1_SIMO BIT5
#define _SPI1_SOMI BIT6
#define _SPI1_UCLK BIT4
//SPI Port Init
Cbi(_SPI1_PxSEL, (_SPI1_UCLK|_SPI1_SOMI|_SPI1_SIMO));
Sbi(_SPI1_PxSEL1, (_SPI1_UCLK|_SPI1_SOMI|_SPI1_SIMO));
// SPI option select
Sbi(_SPI1_PxDIR, (_SPI1_UCLK|_SPI1_SOMI|_SPI1_SIMO));
MSP430FR5739 SPI 초기화 함수
void SPI1_Init(void) // SPI 통신 초기화 함수
{
// Initialize USART state machine
UCB0CTL1 &= ~UCSWRST;
//SPI Port Init
Cbi(_SPI1_PxSEL, (_SPI1_UCLK|_SPI1_SOMI|_SPI1_SIMO));
Sbi(_SPI1_PxSEL1, (_SPI1_UCLK|_SPI1_SOMI|_SPI1_SIMO));
// SPI option select
Sbi(_SPI1_PxDIR, (_SPI1_UCLK|_SPI1_SOMI|_SPI1_SIMO));
UCA1CTLW0 |= UCSWRST; // **Put state machine in reset**
UCA1CTLW0 |= UCMST+UCSYNC+UCCKPL+UCMSB; // 3-pin, 8-bit SPI master
// Clock polarity high, MSB
UCA1CTLW0 |= UCSSEL__SMCLK; // SMCLK
UCA1CTLW0 &= ~UCSWRST; // **Initialize USCI state machine**
//UCA1IE |= UCRXIE; // Enable USCI_A0 RX interrupt
}
MSP430FR5739 송수신 함수
#define SPI1_WRITE_BYTE(x) UCA1TXBUF = (x);
#define SPI1_READ_BYTE() UCA1RXBUF
#define SPI1_WAIT_FOR_SEND() while (!(UCA1IFG&UCTXIFG))
#define SPI1_WAIT_FOR_RX() while (!(UCA1IFG&UCRXIFG))
unsigned char SPI1_WriteReadByte(unsigned char Data)
{
//SPI TXBUF 데이터 있는가 확인
SPI1_WAIT_FOR_SEND();
//데이터 전송
SPI1_WRITE_BYTE(Data);
//SPI 데이터가 수신되면
SPI1_WAIT_FOR_RX();
return SPI0_READ_BYTE();
}
인터럽트로 처리할 경우
extern RINGBUFFER gUartBuffer;
#pragma vector=USCI_A0_VECTOR
__interrupt void USCI_A0_ISR(void)
{
switch(__even_in_range(UCA0IV,0x08))
{
case 0: break; // Vector 0 - no interrupt
case 2: // Vector 2 - RXIFG
SetRingBuffer(&gUartBuffer, UCA0RXBUF);
break;
default:
break;
}
}