'LPC812_STUDY'에 해당되는 글 2건

  1. 2014.03.09 LPC812 EVM - SPI 테스트
  2. 2014.03.09 LPC812 EVM - UART 테스트
[NXP]/LPC8002014. 3. 9. 22:30

LPC812 EVM - SPI 테스트

LPC812 EVM - SPI 테스트

LPC812는 2개의 SPI를 내장하고 있다. 저가격 소형 칩이라도 기능은 막강하다. 특히 SWITCH MATRIX 방식으로 SPI 핀맵을 원하는 형태로 할당 할 수 있기 때문에 상상히 유연성이 좋은것 같다.

SPI의 최대 클럭 속도는 메인클럭인 30Mhz까지 출력 가능하다. 


LPC812 SPI 블록도





LPC812 EVM 에서 SPI 핀맵할당

LPC812 EVM에서 SPI핀맵은 아래와같이 할당 했고 Switch Matrix Tool을 이용하여 코드 생성을 쉽게 할 수 있다.





LPC812 SPI 초기화 함수

void SPI0_Init(void)

{

    /* Enable SWM clock */

    LPC_SYSCON->SYSAHBCLKCTRL |= (1<<7);


    /* Pin Assign 8 bit Configuration */

    /* SPI0_SCK */

    LPC_SWM->PINASSIGN3 = 0x07ffffffUL; 

    /* SPI0_MOSI */

    /* SPI0_MISO */

    LPC_SWM->PINASSIGN4 = 0xffff0203UL; 


    

    /* Enable SPI clock */

    LPC_SYSCON->SYSAHBCLKCTRL |= (1<<11);


    /* Bring SPI out of reset */

    LPC_SYSCON->PRESETCTRL &= ~(0x1<<0);

    LPC_SYSCON->PRESETCTRL |= (0x1<<0);


    /* Set clock speed and mode */

    LPC_SPI0->DIV = 15-1;

    LPC_SPI0->DLY = 0;

    LPC_SPI0->CFG = (SPI_CFG_MASTER & ~SPI_CFG_ENABLE);

    LPC_SPI0->CFG |= SPI_CFG_ENABLE;    

}




LPC812 SPI 송수신 함수

unsigned char SPI0_WriteReadByte(unsigned char Data)

{

while ( (LPC_SPI0->STAT & SPI_STAT_TXRDY) == 0 );


    LPC_SPI0->TXDATCTL = SPI_TXDATCTL_FSIZE(8-1) | SPI_TXDATCTL_EOT | Data;

    while ( (LPC_SPI0->STAT & SPI_STAT_RXRDY) == 0 );

    

    return LPC_SPI0->RXDAT;   

}





LPC812 모드 설정







void SPI0_SetMode(int Mode)

{

switch(Mode)

{

case _SPI_MODE0:

            Cbi(LPC_SPI0->CFG, SPI_CFG_CPOL);

            Cbi(LPC_SPI0->CFG, SPI_CFG_CHPA);

break;

            

case _SPI_MODE1:

            Cbi(LPC_SPI0->CFG, SPI_CFG_CPOL);

            Sbi(LPC_SPI0->CFG, SPI_CFG_CHPA);

break;


case _SPI_MODE2:

            Sbi(LPC_SPI0->CFG, SPI_CFG_CPOL);

            Cbi(LPC_SPI0->CFG, SPI_CFG_CHPA);

break;


case _SPI_MODE3:

            Sbi(LPC_SPI0->CFG, SPI_CFG_CPOL);

            Sbi(LPC_SPI0->CFG, SPI_CFG_CHPA);

break;            

}

}




Posted by nexp

댓글을 달아 주세요

[NXP]/LPC8002014. 3. 9. 21:00

LPC812 EVM - UART 테스트

LPC812 EVM -  UART 테스트


LPC812 는 3채널의 UART가 있다. 20핀 소형 페키지 임에도 불구하고 3개의 UART가 있어 유용하게 사용될곳이 많을것 같다.

그리고 스위치 메트릭스라는 기능을 이용하여 UART핀을 자유롭게 맵핑할 수 있는것도 상당히 마음에 든다.


아래 그림은 LPC812의 UART 블록도 이다.



LPC812 UART 핀맵핑 


