本感觉一个键鼠复合设备没啥好讲的,但是应不住日天兄再三之邀,写下此文。
首先简单科普一下USB的速度,对于USB2.0来说,一共有3种速度
低速(USB1.0):1.5Mbit/s
全速(USB1.1):12Mbit/s
高速(USB2.0):480Mbit/s
对于大部分支持USB2.0的单片机来说,一般都是支持的全速模式,高速模式是比较少见的,而这次使用的LPC5516是全速模式与高速模式都支持的。
我们先看一下手台的USB类型。
可以看到,识别出来的是高速USB,但是事实上对于键盘鼠标这种低速设备来说,完全是大才小用了,这里我就是属于弄着玩玩,看起来比较酷炫。
手台本身由两部分组成,键盘与鼠标,可以看到配置描述符里面有两个接口
分别就是鼠标跟键盘了
USB鼠标部分:
鼠标发送给PC的数据每次4字节
BYTE1 --
|--bit7~3: 无意义
|--bit2: 中键,1按下 0抬起
|--bit1: 右键
|--bit0: 左键
BYTE2 -- X坐标变化量,负数表示向左移,正数表右移。用补码表示变化量
BYTE3 -- Y坐标变化量,负数表示向下移,正数表上移。用补码表示变化量
BYTE4 -- 滚轮变化,0x01表示滚轮向前滚动一格;0xFF表示滚轮向后滚动一格;0x80是个中间值,不滚动。
USB是一个主机向从机查询的协议,对于鼠标来说,查询的速度越快,连续性越好,这里我程序设置的主机轮询速度为2ms,也就是鼠标部分1S通信500次。
这个参数在鼠标上叫回报率,也叫刷新率,简单理解就是1S能上传多少次数据到电脑,一般鼠标是125Hz。我的鼠标测试(罗技 M90)
手台数据测试
500Hz的回报率对手台来说完全足够。
USB键盘部分:
键盘发送给PC的数据每次8个字节
定义分别是:
BYTE1 --
|--bit0: 左Ctrl,1为按下 0为抬起
|--bit1: 左Shift
|--bit2: 左Alt
|--bit3: 左GUI
|--bit4: 右Ctrl
|--bit5: 右Shift
|--bit6: 右Alt
|--bit7: 右GUI
BYTE2 -- 保留
BYTE3--BYTE8 -- 普通按键
所以说一般的USB键盘只考虑软件的话只能做到6键无冲,如果需要更多,那只能加点接口,也就是那些支持多键无冲的键盘(需要硬件支持)。
对于手台来说,上面只有7个按键,这7个按键是直接接到IO上的。硬件完全支持无冲。而且其中一个按键还是确定键,平时使用中软件只要保证6键无冲即可。
同时按下6键,可正常识别。
键盘另一个比较重要的就是反应速度了,也就是按下按键到电脑反应的时间(其实我觉得完全不重要,因为键盘又不像鼠标一样是个连续的过程,人的反应速度才多少)。
软件上配置的主机轮询速度就是4ms,也就是理论上,按下按键到电脑有反应,最长要4ms。
这个只能说,主观感受是完全没问题的。
对于LPC5516来说这种应用只能说是毛毛雨了,150MHz的主频,完全轻轻松松。
按键与编码器:
按键、编码器通通外部上拉加电容消抖,软件部分没添加消抖,使用中未出现按键抖动的问题。
编码器代码采用外部中断的方式写的,稳定性还可以,就是买的编码器分辨率太低了,效果不太理想。
WS2812:
代码上使用了SPI去模拟,没有做按键与灯的绑定代码,目前只支持全彩渐变呼吸灯的效果。目前板子硬件上有11个灯,驱动毫无压力。
代码是用了mgn的程序改巴改巴搞出来的,原地址: https://www.nxpic.org.cn/module/forum/forum.php?mod=viewthread&tid=620562
程序开发上,NXP官方提供了很详细的例程,很方便就能上手,手台的软件部分的开发时间加起来不超过2小时。MCUXpresso Config Tools确实好用,配IO配时钟不要太简单,
最后总结一下:对于键鼠设备来说,全速USB就完全足够,因为键鼠是走中断传输模式的,速度的提升到了1ms之后的意义就不大了,太快反而给主机带来了负担。比如现在我在使用的键盘就是全速USB的,能查到的鼠标信息,好的游戏鼠标的回报率就是500Hz或者1000Hz了,换算到USB速度上,差不多也就是全速USB的水平吧(手上没有这么高级的玩意,猜的速度,欢迎有大佬在帖子留下自己鼠标的测试记录)。
对于我这个手台来说LPC5516可以说性能严重过剩。还是得想个办法逼出极限性能来啊。