首 页文档资料下载资料维修视频包年699元
请登录  |  免费注册
当前位置:精通维修下载 > 文档资料 > 家电技术 > 单元电路介绍 > 其它电路
基于HID协议的USB人机交互设备的接口设计
来源:本站整理  作者:佚名  2011-02-28 09:46:24



    2 HID接口固件设计与实现

  该设备采用C8051F120微控制器和PDIUSBD12芯片来实现,如图3所示。

    因为PDIUSBD12的主端点(Endpoint2)具有64字节的双缓冲,能够提供比较高的速度,所以在端点描述符里把它配置为中断传输方式,而Endpoint1没有使用。PDIUSBD12通过中断触发CPU来响应主机的各种请求。

  此系统采用的USB协议版本是1.1,所以能够支持中断输出传输。为了让主机把设备识别为HID类别,定义设备接口描述符时类别这一字段的值必须设置为0x03(HID类别),这样主机就会继续请求获得设备的HID描述符和报告描述符。在主机Get_Descriptor请求中,当值字段的高位字节为0x21时,表示主机要求获得HID描述符;当值字段高字节为0x22时,就是主机要求获得报告描述符。对于报告描述符,可以参考HIDUsageTables规范。HIDDescriptorTool工具可以帮助建立和测试编写的报告描述符。这里定义了一个输入和输出64字节数据的报告描述符。

  codeunsignedcharszReport[]={

  0x06,0xA0,0xFF,//用法页(FFA0h,vendordefined)

  0x09,0x01,//用法(vendordefined)

  0xA1,0x01,//集合(ApplICaTION)

  0x09,0x02,//用法(vendordefined)

  0xA1,0x00,//集合(Physical)

  0x06,0xA1,0xFF,//用法页(vendordefined)

  //输入报告

  0x09,0x03,//用法(vendordefined)

  0x09,0x04,//用法(vendordefined)

  0x15,0x80,//逻辑最小值(0x80or-128)

  0x25,0x7F,//逻辑最大值(0x7For127)

  0x35,0x00,//物理最小值(0)

  0x45,0xFF,//物理最大值(255)

  0x75,0x08,//报告长度Reportsize(8位)

  0x95,0x40,//报告数值(64fiELDs)

  0x81,0x02,//输入(data,variable,absolute)

  //输出报告

  0x09,0x05,//用法(vendordefined)

  0x09,0x06,//用法(vendordefined)

  0x15,0x80,//逻辑最小值(0x80or-128)

  0x25,0x7F,//逻辑最大值(0x7For127)

  0x35,0x00,//物理最小值(0)

  0x45,0xFF,//物理最大值(255)

  0x75,0x08,//报告长度(8位)

  0x95,0x40,//报告数值(64fields)

  0x91,0x02,//输出(data,variable,absolute)

  0xC0,//集合结束(Physical)

  0xC0//集合结束(Application)

  };

  这样,后面数据的输入和输出都必须满足报告的格式才能够进行传输。

    3 应用程序设计实现

  Windows为应用程序访问HID设备提供了强大的支持,有一整套对HID设备进行访问的API。应用程序要访问设备就必须先枚举到设备,图4为应用程序枚举HID设备流程。

  枚举成功后根据返回的设备句柄,就可以用ReadFile和WriteFile来读写设备的数据了。这里采用异步方式来读写数据,这样不会发生读写时阻塞,提高了程序的效率。以下是异步方式读写设备的要点:

  ①为了实现异步访问设备,在CreateFile打开设备时必须使用FILE_FLAG_OVERLAPPED标志。

  ②打开设备成功后,使用CreateThread建立1个读设备线程。

  ③在这个线程中首先建立1个OVERLAPPED结构,并用CreateEvent函数初始化它的hEvent成员,这样就创建了1个事件对象。

  ④调用ReadFile函数,并传入这个结构。

  ⑤调用ReadFile后会立即返回,必须调用GetLaSTError获得出错码。如果为ERROR_IO_PENDING,说明此操作是在等待完成的;否则,说明调用出错。

  ⑥调用WaitForSingleObject等待hEvent事件的通知,并使此线程进入休眠状态。如果有数据发送到主机,读线程就会被激活。

  WriteFile的使用也同样要求异步操作,与ReadFile的使用差不多。

  这里要注意的是,在每次读写数据前都要先接收和发送1字节的PID标志,所以每次读写数据的时候都要多一个字节。比如,这里每次读写的是64字节数据,但是在这64字节之前必须放1字节的PID数据,所以是65字节。一般这个字节的值为0。

  4 小结

  充分利用PDIUSBD12主端口的双缓冲特性后,测试设备与PC间传输速度能达到8KB/s以上,对于一些传输数据量不大,速度要求不高,而又必须在短时间内做出响应的场合基本能够满足要求。在此基础上只要生成不同的报告描述符,就能开发出各种不同的嵌入式设备;而且这样的设备无需驱动,在插入PC后就能立刻开始工作,省去了安装驱动程序的过程,方便使用。

上一页  [1] [2] 

关键词:

文章评论评论内容只代表网友观点,与本站立场无关!

   评论摘要(共 0 条,得分 0 分,平均 0 分)
Copyright © 2007-2017 down.gzweix.Com. All Rights Reserved .
页面执行时间:17,328.13000 毫秒