[LPC1K EVM] SPI 테스트 - 가속도 센서 테스트
LCP1K SPI 특징
- Maximum SPI speed of 25 Mbit/s (master) or 4.17 Mbit/s (slave) (in SSP mode)
- Compatible with Motorola SPI, 4-wire Texas Instruments SSI, and National Semiconductor Microwire buses
- Synchronous serial communication
- Master or slave operation
- 8-frame FIFOs for both transmit and receive
- 4-bit to 16-bit frame
SPI SLK핀은 P0.10, 2.11, P0.6포트에 리맵이 가능한데 [LPC1K EVM] 보드는 0.6에 되어 있으므로 아래와 같이 설정할 수 있다.
SPI 드라이버 함수(spi.c)의 초기화 함수 및 송수신 함수를 수정하면 기존 코드를 그대로 사용할 수 있다.
LPC1113 SPI 가속도 센서 테스트
가속도 센서를 테스트하기 위해 [NET-EVM]보드를 이용하였다. [NET-EVM]보드의 가속도 센서 CS는 CN7의 P8에 연결되어 있는데 LPC1K EVM보드는 핀수가 적어 할당되어 있지 않다.
그래서 점퍼를 이용하여 P3.5에 연결하여 테스트 하였다.
LCP1K SPI 특징
- Maximum SPI speed of 25 Mbit/s (master) or 4.17 Mbit/s (slave) (in SSP mode)
- Compatible with Motorola SPI, 4-wire Texas Instruments SSI, and National Semiconductor Microwire buses
- Synchronous serial communication
- Master or slave operation
- 8-frame FIFOs for both transmit and receive
- 4-bit to 16-bit frame
SPI SLK핀은 P0.10, 2.11, P0.6포트에 리맵이 가능한데 [LPC1K EVM] 보드는 0.6에 되어 있으므로 아래와 같이 설정할 수 있다.
#define IOCON_SCKLOC_SCKPIN_PIO0_10 0 // Set SCK function to pin 0.10
#define IOCON_SCKLOC_SCKPIN_PIO2_11 1 // Set SCK function to pin 2.11
#define IOCON_SCKLOC_SCKPIN_PIO0_6 1 // Set SCK function to pin 0.6
//Set 0.6 to SSP SCK (2.11 and 0.10 can also be used)
LPC_IOCON->SCK_LOC = IOCON_SCKLOC_SCKPIN_PIO0_6;
LPC_IOCON->PIO0_6 = IOCON_PIO0_6_FUNC_SCK;
LPC_IOCON->PIO0_6 |= IOCON_PIO0_6_MODE_PULLUP;
#define IOCON_SCKLOC_SCKPIN_PIO2_11 1 // Set SCK function to pin 2.11
#define IOCON_SCKLOC_SCKPIN_PIO0_6 1 // Set SCK function to pin 0.6
//Set 0.6 to SSP SCK (2.11 and 0.10 can also be used)
LPC_IOCON->SCK_LOC = IOCON_SCKLOC_SCKPIN_PIO0_6;
LPC_IOCON->PIO0_6 = IOCON_PIO0_6_FUNC_SCK;
LPC_IOCON->PIO0_6 |= IOCON_PIO0_6_MODE_PULLUP;
SPI 드라이버 함수(spi.c)의 초기화 함수 및 송수신 함수를 수정하면 기존 코드를 그대로 사용할 수 있다.
void SPI0_Init(void)
{
LPC_SYSCON->PRESETCTRL |= (1 << 0);
LPC_SYSCON->SSP0CLKDIV = SCB_SSP0CLKDIV_DIV4;
LPC_SYSCON->SYSAHBCLKCTRL |= SCB_SYSAHBCLKCTRL_SSP0;
/* Set P0.8 to SSP MISO */
LPC_IOCON->PIO0_8 &= ~IOCON_PIO0_8_FUNC_MASK;
LPC_IOCON->PIO0_8 |= IOCON_PIO0_8_FUNC_MISO0;
LPC_IOCON->PIO0_8 |= IOCON_PIO0_8_MODE_PULLUP;
/* Set P0.9 to SSP MOSI */
LPC_IOCON->PIO0_9 &= ~IOCON_PIO0_9_FUNC_MASK;
LPC_IOCON->PIO0_9 |= IOCON_PIO0_9_FUNC_MOSI0;
LPC_IOCON->PIO0_9 |= IOCON_PIO0_9_MODE_PULLUP;
//Set 0.6 to SSP SCK (2.11 and 0.10 can also be used)
LPC_IOCON->SCK_LOC = IOCON_SCKLOC_SCKPIN_PIO0_6;
LPC_IOCON->PIO0_6 = IOCON_PIO0_6_FUNC_SCK;
LPC_IOCON->PIO0_6 |= IOCON_PIO0_6_MODE_PULLUP;
// Set clock polarity
Cbi(LPC_SSP0->CR0, SSP_SSP0CR0_CPOL_MASK);
// Set edge transition
Sbi(LPC_SSP0->CR0, SSP_SSP0CR0_CPHA_SECOND);
/* Master mode */
LPC_SSP0->CR1 = SSP_SSP0CR1_SSE_ENABLED | SSP_SSP0CR1_MS_MASTER | SSP_SSP0CR1_LBM_NORMAL;
/* Clock prescale register must be even and at least 2 in master mode */
LPC_SSP0->CPSR = 2;
}
SUINT SPI0_WriteReadByte(SUINT Data)
{
/* Move on only if NOT busy and TX FIFO not full. */
while ((LPC_SSP0->SR & (SSP_SSP0SR_TNF_NOTFULL | SSP_SSP0SR_BSY_BUSY)) != SSP_SSP0SR_TNF_NOTFULL);
LPC_SSP0->DR = Data;
while ( (LPC_SSP0->SR & (SSP_SSP0SR_BSY_BUSY|SSP_SSP0SR_RNE_NOTEMPTY)) != SSP_SSP0SR_RNE_NOTEMPTY );
return(LPC_SSP0->DR);
}
{
LPC_SYSCON->PRESETCTRL |= (1 << 0);
LPC_SYSCON->SSP0CLKDIV = SCB_SSP0CLKDIV_DIV4;
LPC_SYSCON->SYSAHBCLKCTRL |= SCB_SYSAHBCLKCTRL_SSP0;
/* Set P0.8 to SSP MISO */
LPC_IOCON->PIO0_8 &= ~IOCON_PIO0_8_FUNC_MASK;
LPC_IOCON->PIO0_8 |= IOCON_PIO0_8_FUNC_MISO0;
LPC_IOCON->PIO0_8 |= IOCON_PIO0_8_MODE_PULLUP;
/* Set P0.9 to SSP MOSI */
LPC_IOCON->PIO0_9 &= ~IOCON_PIO0_9_FUNC_MASK;
LPC_IOCON->PIO0_9 |= IOCON_PIO0_9_FUNC_MOSI0;
LPC_IOCON->PIO0_9 |= IOCON_PIO0_9_MODE_PULLUP;
//Set 0.6 to SSP SCK (2.11 and 0.10 can also be used)
LPC_IOCON->SCK_LOC = IOCON_SCKLOC_SCKPIN_PIO0_6;
LPC_IOCON->PIO0_6 = IOCON_PIO0_6_FUNC_SCK;
LPC_IOCON->PIO0_6 |= IOCON_PIO0_6_MODE_PULLUP;
// Set clock polarity
Cbi(LPC_SSP0->CR0, SSP_SSP0CR0_CPOL_MASK);
// Set edge transition
Sbi(LPC_SSP0->CR0, SSP_SSP0CR0_CPHA_SECOND);
/* Master mode */
LPC_SSP0->CR1 = SSP_SSP0CR1_SSE_ENABLED | SSP_SSP0CR1_MS_MASTER | SSP_SSP0CR1_LBM_NORMAL;
/* Clock prescale register must be even and at least 2 in master mode */
LPC_SSP0->CPSR = 2;
}
SUINT SPI0_WriteReadByte(SUINT Data)
{
/* Move on only if NOT busy and TX FIFO not full. */
while ((LPC_SSP0->SR & (SSP_SSP0SR_TNF_NOTFULL | SSP_SSP0SR_BSY_BUSY)) != SSP_SSP0SR_TNF_NOTFULL);
LPC_SSP0->DR = Data;
while ( (LPC_SSP0->SR & (SSP_SSP0SR_BSY_BUSY|SSP_SSP0SR_RNE_NOTEMPTY)) != SSP_SSP0SR_RNE_NOTEMPTY );
return(LPC_SSP0->DR);
}
LPC1113 SPI 가속도 센서 테스트
가속도 센서를 테스트하기 위해 [NET-EVM]보드를 이용하였다. [NET-EVM]보드의 가속도 센서 CS는 CN7의 P8에 연결되어 있는데 LPC1K EVM보드는 핀수가 적어 할당되어 있지 않다.
그래서 점퍼를 이용하여 P3.5에 연결하여 테스트 하였다.
반응형