[NXP]/LPC17002011. 11. 6. 23:00

[LPC1756 EVM] TCP/IP Server 전송 속도 테스트

[LPC1756 EVM] TCP/IP Server 전송 속도 테스트


LPC1756 을 이용하여 SPI방식의 Hardwired TCP/IP 모듈 W5200을 테스트 했다.
SPI속도가 빠르기 때문에 간단한 이더넷 솔루션으로 사용해 볼 만하다.
(TCP/IP 전송 속도 테스트 참고)

LPC1756의 SPI클럭 최대 속도는 48Mhz 이지만 실제 24Mhz이상에서는 정상적으로 동자하지 않는다.
SPI클럭 24Mhz에서 2.8Mbps 정도 출력된다.
(PIC32에 비하면 약간은 기대에 못미치는데... 클럭만 빠르다고 전송속도가 빠른것은 아닌것 같다.)


[31] iInChip Send: 2.8086 Mbps(348160 bytes, 0.9457 sec)
iInChip Recv: 2.5316 Mbps(348160 bytes, 1.0492 sec)
------------------------------------------------------------
[32] iInChip Send: 2.8575 Mbps(348160 bytes, 0.9296 sec)
iInChip Recv: 2.4732 Mbps(348160 bytes, 1.0740 sec)
-------------------------------------------------------


[LPC1756 EVM] W5200 드라이버 코드

//-----------------------------------------------------------------------------
// W5100 HAL
#define W5100_CS_PORT     GPIO0
#define W5100_CS_BIT     BIT16

#define W5100_RST_PORT     GPIO0
#define W5100_RST_BIT     BIT6

#define IINCHIP_RSToff()    cbi(W5100_RST_PORT, W5100_RST_BIT) 
#define IINCHIP_RSTon()     sbi(W5100_RST_PORT, W5100_RST_BIT)


#define W5100_IO_INIT()     GPIOInit(0, DIR_OUT, W5100_CS_BIT);GPIOInit(0, DIR_OUT, W5100_RST_BIT)


#define IINCHIP_CSoff()     cbi(W5100_CS_PORT, W5100_CS_BIT)
#define IINCHIP_CSon()     sbi(W5100_CS_PORT, W5100_CS_BIT)

#define IINCHIP_SPI_INIT()    SPI0_Init()
//#define IINCHIP_SpiSendData    SPI0_WriteByte
#define IINCHIP_SpiSendData    SPI0_WriteReadByte
#define IINCHIP_SpiRecvData    SPI0_WriteReadByte
//-----------------------------------------------------------------------------

Posted by nexp

댓글을 달아 주세요

[NXP]/LPC17002011. 11. 6. 21:00

[LPC1756 EVM] TFT-LCD 테스트

[LPC1756 EVM] TFT-LCD 테스트


LPC1756 EVM을 이용하여 TFT-LCD를 테스트 해보았다. 100Mhz 클럭 이기 때문에 좀더 빠를것 같은 기대로 테스트 진행 해 보았다.


IO제어는 빠른것 같다. 1프레임 출력하는데 10ms 안으로 들어온다. 좀더 옵티마이즈 하면 더 빨라질것 같다. 물론 Address/Data Bus를 이용하는것 보다는 느리겠지만 간단히 GPIO만으로도 빠른 속도를 낼 수 있을것 같다.





SPI속도도 빠르기 때문에 SD Card를 이용해서 테스트 해 보았다. LPC1756의 SPI최대 속도는 50Mhz까지 출력되지만 SD Card 제어시는 18Mhz이상 힘들기 때문에 16Mhz로 테스트 해 보았다. (SPI클럭 조합이 좀 아쉽다. 16Mhz 다음에 24Mhz, 48Mhz..로 설정 가능하다.)




LPC1756 EVM TFT-LCD 테스트 드라이버 코드

//-----------------------------------------------------------------------------
//TFT LCD
#define TFT_DRV_HD66791                 0
#define TFT_DRV_COM44                   1

