沁恒三模键盘方案测试体验

近期收到了沁恒发来的三模键盘(BLE+2.4G+USB)方案demo,准备测一下看看demo做到了什么程度。
先看看提供的资料包(命名有点随意,哈哈哈哈哈)。

解压以后的资料内容,如下图共5个文件。

第1个firmware是软件,里面有2个文件夹。

第2个firmware是软件,里面有3个压缩包,没有说明,打开看了一下地3个是dongle,第1和2个是键盘硬件,2看命名应该是新一点的。

用Altium Designer可以打开,打开如下图

第3个image打开来看里面是2个逻辑框图,一个数据处理,一个是RF配对流程。对应后面理解程序有一些作用,方便阅读代码。

第4个不知道是啥,接着往下看。
第5个后来发现是简介,折腾了一会,用浏览器可以打开。

比较良心的是寄来测试硬件(键盘PCB+Dongle),不然还得自己打样焊接,不能立马测试,这服务没的说


 正面(我测过硬件,顺便把几个功能切换按键标注出来了,贴纸部分的按键)


反面+Dongle(Dongle比1角硬币还小,很紧凑)
这里不得不夸一句,沁恒提供的测试硬件还是很良心的,看焊工不错,一看就是有功底的电子工程师,板子很干净,焊点也比较漂亮,初测了一下一下,正常下载都没有问题,各个按键都是可用的。
调试开始
下面来分享一下具体的测试(CH582是RISC-V内核的,哈哈也算是赶潮流的,沁恒在自己涉及的专业领域都钻研的比较深,比如最开始使用的CH340/CH341 USB 转串口,后来用过U盘管理芯片CH376,现在连103都做了,BLE也做的不错,看过网上拆解的游戏手柄用的就是CH573),所以想来RISC-V应该也不会差。
编译器安装环境,我参考这个这个
(30条消息) RISC-V MCU开发(一):集成开发环境_MounRiver_Studio的博客-CSDN博客
先安装MRS,打开工程

界面对比keil还是有点相似的,用法实际上也比较相似,都是C编程,上手不太难。
编译问题解决了,现在要想办法把代码下载到硬件里面,咨询了技术支持,CH582每个芯片都自带BOOT,可以使用USB和串口进行下载,三模键盘都有USB口,可以用USB口,感觉要简单一点。
下载工具链接
WCHISPTool_Setup.exe - 南京沁恒微电子股份有限公司
安装后的样子

 

先把编译好的dongle和键盘代码下载进去测一下已经实现的功能
下载键盘固件


把P6这个跳冒短接,然后USB接PC
 
下载的几个坑要注意回避
1)RST不能使能复位,因为RST是PB23,RST低电平有效,如果勾选,有些按键会导致复位生效,然后就外部复位;
2)默认下载脚是PB22,如果不选择PB11,用默认的PB22,每次上电都会进BOOT,但是会超时,后来我测差不多是10s,问了官方技术支持,BOOT确实有这个超时退出的功能。
当时这个真的查死人,一开始没注意,每次都过了很久键盘才能上传值,后来看设备管理器,发现设备管理器会跳,以为是上电会复位一次,但是仔细看现实外部接口-USB Moudle的设备,然后才是HID的设备,然后偶然发现USB Moudle的设备ISP工具能搜索到设备,是进BOOT了,整个大乌龙;
3)dataflash清空可以把dataflash里面存的信息清掉,调试过程还是有用的;
上图键盘代码已经下载进去了,下载Dongle要麻烦一点。


 Dongle下载也要PB11触发,PB11实际是D+引脚,要触发我搞了个转接头,用的时候用镊子短接一下D+和V33,这样就可以触发进BOOT了。
至此下载终于搞完了,下面就是测试功能了。
沁恒的USB做的比较久,尤其是CH340 CH341,每个做嵌入式开发的技术工程师都应该至少有1个吧,USB这块问题应该不大,先从最稳妥的下手,测USB模式


按照这个说明,Fn+Pause是USB有线模式
键盘的背面P7有个插针是TXD,可以输出打印信息
 
波特率921600,默认的打印信息,上电以后默认是BLE模式,这个时候按住Fn+Pause测试USB有线模式

 

测试打印字符(这个小白的按键测试真心废手,按的有点疼),测试效果如上图(右),先简单试试功能,后面具体对照代码再详细测试,至少目前测试USB模式下可以正常进行按键扫描和USB数据上传,如上图。


测蓝牙模式,按住Fn+Insert切换到蓝牙模式,


可以看到广播开启,


搜索设备,点击连接


设备连接状态,测一下打字,可以正常打字如下图:

 

