# USB 기기 만들기 – 당신의 첫 번째 가젯 제작을 위한 종합 가이드

> Clean Markdown view of GeekNews topic #15166. Use the original source for factual precision when an external source URL is present.

## Metadata

- GeekNews HTML: [https://news.hada.io/topic?id=15166](https://news.hada.io/topic?id=15166)
- GeekNews Markdown: [https://news.hada.io/topic/15166.md](https://news.hada.io/topic/15166.md)
- Type: GN+
- Author: [neo](https://news.hada.io/@neo)
- Published: 2024-06-04T10:47:22+09:00
- Updated: 2024-06-04T10:47:22+09:00
- Original source: [popovicu.com](https://popovicu.com/posts/making-usb-devices/)
- Points: 2
- Comments: 1

## Topic Body

### 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 외에도 다양한 옵션이 있음.

## Comments



### Comment 25914

- Author: neo
- Created: 2024-06-04T10:47:22+09:00
- Points: 1

###### [Hacker News 의견](https://news.ycombinator.com/item?id=40560300) 
- **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의 일회성 비용을 지불해야 함.
