EDN首页   博客首页

日志档案

发表于 2007-3-31 1:17:20

18

标签: 自制USB键盘  源代码  原理图  

自制USB键盘来玩玩~~~~(源代码,原理图)

哈哈,终于搞了一回USB HID设备,做了一个USB键盘来玩玩~~~~
其中的报告描述符让我晕了几天~~~~~几份HID相关的协议还是蛮长的~~~~~~
明天再弄个USB鼠标设备玩玩~~~~~~~有空的话再搞个红外遥控器玩玩~~~
这回是拿以前做的Mass storage来改的,所以比较快,修改了一下描述符
以及端点处理等,就行了。用了一个4*4的小键盘,有0-9十个数字键,
Num Lock键,Caps Lock键,Shift键,Ctrl键,Alt键,回车键等。
最多可以有三个键同时按下,如果相交的话,最多只能两个键按下。
 
下载全部源代码 USB键盘源代码包.rar  rar
 
 
以下是通过串口返回的调试信息:
 
系统启动................................
断开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欧姆的匹配电阻。由于图得比较匆忙,所以没留意。

点击看大图

点击看大图
 
点击看大图
点击看大图
点击看大图


系统分类: 单片机   |   用户分类: 圈圈作品   |   来源: 原创   |   【推荐给朋友】   |   【添加到收藏夹】

    阅读(6281)    回复(24)  

投一票您将和博主都有获奖机会!

  • 哦哦哦

    2007-5-3 20:49:18

    高手!

  • computer00

    2007-5-19 10:59:09

    都可以.只要能显示串口数据即可。

  • 2007-5-18 17:04:14

     

  • computer00

    2007-5-17 19:47:01

    不用安装驱动程序,这个驱动程序是windows自带的。也许你哪里搞错了,用BUS HOUND来看看数据,是否有数据包返回. 另外,原理图上的晶体频率太高,你换成22.1184M的试试,然后看看串口的返回信息.

    你可以去设备管理器里面去看看它的PID和UID,看是否为0,如果为0,就表示没有枚举成功. 也许是你的D+和D-接反了?仔细检查一下。

    我的D12是用飞线连起来的,封起来只是为了防止刮断线而已。

  • 2007-5-17 16:29:44

    圈圈你好,请问需要安装驱动程序吗?我点击“无法识别的设备”的详细内容,说是没有驱动程序,请问需要驱动吗?我的是xp版的。谢谢!

  • 2007-5-17 16:31:19

    还有就是的D12是不是容易被外界干扰,所以要把它密封起来?谢谢!

  • 2007-5-18 7:17:42

    圈圈你好!谢谢答复!我现在89s52用的是20M的晶振,除了按键地方和你不一样,其他都一样,我没有连串口,我也是用实验板焊的,我焊了两块电路板,现象都是一样的,偶尔会出现弹出发现新硬件,这种情况很少,但最终都是不正常,几乎都是插入USB后都是WINDOWS无法识别。还有和你不一样的地方是我在D+和D-上串接了18欧的电阻,但是把电阻短接起来还是无法识别,我今天去买22.1184M的晶振换换试试,但我觉得不像是晶振的问题,我就用你的程序编译后烧到89S52里面的,应该不是程序有问题吧?

  • 2007-5-18 7:19:50

    圈圈你好!谢谢答复!我现在89s52用的是20M的晶振,除了按键地方和你不一样,其他都一样,我没有连串口,我也是用实验板焊的,我焊了两块电路板,现象都是一样的,偶尔会出现弹出发现新硬件,这种情况很少,但最终都是不正常,几乎都是插入USB后都是WINDOWS无法识别。还有和你不一样的地方是我在D+和D-上串接了18欧的电阻,但是把电阻短接起来还是无法识别,我明天去买22.1184M的晶振换换试试,但我觉得不像是晶振的问题,我就用你的程序编译后烧到89S52里面的,应该不是程序有问题吧?

  • computer00

    2007-5-18 11:10:26

    程序应该是没有问题的(当然硬件要一致才行),我是最后烧到片子里面去试过才发上来的。建议你还是搞个串口出来,然后返回一些信息来看看,否则一点信息都没有,就像盲人摸象。另外再装上BUS HOUND,来看看数据包。

  • computer00

    2007-5-14 22:40:28

    我已经上传到BLOG里面了呀,

    http://www.ednchina.com/blog/computer00/19927/message.aspx

     

    如果这里不能下载了,你可以去另一个站点下载:

    http://computer00.21ic.org

     

    就在[圈圈的作品]版块里.

  • computer00

    2007-5-15 20:12:23

    有可能是你没连好电路,也可能是单片机除了问题,也可能是D12出了问题,也可能是你烧程序的时候没烧对,也可能是你的USB数据线有问题等等.

  • 2007-5-15 16:34:30

    圈圈你好,我也在做一个usb键盘,四个键,四个灯,我参考你的程序和电路,但是连上电脑后,显示:无法识别的设备,请问这是什么原因呢?谢谢答复。

  • computer00

    2007-7-15 22:30:26

    好象复合设备就可以...你找找USB关于复合设备方面的文档吧.....

  • dbird

    2007-7-15 18:54:06

     

     圈圈你好:

       小弟有一事请教能不能用该框架不变的情况下,也发送鼠标消息。也就是它能轮流发送鼠标和键盘消息!

  • dbird

    2007-7-16 7:26:19

     

     谢谢 , 我这就动手查资料!

  • computer00

    2007-6-5 14:51:09

    也许是你的端口初始化不对吧.这个需要一步步跟踪调试,才能确认故障在哪.

  • 柳叶

    2007-6-4 23:07:58

    圈圈,你好,按你的程序也搞了个USB键盘,但是识别出来后为什么在人机接口上有个黄色的叹号,属性里面提示不能启用.是什么原理呢?

  • 利剑

    2007-5-12 21:34:56

    好厉害啊。有没有那个IDE转USB 的程序?可以发份给我吗?谢谢先,我的邮箱2292ljq@163.com

  • computer00

    2007-5-30 12:59:43

    呵呵,恭喜了~~~~~~

  • 2007-5-30 10:53:39

    圈圈您好,谢谢您的指导和帮助,终于做好了USB键盘,谢谢啊,呵呵

  • eoda

    2007-4-27 9:44:48

    ThankX~

  • computer00

    2007-8-25 11:16:55

    发现程序的一个BUG,有些朋友提到枚举不正常,可能是下面这个函数的问题,替换它再试试.

    /***************************设置地址***************************************/
    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;
    }
    /******************************************************************************/

  • irctrl

    2007-9-18 12:42:15

    大家可以自制的电脑遥控器-IRCtrl软件

    http://www.irctrl.com

  • yueyang

    2007-11-24 11:52:49

    你没有考虑搞个USB红外接收设备吗?最好能支持linux