#define LCD_LAT_BIT      BIT0
#define LCD_LAT_PORT     GPIO1
#define LCD_LAT_ON()     sbi(LCD_LAT_PORT, LCD_LAT_BIT)
#define LCD_LAT_OFF()     cbi(LCD_LAT_PORT, LCD_LAT_BIT)
#define LCD_DATA_LATCH()    LCD_LAT_ON();LCD_LAT_OFF();

#define LCD_EN_BIT      BIT4
#define LCD_EN_PORT      GPIO1
#define LCD_ENABLE()     cbi(LCD_EN_PORT, LCD_EN_BIT)
#define LCD_DISABLE()     sbi(LCD_EN_PORT, LCD_EN_BIT)

#define LCD_RST_BIT      //BIT8
#define LCD_RST_PORT     //PORTB
#define LCD_RST_ON()     //Sbi(LCD_RST_PORT, LCD_RST_BIT)
#define LCD_RST_OFF()     //Cbi(LCD_RST_PORT, LCD_RST_BIT)

#define LCD_RS_BIT      BIT0
#define LCD_RS_PORT      GPIO0
#define LCD_RS_OFF()     cbi(LCD_RS_PORT, LCD_RS_BIT)
#define LCD_RS_ON()      sbi(LCD_RS_PORT, LCD_RS_BIT)

#define LCD_WR_BIT      BIT1
#define LCD_WR_PORT      GPIO1
#define LCD_WR_OFF()     cbi(LCD_WR_PORT, LCD_WR_BIT)
#define LCD_WR_ON()      sbi(LCD_WR_PORT, LCD_WR_BIT)

#define LCD_RD_BIT      //BIT5
#define LCD_RD_PORT      //LATD
#define LCD_RD_OFF()     //Cbi(LCD_RD_PORT, LCD_RD_BIT)
#define LCD_RD_ON()      //Sbi(LCD_RD_PORT, LCD_RD_BIT)

#define LCD_BL_BIT      BIT4
#define LCD_BL_PORT      PORT3
#define LCD_BL_OFF()     //Cbi(LCD_BL_PORT, LCD_BL_BIT)
#define LCD_BL_ON()      //Sbi(LCD_BL_PORT, LCD_BL_BIT)

#define _LCD_DAT_OUT(Data)    PORT2 = (PORT2&0xFF00) | (Data>>8);\
                                     LCD_DATA_LATCH();\
                                     PORT2 = (PORT2&0xFF00) | (Data&0xFF);

#define TFTGpioInit()     GPIOInit(0, DIR_OUT, (BIT0));\
                                        GPIOInit(1, DIR_OUT, (BIT0|BIT1|BIT4));\
                                        GPIOInit(2, DIR_OUT, 0xFF);
//-----------------------------------------------------------------------------


Posted by nexp

댓글을 달아 주세요

[NXP]/LPC17002011. 11. 6. 15:19

[LPC1756 EVM] SPI 테스트

[LPC1756 EVM] SPI 테스트





LPC1756 SPI 초기화 함수
void SPI0_Init(void)
{
    int i;
    volatile unsigned char Dummy;
    
    //SPI Power On
    PCONP |= (1 << 21);    

   //SPI 핀설정    
    PINSEL0 |= 0x80000000;
    PINSEL1 |= 0x28;    

    PCLKSEL1 |= 0x400;   //CCLK
//    PCLKSEL1 |= 0x800;    //    CCLK/2
//    PCLKSEL1 |= 0xC00;    //    CCLK/8

   SPI0_SetSpeed(SPI_SPEED_1MHZ);
  
  //SSP disable
  SSP0CR1_bit.SSE = 0;
   
  /* Set DSS data to 8-bit, Frame format SPI, CPOL = 0, CPHA = 0, and SCR is 15 */
  SSP0CR0 = 0x0007;

  /* SSPCPSR clock prescale register, master mode, minimum divisor is 0x02 */
  SSP0CPSR = 0x2;

  for ( i = 0; i < FIFOSIZE; i++ )
  {
    Dummy = SSP0DR;   /* clear the RxFIFO */
  }

  //NVIC_IntEnable(NVIC_SSP1);
  //NVIC_IntPri(NVIC_SSP1,HIGHEST_PRIORITY);

  // SSP Enabled
  SSP0CR1 = SSPCR1_SSE;
}


