搜索
bottom↓
回复: 171

AVRUSB+ADC

[复制链接]

出0入0汤圆

发表于 2007-12-22 21:41:59 | 显示全部楼层 |阅读模式
下面提供的是刚刚做好的AVRUSB——ADC转换。相关介绍如下:
1、电路,在原来USBASP基础上加以很少修改
2、驱动,如果已经安装了USBASP的,那么不需要安装了。
3、这个程序包括上位机和下位机两部分,上位机用BCB6编写,显示采用普通文字显示(没有采取波形显示)
4、这个程序目的演示PC通过AVRUSB获取数据的。
5、电路迟点再发过来





点击此处下载ourdev_192197.rar(文件大小:609K)
原理图:
点击此处下载ourdev_192212.rar(文件大小:4K)

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2007-12-22 21:44:06 | 显示全部楼层
楼主能否简要介绍一下PC端与USBASP通讯的接口?
谢谢!

出0入0汤圆

 楼主| 发表于 2007-12-22 21:48:11 | 显示全部楼层
PC端与USBASP通讯的接口?请参考USBASP电路
头像被屏蔽

出0入0汤圆

发表于 2007-12-22 22:31:21 | 显示全部楼层
谢谢共享。源代码很完整。COOL!

出0入0汤圆

发表于 2007-12-22 22:34:44 | 显示全部楼层
遇到强贴,怎一个顶字了得

出0入0汤圆

发表于 2007-12-22 23:00:39 | 显示全部楼层
好!

出0入50汤圆

发表于 2007-12-22 23:01:21 | 显示全部楼层
非常好的东西啊!不顶不厚道,呵呵。

出0入0汤圆

发表于 2007-12-23 07:18:56 | 显示全部楼层
不错

出0入0汤圆

发表于 2007-12-23 10:26:45 | 显示全部楼层
>PC端与USBASP通讯的接口?请参考USBASP电路
硬件接口应该没问题,软件接口这里还没有人介绍过哦

出0入0汤圆

发表于 2007-12-23 10:53:59 | 显示全部楼层
还没对USBASP做具体研究。硬件接口应该没问题,软件接口还不知道呢。

出0入0汤圆

发表于 2007-12-23 10:54:15 | 显示全部楼层
不错,又一个usbasp的应用

出0入0汤圆

发表于 2007-12-23 12:16:02 | 显示全部楼层
是啊,软件接口实在是需要老师带一下!

出0入0汤圆

发表于 2007-12-31 15:06:22 | 显示全部楼层
请问软件接口是怎么实现的。驱动程序是怎么生成的。LZ能留个联系方式吗?急!

出0入0汤圆

 楼主| 发表于 2007-12-31 17:39:32 | 显示全部楼层
驱动程序是怎么生成的?你下载一个libusb-win32,里面有inf-wizard.exe这个程序就会引导你一步一步建立inf文件,你只是需要注意PID和VID就可以。然后将里面的libusb0.dll,libusb0.sys拷到一起。当你插入硬件时候,按安装程序提示选择inf文件就可以安装了 。
我提供libusb-win32给你吧:
点击此处下载ourdev_195812.rar(文件大小:111K)

出0入0汤圆

 楼主| 发表于 2007-12-31 18:39:28 | 显示全部楼层
看来还有人喜欢搞AVRUSB,我在这里借花献佛,提供一些参考资料。就是
AVRUSB技术探讨
作者:邵子扬、王育强、吕益光
我是以这入门的,在此感谢邵子扬、王育强、吕益光。这篇论文在这个网站里面也有介绍,现在再次提供。
点击此处打开ourdev_195833.doc(文件大小:178K)

出0入0汤圆

发表于 2007-12-31 18:45:26 | 显示全部楼层
非常感谢楼主!再顶你。我现正在研究你的代码呢。libusb-win32也可以用于普通的USB吧。

出0入0汤圆

发表于 2007-12-31 18:57:42 | 显示全部楼层
cool~请问这个是软件模拟usb端口的麽?

出0入0汤圆

 楼主| 发表于 2007-12-31 19:24:01 | 显示全部楼层
使用AVR模拟USB设备,就是人家说的软USB

出0入0汤圆

 楼主| 发表于 2007-12-31 19:24:49 | 显示全部楼层
libusb-win32是USB通用驱动DLL

出0入0汤圆

 楼主| 发表于 2007-12-31 19:43:00 | 显示全部楼层
学习AVRUSB,最好的方法就是学习USBASP里面的代码,在USBASP代码里面,usbdrvasm.S、usbdrvasm12.S、usbdrv.c是AVR模拟USB的文件。usbdrvasm12.S文件里面程序实现PC与MCU数据的接受与发送;usbdrv.c实现接口。我通过学习,感觉到如果AVR汇编不好,可以粗略看看usbdrvasm12.S,只要大概知道它如何实现数据的传输的(这需要用到USB通讯协议,如编码、插入填充位、同步,其中去掉填充位,添加填充位是最难的)。usbdrv.c实现接口,这个是比较重要的,不过归纳起来就是如何处理数据。

出0入0汤圆

 楼主| 发表于 2007-12-31 20:20:00 | 显示全部楼层
如果使用BCB编写USB上位机程序可以这样做:
1、将libusb-win32文件夹-》LIB-》bcc->libusb.lib拷到你的程序项目文件夹中,并且加入到你的项目中,如果加入到你程序项目中?在BCB菜单中:Project->Add to prgject...然后选中libusb.lib就可以了
2、将libusb-win32文件夹-》include->usb.h拷到你项目文件夹下面
3、在程序中包含usb.h
4、使用PID/VID打开USB设备
如:
#include "usb.h"
#define        USBDEV_VENDOR        0x16c0        /* ATMEL */
#define        USBDEV_PRODUCT        0x05dc         /* USBasp */
static usb_dev_handle *usbhandle;
int usbasp_open()
{
  struct usb_bus    *bus;
  struct usb_device *dev = 0;
  usb_init();
  usb_find_busses();
  usb_find_devices();
  for(bus=usb_get_busses(); bus; bus=bus->next)
   {
    for(dev=bus->devices; dev; dev=dev->next)
     {
      if((dev->descriptor.idVendor == USBDEV_VENDOR) && (dev->descriptor.idProduct == USBDEV_PRODUCT))
        break;
     }
    if(dev)
      break;
   }
  if(!dev){
    ShowMessage("找不到USB设备!");
    usbhandle=NULL;
    return 1;
  }
  usbhandle = usb_open(dev);
  if(!usbhandle){
    ShowMessage("不能打开USB!");
    usbhandle=NULL;
    return 2;
  }
  return 0;
}
5、使用函数 usb_control_msg进行数据传输
6、使用函数usb_close关闭USB

