CH32V208 USB 转蓝牙键盘装置

2022-12-181.1万
精华项目
AI 快速预览详细 收起
这个项目基于CH32V208WBU6微控制器,实现了USB键盘到蓝牙键盘的转换。硬件部分包括QFN68X8封装的CH32V208WBU6、天线设计、外部晶振校准等。软件部分结合了官方提供的示例代码,实现了USB Host与键盘通讯,并通过BLE蓝牙发送按键数据。该项目提供了详细的电路设计和代码实现,适合DIY爱好者和开发者。
CH32V208系列是一款32位RISC-V设计的无线型微控制器。它的外部接口非常丰富,片上集成2Mbps低功耗蓝牙BLE 通讯模块、USB2.0全速设备+主机/设备接口。这次的作品就是基于蓝牙BLE和USB 主机功能实现的。

简单的说这个作品的原理是通过 USB Host 和键盘进行通讯,取得按键之后再通过BLE蓝牙发送出去。
作品设计是围绕 CH32V208进行的,目前公开的型号有如下几种,这次使用的是CH32V208WBU6,它是QFN68X8封装的,这个对于手工焊接稍微有难度,如果有可能最好使用加热焊台配合焊锡膏进行。选择这种封装的唯一原因是目前市场上还没有其他封装。
  
订货型号
  
封装形式
塑体宽度
引脚间距
封装说明
出货料盘
CH32V208GBU6  
QFN28X4  
4*4mm  
0.4mm  
方形无引线 28 脚
托盘
CH32V208CBU6  
QFN48X5  
5*5mm  
0.35mm  
方形无引线 48 脚
托盘
CH32V208RBT6  
LQFP64M  
10*10mm  
0.5mm  
LQFP64M(10*10)贴片
托盘
CH32V208WBU6  
QFN68X8  
8*8mm  
0.4mm  
方形无引线 68 脚
托盘
完整电路图如下:
CH32V208  USB 转蓝牙键盘装置图1
需要特别注意的有下面几点:
1.E1 是一个天线,我是根据WCH官方提供的 LIB 导入到立创EDA完成的其中L1C16C17 的电容是来自官方评估板电路图,我并不知道为什么这样选择,也不知道是否需要进行调整;
CH32V208  USB 转蓝牙键盘装置图2
2.和评估板相比,没有设计 OSC32IN/OUT 这一组晶振,它只在使用 BLE Client的时候才会用到,这次的设备是作为BLE Server 的,因此不需要。外部使用了32Mhz的晶振,CH32V208内部带有可以设定的匹配电容,所以外部不需要。晶振是YXC(扬兴晶振)X503232MSB2GI,从立创商城购买。
CH32V208  USB 转蓝牙键盘装置图3
3.芯片工作电压为3.3V,沿用了多次使用的TLV1117芯片
CH32V208  USB 转蓝牙键盘装置图4
4.板子带有一个USB母头和一个USB公头,前者用于连接USB键盘,后者用于取电
CH32V208  USB 转蓝牙键盘装置图5
5.下面是一个负载消耗电流的设计。很多充电宝在小电流输出一段时间之后会自动切断输出,因此使用PA3GPIO控制每隔一段时间拉一个大电流出来,这样能够维持充电宝的输出。
CH32V208  USB 转蓝牙键盘装置图6
6.预留了下载按钮,这样可以方便烧写程序
CH32V208  USB 转蓝牙键盘装置图7
7.最后是预留的调试接口,串口输出:
CH32V208  USB 转蓝牙键盘装置图8
天线的设计来自WCH官方提供的参考库,对应的 PCB 厚度为 1.6mm
CH32V208  USB 转蓝牙键盘装置图9
PCB 设计如下:
CH32V208  USB 转蓝牙键盘装置图10
硬件介绍完毕,下面讲一下代码设计。官方提供了丰富的示例代码(比 CH567 多很多)。对于我们来说相当于将下面这两个示例代码合并在一起:
1.     BLE 蓝牙键盘的示例代码,位于 CH32V20xEVT\EVT\EXAM\BLE\HID_Keyboard。这个代码的功能是:模拟键盘设备,连接主机后定时上传键值;
2.     USB Host 连接USB键盘的代码,位于CH32V20xEVT\EVT\EXAM\USB\USBFS\HOST_KM。这个代码的功能是主机操作键鼠,获取键鼠上传的端点的数据并打印,支持U口下1级hub;
针对这次的设计有如下修改:
1. hidkbd_main.c使用1M作为串口调试波特率,在速度较低的情况下,发送调试信息可能会导致USB方面的问题,所以这里使用比较高的波特率(我是用 CH343 制作USB串口调试器)避免调试代码干扰运行
  1. #ifdef DEBUG
  2.     USART_Printf_Init( 1000000 );
  3. #endif
