[MSP430]/MSP430F5x2011. 11. 27. 23:00

[MSP430F5510 EVM] USB Keyboard 테스트

[MSP430F5510 EVM] USB Keyboard 테스트


MP430F5510은 저렴하고 저전력인 MSP430코어이다.  USB기능이 있고 소형(48Pin QFN)이기 때문에 밧데리로 구동하는 간단한 HID장치나 USB Keyboard, USB Mouse 장치를 만들기에 좋다.

[MSP430F5510 EVM] 보드를 이용하여 USB Keyboard 테스트해 보았다. 소스코드도 기존 예제에 쉽게 포팅 할 수 있도록 수정해서 정리 해 보았다.





[MSP430F5510 EVM]  USB Keyboard 테스트 동영상
USB Keynoard 테스를 위해 간단히 Up, Down, Left, Right Key를 에뮬레이션 하여 뷰어 할때 편리한 USB 장치를 만들어 보았다.





MSP430F5510 USB Keyboard 테스트 예제 소스코드
void main(void)
{
    //UART 초기화
 DebugInit(BAUD_115200);
 DebugPrint("MSP430F5510 USB Test\r");
   
    //MSP430 USB초기화
    Msp430UsbInit();

    Led1Init();
    Led1On();
   
    //Key 초기화
    INIT_KEY_IO();
   
 // Enable interrupts
    enable();

   //USB가 연결되어 있으면 이벤트 발생하여 재연결
    if (USB_connectionInfo() & kUSB_vbusPresent)USB_handleVbusOnEvent();
    
  
   while(1)
  {
     //USB 처리
     ProcessUSB();
  }
}



USB 처리 함수
void ProcessUSB(void)
{
     switch(USB_connectionState())
      {
         case (ST_USB_DISCONNECTED | ST_NOENUM_SUSPENDED):
               __bis_SR_register(LPM3_bits + GIE);  // Enter LPM3 w/interrupt.  Nothing for us to do while disconnected. 
               break;
             
         case ST_USB_CONNECTED_NO_ENUM:
              break;
             
         case ST_ENUM_ACTIVE:
          
              __bis_SR_register(LPM0_bits + GIE);     // Enter LPM0 w/interrupt, until a keypress occurs
             //Key처리 
             PorcessKeyboad();        
              }
              break; 
             
         case ST_ENUM_SUSPENDED:
              __bis_SR_register(LPM3_bits + GIE);  // Enter LPM3 w/interrupt.  Nothing for us to do while 
              break;                                // suspended.  (Remote wakeup isn't enabled in this example.)
             
         case ST_ENUM_IN_PROGRESS:
              break;
             
         case ST_ERROR:
              break;
             
         default:;
      }
}



Keyboard 인터럽트 처리 핸들러
#pragma vector=PORT1_VECTOR
__interrupt void Port1_ISR(void)
{
    WORD i;
    unsigned char key_val = 0;
 
    if(P1IFG)
    {
        key_val = ~P1IN;
        Delay(30);   // Cheap debounce. 

        report[0] = 0;
        report[1] = 0;       
        switch(key_val)
        {
        case 1:
            report[2] = usbUsageLeftArrow;
            break;
           
        case 2:
            report[2] = usbUsageRightArrow;
            break;
           
        case 4:
            report[2] = usbUsageUpArrow;
            break;
           
        case 8:
            report[2] = usbUsageDownArrow;
            break;   
           
        case 0x10:
            report[2] = usbUsageA;
            break; 

        case 0x20:
            report[2] = usbUsageB;
            break;
           
        case 0x40:
            report[2] = usbUsageN;
            report[3] = usbUsageE;
            report[4] = usbUsageX;           
            report[5] = usbUsageP;           
            report[6] = usbUsageEnter;
            break; 

        case 0x80:
            report[2] = usbUsageEnter;
            break;             
           
        }
       
        buttonPressed = TRUE;
        __bic_SR_register_on_exit(LPM3_bits);  // Wake main from LPMx       
        P1IFG = 0;
    } 
}
Posted by nexp

댓글을 달아 주세요