出0入0汤圆

发表于 2007-12-31 20:54:19 | 显示全部楼层
再顶。太感谢你了。

出0入0汤圆

发表于 2008-1-2 13:07:55 | 显示全部楼层
我大体看了你的两个程序.上位机程序看得基本没问题。下位机程序有点不明白。
1.在主函数里只调用usbPoll(),好像没有其他处理。我不知道什么时候执行usbFunctionSetup、usbFunctionRead函数。麻烦搂主明示。
2.你的上位机程序修改下是否可用于PDIUSBD12系统的上位机?

出0入0汤圆

 楼主| 发表于 2008-1-2 16:24:15 | 显示全部楼层
如果PC发给MCU不是标准命令,则该命令由usbFunctionSetup函数处理,如果usbFunctionSetup直接能处理的(完成数据读写),则就返回处理数据的个数,如果usbFunctionSetup不能直接处理的(数据量太大),返回0XFF,则由usbFunctionRead或usbFunctionWrite处理.

出0入0汤圆

发表于 2008-1-2 21:39:16 | 显示全部楼层
libusb-win32是个不错的东西.用它开发太方便了。接下来我用它来给我的PDIUSBD12系统做个上位机软件。

出0入0汤圆

发表于 2008-1-5 10:31:23 | 显示全部楼层
呵呵,我最近也在搞这个东西,不过上位机是vc++编译的,源代码在我的博客上有http://nilau.21ic.org,可供朋友们参考

出0入0汤圆

发表于 2008-1-11 11:14:40 | 显示全部楼层
驱动程序是怎么生成的?你下载一个libusb-win32,里面有inf-wizard.exe这个程序就会引导你一步一步建立inf文件,你只是需要注意PID和VID就可以。然后将里面的libusb0.dll,libusb0.sys拷到一起。当你插入硬件时候,按安装程序提示选择inf文件就可以安装了 。
我提供libusb-win32给你吧:
点击此处下载ourdev_195812.rar(文件大小:111K)


大哥你这附件,我的卡巴有报警啊......

是怎么回事情啊?

出0入0汤圆

发表于 2008-1-11 11:17:00 | 显示全部楼层
还有就是楼主发的上位机软件在我的电脑上怎么没有办法运行?
总是提示:没有找到VCL60.BPL.因此这个应用程序未能启动

出0入0汤圆

 楼主| 发表于 2008-1-11 11:18:24 | 显示全部楼层
我的机器增经中过威金

出0入0汤圆

发表于 2008-1-11 14:49:31 | 显示全部楼层
不是吧
现在还有病毒呢?!!
本来我想下你的附件,可是现在不敢下了。。

出0入0汤圆

发表于 2008-1-11 14:59:54 | 显示全部楼层
我下载了没有问题呀

出0入0汤圆

发表于 2008-1-15 15:09:43 | 显示全部楼层
我上传一个没病毒的。
点击此处下载ourdev_201673.rar(文件大小:107K)

出0入0汤圆

发表于 2008-1-16 13:14:25 | 显示全部楼层
25楼的兄弟,您的博客http://nilau.21ic.org上不了啊

出0入70汤圆

发表于 2008-1-16 16:31:37 | 显示全部楼层
不错

出0入0汤圆

发表于 2008-1-16 18:04:11 | 显示全部楼层
25楼的兄弟,您的博客http://nilau.21ic.org,的确上不了啊 !?

出0入0汤圆

发表于 2008-1-16 19:43:56 | 显示全部楼层
楼主,我用您的方法生成了一个驱动程序,VID和PID已修改.驱动安装成功后,运行你的上位机软件,说找不到USB设备.是不是哪里还要改下啊?
还有我看了你在网站上发的别的几个USBAVR小项目,驱动程序也是不通用的.应该是通用的吧? 请楼主明示.
楼主能不能在你的个人资料你留个EMAIL呢?

出0入0汤圆

发表于 2008-1-16 19:59:56 | 显示全部楼层
收藏,谢谢!

出0入0汤圆

发表于 2008-1-18 14:42:51 | 显示全部楼层
我现在可以控制传输了。原来是LIBUSB版本的问题。

但是现在又又一个问题,我下位机通过端点2发送数据,我上位机怎么接收数据啊?我用usb_bulk_read函数接收,接到的全是0.

出0入0汤圆

发表于 2008-1-22 16:14:55 | 显示全部楼层
抱歉32楼和34楼的兄弟,地址改了http://ppwork.21ic.org

出0入0汤圆

发表于 2008-1-23 15:21:39 | 显示全部楼层
hao   记号

出0入0汤圆

发表于 2008-2-6 09:49:15 | 显示全部楼层
thank  a   lot!!!!

出0入0汤圆

发表于 2008-2-6 10:01:45 | 显示全部楼层
好东西!

出0入0汤圆

发表于 2008-2-10 09:13:28 | 显示全部楼层
顶一下~不错~顺路问一下,用VC和winavr怎么掺到一块儿的~

出300入0汤圆

发表于 2008-2-11 01:12:57 | 显示全部楼层
这个东西好像很有意思,学习了!

出0入0汤圆

发表于 2008-2-11 09:31:44 | 显示全部楼层
都是牛人,谢谢!

出0入0汤圆

发表于 2008-2-11 13:03:15 | 显示全部楼层
顶,慢慢研究

出0入0汤圆

发表于 2008-2-14 13:07:48 | 显示全部楼层
牛极了!!

出0入0汤圆

发表于 2008-2-14 22:56:03 | 显示全部楼层
太好了,谢谢

出0入0汤圆

发表于 2008-2-15 09:21:00 | 显示全部楼层
非常感谢楼主!再顶你。我现正在研究你的代码呢。libusb-win32也可以用于普通的USB吧。

出0入0汤圆

发表于 2008-2-15 13:42:30 | 显示全部楼层
我用瑞星杀了一下,还真有病毒。

出0入0汤圆

发表于 2008-5-7 09:48:49 | 显示全部楼层
谁能提供个avrusb下位机源码给我?

出0入0汤圆

发表于 2008-5-7 09:54:52 | 显示全部楼层
记号

出0入0汤圆

发表于 2008-5-7 10:24:00 | 显示全部楼层
楼主大哥,请问您的 AVRUSB_ADC.exe  怎么打不开?

如果没有安装USBASP就打不开,还是其他原因?等待答复。。

出0入42汤圆

发表于 2008-5-7 14:21:14 | 显示全部楼层
记号

出0入0汤圆

 楼主| 发表于 2008-5-7 16:19:43 | 显示全部楼层
to:wisebaby 明君
如果没有安装USBASP,AVRUSB_ADC.exe能够运行?你可以对比一下嘛,反正安装USBASP驱动程序不是什么难事情。

出0入0汤圆

发表于 2008-5-7 16:35:37 | 显示全部楼层
好贴,学习。

出0入0汤圆

发表于 2008-5-7 23:16:44 | 显示全部楼层
必须MARK

出0入0汤圆

发表于 2008-6-11 22:12:42 | 显示全部楼层
酷~ 学习 ^_^

出0入0汤圆

发表于 2008-6-21 00:09:41 | 显示全部楼层
记之,学之。

出0入0汤圆

发表于 2008-6-21 13:04:58 | 显示全部楼层
学习学习,刚好还有两块usbasp的板,刚好用上了。本想看能否找到用这个板做usb转串口的呢!

出0入0汤圆

发表于 2008-10-14 11:04:06 | 显示全部楼层
正在找这方面的资料那!!谢谢!!

出10入0汤圆

发表于 2008-10-14 16:43:15 | 显示全部楼层
谢谢!!!

出0入0汤圆

发表于 2008-10-14 17:19:58 | 显示全部楼层
谢谢!!!

出0入0汤圆

发表于 2008-10-14 18:29:39 | 显示全部楼层
mark

出0入0汤圆

发表于 2008-10-14 18:31:29 | 显示全部楼层
这两天正在看, 被楼主抢先了… 学习学习

出0入0汤圆

发表于 2008-10-14 20:50:17 | 显示全部楼层
记号

出0入0汤圆

发表于 2008-10-15 11:46:07 | 显示全部楼层
太好了,不过可执行文件缺少两个库,现传上。 缺少的库文件ourdev_455581.rar(文件大小:470K)&nbsp;<font color=green>(原文件名:缺少的库文件.rar)&nbsp;

出0入0汤圆

发表于 2008-10-15 12:51:15 | 显示全部楼层
我也正想做一个这样的东东。

出0入0汤圆

发表于 2008-10-15 17:37:55 | 显示全部楼层
楼主,&nbsp;看到你固件的主文件里有“痛苦啊,&nbsp;他妈妈的……”注释,
其实在C语言里可以直接&nbsp;return&nbsp;ADC;&nbsp;不需要先读低位再读高位。

出0入0汤圆

发表于 2008-10-25 10:38:47 | 显示全部楼层
【13楼】&nbsp;lzf713&nbsp;&nbsp;
楼主,你上传的文件有毒呀...Win32.Loader.c<fontcolor=#699bcd>本贴被 huike_h
编辑过,最后修改时间:2008-10-25,10:46:21.

出0入0汤圆

发表于 2008-10-25 14:39:40 | 显示全部楼层
记号,,,

出0入0汤圆

发表于 2008-10-25 21:14:49 | 显示全部楼层
要顶

出0入0汤圆

发表于 2008-10-26 12:00:21 | 显示全部楼层
收了

出0入0汤圆

发表于 2008-10-27 10:14:27 | 显示全部楼层
顶,正在学习VB写USB的上位机

出0入0汤圆

发表于 2008-10-28 19:25:38 | 显示全部楼层
&nbsp;<font color=green>(原文件名:queshao.JPG)&nbsp;楼主,还缺少这个文件啊,我现在没装VC啊!!麻烦发这个文件出来

出0入0汤圆

发表于 2008-10-28 19:33:23 | 显示全部楼层
BCB6编译出来的程序在没装BCB的机器上不能运行,缺VCL60.bpl
[转贴]一个问过100遍啊100遍的问题&nbsp;&nbsp; CB的完全编译问题,大概是初学BCB的朋友们问的最多的问题。
症状就是编译好的Exe程序拷到没有安装BCB的机器上运行会提示找不到xx库之类的,解决方法:
在project-&gt;Options-&gt;Compiler中点击Release,&nbsp;
在project-&gt;Options-&gt;Packages中取消Builder&nbsp;with&nbsp;runtime&nbsp;packages的对钩
在project-&gt;Options-&gt;Linker中取消Use&nbsp;dynamic&nbsp;RTL前的对钩
这问题我回答过NN次了,实在懒的打字,写到这里用的时候好copy&amp;paste。&nbsp;

出0入0汤圆

发表于 2008-11-3 13:25:44 | 显示全部楼层
记号了

出0入0汤圆

发表于 2008-11-3 14:58:13 | 显示全部楼层
mark&nbsp;~

出0入0汤圆

发表于 2008-11-3 16:30:33 | 显示全部楼层
赞一个&nbsp;&nbsp;&nbsp;&nbsp;

出0入0汤圆

发表于 2008-11-4 17:09:20 | 显示全部楼层
LZ的上位机开启ADC转换后,软件好像变得很迟钝,特别是拖动窗体时,一卡一卡的。是不是软USB通信速度太慢了?

出0入0汤圆

发表于 2008-11-4 17:20:34 | 显示全部楼层
太强了,有很多的应用之处

出0入0汤圆

发表于 2008-11-4 21:09:27 | 显示全部楼层
没人回答,自己顶一下!

出0入0汤圆

发表于 2008-11-11 22:58:55 | 显示全部楼层
adcdata_temp[currenp]=ADCL;//痛苦呀,他妈妈的,必须先读低位,这个差点就让我发疯了

看&nbsp;lzf713&nbsp;&nbsp;源码有感!



也差点也让我发疯啊,

先读ADCH&nbsp;输入&nbsp;模拟数据不会变化,只有重启时才能&nbsp;&nbsp;读到&nbsp;输入的模拟量,

搞了&nbsp;半天,原来是这个原因!!!!!!!!!!!

出0入0汤圆

发表于 2008-12-24 11:55:10 | 显示全部楼层
请问,缺的那个库放哪才好使

出0入0汤圆

发表于 2008-12-24 21:19:21 | 显示全部楼层
顶了,正是我需要的东东哦,

出0入0汤圆

发表于 2009-1-8 16:57:59 | 显示全部楼层
迷惑ing.....

出0入0汤圆

发表于 2009-1-8 17:07:57 | 显示全部楼层
顶顶顶,必须顶

出0入0汤圆

发表于 2009-1-8 18:17:22 | 显示全部楼层
非常好,我试过了

出0入0汤圆

发表于 2009-1-9 11:10:06 | 显示全部楼层
原理图:&nbsp;

点击此处下载ourdev_192212.rar(文件大小:4K)&nbsp;

=================================================

为什么包内没有扩展名?!重新下载几次都是一样!

出0入0汤圆

发表于 2009-1-9 11:15:15 | 显示全部楼层
哈哈,增加sch扩展名就可以了。

出0入0汤圆

发表于 2009-1-10 11:13:57 | 显示全部楼层
为什么我电脑不用安装驱动,系统自己安上了?!

把那缺少的两个文件拷贝到exe那里还是不行,好像dll名称不对!

出0入0汤圆

发表于 2009-1-15 11:02:55 | 显示全部楼层
ourdev_195812.rar(文件大小:111K)&nbsp;有毒!!

出0入0汤圆

发表于 2009-2-6 13:13:51 | 显示全部楼层
楼主能不能把AVRUSB改成HID类的设备,免驱很方便。正在想做一个基于HID类数据采集的演示。另:如果改成HID会不会影响ADC的采样频率?

出0入0汤圆

发表于 2009-2-6 13:27:28 | 显示全部楼层
AVR-USB已更新至:avrusb-20081126.zip下载地址:http://www.obdev.at/products/avrusb/download.html更新内容如下:Release&nbsp;2008-11-26Fixed&nbsp;assembler&nbsp;code&nbsp;in&nbsp;example&nbsp;code&nbsp;osctune.h.&nbsp;Previous&nbsp;version&nbsp;did&nbsp;not&nbsp;work&nbsp;when&nbsp;the&nbsp;OSCCAL&nbsp;register&nbsp;was&nbsp;outside&nbsp;the&nbsp;I/O&nbsp;addressable&nbsp;range.&nbsp;Code&nbsp;can&nbsp;now&nbsp;be&nbsp;licensed&nbsp;under&nbsp;GPL&nbsp;version&nbsp;3&nbsp;or&nbsp;version&nbsp;2,&nbsp;it's&nbsp;your&nbsp;choice.&nbsp;Release&nbsp;2008-10-22Fixed&nbsp;bug&nbsp;in&nbsp;libs-host/hiddata.c&nbsp;function&nbsp;usbhidGetReport().&nbsp;Fixed&nbsp;bug&nbsp;with&nbsp;long&nbsp;transfers&nbsp;(above&nbsp;254&nbsp;bytes&nbsp;total).&nbsp;AVR's&nbsp;internal&nbsp;RC&nbsp;oscillator&nbsp;is&nbsp;now&nbsp;supported&nbsp;at&nbsp;12.8&nbsp;MHz.&nbsp;Added&nbsp;hook&nbsp;to&nbsp;SOF&nbsp;code&nbsp;so&nbsp;that&nbsp;oscillator&nbsp;can&nbsp;be&nbsp;tuned&nbsp;to&nbsp;USB&nbsp;frame&nbsp;clock.&nbsp;Added&nbsp;example&nbsp;code&nbsp;for&nbsp;oscillator&nbsp;tuning&nbsp;to&nbsp;libs-device.&nbsp;New&nbsp;options&nbsp;USB_CFG_CHECK_DATA_TOGGLING&nbsp;and&nbsp;USB_CFG_SUPPRESS_INTR_CODE.&nbsp;Use&nbsp;control&nbsp;transfer&nbsp;recipient&nbsp;"device"&nbsp;instead&nbsp;of&nbsp;"interface"&nbsp;in&nbsp;HID&nbsp;examples.&nbsp;Fixed&nbsp;USB&nbsp;Reset&nbsp;detection&nbsp;for&nbsp;high&nbsp;speed&nbsp;CPU&nbsp;clocks.&nbsp;Added&nbsp;timeout&nbsp;to&nbsp;waitForJ&nbsp;loop.&nbsp;Helps&nbsp;preventing&nbsp;unexpected&nbsp;hangs.&nbsp;Code&nbsp;size&nbsp;optimizations.&nbsp;Release&nbsp;2008-05-13New&nbsp;configuration&nbsp;option&nbsp;USB_CFG_LONG_TRANSFERS&nbsp;for&nbsp;transfer&nbsp;sizes&nbsp;above&nbsp;254&nbsp;bytes.&nbsp;Added&nbsp;support&nbsp;for&nbsp;20&nbsp;MHz&nbsp;CPU&nbsp;clock,&nbsp;the&nbsp;assembler&nbsp;module&nbsp;was&nbsp;contributed&nbsp;by&nbsp;Jeroen&nbsp;Benschop.&nbsp;Better&nbsp;code&nbsp;size&nbsp;optimization&nbsp;with&nbsp;gcc&nbsp;4.&nbsp;Restructured&nbsp;usbdrv.c&nbsp;so&nbsp;that&nbsp;it&nbsp;is&nbsp;easier&nbsp;to&nbsp;read&nbsp;and&nbsp;understand.&nbsp;Built-in&nbsp;configuration&nbsp;descriptor&nbsp;allows&nbsp;up&nbsp;to&nbsp;two&nbsp;interrupt-in&nbsp;endpoints&nbsp;now.&nbsp;Release&nbsp;2008-04-18USB_INITIAL_DATATOKEN&nbsp;defaults&nbsp;to&nbsp;USBPID_DATA1&nbsp;now,&nbsp;which&nbsp;means&nbsp;that&nbsp;we&nbsp;begin&nbsp;interrupts&nbsp;transfers&nbsp;with&nbsp;USBPID_DATA0.&nbsp;Changed&nbsp;defaults&nbsp;in&nbsp;usbconfig-prototype.h&nbsp;(is&nbsp;now&nbsp;an&nbsp;example&nbsp;for&nbsp;a&nbsp;custom&nbsp;class&nbsp;device).&nbsp;Added&nbsp;free&nbsp;USB&nbsp;VID/PID&nbsp;pair&nbsp;for&nbsp;MIDI&nbsp;class&nbsp;devices.&nbsp;Restructured&nbsp;AVR-USB&nbsp;as&nbsp;separate&nbsp;package,&nbsp;not&nbsp;part&nbsp;of&nbsp;PowerSwitch&nbsp;any&nbsp;more.&nbsp;Release&nbsp;2008-02-28Added&nbsp;hooks&nbsp;so&nbsp;that&nbsp;application&nbsp;firmware&nbsp;can&nbsp;be&nbsp;informed&nbsp;about&nbsp;USB&nbsp;reset&nbsp;and&nbsp;address&nbsp;assignment.&nbsp;Added&nbsp;optional&nbsp;routine&nbsp;usbMeasureFrameLength()&nbsp;which&nbsp;can&nbsp;be&nbsp;used&nbsp;to&nbsp;calibrate&nbsp;the&nbsp;AVR's&nbsp;internal&nbsp;RC&nbsp;oscillator&nbsp;based&nbsp;on&nbsp;the&nbsp;USB&nbsp;frame&nbsp;time.&nbsp;Release&nbsp;2008-02-16Fixed&nbsp;a&nbsp;bug&nbsp;in&nbsp;16.5&nbsp;MHz&nbsp;module&nbsp;where&nbsp;interrupt&nbsp;handler&nbsp;modified&nbsp;a&nbsp;register&nbsp;before&nbsp;it&nbsp;was&nbsp;pushed.&nbsp;This&nbsp;bug&nbsp;was&nbsp;introduced&nbsp;with&nbsp;code&nbsp;restructuring&nbsp;in&nbsp;version&nbsp;2007-12-01.&nbsp;Optimized&nbsp;CRC&nbsp;computation&nbsp;(saved&nbsp;a&nbsp;couple&nbsp;of&nbsp;bytes&nbsp;in&nbsp;code&nbsp;size).&nbsp;Release&nbsp;2008-02-05Fixed&nbsp;bug&nbsp;in&nbsp;15&nbsp;and&nbsp;16&nbsp;MHz&nbsp;module&nbsp;which&nbsp;caused&nbsp;USB&nbsp;enumeration&nbsp;to&nbsp;fail&nbsp;on&nbsp;some&nbsp;hosts.&nbsp;Release&nbsp;2008-01-21Renamed&nbsp;all&nbsp;include-only&nbsp;assembler&nbsp;files&nbsp;from&nbsp;*.S&nbsp;to&nbsp;*.inc&nbsp;so&nbsp;that&nbsp;users&nbsp;don't&nbsp;accidentally&nbsp;link&nbsp;them.&nbsp;Distribute&nbsp;leap&nbsp;bits&nbsp;more&nbsp;evenly&nbsp;in&nbsp;transmit&nbsp;loop&nbsp;of&nbsp;16&nbsp;MHz&nbsp;module.&nbsp;