SPI 클럭 설정 PCLKSEL1에서 아래와 같이 설정 가능하다.
00 PCLK_peripheral = CCLK/4 00
01 PCLK_peripheral = CCLK
10 PCLK_peripheral = CCLK/2
11 PCLK_peripheral = CCLK/8, except for CAN1, CAN2, and
CAN filtering when “11” selects = CCLK/6.


LPC1756 SPI 송수신 함수
SUINT SPI0_WriteReadByte(SUINT Data)
{
    //TxFIFO is not full
    while ( !(SSP0SR & SSPSR_TNF) );
    SSP0DR = Data;

    //Wait until the Busy bit is cleared 
    while ( !(SSP0SR & SSPSR_RNE) );
    return SSP0DR;  
}


SPI 모드 설정 레지스터




Posted by nexp

댓글을 달아 주세요

[NXP]/LPC17002011. 11. 6. 06:30

[LPC1756 EVM] Cortex-M3 LPC1700 GPIO 속도 테스트 실험

[LPC1756 EVM] Cortex-M3 LPC1700 GPIO 속도 테스트 실험



NXP사의 100Mhz Corte-M3 LPC1756 의 GPIO토글링 속도 테스트를 실험해 보았다. [다른 MCU속도 측정 결과]와 비교 하면 PIC32정도와 비교할 만하다.

