如何自己自制一个USB键盘

电子说

1.3w人已加入

描述

哈哈,终于搞了一回USB HID设备,做了一个USB键盘来玩玩~~~~其中的报告描述符让我晕了几天~~~~~几份HID相关的协议还是蛮长的~~~~~~明天再弄个USB鼠标设备玩玩~~~~~~~有空的话再搞个红外遥控器玩玩~~~

这回是拿以前做的Mass storage来改的,所以比较快,修改了一下描述符以及端点处理等,就行了。用了一个4*4的小键盘,有0-9十个数字键,Num Lock键,Caps Lock键,Shift键,Ctrl键,Alt键,回车键等。

最多可以有三个键同时按下,如果相交的话,最多只能两个键按下。

以下是通过串口返回的调试信息:

系统启动。..。..。..。..。..。..。..。..。..。..。.

断开USB连接。..。..。..。..。..。..。..。..

USBD12芯片初始化

设置地址。..。..。..。..。..。..。..

地址为: 0

连接USB.。..。..。..。..。.

USB总线复位。..。..。..。..。..。..。..。..。..。..。.

USB总线挂起。..。..。..。..。..。..。..。..。..。..。.

USB总线复位。..。..。..。..。..。..。..。..。..。..。.

USB总线挂起。..。..。..。..。..。..。..。..。..。..。.

USB总线复位。..。..。..。..。..。..。..。..。..。..。.

USB标准请求。..。..。..。..。..。..。..。..。..。..。.

获取描述符。..。..。..。..。..。..。..。..。..。..。.

获取设备描述符。..。..。..。..。..。..。..。..。..。..。.

USB总线复位。..。..。..。..。..。..。..。..。..。..。.

USB标准请求。..。..。..。..。..。..。..。..。..。..。.

设置地址。..。..。..。..。..。..。..

地址为: 2

USB标准请求。..。..。..。..。..。..。..。..。..。..。.

获取描述符。..。..。..。..。..。..。..。..。..。..。.

获取设备描述符。..。..。..。..。..。..。..。..。..。..。.

USB标准请求。..。..。..。..。..。..。..。..。..。..。.

获取描述符。..。..。..。..。..。..。..。..。..。..。.

USB标准请求。..。..。..。..。..。..。..。..。..。..。.

获取描述符。..。..。..。..。..。..。..。..。..。..。.

获取配置描述符。..。..。..。..。..。..。..。..。..。..。.

USB标准请求。..。..。..。..。..。..。..。..。..。..。.

获取描述符。..。..。..。..。..。..。..。..。..。..。.

获取字符串描述符。..。..。..。..。..。..。..。..。..。..。.

获取语言ID.。..。..。..。..。..。..。..。..。..。..。

USB标准请求。..。..。..。..。..。..。..。..。..。..。.

获取描述符。..。..。..。..。..。..。..。..。..。..。.

获取字符串描述符。..。..。..。..。..。..。..。..。..。..。.

获取设备序列号。..。..。..。..。..。..。..。..。..。..。.

USB标准请求。..。..。..。..。..。..。..。..。..。..。.

获取描述符。..。..。..。..。..。..。..。..。..。..。.

USB标准请求。..。..。..。..。..。..。..。..。..。..。.

获取描述符。..。..。..。..。..。..。..。..。..。..。.

获取配置描述符。..。..。..。..。..。..。..。..。..。..。.

USB标准请求。..。..。..。..。..。..。..。..。..。..。.

获取描述符。..。..。..。..。..。..。..。..。..。..。.

USB标准请求。..。..。..。..。..。..。..。..。..。..。.

获取描述符。..。..。..。..。..。..。..。..。..。..。.

USB标准请求。..。..。..。..。..。..。..。..。..。..。.

获取描述符。..。..。..。..。..。..。..。..。..。..。.

获取字符串描述符。..。..。..。..。..。..。..。..。..。..。.

获取语言ID.。..。..。..。..。..。..。..。..。..。..。

USB标准请求。..。..。..。..。..。..。..。..。..。..。.

获取描述符。..。..。..。..。..。..。..。..。..。..。.

获取字符串描述符。..。..。..。..。..。..。..。..。..。..。.

获取产品字符串。..。..。..。..。..。..。..。..。..。..。.

USB标准请求。..。..。..。..。..。..。..。..。..。..。.

获取描述符。..。..。..。..。..。..。..。..。..。..。.

USB标准请求。..。..。..。..。..。..。..。..。..。..。.

获取描述符。..。..。..。..。..。..。..。..。..。..。.

USB标准请求。..。..。..。..。..。..。..。..。..。..。.

获取描述符。..。..。..。..。..。..。..。..。..。..。.

USB标准请求。..。..。..。..。..。..。..。..。..。..。.

获取描述符。..。..。..。..。..。..。..。..。..。..。.

USB标准请求。..。..。..。..。..。..。..。..。..。..。.

获取描述符。..。..。..。..。..。..。..。..。..。..。.

USB标准请求。..。..。..。..。..。..。..。..。..。..。.

获取描述符。..。..。..。..。..。..。..。..。..。..。.