本贴被 aduc812 编辑过,最后修改时间:2009-02-06,13:28:10.

出0入0汤圆

 楼主| 发表于 2009-2-6 14:53:12 | 显示全部楼层
HID类的设备的描述符我搞不明白,所以我无法实现你提出的要求。

出0入0汤圆

发表于 2009-2-6 16:47:05 | 显示全部楼层
感谢楼主分享!

出0入4汤圆

发表于 2009-2-6 20:49:58 | 显示全部楼层
把lz的可执行文件所缺的支持库打包上传,测试可以执行。上位机执行程序.rarourdev_612651.rar(文件大小:896K)&nbsp;(原文件名:上位机执行程序.rar)&nbsp;

出0入0汤圆

发表于 2009-2-6 22:02:12 | 显示全部楼层
The&nbsp;HID&nbsp;Page:http://www.lvr.com/hidpage.htmcomputer00的《USB&nbsp;HID报告及报告描述符简介》:http://group.ednchina.com/93/198.aspxUSB&nbsp;HID设备驱动程序设计:http://www.airain.net.cn/post/46.html========================把computer00的转载到这里:在USB中,USB&nbsp;HOST是通过各种描述符来识别设备的,有设备描述符,配置描述符,接口描述符,端点描述符,字符串描述符,报告描述符等等。USB报告描述符(Report&nbsp;Descriptor)是HID设备中的一个描述符,它是比较复杂的一个描述符。&nbsp;&nbsp;&nbsp;&nbsp;USB&nbsp;HID设备是通过报告来给传送数据的,报告有输入报告和输出报告。输入报告是USB设备发送给主机的,例如USB鼠标将鼠标移动和鼠标点击等信息返回给电脑,键盘将按键数据数据返回给电脑等;输出报告是主机发送给USB设备的,例如键盘上的数字键盘锁定灯和大写字母锁定灯等。报告是一个数据包,里面包含的是所要传送的数据。输入报告是通过中断输入端点输入的,而输出报告有点区别,当没有中断输出端点时,可以通过控制输出端点0发送,当有中断输出端点时,通过中断输出端点发出。&nbsp;&nbsp;&nbsp;&nbsp;而报告描述符,是描述一个报告以及报告里面的数据是用来干什么用的。通过它,USB&nbsp;HOST可以分析出报告里面的数据所表示的意思。它通过控制输入端点0返回,主机使用获取报告描述符命令来获取报告描述符,注意这个请求是发送到接口的,而不是到设备。一个报告描述符可以描述多个报告,不同的报告通过报告ID来识别,报告ID在报告最前面,即第一个字节。当报告描述符中没有规定报告ID时,报告中就没有ID字段,开始就是数据。更详细的说明请参看USB&nbsp;HID协议,该协议可从Http://www.usb.org下载。&nbsp;&nbsp;&nbsp;&nbsp;USB报告描述符可以通过使用HID&nbsp;Descriptor&nbsp;tool来生成,这个工具可以到Http://www.usb.org下载,为了方便大家,我顺便上传了一份。http://www.ednchina.com/Upload/Blog/2007/4/2/af7c3443-ad61-4465-adc7-a74d28bbc322.zip&nbsp;&nbsp;&nbsp;&nbsp;下面通过由HID&nbsp;Descriptor&nbsp;tool生成的USB鼠标和USB键盘来说明一下报告描述符和报告。code&nbsp;char&nbsp;KeyBoardReportDescriptor[63]&nbsp;=&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;//表示用途页为通用桌面设备&nbsp;&nbsp;&nbsp;&nbsp;0x05,&nbsp;0x01,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;USAGE_PAGE&nbsp;(Generic&nbsp;Desktop)&nbsp;&nbsp;&nbsp;&nbsp;//表示用途为键盘&nbsp;&nbsp;&nbsp;&nbsp;0x09,&nbsp;0x06,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;USAGE&nbsp;(Keyboard)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//表示应用集合,必须要以END_COLLECTION来结束它,见最后的END_COLLECTION&nbsp;&nbsp;&nbsp;&nbsp;0xa1,&nbsp;0x01,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;COLLECTION&nbsp;(Application)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//表示用途页为按键&nbsp;&nbsp;&nbsp;&nbsp;0x05,&nbsp;0x07,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;USAGE_PAGE&nbsp;(Keyboard)&nbsp;&nbsp;&nbsp;&nbsp;//用途最小值,这里为左ctrl键&nbsp;&nbsp;&nbsp;&nbsp;0x19,&nbsp;0xe0,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;USAGE_MINIMUM&nbsp;(Keyboard&nbsp;LeftControl)&nbsp;&nbsp;&nbsp;&nbsp;//用途最大值,这里为右GUI键,即window键&nbsp;&nbsp;&nbsp;&nbsp;0x29,&nbsp;0xe7,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;USAGE_MAXIMUM&nbsp;(Keyboard&nbsp;Right&nbsp;GUI)&nbsp;&nbsp;&nbsp;&nbsp;//逻辑最小值为0&nbsp;&nbsp;&nbsp;&nbsp;0x15,&nbsp;0x00,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;LOGICAL_MINIMUM&nbsp;(0)&nbsp;&nbsp;&nbsp;&nbsp;//逻辑最大值为1&nbsp;&nbsp;&nbsp;&nbsp;0x25,&nbsp;0x01,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;LOGICAL_MAXIMUM&nbsp;(1)&nbsp;&nbsp;&nbsp;&nbsp;//报告大小(即这个字段的宽度)为1bit,所以前面的逻辑最小值为0,逻辑最大值为1&nbsp;&nbsp;&nbsp;&nbsp;0x75,&nbsp;0x01,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;REPORT_SIZE&nbsp;(1)&nbsp;&nbsp;&nbsp;&nbsp;//报告的个数为8,即总共有8个bits&nbsp;&nbsp;&nbsp;&nbsp;0x95,&nbsp;0x08,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;REPORT_COUNT&nbsp;(8)&nbsp;&nbsp;&nbsp;&nbsp;//输入用,变量,值,绝对值。像键盘这类一般报告绝对值,&nbsp;&nbsp;&nbsp;&nbsp;//而鼠标移动这样的则报告相对值,表示鼠标移动多少&nbsp;&nbsp;&nbsp;&nbsp;0x81,&nbsp;0x02,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;INPUT&nbsp;(Data,Var,Abs)&nbsp;&nbsp;&nbsp;&nbsp;//上面这这几项描述了一个输入用的字段,总共为8个bits,每个bit表示一个按键&nbsp;&nbsp;&nbsp;&nbsp;//分别从左ctrl键到右GUI键。这8个bits刚好构成一个字节,它位于报告的第一个字节。&nbsp;&nbsp;&nbsp;&nbsp;//它的最低位,即bit-0对应着左ctrl键,如果返回的数据该位为1,则表示左ctrl键被按下,&nbsp;&nbsp;&nbsp;&nbsp;//否则,左ctrl键没有按下。最高位,即bit-7表示右GUI键的按下情况。中间的几个位,&nbsp;&nbsp;&nbsp;&nbsp;//需要根据HID协议中规定的用途页表(HID&nbsp;Usage&nbsp;Tables)来确定。这里通常用来表示&nbsp;&nbsp;&nbsp;&nbsp;//特殊键,例如ctrl,shift,del键等&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//这样的数据段个数为1&nbsp;&nbsp;&nbsp;&nbsp;0x95,&nbsp;0x01,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;REPORT_COUNT&nbsp;(1)&nbsp;&nbsp;&nbsp;&nbsp;//每个段长度为8bits&nbsp;&nbsp;&nbsp;&nbsp;0x75,&nbsp;0x08,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;REPORT_SIZE&nbsp;(8)&nbsp;&nbsp;&nbsp;&nbsp;//输入用,常量,值,绝对值&nbsp;&nbsp;&nbsp;&nbsp;0x81,&nbsp;0x03,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;INPUT&nbsp;(Cnst,Var,Abs)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//上面这8个bit是常量,设备必须返回0&nbsp;&nbsp;&nbsp;&nbsp;//这样的数据段个数为5&nbsp;&nbsp;&nbsp;&nbsp;0x95,&nbsp;0x05,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;REPORT_COUNT&nbsp;(5)&nbsp;&nbsp;&nbsp;&nbsp;//每个段大小为1bit&nbsp;&nbsp;&nbsp;&nbsp;0x75,&nbsp;0x01,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;REPORT_SIZE&nbsp;(1)&nbsp;&nbsp;&nbsp;&nbsp;//用途是LED,即用来控制键盘上的LED用的,因此下面会说明它是输出用&nbsp;&nbsp;&nbsp;&nbsp;0x05,&nbsp;0x08,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;USAGE_PAGE&nbsp;(LEDs)&nbsp;&nbsp;&nbsp;&nbsp;//用途最小值是Num&nbsp;Lock,即数字键锁定灯&nbsp;&nbsp;&nbsp;&nbsp;0x19,&nbsp;0x01,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;USAGE_MINIMUM&nbsp;(Num&nbsp;Lock)&nbsp;&nbsp;&nbsp;&nbsp;//用途最大值是Kana,这个是什么灯我也不清楚^_^&nbsp;&nbsp;&nbsp;&nbsp;0x29,&nbsp;0x05,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;USAGE_MAXIMUM&nbsp;(Kana)&nbsp;&nbsp;&nbsp;&nbsp;//如前面所说,这个字段是输出用的,用来控制LED。变量,值,绝对值。&nbsp;&nbsp;&nbsp;&nbsp;//1表示灯亮,0表示灯灭&nbsp;&nbsp;&nbsp;&nbsp;0x91,&nbsp;0x02,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;OUTPUT&nbsp;(Data,Var,Abs)&nbsp;&nbsp;&nbsp;&nbsp;//这样的数据段个数为1&nbsp;&nbsp;&nbsp;&nbsp;0x95,&nbsp;0x01,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;REPORT_COUNT&nbsp;(1)&nbsp;&nbsp;&nbsp;&nbsp;//每个段大小为3bits&nbsp;&nbsp;&nbsp;&nbsp;0x75,&nbsp;0x03,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;REPORT_SIZE&nbsp;(3)&nbsp;&nbsp;&nbsp;&nbsp;//输出用,常量,值,绝对&nbsp;&nbsp;&nbsp;&nbsp;0x91,&nbsp;0x03,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;OUTPUT&nbsp;(Cnst,Var,Abs)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//由于要按字节对齐,而前面控制LED的只用了5个bit,&nbsp;&nbsp;&nbsp;&nbsp;//所以后面需要附加3个不用bit,设置为常量。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//报告个数为6&nbsp;&nbsp;&nbsp;&nbsp;0x95,&nbsp;0x06,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;REPORT_COUNT&nbsp;(6)&nbsp;&nbsp;&nbsp;&nbsp;//每个段大小为8bits&nbsp;&nbsp;&nbsp;&nbsp;0x75,&nbsp;0x08,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;REPORT_SIZE&nbsp;(8)&nbsp;&nbsp;&nbsp;&nbsp;//逻辑最小值0&nbsp;&nbsp;&nbsp;&nbsp;0x15,&nbsp;0x00,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;LOGICAL_MINIMUM&nbsp;(0)&nbsp;&nbsp;&nbsp;&nbsp;//逻辑最大值255&nbsp;&nbsp;&nbsp;&nbsp;0x25,&nbsp;0xFF,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;LOGICAL_MAXIMUM&nbsp;(255)&nbsp;&nbsp;&nbsp;&nbsp;//用途页为按键&nbsp;&nbsp;&nbsp;&nbsp;0x05,&nbsp;0x07,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;USAGE_PAGE&nbsp;(Keyboard)&nbsp;&nbsp;&nbsp;&nbsp;//使用最小值为0&nbsp;&nbsp;&nbsp;&nbsp;0x19,&nbsp;0x00,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;USAGE_MINIMUM&nbsp;(Reserved&nbsp;(no&nbsp;event&nbsp;indicated))&nbsp;&nbsp;&nbsp;&nbsp;//使用最大值为0x65&nbsp;&nbsp;&nbsp;&nbsp;0x29,&nbsp;0x65,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;USAGE_MAXIMUM&nbsp;(Keyboard&nbsp;Application)&nbsp;&nbsp;&nbsp;&nbsp;//输入用,变量,数组,绝对值&nbsp;&nbsp;&nbsp;&nbsp;0x81,&nbsp;0x00,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;INPUT&nbsp;(Data,Ary,Abs)&nbsp;&nbsp;&nbsp;&nbsp;//以上定义了6个8bit宽的数组,每个8bit(即一个字节)用来表示一个按键,所以可以同时&nbsp;&nbsp;&nbsp;&nbsp;//有6个按键按下。没有按键按下时,全部返回0。如果按下的键太多,导致键盘扫描系统&nbsp;&nbsp;&nbsp;&nbsp;//无法区分按键时,则全部返回0x01,即6个0x01。如果有一个键按下,则这6个字节中的第一&nbsp;&nbsp;&nbsp;&nbsp;//个字节为相应的键值(具体的值参看HID&nbsp;Usage&nbsp;Tables),如果两个键按下,则第1、2两个&nbsp;&nbsp;&nbsp;&nbsp;//字节分别为相应的键值,以次类推。&nbsp;&nbsp;&nbsp;&nbsp;//关集合,跟上面的对应&nbsp;&nbsp;&nbsp;&nbsp;0xc0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;END_COLLECTION};&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;通过上面的分析,我们知道这个报告中只有一个报告,所以没有报告ID,因此返回的都是实际使用的数据。总共有8字节输入,1字节输出。其中输入的第一字节用来表示特殊按键,第二字节保留,后面的六字节为普通按键。如果只有左ctrl键按下,则返回01&nbsp;00&nbsp;00&nbsp;00&nbsp;00&nbsp;00&nbsp;00&nbsp;00(十六进制),如果只有数字键1&nbsp;按下,则返回00&nbsp;00&nbsp;59&nbsp;00&nbsp;00&nbsp;00&nbsp;00&nbsp;00,如果数字键1&nbsp;和2&nbsp;同时按下,则返回00&nbsp;00&nbsp;59&nbsp;5A&nbsp;00&nbsp;00&nbsp;00&nbsp;00,如果再按下左shift&nbsp;键,则返回02&nbsp;00&nbsp;59&nbsp;5A&nbsp;00&nbsp;00&nbsp;00&nbsp;00,然后再释放1&nbsp;&nbsp;&nbsp;键,则返回02&nbsp;00&nbsp;5A&nbsp;00&nbsp;00&nbsp;00&nbsp;00&nbsp;00,然后全部按键释放,则返回00&nbsp;00&nbsp;00&nbsp;00&nbsp;00&nbsp;00&nbsp;00&nbsp;00。这些数据(即报告)都是通过中断端点返回的。当按下Num&nbsp;Lock键时,PC会发送输出报告,从报告描述符中我们知道,Num&nbsp;Lock的LED对应着输出报告的最低位,当数字小键盘打开时,输出xxxxxxx1(二进制,打x的由其它的LED状态决定);当数字小键盘关闭时,输出xxxxxxx0(同前)。取出最低位就可以控制数字键锁定LED了。&nbsp;下面这个报告描述符是USB鼠标报告描述符,比起键盘的来说要简单些。它描述了4个字节,第一个字节表示按键,第二个字节表示x轴(即鼠标左右移动,0表示不动,正值表示往右移,负值表示往左移),第三个字节表示y轴(即鼠标上下移动,0表示不动,正值表示往下移动,负值表示往上移动),第四个字节表示鼠标滚轮(正值为往上滚动,负值为往下滚动)。code&nbsp;char&nbsp;MouseReportDescriptor[52]&nbsp;=&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;//通用桌面设备&nbsp;&nbsp;&nbsp;&nbsp;0x05,&nbsp;0x01,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;USAGE_PAGE&nbsp;(Generic&nbsp;Desktop)&nbsp;&nbsp;&nbsp;&nbsp;//鼠标&nbsp;&nbsp;&nbsp;&nbsp;0x09,&nbsp;0x02,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;USAGE&nbsp;(Mouse)&nbsp;&nbsp;&nbsp;&nbsp;//集合&nbsp;&nbsp;&nbsp;&nbsp;0xa1,&nbsp;0x01,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;COLLECTION&nbsp;(Application)&nbsp;&nbsp;&nbsp;&nbsp;//指针设备&nbsp;&nbsp;&nbsp;&nbsp;0x09,&nbsp;0x01,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;USAGE&nbsp;(Pointer)&nbsp;&nbsp;&nbsp;&nbsp;//集合&nbsp;&nbsp;&nbsp;&nbsp;0xa1,&nbsp;0x00,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;COLLECTION&nbsp;(Physical)&nbsp;&nbsp;&nbsp;&nbsp;//按键&nbsp;&nbsp;&nbsp;&nbsp;0x05,&nbsp;0x09,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;USAGE_PAGE&nbsp;(Button)&nbsp;&nbsp;&nbsp;&nbsp;//使用最小值1&nbsp;&nbsp;&nbsp;&nbsp;0x19,&nbsp;0x01,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;USAGE_MINIMUM&nbsp;(Button&nbsp;1)&nbsp;&nbsp;&nbsp;&nbsp;//使用最大值3。1表示左键,2表示右键,3表示中键&nbsp;&nbsp;&nbsp;&nbsp;0x29,&nbsp;0x03,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;USAGE_MAXIMUM&nbsp;(Button&nbsp;3)&nbsp;&nbsp;&nbsp;&nbsp;//逻辑最小值0&nbsp;&nbsp;&nbsp;&nbsp;0x15,&nbsp;0x00,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LOGICAL_MINIMUM&nbsp;(0)&nbsp;&nbsp;&nbsp;&nbsp;//逻辑最大值1&nbsp;&nbsp;&nbsp;&nbsp;0x25,&nbsp;0x01,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LOGICAL_MAXIMUM&nbsp;(1)&nbsp;&nbsp;&nbsp;&nbsp;//数量为3&nbsp;&nbsp;&nbsp;&nbsp;0x95,&nbsp;0x03,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;REPORT_COUNT&nbsp;(3)&nbsp;&nbsp;&nbsp;&nbsp;//大小为1bit&nbsp;&nbsp;&nbsp;&nbsp;0x75,&nbsp;0x01,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;REPORT_SIZE&nbsp;(1)&nbsp;&nbsp;&nbsp;&nbsp;//输入,变量,数值,绝对值&nbsp;&nbsp;&nbsp;&nbsp;//以上3个bit分别表示鼠标的三个按键情况,最低位(bit-0)为左键&nbsp;&nbsp;&nbsp;&nbsp;//bit-1为右键,bit-2为中键,按下时对应的位值为1,释放时对应的值为0&nbsp;&nbsp;&nbsp;&nbsp;0x81,&nbsp;0x02,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;INPUT&nbsp;(Data,Var,Abs)&nbsp;&nbsp;&nbsp;&nbsp;//填充5个bit,补足一个字节&nbsp;&nbsp;&nbsp;&nbsp;0x95,&nbsp;0x01,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;REPORT_COUNT&nbsp;(1)&nbsp;&nbsp;&nbsp;&nbsp;0x75,&nbsp;0x05,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;REPORT_SIZE&nbsp;(5)&nbsp;&nbsp;&nbsp;&nbsp;0x81,&nbsp;0x03,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;INPUT&nbsp;(Cnst,Var,Abs)&nbsp;&nbsp;&nbsp;&nbsp;//用途页为通用桌面&nbsp;&nbsp;&nbsp;&nbsp;0x05,&nbsp;0x01,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;USAGE_PAGE&nbsp;(Generic&nbsp;Desktop)&nbsp;&nbsp;&nbsp;&nbsp;//用途为X&nbsp;&nbsp;&nbsp;&nbsp;0x09,&nbsp;0x30,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;USAGE&nbsp;(X)&nbsp;&nbsp;&nbsp;&nbsp;//用途为Y&nbsp;&nbsp;&nbsp;&nbsp;0x09,&nbsp;0x31,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;USAGE&nbsp;(Y)&nbsp;&nbsp;&nbsp;&nbsp;//用途为滚轮&nbsp;&nbsp;&nbsp;&nbsp;0x09,&nbsp;0x38,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;USAGE&nbsp;(Wheel)&nbsp;&nbsp;&nbsp;&nbsp;//逻辑最小值为-127&nbsp;&nbsp;&nbsp;&nbsp;0x15,&nbsp;0x81,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LOGICAL_MINIMUM&nbsp;(-127)&nbsp;&nbsp;&nbsp;&nbsp;//逻辑最大值为+127&nbsp;&nbsp;&nbsp;&nbsp;0x25,&nbsp;0x7f,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LOGICAL_MAXIMUM&nbsp;(127)&nbsp;&nbsp;&nbsp;&nbsp;//大小为8个bits&nbsp;&nbsp;&nbsp;&nbsp;0x75,&nbsp;0x08,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;REPORT_SIZE&nbsp;(8)&nbsp;&nbsp;&nbsp;&nbsp;//数量为3个,即分别代表x,y,滚轮&nbsp;&nbsp;&nbsp;&nbsp;0x95,&nbsp;0x03,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;REPORT_COUNT&nbsp;(3)&nbsp;&nbsp;&nbsp;&nbsp;//输入,变量,值,相对值&nbsp;&nbsp;&nbsp;&nbsp;0x81,&nbsp;0x06,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;INPUT&nbsp;(Data,Var,Rel)&nbsp;&nbsp;&nbsp;&nbsp;//关集合&nbsp;&nbsp;&nbsp;&nbsp;0xc0,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;END_COLLECTION&nbsp;&nbsp;&nbsp;&nbsp;0xc0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;END_COLLECTION};&nbsp;&nbsp;通过对上面的报告分析,我们知道报告返回4个字节,没有报告ID。如果鼠标左键按下,则返回01&nbsp;00&nbsp;00&nbsp;00(十六进制值),如果右键按下,则返回02&nbsp;00&nbsp;00&nbsp;00,如果中键按下,则返回04&nbsp;00&nbsp;00&nbsp;00,如果三个键同时按下,则返回07&nbsp;00&nbsp;00&nbsp;00。如果鼠标往右移动则第二字节返回正值,值越大移动速度越快。其它的类推。&nbsp;这里只对报告描述符做一个简单的介绍,更详细的资料请参看USB&nbsp;HID协议以及HID&nbsp;Usage&nbsp;Tables,可以从Http://www.usb.org下载。根据这个实际设计的USB键盘和USB鼠标:USB键盘:http://computer00.21ic.org/user1/2198/archives/2007/36484.htmlhttp://www.ednchina.com/blog/computer00/20134/message.aspxUSB鼠标:http://computer00.21ic.org/user1/2198/archives/2007/36520.htmlhttp://www.ednchina.com/blog/computer00/20135/message.aspx

出0入0汤圆

发表于 2009-2-11 18:43:15 | 显示全部楼层
请问熔丝咋配置啊?能给个图么??俺用ATMEGA16L替代(俺这儿ATMEGA8和16一个价。。都是16元:()俺刚学AVR,只是想尝试下。。。熔丝不会配。。

出0入0汤圆

发表于 2009-3-18 12:35:11 | 显示全部楼层
收藏,谢谢!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-28 01:54

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表