2P by neo 3달전 | favorite | 댓글 1개

USB 장치 개발 가이드

목차

  • 배경
  • USB란 무엇인가?
  • USB 와이어
    • USB-C에 대한 주의사항
    • 차동 쌍을 통한 데이터 전송
  • PCB에서의 USB
  • USB의 다양한 속도
    • PCB에서의 속도에 대한 간단한 주의사항
  • 프로토콜 및 소프트웨어 계층
    • USB 장치 클래스와 호스트의 사용 방법
  • 시리얼 포트 장치 만들기
    • STM32 마이크로컨트롤러와 Nucleo 보드
    • 실제 USB 포트 설정
    • 소프트웨어 작성
    • 플래싱 및 실행
  • 결론

배경

  • USB 장치는 컴퓨터의 기능을 확장하는 데 유용함.
  • 이 글의 목표는 USB 장치를 처음부터 끝까지 만드는 과정을 안내하는 것임.

USB란 무엇인가?

  • USB는 데이터 교환과 전력 공급을 위한 산업 표준임.
  • USB는 직렬 버스로, 비트가 하나씩 전송됨.
  • USB는 단순한 연결 규격을 넘어 통신 프로토콜도 포함함.

USB 와이어

  • USB 2.0 연결에는 4개의 주요 와이어가 있음:
    • +5V 와이어: 호스트에서 장치로 전력을 공급함.
    • D-D+ 와이어: 차동 쌍으로 1비트를 전송함.
    • GND 와이어: 접지 역할을 함.

USB-C에 대한 주의사항

  • USB-C는 양방향으로 연결할 수 있음.
  • USB-C는 속도나 버전을 나타내지 않음.

차동 쌍을 통한 데이터 전송

  • 차동 쌍은 두 개의 와이어를 사용하여 하나의 비트를 전송함.
  • 차동 쌍은 전압 노이즈를 제거하는 데 유리함.

PCB에서의 USB

  • USB 커넥터를 PCB에 추가할 때, 차동 쌍의 길이를 동일하게 유지해야 함.
  • 차동 쌍의 트레이스는 서로 가까이 있어야 함.
  • 특정 임피던스를 유지해야 함.

USB의 다양한 속도

  • USB 2.0은 풀 스피드(12 Mbit/s)와 하이 스피드(480 Mbit/s)로 동작할 수 있음.
  • 호스트와 장치는 연결 시 속도를 협상함.

PCB에서의 속도에 대한 간단한 주의사항

  • 풀 스피드에서는 임피던스와 트레이스 길이에 대해 덜 엄격해도 됨.

프로토콜 및 소프트웨어 계층

  • USB는 네트워크처럼 동작하며, 다양한 엔드포인트와 구성을 가짐.
  • 호스트는 드라이버를 통해 USB 장치를 인식하고 사용함.

USB 장치 클래스와 호스트의 사용 방법

  • 운영체제는 다양한 USB 장치 클래스를 인식함.
  • 예를 들어, 대용량 저장 장치나 시리얼 장치 등이 있음.

시리얼 포트 장치 만들기

  • 간단한 USB 시리얼 포트 장치를 만들어 봄.
  • STM32 마이크로컨트롤러와 Nucleo 보드를 사용함.

STM32 마이크로컨트롤러와 Nucleo 보드

  • NUCLEO-F103RB 보드를 사용함.
  • 보드는 프로그래머와 마이크로컨트롤러로 구성됨.

실제 USB 포트 설정

  • USB 포트를 설정하고, 외부 5V 전원을 사용하도록 점퍼를 설정함.
  • PA12PA11 핀을 USB_DPUSB_DM으로 설정함.
  • PA12 핀에 1.5 kΩ 저항을 연결하여 풀업함.

소프트웨어 작성

  • STM32CubeIDE에서 USB 장치 모드를 설정함.
  • 시리얼 포트 장치로 설정하여 호스트가 인식하도록 함.
  • CDC_Receive_FS 루틴에서 LED를 켜는 코드를 작성함.