获取字符串描述符。..。..。..。..。..。..。..。..。..。..。.

获取语言ID.。..。..。..。..。..。..。..。..。..。..。

USB标准请求。..。..。..。..。..。..。..。..。..。..。.

获取描述符。..。..。..。..。..。..。..。..。..。..。.

获取字符串描述符。..。..。..。..。..。..。..。..。..。..。.

获取产品字符串。..。..。..。..。..。..。..。..。..。..。.

USB标准请求。..。..。..。..。..。..。..。..。..。..。.

获取描述符。..。..。..。..。..。..。..。..。..。..。.

USB标准请求。..。..。..。..。..。..。..。..。..。..。.

获取描述符。..。..。..。..。..。..。..。..。..。..。.

USB标准请求。..。..。..。..。..。..。..。..。..。..。.

获取描述符。..。..。..。..。..。..。..。..。..。..。.

USB标准请求。..。..。..。..。..。..。..。..。..。..。.

获取描述符。..。..。..。..。..。..。..。..。..。..。.

USB标准请求。..。..。..。..。..。..。..。..。..。..。.

获取描述符。..。..。..。..。..。..。..。..。..。..。.

USB标准请求。..。..。..。..。..。..。..。..。..。..。.

获取描述符。..。..。..。..。..。..。..。..。..。..。.

获取设备描述符。..。..。..。..。..。..。..。..。..。..。.

USB标准请求。..。..。..。..。..。..。..。..。..。..。.

获取描述符。..。..。..。..。..。..。..。..。..。..。.

USB标准请求。..。..。..。..。..。..。..。..。..。..。.

获取描述符。..。..。..。..。..。..。..。..。..。..。.

获取配置描述符。..。..。..。..。..。..。..。..。..。..。.

USB标准请求。..。..。..。..。..。..。..。..。..。..。.

获取描述符。..。..。..。..。..。..。..。..。..。..。.

获取配置描述符。..。..。..。..。..。..。..。..。..。..。.

USB标准请求。..。..。..。..。..。..。..。..。..。..。.

获取描述符。..。..。..。..。..。..。..。..。..。..。.

USB标准请求。..。..。..。..。..。..。..。..。..。..。.

获取描述符。..。..。..。..。..。..。..。..。..。..。.

USB标准请求。..。..。..。..。..。..。..。..。..。..。.

设置配置。..。..。..。..。..。..。..。..。..。..。.

USB类请求。..。..。..。..。..。..。..。..。..。..。.

设置空闲。..。..。..。..。..。..。..。..。..。..。.

USB标准请求。..。..。..。..。..。..。..。..。..。..。.

获取描述符(从接口)。..。..。..。..。..。..。..。..。..。..

获取报告描述符。..。..。..。..。..。..。..。..。..。..。.

USB标准请求。..。..。..。..。..。..。..。..。..。..。.

获取描述符(从接口)。..。..。..。..。..。..。..。..。..。..

USB标准请求。..。..。..。..。..。..。..。..。..。..。.

获取描述符(从接口)。..。..。..。..。..。..。..。..。..。..

USB标准请求。..。..。..。..。..。..。..。..。..。..。.

获取描述符(从接口)。..。..。..。..。..。..。..。..。..。..

USB标准请求。..。..。..。..。..。..。..。..。..。..。.

获取描述符(从接口)。..。..。..。..。..。..。..。..。..。..

USB标准请求。..。..。..。..。..。..。..。..。..。..。.

获取描述符(从接口)。..。..。..。..。..。..。..。..。..。..

USB标准请求。..。..。..。..。..。..。..。..。..。..。.

获取描述符(从接口)。..。..。..。..。..。..。..。..。..。..

USB标准请求。..。..。..。..。..。..。..。..。..。..。.

获取描述符(从接口)。..。..。..。..。..。..。..。..。..。..

端点2输出。..。..。..。..。..。..。..。..。..。..。.

端点2的数据是 0x01

端点2输出。..。..。..。..。..。..。..。..。..。..。.

端点2的数据是 0x03

端点2输出。..。..。..。..。..。..。..。..。..。..。.

端点2的数据是 0x01

端点2输出。..。..。..。..。..。..。..。..。..。..。.

端点2的数据是 0x00

端点2输出。..。..。..。..。..。..。..。..。..。..。.

端点2的数据是 0x02

端点2输出。..。..。..。..。..。..。..。..。..。..。.

端点2的数据是 0x03

在设备管理器里看到的图:

原理图

(用的是以前做IDE转USB的板,所以上面还有个IDE接口和573锁存器,可以不用理会它们):

(注意:原理图上所标的晶体值是以前的,这个程序中使用的是22.1184M的晶体。它关系到串口波特率,如果你不使用串口,那么可以不用理会它。)

注意:图中串口电平转换部分的C8和C10接反了,C11负端应接VDD。D12的SUSPEND(12脚)应该接地。USB接头的D+和D-跟芯的D+和D-之间应该串联22欧姆的匹配电阻。片由于图得比较匆忙,所以没留意。右击选择图片另存为可以看到完整图片了。

usb

实物图片(键盘是外接的):


责任编辑LK

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分