zoologist 发表于 2022-12-18 17:01:36

CH32V208 USB 转蓝牙键盘装置

CH32V208系列是一款32位RISC-V设计的无线型微控制器。它的外部接口非常丰富,片上集成2Mbps低功耗蓝牙BLE 通讯模块、USB2.0全速设备+主机/设备接口。这次的作品就是基于蓝牙BLE和USB 主机功能实现的。
简单的说这个作品的原理是通过 USB Host 和键盘进行通讯,取得按键之后再通过BLE蓝牙发送出去。作品设计是围绕 CH32V208进行的,目前公开的型号有如下几种,这次使用的是CH32V208WBU6,它是QFN68X8封装的,这个对于手工焊接稍微有难度,如果有可能最好使用加热焊台配合焊锡膏进行。选择这种封装的唯一原因是目前市场上还没有其他封装。
订货型号 封装形式 塑体宽度 引脚间距 封装说明 出货料盘
CH32V208GBU6QFN28X44*4mm0.4mm方形无引线 28 脚 托盘
CH32V208CBU6QFN48X55*5mm0.35mm方形无引线 48 脚 托盘
CH32V208RBT6LQFP64M10*10mm0.5mmLQFP64M(10*10)贴片 托盘
CH32V208WBU6QFN68X88*8mm0.4mm方形无引线 68 脚 托盘
完整电路图如下:
需要特别注意的有下面几点:1.E1 是一个天线,我是根据WCH官方提供的 LIB 导入到立创EDA完成的其中L1和C16。C17 的电容是来自官方评估板电路图,我并不知道为什么这样选择,也不知道是否需要进行调整;
2.和评估板相比,没有设计 OSC32IN/OUT 这一组晶振,它只在使用 BLE Client的时候才会用到,这次的设备是作为BLE Server 的,因此不需要。外部使用了32Mhz的晶振,CH32V208内部带有可以设定的匹配电容,所以外部不需要。晶振是YXC(扬兴晶振)的X503232MSB2GI,从立创商城购买。
3.芯片工作电压为3.3V,沿用了多次使用的TLV1117芯片
4.板子带有一个USB母头和一个USB公头,前者用于连接USB键盘,后者用于取电
5.下面是一个负载消耗电流的设计。很多充电宝在小电流输出一段时间之后会自动切断输出,因此使用PA3GPIO控制每隔一段时间拉一个大电流出来,这样能够维持充电宝的输出。
6.预留了下载按钮,这样可以方便烧写程序
7.最后是预留的调试接口,串口输出:
天线的设计来自WCH官方提供的参考库,对应的 PCB 厚度为 1.6mm。
PCB 设计如下:
硬件介绍完毕,下面讲一下代码设计。官方提供了丰富的示例代码(比 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串口调试器)避免调试代码干扰运行#ifdef DEBUG

    USART_Printf_Init( 1000000 );

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

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){

    while(1)

    {

      USBH_MainDeal( );

      TMOS_SystemProcess();



      // 计时10秒左右拉高GPIO, 实现电流输出

      if (Elsp>10000) {

            DUG_PRINTF( "Set to High\r\n" );

            POWERON();

      }

      if (Elsp>10100) {

            DUG_PRINTF( "Set to Low\r\n" );

            POWEROFF();

            Elsp=0;

      }

    }

}
4.   获得键盘数据的代码在 app_km.c 文件中的voidUSBH_MainDeal( void )函数。取得之后,通过HidDev_Report()函数即可从BLE蓝牙发送出去。                         //LABZDebug_Start

                            // HID keyboard input report length

                            #define HID_KEYBOARD_IN_RPT_LEN         8

                            #define HID_RPT_ID_KEY_IN               0

                            #define HID_REPORT_TYPE_INPUT             1

                            uint8_t buf;

                            static uint8_t LastBuf;



                            DUG_PRINTF( "LastBuf:" );

                            for( i = 0; i < len; i++ )

                              {

                                 DUG_PRINTF( "%02x ", Com_Buf[ i ] );

                              }

                            DUG_PRINTF( "\r\n" );

                            //if (memcmp(buf,LastBuf,HID_KEYBOARD_IN_RPT_LEN)!=0) { // False == 0

                            //    memcpy(LastBuf,buf,HID_KEYBOARD_IN_RPT_LEN);

                              HidDev_Report(HID_RPT_ID_KEY_IN, HID_REPORT_TYPE_INPUT,

                                              HID_KEYBOARD_IN_RPT_LEN, Com_Buf);

                              DUG_PRINTF( "SendData");

                            //}

                         //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
HSECHSE
FAULTReser
vedHSEITRIM
Reserved
1514 13 12 11 10 9 8 7 6 5 4 3 2 1 0
Reserved
位 名称 访问 描述 复位值

