264浏览
查看: 264|回复: 1

基于 Ch554 实现 USB 转USB 设备

[复制链接]
最近设计了一个USB USB 设备,它带有一个USB公头和一个USB母头,可以读取一个USB 设备发出来的数据,然后转换为另外的数据。
首先是硬件设计,使用了2 CH554e芯片,这个芯片能够实现 USB HostDevice,二者通过串口进行通讯。这款芯片是南京WCH出品的,最高支持 24Mhz主频内置,16K程序存储器ROM256字节内部iRAM以及1K字节片内xRAMCh554e 是最小的封装形式,MOP10方便焊接。
硬件设计比较简单,25V供电的Ch554的最小系统,中间通过串口连接。
基于 Ch554 实现 USB 转USB 设备图1
PCB 设计如下:
基于 Ch554 实现 USB 转USB 设备图2
这样的设计刚好能够放入淘宝购买的透明外壳中。

两个 Ch554分别写入不同的固件。其中USB母头连接Ch554的需要写入 Keil编译的代码,用于实现 USB Host 功能。解析后的HID 数据会按照 Ch9350 格式通过串口输出,有兴趣的朋友可以在【参考1】看到实现。
USB 公头连接的Ch554代码使用 Arduino 进行编译。实现的功能是检测通过串口获得数据是否包含 wasd 这几个按键,如果有的话就转为对应的鼠标移动操作:
  1. #ifndef USER_USB_RAM
  2. //#error "This example needs to be compiled with a USER USB setting"
  3. #endif
  4. #include "src/userUsbHidKeyboardMouse/USBHIDKeyboardMouse.h"
  5. #define DEBUGMODE 0
  6. void setup() {
  7.   // 串口通讯
  8.   Serial1_begin(500000);
  9.   USBInit();
  10.   pinMode(14, OUTPUT);
  11.   digitalWrite(14, LOW);
  12. }
  13. boolean FindKey(byte s, byte *p, byte len) {
  14.   for (byte i = 0; i < len; i++) {
  15.     if (p[i] == s) {
  16.       return true;
  17.     }
  18.   }
  19.   return false;
  20. }
  21. void loop() {
  22.   //根据 CH9350 Spec 每次最多输出 72Bytes
  23.   byte Data[72];
  24.   byte CounterLast = Serial1_available();
  25.   byte CounterCurrent = 0;
  26.   // 如果当前串口有数据
  27.   if (CounterLast != 0) {
  28.     // 进行简单测试,如果当前还在传输数据那么持续接收
  29.     while (CounterCurrent != CounterLast) {
  30.       CounterLast = Serial1_available();
  31.       delayMicroseconds(500);
  32.       CounterCurrent = Serial1_available();
  33.     }
  34.   }
  35.   if (CounterCurrent > 0) {
  36.     // 一次性将数据收取下来
  37.     //Serial1_readBytes(Data, CounterCurrent);
  38.     for (byte i = 0; i < CounterCurrent; i++) {
  39.       Data[i] = Serial1_read();
  40.       //  USBSerial_print_ub(Data[i], 16);
  41.     }
  42.     unsigned int i = 0;
  43.     unsigned int Length;
  44.     while (i < CounterCurrent) {
  45.       // 识别帧头
  46.       if ((Data[i] == 0x57) && (Data[i + 1] == 0xAB)) {
  47.         // 有效键值帧
  48.         if (Data[i + 2] == 0x88) {
  49.           // 获得数据长度
  50.           Length = Data[i + 3];
  51.           //如果是键盘
  52.           if (Data[i + 4] == 0x10) {
  53.             digitalWrite(14, HIGH);
  54.             if (DEBUGMODE) {
  55.               for (int j = 3; j < Length - 2; j++) {
  56.                 USBSerial_print_ub(Data[i + 3  + j], 16);
  57.               }
  58.               USBSerial_println_only();
  59.             }
  60.             if (FindKey(0x1A, Data, Length) == true) { // 'w'
  61.               Mouse_move(0, -100);
  62.             }
  63.             if (FindKey(0x16, Data, Length) == true) { // 's'
  64.               Mouse_move(0, 100);
  65.             }
  66.             if (FindKey(0x04, Data, Length) == true) { // 'a'
  67.               Mouse_move(-100,0);
  68.             }
  69.             if (FindKey(0x07, Data, Length) == true) { // 'd'
  70.               Mouse_move(100,0);
  71.             }
  72.             digitalWrite(14, LOW);
  73.           } //if (Data[i + 4] == 0x10) {
  74.         }
  75.         i = i + 3 + Length;
  76.       }
  77.       i++;
  78.     } // while (i < Counter)
  79.   }
  80. }
复制代码

通过串口烧录,短接DL1 或者  DL2 接口,插入Windows主机后,设备管理器中会出现新的设备,然后使用wchispstudio 即可烧写。对于USBHost 对应的Ch554需要一个 USB 公头转公头来实现转为USB公头然后进行烧写。

基于 Ch554 实现 USB 转USB 设备图3

参考:

工作的测试视频在:














zoologist  高级技匠
 楼主|

发表于 2024-7-26 09:24:09

本文提到的 USB Host 和 Device 代码在这里

Ch554USBKBHost500K.zip

303.33 KB, 下载次数: 271

KB2MS.zip

11.61 KB, 下载次数: 229

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail