[INTERFACE]/USB2011. 1. 28. 16:30

USB Bulk전송과 HID전송의 속도 차이

USB Bulk전송과 HID전송의 속도 차이

USB Bulk와 HID속도가 1트랜잭션 전송시 2ms로 동일하게 나온다. 
노트북(2.2GHz  P8400) 에서 테스트 했는데 뭔가 좀 이상해서 테스크탑에서 테스트 해보았다.



3.4Ghz i7-270 에서 테스트 하니 속도차이가 확실하게 나타난다.
USB Bulk 전송시 1트랜잭션(64Byte)전송시 250us정도 걸린다.
HID 전송시 1트랜잭션 (63Byte) 전송시 1ms 정도 걸린다.

4배정도 차이가 난다. 아무래도 내부 dll 거치면서 속도가 느려지는것 같다.
Posted by nexp

댓글을 달아 주세요

[AVR]/AT90USB2010. 9. 12. 13:51

[AT90USB162 EVM] HID Mouse 만들기

[AT90USB162 EVM] HID Mouse 만들기


AT90USB162는 AVR코어에 USB기능이 있는 칩이다. 저렴하게 그리고 기존 AVR코드를 활용해서 USB기능을 추가하여 제작할 경우 유용하게 사용될수 있다.

Atmel사에서 제공하는 예제를 이용하여 HID Mouse를 간단히 만들어 보았다.
우선 마우스의 구동을 위해 스위치가 있는 확장보드를 이용해 하드웨어를 구성한다.  각 키에 따라 UP(PB0), Down(PB1), Left(PC5), Right(PB6)를 점퍼 이용하여 설정.



그리고 보드 자체의 LED와 스위치를 이용해 마우스 클릭 버턴 Click(PD1) 을 구현한다.


AT90USB162 HID Mouse 소스코드
(소스코드)

gcc를 이용한 AVRStudio를 이용하여 컴파일 가능하다.
stk526.h 파일의 마우스 이동을 설정하는 키 및 LED 정의를 [AT90USB162 EVM] 하드웨어에 맞게 설정한다.
//Key define
#define   Joy_init()                Cbi(DDRC, BIT5|BIT6);Cbi(DDRB, BIT0|BIT1);Sbi(PORTC, BIT5|BIT6);Sbi(PORTB, BIT0|BIT1);
#define   Push_button_init()        Joy_init()

#define   Is_joy_left()             (((PINC&BIT5) == 0) ? TRUE : FALSE)   
#define   Is_joy_not_left()         (((PINC&BIT5) == 0) ? FALSE : TRUE)
#define   Is_button_left()          Is_joy_left()
#define   Is_button_not_left()      Is_joy_not_left()

#define   Is_joy_middle()           FALSE
#define   Is_joy_not_middle()       TRUE
#define   Is_joy_select()           Is_joy_middle()
#define   Is_joy_not_select()       Is_joy_not_middle()
#define   Is_button_middle()        Is_joy_middle()
#define   Is_button_not_middle()    Is_joy_not_middle()

#define   Is_joy_right()            (((PINC&BIT6) == 0) ? TRUE : FALSE)
#define   Is_joy_not_right()        (((PINC&BIT6) == 0) ? FALSE : TRUE)
#define   Is_button_right()         Is_joy_right()
#define   Is_button_not_right()     Is_joy_not_right()

#define   Is_joy_down()             (((PINB&BIT1) == 0) ? TRUE : FALSE)
#define   Is_joy_not_down()         (((PINB&BIT1) == 0) ? FALSE : TRUE)
#define   Is_button_down()          Is_joy_down()
#define   Is_button_not_down()      Is_joy_not_down()

#define   Is_joy_up()               (((PINB&BIT0) == 0) ? TRUE : FALSE)
#define   Is_joy_not_up()           (((PINB&BIT0) == 0) ? FALSE : TRUE)
#define   Is_button_up()            Is_joy_up()
#define   Is_button_not_up()        Is_joy_not_up()

