[MSP430F2274 EVM] SPI테스트 - 가속도 센서 테스트
MSP430F2274 SPI 블록도
[MSP430F2274 EVM] 보드에서 SPI는 P3.0~P3.3에 할당되어 있는 UCB0-SPI를 사용하고 있다.
spi.c 드라이이버 함수의 초기화 및 송수신 함수만 수정하면 기존 코드 그대로 사용할 수 있다.
SPI MODE설정시 주의 사항
SPI 가속도 센서를 테스트 하기위해 [NET-EVM] 보드를 이용하였는데 SPI CS는 CN7의 P8번에 연결되어 있고 이는 MSP430보드의 P3.7에 할당되어 있다. 드라이버 파일(config.h)에 아래와 같이 설정할 수 있다.
[MSP430F2274 EVM]보드를 이용한 SPI테스트 예제 - 가속도 센서 테스트
MSP430F2274 SPI 블록도
[MSP430F2274 EVM] 보드에서 SPI는 P3.0~P3.3에 할당되어 있는 UCB0-SPI를 사용하고 있다.
spi.c 드라이이버 함수의 초기화 및 송수신 함수만 수정하면 기존 코드 그대로 사용할 수 있다.
#define SPI0_WRITE_BYTE(x) UCB0TXBUF = (x);
#define SPI0_READ_BYTE() UCB0RXBUF
#define SPI0_WAIT_FOR_EN() while (!(IFG2&UCB0TXIFG));
#define SPI0_WAIT_FOR_SEND() while (UCB0STAT & UCBUSY);
#define SPI0_WAIT_FOR_RX() while (!(IFG2&UCB0RXIFG))
//USCIB0 for 2271
#define TI_CC_SPI_USCIB0_PxSEL P3SEL
#define TI_CC_SPI_USCIB0_PxDIR P3DIR
#define TI_CC_SPI_USCIB0_PxIN P3IN
#define TI_CC_SPI_USCIB0_SIMO BIT1
#define TI_CC_SPI_USCIB0_SOMI BIT2
#define TI_CC_SPI_USCIB0_UCLK BIT3
#define SPI0_READ_BYTE() UCB0RXBUF
#define SPI0_WAIT_FOR_EN() while (!(IFG2&UCB0TXIFG));
#define SPI0_WAIT_FOR_SEND() while (UCB0STAT & UCBUSY);
#define SPI0_WAIT_FOR_RX() while (!(IFG2&UCB0RXIFG))
//USCIB0 for 2271
#define TI_CC_SPI_USCIB0_PxSEL P3SEL
#define TI_CC_SPI_USCIB0_PxDIR P3DIR
#define TI_CC_SPI_USCIB0_PxIN P3IN
#define TI_CC_SPI_USCIB0_SIMO BIT1
#define TI_CC_SPI_USCIB0_SOMI BIT2
#define TI_CC_SPI_USCIB0_UCLK BIT3
void SPI0_Init(void)
{
//MSP430 SPI초기화
UCB0CTL1 |= UCSWRST; // **Disable USCI state machine**
UCB0CTL0 |= UCMST+UCCKPH+UCMSB+UCSYNC; // 3-pin, 8-bit SPI master
UCB0CTL1 |= UCSSEL_2; // SMCLK
UCB0BR0 = 0x02; // UCLK/2
UCB0BR1 = 0;
//SPI Port Init
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;
// Initialize USART state machine
UCB0CTL1 &= ~UCSWRST;
}
unsigned char SPI0_WriteReadByte(unsigned char Data)
{
SPI0_WAIT_FOR_EN();
SPI0_WRITE_BYTE(Data);
SPI0_WAIT_FOR_SEND();
return SPI0_READ_BYTE();
}
{
//MSP430 SPI초기화
UCB0CTL1 |= UCSWRST; // **Disable USCI state machine**
UCB0CTL0 |= UCMST+UCCKPH+UCMSB+UCSYNC; // 3-pin, 8-bit SPI master
UCB0CTL1 |= UCSSEL_2; // SMCLK
UCB0BR0 = 0x02; // UCLK/2
UCB0BR1 = 0;
//SPI Port Init
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;
// Initialize USART state machine
UCB0CTL1 &= ~UCSWRST;
}
unsigned char SPI0_WriteReadByte(unsigned char Data)
{
SPI0_WAIT_FOR_EN();
SPI0_WRITE_BYTE(Data);
SPI0_WAIT_FOR_SEND();
return SPI0_READ_BYTE();
}
SPI MODE설정시 주의 사항
SPI 가속도 센서를 테스트 하기위해 [NET-EVM] 보드를 이용하였는데 SPI CS는 CN7의 P8번에 연결되어 있고 이는 MSP430보드의 P3.7에 할당되어 있다. 드라이버 파일(config.h)에 아래와 같이 설정할 수 있다.
//AccelCS A8-P3.7
#define ACCEL_CS_BIT BIT7
#define ACCEL_CS_PORT P3OUT
#define ACCEL_CS_INIT() Sbi(P3DIR, ACCEL_CS_BIT);
#define ACCEL_CS_BIT BIT7
#define ACCEL_CS_PORT P3OUT
#define ACCEL_CS_INIT() Sbi(P3DIR, ACCEL_CS_BIT);
[MSP430F2274 EVM]보드를 이용한 SPI테스트 예제 - 가속도 센서 테스트
//-----------------------------------------------------------------------------
int main(void)
{
int flag = 0;
short data = 0;
//System Init
SystemInit();
//LED Init
Led1Init();
Led1On();
//Serial Init
DebugInit(BAUD_115200);
DebugPrint("MSP430F2274 SPI Test Program.\r\n");
//SPI및 가속도 센서초기화
myAccel3lvInit();
while (1)
{
if(u0_IsReceiveData())
{
switch(U0_GetByte())
{
case 'i':
myAccel3lvWrite(CTRL_REG1, 0xC7); //1000.0111 Power on, enable all axis, self test off
DebugPrint("Accel Init\r\n");
break;
case 'r':
data = myAccel3lvRead(WHO_AM_I);
DebugPrint("Who am I? 0x%x\r\n", data);
break;
case 'x':
GetAccelValue(AXIS_X, &data);
DebugPrint("%d\r\n", data);
break;
}
}
}
}
int main(void)
{
int flag = 0;
short data = 0;
//System Init
SystemInit();
//LED Init
Led1Init();
Led1On();
//Serial Init
DebugInit(BAUD_115200);
DebugPrint("MSP430F2274 SPI Test Program.\r\n");
//SPI및 가속도 센서초기화
myAccel3lvInit();
while (1)
{
if(u0_IsReceiveData())
{
switch(U0_GetByte())
{
case 'i':
myAccel3lvWrite(CTRL_REG1, 0xC7); //1000.0111 Power on, enable all axis, self test off
DebugPrint("Accel Init\r\n");
break;
case 'r':
data = myAccel3lvRead(WHO_AM_I);
DebugPrint("Who am I? 0x%x\r\n", data);
break;
case 'x':
GetAccelValue(AXIS_X, &data);
DebugPrint("%d\r\n", data);
break;
}
}
}
}
반응형