HSECRWHSE内置匹配电容调节位:
111:22pF
110:20pF
101:18pF100:16pF
011:14pF
010:12pF
001:10pF
000:8pF000b\



27HSEFAULTRWHSE失效检测禁用控制位:
1:忽略模拟输入的 HSE 失效检测信号
0:使用模拟输入的 HSE 失效检测信号0
26ReservedRO保留。 0
HSEITRIMRWHSE起振电流调节位。 01b
ReservedRO保留。 0

上面就是基于CH32V208的USB键盘转BLE蓝牙的设计,本次设计使用立创EDA设计,硬件和软件都是完全开源的有兴趣的朋友可以尝试制作自己的专属设备。

zoologist 发表于 2022-12-18 17:16:21

工作的测试视频

https://www.bilibili.com/video/BV1944y1Z7fK/?vd_source=cf6121716e06cb669a27c10276f9c920
本文提到的电路图和PCB


zoologist 发表于 2022-12-18 17:34:55

本帖最后由 zoologist 于 2023-2-16 17:08 编辑

本项目完整的代码

电路图和PCB

陈玉玮 发表于 2022-12-20 15:56:46

看起来好复杂的样子(小白)

fe 发表于 2023-3-24 13:32:01

我是一名初学者,烧录了你的hex文件能用,但是想自己实现一下,按照文章中你的代码修改后,编译没错误,烧录进去没反应,手机里连蓝牙设备都找不到,请问你的工程文件源码还有没了?能不能发我一份,或者我把我的工程源码发你,你帮我看看,哪里没改对,可以吗?先谢谢了。

zoologist 发表于 2023-3-24 21:54:05

fe 发表于 2023-3-24 13:32
我是一名初学者,烧录了你的hex文件能用,但是想自己实现一下,按照文章中你的代码修改后,编译没错误,烧 ...

工程源码在 https://github.com/ziv2013/USBKB2BLEKB

fe 发表于 2023-4-11 19:24:55

本帖最后由 fe 于 2023-4-11 19:29 编辑

首先,非常感谢楼主的源码,没想到楼主还在活跃中,回复如此及时。


我真是败了,我把源码下载直接编译,烧录能用。
我照抄楼主代码,自己建项目,然后编译也显示成功同时没有任何报错信息,但烧录进去连蓝牙都发现不了。生成的hex文件比楼主的略大。

现在我连哪里出问题了不知道,难怪说微软的VS是宇宙最强编辑器。楼主有群吗,能不能帮扶一下。

win7,MounRiver Studio Version: v1.84


zoologist 发表于 2023-4-12 09:18:37

fe 发表于 2023-4-11 19:24
首先,非常感谢楼主的源码,没想到楼主还在活跃中,回复如此及时。




你用的什么板子? WCH 的官方板子吗?

如果是官方的板子,那么“3.4.13 外部晶振校准控制寄存器(HSE_CAL_CTRL)” 这里需要恢复成原来的数值。

之前我自己做的板子也遇到无法找到蓝牙的问题,最后发现是这里的问题。

zoologist 发表于 2023-4-12 09:19:57

fe 发表于 2023-4-11 19:24
首先,非常感谢楼主的源码,没想到楼主还在活跃中,回复如此及时。




如果你确定和编译器有关系,我也没办法,因为我对他们的编译器也不熟,做这个项目是第一次用。

fe 发表于 2023-4-13 10:47:46

我觉的不是板子的问题,我下载你的源码编译出来的刷进入没问题,我自己建的工程编译出来的就不行,嵌入式我只是业余,准确的说是看到你这帖子我才触发兴趣的,所以我现在连问题出在哪都搞不清楚,感觉的是设置出问题了??

我用vs的,觉得vs没这么多的设置,eclipse没用过,更不敢大言不惭的说编译器有关

我用的MounRiver Studio Version: v1.84 生成的项目,目录结构。

我发我的工程文件源码给你,能不能帮我看看?怎么发你?

zoologist 发表于 2023-4-13 12:19:29

fe 发表于 2023-4-13 10:47
我觉的不是板子的问题,我下载你的源码编译出来的刷进入没问题,我自己建的工程编译出来的就不行,嵌入式我 ...

发我邮箱吧2925059@qq.com

fe 发表于 2023-4-28 10:30:37

你好,我后面给你发的邮件你看了吗?就是需要多清除几次项目,还是清除了也没有作用,一样提示缺文件和目录?

我想5.1再学习研究研究的,现在卡在这里过不去了,不知道哪里出错。希望得到你的帮助。

zoologist 发表于 2023-4-29 08:33:14

fe 发表于 2023-4-28 10:30
你好,我后面给你发的邮件你看了吗?就是需要多清除几次项目,还是清除了也没有作用,一样提示缺文件和目录 ...

不好意思,编译器的问题我也不清楚的。

要不你直接去官方询问一下?
页: [1]
查看完整版本: CH32V208 USB 转蓝牙键盘装置