原创
自制USB键盘来玩玩~~~~(源代码,原理图)
2007-3-31 01:17
10512
9
19
分类:
MCU/ 嵌入式
哈哈,终于搞了一回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-应该分别串联22欧姆的匹配电阻。由于图得比较匆忙,所以没留意。
用户216809 2007-11-24 11:52
computer00 2007-8-25 11:16
/***************************设置地址***************************************/
void set_usb_address(void)
{
usb_flags.flags.set_addr=1;
set_usb_addr(Control_Data.DeviceRequest.wValue);
while(select_endpoint(1)&0x01);
write_endpoint_buff(1,0,0);
while(select_endpoint(1)&0x01);
usb_flags.flags.usb_endp0_in=0;
usb_flags.flags.setup_packet_out=0;
}
/******************************************************************************/
用户87040 2007-7-16 07:26
谢谢 , 我这就动手查资料!
computer00 2007-7-15 22:30
用户87040 2007-7-15 18:54
圈圈你好:
小弟有一事请教能不能用该框架不变的情况下,也发送鼠标消息。也就是它能轮流发送鼠标和键盘消息!
computer00 2007-6-5 14:51
computer00 2007-5-30 12:59
computer00 2007-5-19 10:59
都可以.只要能显示串口数据即可。
computer00 2007-5-18 11:10
computer00 2007-5-17 19:47
不用安装驱动程序,这个驱动程序是windows自带的。也许你哪里搞错了,用BUS HOUND来看看数据,是否有数据包返回. 另外,原理图上的晶体频率太高,你换成22.1184M的试试,然后看看串口的返回信息.
你可以去设备管理器里面去看看它的PID和UID,看是否为0,如果为0,就表示没有枚举成功. 也许是你的D+和D-接反了?仔细检查一下。
我的D12是用飞线连起来的,封起来只是为了防止刮断线而已。