[NXP]/LPC1k2011. 10. 25. 22:30

[LPC1K-SM EVM] VS1033 을이용한 MP3 출력 테스트

[LPC1K-SM EVM] VS1033 을이용한 MP3 출력 테스트


VS1033 MP3 디코드모률을 이용하면 LPC1100과 같은 저가형 MCU에서 쉽게 MP3출력이 가능하다. [EXP-DSP EVM] 보드는 VS1033모듈을 쉽게 연결하여 테스트 할 수 있다.

VS1033 모듈 핀맵
SPI를 위한 3개핀과 아래 제어핀 4개가 필요하다.



LPC1111을 사용할 때는 아래 두 핀은 점퍼로 할당이 필요하다.
DREQ     -> P_A3(P1.11)
MP3_CS -> P_A4(P0.10)







Posted by nexp

댓글을 달아 주세요

[NXP]/LPC1k2011. 10. 24. 23:51

[LPC1K EVM] LPC1100 TFT LCD테스트 (LCD_IF_P Board)

[LPC1K EVM] LPC1100 TFT LCD테스트 (LCD_IF_P Board)


소형에 저렴한 (현재 쇼핑몰에서 1000원대에 판매하고 있다. 링크) MCU에도 불구 하고 기능이 좋아 여러곳에 사용기 좋은것 같다. SD Card의 이미지 파일을 TFT LCD에 출력하는 테스트를 해 보았다.





[LPC1113 EVM] TFT-LCD 테스트 동영상

보드 특성상 Data가 0~7의 순서로 되어 있지 않아 추가적인 비트 조작이 필요 하고  SPI클럭이 최대 12Mhz이기 때문에 속도는 조금 느려 보이는데 가격대비 성능비로는 아주 만족할만하다.




LPC1100에서 일부 핀들은 디폴트가 JTAG으로 할당되어 있기 때문에 GPIO로 설정할 필요가 있다.

    LPC_IOCON->JTAG_TDO_PIO1_1  &= ~0x07;
    LPC_IOCON->JTAG_TDO_PIO1_1  |= 0x01;

    LPC_IOCON->JTAG_TMS_PIO1_0  &= ~0x07;
    LPC_IOCON->JTAG_TMS_PIO1_0  |= 0x01;

    LPC_IOCON->JTAG_nTRST_PIO1_2  &= ~0x07;
    LPC_IOCON->JTAG_nTRST_PIO1_2  |= 0x01;
   
    LPC_IOCON->ARM_SWDIO_PIO1_3  &= ~0x07;
    LPC_IOCON->ARM_SWDIO_PIO1_3  |= 0x01;
   
    LPC_IOCON->PIO0_7  &= ~0x07;
    LPC_IOCON->PIO0_3  &= ~0x07;
    LPC_IOCON->PIO3_2  &= ~0x07; 




TFT LCD제어 드라이버 코드

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

#define LCD_LAT_BIT      BIT5
#define LCD_LAT_PORT     PORT3
#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      BIT3
#define LCD_EN_PORT      PORT0
#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      BIT7
#define LCD_RS_PORT      PORT0
#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      BIT2
#define LCD_WR_PORT      PORT3
#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)    DataOut((Data>>8));\
                                     LCD_DATA_LATCH();\
                                     DataOut(Data&0xFF);

//-----------------------------------------------------------------------------

Posted by nexp

댓글을 달아 주세요

[NXP]/LPC1k2011. 10. 19. 10:46

[LPC1111 EVM] W5200 TCP/IP 테스트

[LPC1111 EVM] W5200 TCP/IP 테스트


하드웨어 TCP/IP W5200모듈을 NET-EXP보드에서 테스트 했다.

LPC1100
Cortex-M0코어의 저렴한 LPC1113의 SPI최대 속도가 12Mhz이고 W5200 TCP전송 속도는 1.5Mbps정도 나온다.
[1] iInChip Send: 1.5744 Mbps(3966014 bytes, 19.2184 sec)
iInChip Recv: 1.5546 Mbps(3966014 bytes, 19.4632 sec)
------------------------------------------------------------
[2] iInChip Send: 1.5687 Mbps(3966014 bytes, 19.2887 sec)
iInChip Recv: 1.5694 Mbps(3966014 bytes, 19.2800 sec)
------------------------------------------------------------



LCP1100 핀맵


