본문 바로가기

[NXP]/LPC800

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;            

}

}




반응형