#if 1

  /* connect the UART0 TXD abd RXD sigals to port pins(P0.4-P0.0)*/

regVal = LPC_SWM->PINASSIGN0 & ~( 0xFF << 0 );

LPC_SWM->PINASSIGN0 = regVal | ( 4 << 0 ); /* P0.4 is UART0 TXD, ASSIGN0(7:0) */

regVal = LPC_SWM->PINASSIGN0 & ~( 0xFF << 8 );

LPC_SWM->PINASSIGN0 = regVal | ( 0 << 8 ); /* P0.0 is UART0 RXD. ASSIGN0(15:8) */

regVal = LPC_SWM->PINASSIGN0 & ~( 0xFF << 16 );

LPC_SWM->PINASSIGN0 = regVal | ( 12 << 16 ); /* P0.12 is UART0 RTS, ASSIGN0(23:16) */

regVal = LPC_SWM->PINASSIGN0 & ~( 0xFFUL << 24 );

LPC_SWM->PINASSIGN0 = regVal | ( 13 << 24 ); /* P0.13 is UART0 CTS. ASSIGN0(31:24) */

#endif


#if 0

  /* connect the UART1 TXD abd RXD sigals to port pins(P0.4-P0.0)*/

regVal = LPC_SWM->PINASSIGN1 & ~( 0xFF << 8 );

LPC_SWM->PINASSIGN1 = regVal | ( 4 << 8 ); /* P0.4 is UART1 TXD, ASSIGN1(15:8) */

regVal = LPC_SWM->PINASSIGN1 & ~( 0xFF << 16 );

LPC_SWM->PINASSIGN1 = regVal | ( 0 << 16 ); /* P0.0 is UART1 RXD. ASSIGN1(23:16) */

regVal = LPC_SWM->PINASSIGN1 & ~( 0xFFUL << 24 );

LPC_SWM->PINASSIGN1 = regVal | ( 12 << 24 ); /* P0.12 is UART1 RTS. ASSIGN1(31:24) */

regVal = LPC_SWM->PINASSIGN2 & ~( 0xFF << 0 );

LPC_SWM->PINASSIGN2 = regVal | ( 13 << 0 ); /* P0.13 is UART1 RTS, ASSIGN2(7:0) */

#endif


#if 0

/* connect the UART2 TXD abd RXD sigals to port pins(P0.4-P0.0)*/

regVal = LPC_SWM->PINASSIGN2 & ~( 0xFF << 16 );

LPC_SWM->PINASSIGN2 = regVal | ( 4 << 16 ); /* P0.4 is UART2 TXD, ASSIGN2(23:16) */

regVal = LPC_SWM->PINASSIGN2 & ~( 0xFFUL << 24 );

LPC_SWM->PINASSIGN2 = regVal | ( 0 << 24 ); /* P0.0 is UART2 RXD. ASSIGN2(31:24) */

regVal = LPC_SWM->PINASSIGN3 & ~( 0xFF << 0 );

LPC_SWM->PINASSIGN3 = regVal | ( 12 << 0 ); /* P0.12 is UART2 RTS. ASSIGN1(7:0) */

regVal = LPC_SWM->PINASSIGN3 & ~( 0xFF << 8 );

LPC_SWM->PINASSIGN3 = regVal | ( 13 << 8 ); /* P0.13 is UART2 RTS, ASSIGN2(15:8) */

#endif



LPC812의 UART는 스위치 메트릭스로 원하는 포트에 할당가능하다. 다만 부트로드의 경우 디폴트로 P0.0, P1.4에 할당되어 있다.부트로더를 이용한다면 하드웨어 설계시주의가 필요하다.





LPC812 UART Status Register

RXDATSTAT의 RXRDY 비트가 1이면 수신버퍼로부터 데이터르 읽어 올 수 있다. 데이터를 읽어오면 자동으로 0이 된다.




LPC812 UART 송수신 함수

void U0_PutByte(unsigned char Data)

{

    while ( !(LPC_USART0->STAT & TXRDY) );

    LPC_USART0->TXDATA = Data;    

}



unsigned char U0_GetByte(void)

{

    while(!(LPC_USART0->STAT & RXRDY));     

    return LPC_USART0->RXDATA;

}



Posted by nexp

댓글을 달아 주세요