#define   Hwb_button_init()         Cbi(DDRD, BIT1);Sbi(PORTD, BIT1)
#define   Is_hwb()                  (((PIND&BIT1) == 0) ? TRUE : FALSE)


마우스 인식후 실제 마우스 동작에 따른 이벤트 처리는  is_usb_mouse_event()함수에서 설정하면 되고 이 예제에서는 마우스 클릭에 따라 LED가 On/Off되도록 수정했다. is_usb_mouse_event()함수는 main에서 10ms 주기로 수행된다. 물론 실행 주기의 변경도 가능하다.
bit is_usb_mouse_event(void)
{
   bit usb_mouse_event_stored;
   Usb_mouse_report_reset();

   if(Is_device_enumerated())
   {
  //마우스 버턴에 따라 LED표시
  if(Is_mouse_click_left_event())Led1On();
  else Led1Off();
  
  if(Is_mouse_up_event())Led2On();
  else Led2Off();  

//마우스 이동 및 버턴에 따를 처리
  if(Is_mouse_click_left_event())
  {
   Usb_mouse_click_left();
   usb_mouse_event_stored = 1;
  }

  if(Is_mouse_release_left_event())
  {
   Usb_mouse_release_left();
   usb_mouse_event_stored = 1;
  }

  if (Is_mouse_up_event())
  {
   Usb_mouse_up();
   usb_mouse_event_stored = 1;
  } 

  if (Is_mouse_left_event())
  {
   Usb_mouse_left();
   usb_mouse_event_stored = 1;
  }

  if (Is_mouse_right_event())
  {
   Usb_mouse_right();
   usb_mouse_event_stored = 1;
  }

  if (Is_mouse_down_event())
  {
   Usb_mouse_down();
   usb_mouse_event_stored = 1;

:
}


AT90USB162 HID Mouse 테스트 동영상
Posted by nexp

댓글을 달아 주세요

  1. 비밀댓글입니다

    2010.09.30 14:44 [ ADDR : EDIT/ DEL : REPLY ]
  2. 킹보스

    관리자의 승인을 기다리고 있는 댓글입니다

    2011.04.03 20:06 [ ADDR : EDIT/ DEL : REPLY ]
  3. breeze

    관리자의 승인을 기다리고 있는 댓글입니다

    2011.05.17 18:04 [ ADDR : EDIT/ DEL : REPLY ]

[MSP430]/MSP430F5x2009. 11. 24. 10:25

MSP430F55xx USB 출시

MSP430F55xx USB 출시
MSP430코어에 USB기능이 추가된 MSP430F5521 이 출시되었다.


저전력 기능에 USB기능까지 포함되어 상당히 기대를 했는데... 너무 늦게 출시되지 않았나 하는 생각이 든다.
요즘에 USB포함되고도 워낙 저렴한 MCU들이 많이 출시되므로 별로 반응이 없는것 같다. 단적으로 STM32의 경우 Cortex-M3 코어에 USB기능을 넣고도 2.5$이면 가능한데 MSP430F55xx는 4$대 이다. 물론 48핀의 저렴한 패키지가 출시 예정이라고 하지만 기능상 미흡한점이 많다.
하지만 저전력을 요하고 PC와 연결되어야 하는 핸드 핼드 제품에는 충분히 가치가 있지 않을까...

MSP430F5x 블럭도




MSP430F5x 핀맵

또한가지 아쉬운점은 기존 핀맵과의 호환이 안된다. 좀만 시경쓰면 좋았을텐데....
대부분 기존 라인에 USB기능을 추가 싶어 하는데 핀맵이 달라지면...


Posted by nexp

댓글을 달아 주세요

[TI]/LuminaryMicro2009. 10. 24. 12:02

[LM3S3748 EVM] LuminaryMicro Cortex-M3 USB 테스트

[LM3S3748 EVM] LuminaryMicro Cortex-M3 USB 테스트



USB OTG기능이 있는 Luminary Micro사의 Cortex-M3 LM3S3748 의 USB기능을 테스트 했다.


PC Host 테스트 프로그램
Visual Studio 2008을 이용하여 데이터 송수신을 테스트 할 수 있는 예제를 작성하였다.



테스트 동영상



[LM3S3748 EVM] USB Host Module




LM3S3748 USB회로 구성시 주의 사항
USB블럭으로 인가되는 전원 포트가 PB1과 공유하도록 되어 있다.
자세하게 보지 않으면 실수 할 수 있는데... PB1/USB0VBUS 핀을 USB전원으로 연결해야 한다.
연결되지 않으면 USB동작을 하지 하지 않는다.
메뉴얼에 블록도로 좀 자세하게 나와 있으면 좋을것 같은데... 아쉬운 부분이다.
Posted by nexp

댓글을 달아 주세요

  1. 비밀댓글입니다

    2010.06.21 03:46 [ ADDR : EDIT/ DEL : REPLY ]

[INTERFACE]/USB2009. 10. 22. 19:30

[STM32] USB 전송속도 테스트

USB 전송 속도 테스트

2009-10-23 19:44:20 금요일
HID방식 데이터 전송 속도 테스트
STM32 USB를 이용하여 HID 데이터 전송 속도 테스트 진행하였다.
64byte 벌크 전송으로 1000개의 버퍼를 보내도록 하고 시작 시간과 종료시간을 측정한 결과 2초가 걸렸다.
초당 전송속도 = (64 x 1000)/2 = 32KByte/s


USB 스펙상 11Mbps =  1.375Mbyte/s 인데...
물론 실제로 USB Bulk 데이터 전송을 위해 3번의 트랜젝션이 필요하므로 하므로 실제 458Kbye/s가 최대 속도가 될테고 PC단 드라이버에서 처리 때문에 반정도 줄어 들어 250Kbyte이상 힘들긴하다. 그래도 7배 이상 차이가 난다.

PC에서 보낼때 for문 돌면서 다른 프로그램에 의해 우선순위가 낮아져 전송 명령 자체가 지연되지 않을까... 그래서 Thread로 전송해 보면 어떨까?
테스트 해보니 Thread를 사용해도 똑같다.
원래 HID속도가 이정도 인가?

1번의 트랜젝션이 이뤄지는데 걸리는 시간을 측정해 보니 2ms걸린다.





STM32에서 HID로 USB전송 속도 테스트를 했다.

64바이트 보내는는데 걸리는 시간을 알아보기 위해 USB엔드포인트 실행 함수 EP1_OUT_Callback() 의 수행 시간을 측정해 보니 6.8us가 걸린다.

혹시나 해서 인터럽트 처리시간을 측정해 보았다.
인터럽트 걸릴때 CTR_LP()함수가 수행 되므로 시간을 측정해 보니 9usw정도가 걸린다.

하지만 연속 전송을 해 보니 아주 느려진다.
두번의 트랜잭션을 일으킬때 2ms시간이 걸린다.

결국 64바이트 전송하는데 걸리는 시간은 2ms로 보면 된다. 1초에 32Kbyte정도 전송할 수 있다고 보면 될것 같다.

USB스펙상 1ms로 보내려면 벌크전송 방식을 써야 하는건가? 너무 느린데...


192kByte이미지를 보내는데 약 3.9초가 걸린다. 초당 50kByte정도 보낸다는 소리인데...
실제로 코드상에서 한번에 54Byte씩 데이터를 실어서 보낸다


->코드 옵티마이즈 하고 스크립트 수정하니 1번 트랜젝션에 1ms 걸린다.
STM32의 USB 관련 코드를 좀더 옵티마이즈 해서 TFT LCD 출력 속도를 높혀 보았다.



Posted by nexp

댓글을 달아 주세요