[NET-EVM] W5100 핀맵 회로도



LPC1113 W5200 테스트 드라이버 코드
#define _SPI0_ENABLE    1

//-----------------------------------------------------------------------------
// W5100 HAL
#define W5100_CS_PORT     PORT0
#define W5100_CS_BIT     BIT2

#define W5100_RST_PORT     PORT0
#define W5100_RST_BIT     BIT1

#define IINCHIP_RSToff()    Cbi(W5100_RST_PORT, W5100_RST_BIT) 
#define IINCHIP_RSTon()     Sbi(W5100_RST_PORT, W5100_RST_BIT)


#define W5100_IO_INIT()     GPIOSetDir( 0, 1, 1 );GPIOSetDir( 0, 2, 1 );

#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]/LPC1k2011. 8. 14. 23:57

[LPC1K EVM] Captuer 이용 IR 리모콘 테스트

[LPC1K EVM] Captuer 이용 IR 리모콘 테스트



Capture를 이용하면 펄스폭을 쉽게 측정할 수 있고 IR 리모콘 코드 분석이 가능하다. CAP32B0 입력핀인 PIO1_5에 IR 출력핀을 연결하였다.



IR포멧은 가장 많이 사용되는 NEC포멧으로 처리 할수 있도록 했다.
전체 구조는 108ms동안 시작을 알리는 리드신호와 데이터 신호를 전송한다.




좀더 자세히 보면 13ms의 리드 코드(이 길이는 제조사 마다 조금씩 차이가 있으므로 가변할 수 있도록 하면 된다.)가 시작 신호를 나타낸다. 그 뒤로 32비트의 코드가 출력된다.



데이터 비트는 펄스폭이 1.125ms이면 '0'을 2.25ms이면 '1'을 나타낸다.




