IT 악세서리
[번역] WCH CH341 USB에서 직렬 칩으로 Linux를 사용하여 USB를 통해 GPIO를 제어
뮤리찌
2018. 2. 19. 15:08
WCH CH341 USB에서 직렬 칩으로 Linux를 사용하여 USB를 통해 GPIO를 제어
USB- 직렬 칩은 종종 타겟 보드에서 직접 또는 전용 디버그 보드를 통해 디버그 인터페이스로 사용됩니다. 그러나 일부 모델에는 여분의 핀이 노출되어 있으며 그 중 하나는 WCH CH341 이며 I2C 및 SPI 인터페이스와 최대 8 개의 GPIO가 포함되어 있습니다.
그러나 여분의 핀을위한 소프트웨어 지원은 현재 리눅스 메인 라인에있는 드라이버에 내장되어 있지 않으며 관련 핀을 분해하는 보드를 찾아야합니다. Aliexpress 에서 10 달러에 판매되는 "CH341A ALL USB 1 / SPI / I2C / IIC / UART / TTL / ISP 직렬 어댑터"보드 와 Zoobab이 성공적으로 6을 제어 하는 데 사용 했던 것 (8 가지 중 8 가지)이 있습니다. ) USB를 통한 GPIO.

이 보드에는 컴퓨터에 연결하기위한 USB 보드, I2C, UART, SPI, 일부 LED 및 I2C / SPI 또는 UART 모드 및 전압 (5V / 3.3V)을 선택하는 점퍼 헤더가 함께 제공됩니다.
보드가 Linux에서 I2C / SPI 또는 UART 모드를 사용하는지 여부에 따라 다르게 인식됩니다.
| $ lsusb Bus 002 Device 003: ID 1a86:5512 QinHeng Electronics CH341 in EPP/MEM/I2C mode, EPP/I2C adapter $ dmesg [ 1739.299811] usb 2-1.2: new full-speed USB device number 3 using ehci-pci [ 1739.385559] usb 2-1.2: New USB device found, idVendor=1a86, idProduct=5512 [ 1739.385565] usb 2-1.2: New USB device strings: Mfr=0, Product=0, SerialNumber=0 |
| $ lsusb Bus 002 Device 004: ID 1a86:5523 QinHeng Electronics CH341 in serial mode, usb to serial port converter $ dmesg [ 1982.227595] usb 2-1.2: new full-speed USB device number 5 using ehci-pci [ 1982.313544] usb 2-1.2: New USB device found, idVendor=1a86, idProduct=5523 [ 1982.313550] usb 2-1.2: New USB device strings: Mfr=0, Product=0, SerialNumber=0 [ 1982.314088] ch341 2-1.2:1.0: ch341-uart converter detected [ 1982.315989] usb 2-1.2: ch341-uart converter now attached to ttyUSB0 |
그러나 8 개의 GPIO를 공개하고 USB / I2C를 통해 제어하려면 tree 외의 i2c-ch341-usb 드라이버 가 필요합니다 . 그는 소스 코드에있는 핀 중 6 개를 출력하라는 지시를 내렸다. (어떤 이유에서든 6-7은 출력으로 설정 될 수 없었다) :
| struct ch341_pin_config ch341_board_config[CH341_GPIO_NUM_PINS] = { // pin GPIO mode GPIO name hwirq { 15, CH341_PIN_MODE_OUT , "gpio0" , 0 }, // used as output { 16, CH341_PIN_MODE_OUT , "gpio1" , 0 }, // used as output { 17, CH341_PIN_MODE_OUT , "gpio2" , 0 }, // used as output { 18, CH341_PIN_MODE_OUT , "gpio3" , 0 }, // used as output { 19, CH341_PIN_MODE_OUT , "gpio4" , 1 }, // used as output with hardware IRQ { 20, CH341_PIN_MODE_OUT , "gpio5" , 0 }, // used as ouput { 21, CH341_PIN_MODE_IN , "gpio6" , 0 }, // used as input { 22, CH341_PIN_MODE_IN , "gpio7" , 0 } // used as input }; |
모듈을 빌드 한 후 모듈을로드하십시오.
| make sudo make install sudo modprobe i2c-ch341-usb |
gpio0에서 gpio5는 / sys / class / gpio에 있어야합니다. 즉, 일반적인 sysfs 명령으로 제어 할 수 있습니다.
| echo 0 > /sys/class/gpio/gpio1/value echo 1 > /sys/class/gpio/gpio1/value |
또한 셸 스크립트로 핀을 벤치마킹하여 연결된 LED를 켜거나 끄고 약 2.2KHz로 관리했습니다. I2C 버스 속도 (기본적으로 100kHz)를 변경하거나 C 코드를 사용하여 조금 더 빨라질 수 있습니다. 또는 같은 개발자 (gschorcht)의 spi-ch341-usb 드라이버 를 사용하면 문서화 된 "느린 SPI"에도 불구하고 약간 속도가 빨라질 수 있습니다.
6 개의 LED가 보드에 연결된 또 다른 쉘 스크립트는 아래에 설명되어 있습니다.

어쨌든 그 좋은 소식은 USB를 가진 리눅스 보드에 GPIO를 비교적 쉽고 싸게 추가 할 수 있다는 것입니다. 그러나 만약 당신이 그 옵션에 10 달러를 쓰지 않는다면 CH341 USB 프로그래머 가 Electrodragon에서 $ 2.30 + 선적을하거나 CJMCU-341 보드 를 Aliexpress 나 eBay 에서 선적을 포함하여 약 $ 5에 판매 하는 등 더 저렴한 옵션이 있습니다 .
https://www.cnx-software.com/2018/02/16/wch-ch341-usb-to-serial-chip-gets-linux-driver-to-control-gpios-over-usb/