复制代码

3.     使用 PA3 来控制三极管,进行电流消耗。在hidkbd_main.c中定义了一个变量Elsp进行计时
  1. // 计时器用来每隔一段时间拉电流保证充电宝可以正常供电
  2. volatile uint32_t Elsp=0;
复制代码

app_km.c 文件中,有一个函数void TIM3_IRQHandler( ) 用于处理USB HID 的间隔事件,同样的,我们在其中更新Elsp,具体可以看 TIM3 的初始化相关代码,这个函数每隔9ms触发一次,我们在其中对Elsp进行自增。
Main_Circulation()函数中我们检查这个计时变量当10秒左右的时候拉一次PA3控制三极管输出大电流。
void Main_Circulation(void)
  1. {
  2.     while(1)
  3.     {
  4.         USBH_MainDeal( );
  5.         TMOS_SystemProcess();
  6.         // 计时10秒左右拉高GPIO, 实现电流输出
  7.         if (Elsp>10000) {
  8.             DUG_PRINTF( "Set to High\r\n" );
  9.             POWERON();
  10.         }
  11.         if (Elsp>10100) {
  12.             DUG_PRINTF( "Set to Low\r\n" );
  13.             POWEROFF();
  14.             Elsp=0;
  15.         }
  16.     }
  17. }
复制代码

4.     获得键盘数据的代码在 app_km.c 文件中的voidUSBH_MainDeal( void )函数。取得之后,通过HidDev_Report()函数即可从BLE蓝牙发送出去。
  1.                          //LABZDebug_Start
  2.                             // HID keyboard input report length
  3.                             #define HID_KEYBOARD_IN_RPT_LEN           8
  4.                             #define HID_RPT_ID_KEY_IN                 0
  5.                             #define HID_REPORT_TYPE_INPUT             1
  6.                             uint8_t buf[HID_KEYBOARD_IN_RPT_LEN];
  7.                             static uint8_t LastBuf[HID_KEYBOARD_IN_RPT_LEN];
  8.                             DUG_PRINTF( "LastBuf:" );
  9.                             for( i = 0; i < len; i++ )
  10.                               {
  11.                                  DUG_PRINTF( "%02x ", Com_Buf[ i ] );
  12.                               }
  13.                             DUG_PRINTF( "\r\n" );
  14.                             //if (memcmp(buf,LastBuf,HID_KEYBOARD_IN_RPT_LEN)!=0) { // False == 0
  15.                             //    memcpy(LastBuf,buf,HID_KEYBOARD_IN_RPT_LEN);
  16.                                 HidDev_Report(HID_RPT_ID_KEY_IN, HID_REPORT_TYPE_INPUT,
  17.                                               HID_KEYBOARD_IN_RPT_LEN, Com_Buf);
  18.                                 DUG_PRINTF( "SendData");
  19.                             //}
  20.                          //LABZDebug_End
复制代码

3.4.13 外部晶振校准控制寄存器(HSE_CAL_CTRL)
偏移地址:0x00
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16
  
HSEC[3:0]  
  
HSE
  FAULT
Reser
  ved
HSEITRIM
  [1:0]
Reserved
1514 13 12 11 10 9 8 7 6 5 4 3 2 1 0
Reserved
  
  
名称
访问
描述
复位值