비트 토글시 4.5Mhz정도 출력된다. PLL세팅 하여 100Mhz로 구동하니 8Mhz 정도 나온다.
     14              while(1)
     15              {
     16                  Led1Toggle();   /FIO1PIN ^= BIT9
   \                     ??main_1:
   \   00000034   2068               LDR      R0,[R4, #+0]
   \   00000036   4840               EORS     R0,R1,R0
   \   00000038   2060               STR      R0,[R4, #+0]
   \   0000003A   FBE7               B.N      ??main_1
   \                     ??main_0:
   \   0000003C   34C00920           DC32     0x2009c034
   \   00000040                      REQUIRE _A_FIO1PIN




단순 On/Off 만 했을때 25Mhz까지 출력된다.
     14              while(1)
     15              {
     16                  FIO1SET = BIT9;
   \                     ??main_1:
   \   00000034   6060               STR      R0,[R4, #+4]
     17                  FIO1CLR = BIT9;
   \   00000036   A060               STR      R0,[R4, #+8]
   \   00000038   FCE7               B.N      ??main_1
   \   0000003A   00BF               Nop     
   \                     ??main_0:
   \   0000003C   34C00920           DC32     0x2009c034
   \   00000040                      REQUIRE _A_FIO1PIN
   \   00000040                      REQUIRE _A_FIO1SET
   \   00000040                      REQUIRE _A_FIO1CLR






LPC1756 PLL 설정 코드 - 100Mhz 설정
void ConfigurePLL ( void )
{
DWORD MValue, NValue;

  if ( PLL0STAT & (1 << 25) )
  {
    PLL0CON = 1;     /* Enable PLL, disconnected */
    PLL0FEED = 0xaa;
    PLL0FEED = 0x55;
  }

  PLL0CON = 0;       /* Disable PLL, disconnected */
  PLL0FEED = 0xaa;
  PLL0FEED = 0x55;

  SCS |= 0x20;      /* Enable main OSC */
  while( !(SCS & 0x40) ); /* Wait until main OSC is usable */

  CLKSRCSEL = 0x1;    /* select main OSC, 12MHz, as the PLL clock source */

  PLL0CFG = PLL_MValue | (PLL_NValue << 16);
  PLL0FEED = 0xaa;
  PLL0FEED = 0x55;

  PLL0CON = 1;       /* Enable PLL, disconnected */
  PLL0FEED = 0xaa;
  PLL0FEED = 0x55;
 
 CCLKCFG = CCLKDivValue; /* Set clock divider */
  #if USE_USB
    USBCLKCFG = USBCLKDivValue;   /* usbclk = 288 MHz/6 = 48 MHz */
  #endif

  while ( ((PLL0STAT & (1 << 26)) == 0) ); /* Check lock bit status */

  MValue = PLL0STAT & 0x00007FFF;
  NValue = (PLL0STAT & 0x00FF0000) >> 16;
  while ((MValue != PLL_MValue) && ( NValue != PLL_NValue) );

  PLL0CON = 3;       /* enable and connect */
  PLL0FEED = 0xaa;
  PLL0FEED = 0x55;
  while ( ((PLL0STAT & (1 << 25)) == 0) ); /* Check connect bit status */
  return;
}


void SystemInit(void)
{
  // Flash accelerator init
  FLASHCFG = (0x5UL<<12) | 0x3AUL;
  // Init clock
  InitClock();
#if FCCLK_FREQ < 20000000
  FLASHCFG = (0x0UL<<12) | 0x3AUL;
#elif FCCLK_FREQ < 40000000
  FLASHCFG = (0x1UL<<12) | 0x3AUL;
#elif FCCLK_FREQ < 60000000
  FLASHCFG = (0x2UL<<12) | 0x3AUL;
#elif FCCLK_FREQ < 80000000
  FLASHCFG = (0x3UL<<12) | 0x3AUL;
#elif FCCLK_FREQ < 100000000
  FLASHCFG = (0x4UL<<12) | 0x3AUL;
#endif 
   :
}
Posted by nexp

댓글을 달아 주세요

[NXP]/LPC17002011. 11. 5. 21:00

[LPC1756 EVM] UART테스트

[LPC1756 EVM] UART테스트

LPC1756은 3개의 UART가 있고 16Byte의 FOFI를 내장하고 있다.




LPC1756 / LPC1768 UART 초기화 순서
1) Power
PCON 설정 : PCUART0 비트를 1로 설정해야 UART0 가 Power enable된다.

2)Peripheral clock
PCLKSEL0 레지스터에서 PCLK_UART0비트로 클럭 DIV를 설정할 수가 있다.
PCLKSEL1 레지스터는 PCLK_UART2/3

00 PCLK_peripheral = CCLK/4 00
01 PCLK_peripheral = CCLK
10 PCLK_peripheral = CCLK/2
11 PCLK_peripheral = CCLK/8, except for CAN1, CAN2, and CAN filtering when “11” selects = CCLK/6.

3)Baud rate
LCR레지스터의 DLAB 비트를 1로 설정후 보레이트 레지스터를 설정할 수 있다. 설정후 DLAB비트를 0으로 설정해야 한다.
(이것 때문에 고생했는데..  메뉴얼을 잘 읽어봐야 하는 부분이다.)

4)UART FIFO
FCR 레지스터에서 FIFO enable 해 주어야 한다.
    U0FCR = 0x07

5)Pin
    //RxD0 and TxD0 PIN Select
    PINSEL0 = 0x00000050;    


LPC1756 초기화 함수

// Serial Prot0 Utility Fuction Routine
void U0_Init(unsigned long baud)
{
    //RxD0 and TxD0 PIN Select
    PINSEL0 = 0x00000050;   

    //8 bits, no Parity, 1 Stop bit
    U0LCR = 3;   

    //UART boaud rate
    U0_SetBaud(baud);
    //Enable and reset TX and RX FIFO
    U0FCR = 0x07;
}


LPC1756 UART송수시 함수
void U0_PutByte(unsigned char Data)
{
    //Wait till U0THR and U0TSR are both empty
    while(!(U0LSR & TEMT)){};   
    U0THR = Data;
}

void U0_PutBuf(unsigned char *str, unsigned char len)
{
 unsigned char i =0;
 
    for(i=0;i<len;i++)
    {
        U0_PutByte(*(str+i));
    }
}


LPC1756 UART 테스트 프로그램
int main()
{
    unsigned int cnt = 0;
   
    SystemInit();

    Led1Init();
    Led1On();
   
    Led2Init();
    Led2Off();
   
    //UART0 초기화
    U0_Init(BAUD_115200);
 DebugPrint("LPC1700 Serial Test\r\n");
   
    while(1)
    {
        Led1Toggle();

        DebugPrint("cnt=%d\r\n", cnt++);
        Delay(500);
    }
 
    return 0;
}
Posted by nexp

댓글을 달아 주세요