测一下蓝牙回连,键盘上下电,测试回连速度:
切断键盘供电,电脑提供连接断开时间在3-5s,说明默认配置的蓝牙通讯超时时间是这么久,这个在代码里面是可以配置的;
回连基本上电后秒连接,时间长不到1-2s,比较快,很不错,连上直接可以发送键值,基本零等待。
蓝牙多设备功能(1台键盘可以在PC、pad、甚至手机等多个主机之间进行切,直接进行字符上传),配对多个设备,切换后零等待,办公就方便多了,是个很实用的功能。
Fn+1、Fn+2、Fn+3、Fn+4可以和4个主机进行配对,功能挺好。
比如Fn+1跟主机1连上去以后,按Fn+2切换到从机2,主机可以重新搜索配对,连接后正常收发,此时主机1是处于配对模式,重新切换到Fn+1,可以立即回连,零等待。

2.4G模式测试,2.4G模式相比蓝牙,虽然都是无限模式,不过蓝牙模式有使用限制,比如有的不支持蓝牙的主机就无法使用,CH582做的三模键盘,就是纯BLE的,不支持经典蓝牙,所以即使是蓝牙也有区分;2.4G模式就没有这个限制因素,它必须有个USB的Dongle接收头,避免了无线对主机的兼容问题,另外2.4G可以做到1000Hz的上报率,BLE通讯间隔最小7.5ms,2.4G的传输更快。

Fn+Src切换到2.4G模式,按住Fn+5开始配对,基本零等待,秒连接,如上(左)图。按下按键可以正常发送键值。测试2.4G断连和回连速度
键盘重新上下电,测试Dongle自动回连的速度,配对后,键盘重新上电,Dongle不掉电,秒连接,零等待,立即可以发码打字;
Dongle重新上电,Dongle上电后10s处于等待新配对模式,10s后,秒连接,零等待,立即可以回连发码。

反复多次测试键盘和Dongle上下电,均可以正常使用,异常情况处理也很不错。
优缺点总结:
1)基本都已经实现,功能规划比较合理;
2)2.4G回连速度挺快的,也有跳频,抗干扰要实测;
3)2.4G模式上下电测试反应速度挺好;
4)上传模式支持普通按键、多媒体按键、鼠标和系统控制报表;
5)BLE多设备功能;

可以改进的地方
1)工程代码比较复杂,多点注释就好了。

  • 3
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
矩阵键盘是一种常见的输入设备,使用沁恒307可以很方便地实现矩阵键盘的输入功能。 首先,需要定义一个矩阵键盘的键位映射表。假设矩阵键盘的大小为4x4,键位从左上角开始编号为0~15,映射表可以按照以下方式定义: ``` const uint8_t keyMap[16] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }; ``` 接下来,需要定义矩阵键盘所接的引脚。假设使用GPIOA和GPIOB的第0~3和第4~7引脚连接矩阵键盘,可以按照以下方式定义: ``` #define ROW_PORT GPIOA #define COL_PORT GPIOB #define ROW_MASK 0x0F #define COL_MASK 0xF0 ``` 接下来,可以定义一个读取键盘状态的函数。这个函数会扫描键盘的行列,并返回当前按下的键位编号。如果没有键被按下,则返回-1。 ``` int readKeypad() { ROW_PORT->ODR |= ROW_MASK; COL_PORT->ODR &= ~COL_MASK; for (int row = 0; row < 4; row++) { ROW_PORT->ODR &= ~(1 << row); for (int col = 0; col < 4; col++) { if (COL_PORT->IDR & (1 << (col + 4))) { int key = row * 4 + col; return keyMap[key]; } } ROW_PORT->ODR |= (1 << row); } return -1; } ``` 最后,在主函数中可以不断调用这个函数来读取键盘状态,并根据返回值进行相应的处理。例如,可以在串口上输出当前按下的键位编号。 ``` int main() { // 初始化GPIO和串口 RCC->AHBENR |= RCC_AHBENR_GPIOAEN | RCC_AHBENR_GPIOBEN; RCC->APB1ENR |= RCC_APB1ENR_USART2EN; GPIOA->MODER &= ~(GPIO_MODER_MODER9 | GPIO_MODER_MODER10); GPIOA->MODER |= GPIO_MODER_MODER9_1 | GPIO_MODER_MODER10_1; GPIOA->AFR[1] &= ~(GPIO_AFRH_AFRH1 | GPIO_AFRH_AFRH2); GPIOA->AFR[1] |= (1 << (1 * 4)) | (1 << (2 * 4)); GPIOB->MODER &= ~(0xFFFF << (4 * 2)); GPIOB->MODER |= 0x5555 << (4 * 2); USART2->BRR = 48000000 / 115200; USART2->CR1 = USART_CR1_UE | USART_CR1_TE | USART_CR1_RE; // 循环读取键盘状态 while (1) { int key = readKeypad(); if (key >= 0) { printf("Key pressed: %d\n", key); } delay_ms(50); } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值