9846|3

1万

帖子

16

TA的资源

版主

楼主
 

CH554评测:四,HID例程详解 [复制链接]

本帖最后由 ddllxxrr 于 2017-10-21 13:31 编辑

上次跑了一下HID实例CompatibilityHID,主要是枚举部分。并没有跑全
今天用一个USB HID调试器给它跑完。

在没跑之前,先介绍下USB的数据结构


端点描述符的结构

HID类描述符的结构



那么这些同本例的哪块对应呢?见下边:

  1. /*设备描述符*/
  2. UINT8C DevDesc[18] = {0x12,0x01,0x10,0x01,0x00,0x00,0x00,THIS_ENDP0_SIZE,
  3.                       0x31,0x51,0x07,0x20,0x00,0x00,0x00,0x00,
  4.                       0x00,0x01
  5.                      };
  6. UINT8C CfgDesc[41] =
  7. {
  8.     0x09,0x02,0x29,0x00,0x01,0x01,0x04,0xA0,0x23,               //配置描述符
  9.     0x09,0x04,0x00,0x00,0x02,0x03,0x00,0x00,0x05,               //接口描述符
  10.     0x09,0x21,0x00,0x01,0x00,0x01,0x22,0x22,0x00,               //HID类描述符
  11.     0x07,0x05,0x82,0x03,THIS_ENDP0_SIZE,0x00,0x18,              //端点描述符
  12.     0x07,0x05,0x02,0x03,THIS_ENDP0_SIZE,0x00,0x18,              //端点描述符
  13. };
  14. /*字符串描述符 略*/

  15. /*HID类报表描述符*/
  16. UINT8C HIDRepDesc[ ] =
  17. {
  18.     0x06, 0x00,0xff,
  19.     0x09, 0x01,
  20.     0xa1, 0x01,                                                   //集合开始
  21.     0x09, 0x02,                                                   //Usage Page  用法
  22.     0x15, 0x00,                                                   //Logical  Minimun
  23.     0x26, 0x00,0xff,                                              //Logical  Maximun
  24.     0x75, 0x08,                                                   //Report Size
  25.     0x95, THIS_ENDP0_SIZE,                                        //Report Counet
  26.     0x81, 0x06,                                                   //Input
  27.     0x09, 0x02,                                                   //Usage Page  用法
  28.     0x15, 0x00,                                                   //Logical  Minimun
  29.     0x26, 0x00,0xff,                                              //Logical  Maximun
  30.     0x75, 0x08,                                                   //Report Size
  31.     0x95, THIS_ENDP0_SIZE,                                        //Report Counet
  32.     0x91, 0x06,                                                   //Output
  33.     0xC0
  34. };
复制代码


报表描述符有注释,其它的我剖析如下:
注意:空格的是同下一个字节在一起的
设备描述符:
0x12:长度
0x01:描述符的类型
0x01:
0x00:USB的版本
0x00:设备所使用的类代码
0x00:设备所使用的子类代码
THis_ENDP0_SIZE:缓冲区大小
0x31:
0x51:厂商ID号
0x07:
0x20:产品ID号
0x00:设备ID号
0x00:无厂商字符串
0x00:厂商字符串索引值
0x00:设备序列号字符串索引值 
0x01:设备有多少种配置

配置描述符:
0x09:长度
0x02:描述符编码
0x29:
0x00:整个配置描述符的总长度
0x01:接口的数量
0x01:配置值
0x04:索引值
0xa0:描述设备的一些特性
0x23:设备从总线取得最大电流
接口描述符:
0x09:长度
0x04:描述符编码
0x00:接口编号
0x02:备用编号
0x03:
0x00:
0x00:类,子类,协议
0x05:字符串索引值
端点描述符:
0x07:长度
0x05:端点描述符代码05
0x82:表示端点地址:最高位D7为端点的传输方向D3-D0为端点号
0x03:表示传输类型:D1-D3:0:控制,1等时,3中断
This_ENDP0_SIZE:最大包长
0x00:
0x18:查询帧的间隔
HID描述符:
0x09:长度
0x21:HID描述符代码
0x08:
0x01:HID版本号
0x00:所适用国家
0x01:下一级描述符数量,最小1
0x22:下一级描述符类型0x22报告0x23物理
0x22:
0x00:下一级描术符长度

下边是用《单片机多功能调试助手》来调试这个例程的截图:


可见我发64个数后,HID单片机方面反回了64个数,怎么是这样我就不得而知:
从例程里是取反:
  1. case UIS_TOKEN_OUT | 2:                                                 //endpoint 2# 端点批量下传
  2.             if ( U_TOG_OK )                                                     // 不同步的数据包将丢弃
  3.             {
  4.                 len = USB_RX_LEN;                                               //接收数据长度,数据从Ep2Buffer首地址开始存放
  5.                 for ( i = 0; i < len; i ++ )
  6.                 {
  7.                     Ep2Buffer[MAX_PACKET_SIZE+i] = Ep2Buffer[i] ^ 0xFF;         // OUT数据取反到IN由计算机验证
  8.                 }
  9.                 UEP2_T_LEN = len;
  10.                 UEP2_CTRL = UEP2_CTRL & ~ MASK_UEP_T_RES | UEP_T_RES_ACK;       // 允许上传
  11.             }
  12.             break;
复制代码


好了这次到这里了,已经跑完整了该例程。

奥充补下:原因找到通过HOUND找到,原来没有点HEX发送

下边的截图是正确的:

此内容由EEWORLD论坛网友ddllxxrr原创,如需转载或用于商业用途需征得作者同意并注明出处



此帖出自单片机论坛

最新回复

这个流程不是很明白, 为什么单片机要主动发送Enp2BlukIn()?不是PC要什么才发什么吗?   详情 回复 发表于 2020-3-24 18:11
点赞 关注
个人签名http://shop34182318.taobao.com/
https://shop436095304.taobao.com/?spm=a230r.7195193.1997079397.37.69fe60dfT705yr
 

回复
举报

1万

帖子

2853

TA的资源

管理员

沙发
 
汇总贴在此:
CH554评测—by ddllxxrr
https://bbs.eeworld.com.cn/forum ... 7444&fromuid=536508
(出处: 电子工程世界-论坛)
此帖出自单片机论坛
加EE小助手好友,
入技术交流群
EE服务号
精彩活动e手掌握
EE订阅号
热门资讯e网打尽
聚焦汽车电子软硬件开发
认真关注技术本身
 
个人签名玩板看这里:
https://bbs.eeworld.com.cn/elecplay.html
EEWorld测评频道众多好板等你来玩,还可以来频道许愿树许愿说说你想要玩的板子,我们都在努力为大家实现!
 

回复

305

帖子

0

TA的资源

一粒金砂(高级)

板凳
 
CH554系列USB实用例程请参考:https://bbs.eeworld.com.cn/thread-571344-1-1.html
此帖出自单片机论坛
 
个人签名单价1元含税的USB和Touchkey单片机CH551G已大批量出货,试样QQ:1258305301
 
 

回复

30

帖子

0

TA的资源

一粒金砂(中级)

4
 

这个流程不是很明白,

为什么单片机要主动发送Enp2BlukIn()?不是PC要什么才发什么吗?

此帖出自单片机论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表