실제 IR모듈의 출력은 반전된 데이터를 출력하므로 Captur입력에서 폴링일때 인터럽트가 걸리도록 해서 인식하면 된다.
void InitTimer32B0(uint32_t TimerInterval)
{
    LPC_SYSCON->SYSAHBCLKCTRL |= (1<<9);

    LPC_TMR32B0->MR0 = TimerInterval;

    LPC_IOCON->PIO1_5 &= ~0x07; /*  Timer0_32 I/O config */
    LPC_IOCON->PIO1_5 |= 0x02; /* Timer0_32 CAP0 */
    
   // Capture 0 폴링모드 인터럽트 설정
   LPC_TMR32B0->CCR = (0x1<<1)|(0x1<<2);
   
    LPC_TMR32B0->MCR = 0;   /* Interrupt and Reset on MR0 */   
    /* Enable the TIMER0 Interrupt */
    NVIC_EnableIRQ(TIMER_32_0_IRQn);
   
    //타이머 Enalbe
    LPC_TMR32B0->TCR = 1;  




모콘 테스트 동영상
리모콘 데이터가 수신되면 코드를 인식해서 LCD에 출력하는 예제




LPC1113 Capture - IR 리모콘 테스트 코드
#include "system.h"
#include "serial.h"
#include "ir_decoder.h"

extern volatile uint8_t  gIrCode, gIrCmd, gIrRead;
//-----------------------------------------------------------------------------
//Capture interrupt handler
void CT32B0_IRQHandler(void)
{
  if ( LPC_TMR32B0->IR & (0x1<<4) )
  { 
 LPC_TMR32B0->IR = 0x1<<4;
   
    //capture값을 읽어와 펄스폭 계산  
    gNewCap = LPC_TMR32B0->CR0;
    gPulseWidth = gNewCap - gOldCap;
   
    gOldCap = gNewCap; 
   
 //IR 코드 처리
 IrDecoder(gPulseWidth);
  } 
}
//-----------------------------------------------------------------------------


int main()
{
    int i = 0;
    unsigned char buf[20];
    SystemInit();

    Led1Init();
    Led1Off();
   
    Led2Init();
    Led2Off();

    U0_Init(BAUD_115200);
    LCD_Display("LPC1K IR Test\r\n");
   
    //Capture 설정   
    InitTimer32B0(SystemAHBFrequency/10000 - 1);
   
    while(1)
    {
       if(gIrRead ==1)
      {
         Led1Toggle();
            
         sprintf(buf, "A:%02X C:%02X\n", gIrCode, gIrCmd);
         LCD_Display(buf);
         gIrRead = 0;
      }       
    }
    return 0;
}



Posted by nexp

댓글을 달아 주세요

[NXP]/LPC1k2011. 8. 14. 12:42

[LPC1K EVM] Capture 테스트 - PWM 펄스폭 측정하기

[LPC1K EVM] Capture 테스트 - PWM 펄스폭 측정하기




LPC1113의 타이머는 4개의 Capture 입력을 받을 수 각각 입력에 대한 이벤트를 받을 수 있다.
테스트는 TIMER32_B1의 PWM출력을 TIMER32_B0의 CAP0입력으로 연결하여 PWM의 펄스폭을 측정하도록 했다.




Timer32B0 Capture 초기화 함수
void InitTimer32B0(uint32_t TimerInterval)
{
    LPC_SYSCON->SYSAHBCLKCTRL |= (1<<9);

    LPC_TMR32B0->MR0 = TimerInterval;

    //CAP PIN = P1_5
    LPC_IOCON->PIO1_5 &= ~0x07; /*  Timer0_32 I/O config */
    LPC_IOCON->PIO1_5 |= 0x02; /* Timer0_32 CAP0 */
   
   //Capture 0 on both edge, interrupt enable. 
   LPC_TMR32B0->CCR = (0x1<<0)|(0x1<<1)|(0x1<<2);
       
    LPC_TMR32B0->MCR = 0;   /* Interrupt and Reset on MR0 */    

    /* Enable the TIMER0 Interrupt */
    NVIC_EnableIRQ(TIMER_32_0_IRQn);
   
    //타이머 Enalbe
    LPC_TMR32B0->TCR = 1;  


Captuer0 인터럽트 핸들러
Capture입력시 마다 Capture레지스터의 값을 저장해 펄스폭을 계산할 수 있따.
//-----------------------------------------------------------------------------
//Capture0 interrupt handler
void CT32B0_IRQHandler(void)
{
  if ( LPC_TMR32B0->IR & 0x01 )
  { 
 LPC_TMR32B0->IR = 1;    
  }
 
  if ( LPC_TMR32B0->IR & (0x1<<4) )
  { 
    // clear interrupt flag
    LPC_TMR32B0->IR = 0x1<<4;   
 
    Led1Toggle();

    //capture값을 읽어와 펄스폭 계산  
    gNewCap = LPC_TMR32B0->CR0;
    gPulseWidth = gNewCap - gOldCap;
   
    gOldCap = gNewCap;    
  } 
  return;
}
//-----------------------------------------------------------------------------



LPC1113 Capture테스트 예제 소스코드
TIMER1에서 PWM출력하고 TIMER0 caputre로 펄스폭을 측정하는 예제
int main()
{
    unsigned long period=0;
    unsigned long cnt = 0;
   
    SystemInit();

    Led1Init();
    Led1Off();
   
    Led2Init();
    Led2Off();

    U0_Init(BAUD_115200);
    DebugPrint("LPC1K UART Test\r\n");
   
   
    //CAPTURE 설정   
    InitTimer32B0(SystemAHBFrequency/1000 - 1);
   
   
    //PWM 초기화
    init_timer32PWM(TIMER_1, PWM_INTERVAL, (1<<PWM_CH2));
   enablePWM(TIMER_1, 1);
   
    //주기 설정
    period = SET_PWM(PWM_INTERVAL, 50);       //   50%
    setMatch_timer32PWM (TIMER_1, PWM_CH2, period);   
   
    while(1)
    {
        switch(U0_GetByte())
        {
        case 'g':
            DebugPrint("PulseWidth= %dus\r\n", gPulseWidth/48);
            break;  
            
        case '+':
            cnt += 1;
            period = SET_PWM(PWM_INTERVAL, cnt);
           
            DebugPrint("CNT= %d, %d\r\n", cnt, period);
            setMatch_timer32PWM (TIMER_1, PWM_CH2, period);
            break;            
           
           
        case '-':
            cnt -= 1;
            period = SET_PWM(PWM_INTERVAL, cnt);
           
            DebugPrint("CNT= %d, %d\r\n", cnt, period);
            setMatch_timer32PWM (TIMER_1, PWM_CH2, period);
            break;              
        }
   
    }
 
    return 0;
}
Posted by nexp

댓글을 달아 주세요