[31:28]  
HSEC[3:0]  
RW
HSE  内置匹配电容调节位:
  111:22pF
  110:20pF
  101:18pF
  
100:16pF
  011:14pF
  010:12pF
  001:10pF
  000:8pF
000b\


27  
HSEFAULT  
RW
HSE  失效检测禁用控制位:
  1:忽略模拟输入的 HSE 失效检测信号
  0:使用模拟输入的 HSE 失效检测信号
0
26  
Reserved  
RO  
保留。
0
[25:24]  
HSEITRIM[1:0]  
RW  
HSE  起振电流调节位。
01b
[23:0]  
Reserved  
RO  
保留。
0
上面就是基于CH32V208USB键盘转BLE蓝牙的设计,本次设计使用立创EDA设计,硬件和软件都是完全开源的有兴趣的朋友可以尝试制作自己的专属设备。

1.jpg (92.71 KB, 下载次数: 4808)

CH32V208WBU6 · USB 转蓝牙键盘装置_image_3.webp

创作许可协议

本项目采用 None(不开放任何权利,保留所有权利) 进行许可。

评论(7)
fe
fe
你好,我后面给你发的邮件你看了吗?就是需要多清除几次项目,还是清除了也没有作用,一样提示缺文件和目录?
我想5.1再学习研究研究的,现在卡在这里过不去了,不知道哪里出错。希望得到你的帮助。
zoologist
zoologist
作者
回复fe
不好意思,编译器的问题我也不清楚的。
要不你直接去官方询问一下?
fe
fe
我觉的不是板子的问题,我下载你的源码编译出来的刷进入没问题,我自己建的工程编译出来的就不行,嵌入式我只是业余,准确的说是看到你这帖子我才触发兴趣的,所以我现在连问题出在哪都搞不清楚,感觉的是设置出问题了??
我用vs的,觉得vs没这么多的设置,eclipse没用过,更不敢大言不惭的说编译器有关
我用的MounRiver Studio Version: v1.84 生成的项目,目录结构。
我发我的工程文件源码给你,能不能帮我看看?怎么发你?
zoologist
zoologist
作者
回复fe
发我邮箱吧 [email]2925059@qq.com[/email]
fe
fe
首先,非常感谢楼主的源码,没想到楼主还在活跃中,回复如此及时。
我真是败了,我把源码下载直接编译,烧录能用。
照抄楼主代码自己建项目,然后编译也显示成功同时没有任何报错信息,但烧录进去连蓝牙都发现不了。生成的hex文件比楼主的略大。
现在我连哪里出问题了不知道,难怪说微软的VS是宇宙最强编辑器。楼主有群吗,能不能帮扶一下。
win7,MounRiver Studio Version: v1.84
zoologist
zoologist
作者
回复fe
如果你确定和编译器有关系,我也没办法,因为我对他们的编译器也不熟,做这个项目是第一次用。
zoologist
zoologist
作者
回复fe
你用的什么板子? WCH 的官方板子吗?
如果是官方的板子,那么“3.4.13 外部晶振校准控制寄存器(HSE_CAL_CTRL)” 这里需要恢复成原来的数值。
之前我自己做的板子也遇到无法找到蓝牙的问题,最后发现是这里的问题。
fe
fe
我是一名初学者,烧录了你的hex文件能用,但是想自己实现一下,按照文章中你的代码修改后,编译没错误,烧录进去没反应,手机里连蓝牙设备都找不到,请问你的工程文件源码还有没了?能不能发我一份,或者我把我的工程源码发你,你帮我看看,哪里没改对,可以吗?先谢谢了。
zoologist
zoologist
作者
回复fe
摸鱼的网民
摸鱼的网民
看起来好复杂的样子(小白)
zoologist
zoologist
作者
本项目完整的代码

电路图和PCB

zoologist
zoologist
作者
工作的测试视频
[media=x,500,375]https://www.bilibili.com/video/BV1944y1Z7fK/?vd_source=cf6121716e06cb669a27c10276f9c920[/media]
本文提到的电路图和PCB
- 没有更多了 -