본문 바로가기

[MSP430]/MSP430_FRAM

MSP430FR5739 EVM - eUSCI SPI 통신 테스트

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;

    }

}



반응형