GN⁺: USB 기기 만들기 – 당신의 첫 번째 가젯 제작을 위한 종합 가이드
(popovicu.com)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 전원을 사용하도록 점퍼를 설정함.
-
PA12
와PA11
핀을USB_DP
와USB_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의 일회성 비용을 지불해야 함.