플래싱 및 실행

  • 코드를 빌드하고 STM32CubeProgrammer를 사용하여 보드에 플래싱함.
  • 보드를 외부 5V 전원으로 연결하고, 시리얼 포트를 통해 LED를 제어함.

결론

  • USB 시리얼 포트 장치를 처음부터 끝까지 만들어 봄.
  • STM32CubeIDE의 많은 보일러플레이트 코드와 UI 기반 설정이 불편할 수 있음.
  • Linux 기반 SoC를 사용하는 것이 더 깔끔한 접근 방식일 수 있음.

GN⁺의 의견

  • STM32CubeIDE의 보일러플레이트 코드: 많은 보일러플레이트 코드가 생성되어 코드 리뷰가 어려울 수 있음.
  • Linux 기반 접근 방식: Linux SoC를 사용하면 더 표준화된 API와 깔끔한 코드 분리가 가능함.
  • 임피던스와 트레이스 길이: 고속 USB 연결을 위해서는 임피던스와 트레이스 길이에 대한 주의가 필요함.
  • 차동 쌍의 이점: 차동 쌍은 전압 노이즈를 제거하는 데 유리하여 안정적인 데이터 전송을 가능하게 함.
  • 마이크로컨트롤러 선택: 프로젝트에 따라 적절한 마이크로컨트롤러를 선택하는 것이 중요함. STM32 외에도 다양한 옵션이 있음.
Hacker News 의견
  • ST 마이크로컨트롤러 사용에 대한 의견: USB 사용에 관한 좋은 글이지만, ST 마이크로컨트롤러에 집중되어 있음. 최근 ESP32 생태계가 더 쉬운 플러그 앤 플레이 방식을 제공함. 초보자에게는 고속 작업이 아닌 기본적인 USB 컨트롤러 IC 사용이 더 적합함.

  • USB 준수 테스트 경험: 오래전 USB 준수 테스트를 했을 때, 인러시 전류 테스트에서 문제가 많았음. 고속 디지털 설계에 집중하기 쉬우나 준수 테스트에서는 작은 부분이 중요함.

  • USB-C 관련 팁: CC 핀을 적절한 저항에 연결해야 함. USB 2.0에서는 차동 라우팅과 임피던스가 큰 문제가 아님. 비슷한 길이로 직접 연결하면 됨.

  • STM32 대안 제안: ARM 프로세서 납땜이 어렵다면, 작은 컨트롤러나 VUSB 라이브러리를 사용하는 것도 고려할 만함. Arduino 스타일 프로그래밍을 선호한다면, 많은 보드가 USB 장치로 쉽게 사용 가능함.

  • ESP32와 저렴한 해킹 방법: ESP32를 주로 사용하지만, 버려진 USB 키보드의 컨트롤 보드를 활용해 저렴하고 견고한 커스텀 컨트롤러를 만들 수 있음.

  • STM32에서 64바이트 이상 수신 지원: 64바이트 이상의 프레임을 수신하는 방법에 대한 질문. 레퍼런스 매뉴얼에 나와 있는 설정이 일반 레지스터가 아니어서 어려움이 있음.

  • 베어 메탈 USB 코드 작성 경험: MCU에서 베어 메탈 USB 코드를 작성하는 것은 SPI나 I2C보다 복잡함. 벤더 제공 소프트웨어를 최대한 활용하는 것이 좋음. 고속 전송을 위해 벌크 전송을 사용하고, 호스트 측 문제를 확인해야 함.

  • 가상 USB 장치 생성: Raspberry Pi를 사용해 가상 USB 장치를 만들어 PC에 연결. MTP 카메라를 에뮬레이트하여 소프트웨어를 속이는 데 사용 중임.

  • USB 3 지원 개발 보드 질문: USB C 모니터 싱크를 프로토타이핑하려고 하는데, DisplayPort를 수신할 수 있는 전력을 가진 보드를 찾기 어려움.

  • USB 사용 비용: USB는 무료가 아님. 벤더 ID를 얻기 위해 $6,000의 일회성 비용을 지불해야 함.