CH554评测:四,HID例程详解
<div class='showpostmsg'> 本帖最后由 ddllxxrr 于 2017-10-21 13:31 编辑上次跑了一下HID实例CompatibilityHID,主要是枚举部分。并没有跑全
今天用一个USB HID调试器给它跑完。
在没跑之前,先介绍下USB的数据结构
端点描述符的结构
HID类描述符的结构
那么这些同本例的哪块对应呢?见下边:
/*设备描述符*/
UINT8C DevDesc = {0x12,0x01,0x10,0x01,0x00,0x00,0x00,THIS_ENDP0_SIZE,
0x31,0x51,0x07,0x20,0x00,0x00,0x00,0x00,
0x00,0x01
};
UINT8C CfgDesc =
{
0x09,0x02,0x29,0x00,0x01,0x01,0x04,0xA0,0x23, //配置描述符
0x09,0x04,0x00,0x00,0x02,0x03,0x00,0x00,0x05, //接口描述符
0x09,0x21,0x00,0x01,0x00,0x01,0x22,0x22,0x00, //HID类描述符
0x07,0x05,0x82,0x03,THIS_ENDP0_SIZE,0x00,0x18, //端点描述符
0x07,0x05,0x02,0x03,THIS_ENDP0_SIZE,0x00,0x18, //端点描述符
};
/*字符串描述符 略*/
/*HID类报表描述符*/
UINT8C HIDRepDesc[ ] =
{
0x06, 0x00,0xff,
0x09, 0x01,
0xa1, 0x01, //集合开始
0x09, 0x02, //Usage Page用法
0x15, 0x00, //LogicalMinimun
0x26, 0x00,0xff, //LogicalMaximun
0x75, 0x08, //Report Size
0x95, THIS_ENDP0_SIZE, //Report Counet
0x81, 0x06, //Input
0x09, 0x02, //Usage Page用法
0x15, 0x00, //LogicalMinimun
0x26, 0x00,0xff, //LogicalMaximun
0x75, 0x08, //Report Size
0x95, THIS_ENDP0_SIZE, //Report Counet
0x91, 0x06, //Output
0xC0
};
报表描述符有注释,其它的我剖析如下:
注意:空格的是同下一个字节在一起的
设备描述符:
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个数,怎么是这样我就不得而知:
从例程里是取反:
case UIS_TOKEN_OUT | 2: //endpoint 2# 端点批量下传
if ( U_TOG_OK ) // 不同步的数据包将丢弃
{
len = USB_RX_LEN; //接收数据长度,数据从Ep2Buffer首地址开始存放
for ( i = 0; i < len; i ++ )
{
Ep2Buffer = Ep2Buffer ^ 0xFF; // OUT数据取反到IN由计算机验证
}
UEP2_T_LEN = len;
UEP2_CTRL = UEP2_CTRL & ~ MASK_UEP_T_RES | UEP_T_RES_ACK; // 允许上传
}
break;
好了这次到这里了,已经跑完整了该例程。
奥充补下:原因找到通过HOUND找到,原来没有点HEX发送
下边的截图是正确的:
此内容由EEWORLD论坛网友ddllxxrr原创,如需转载或用于商业用途需征得作者同意并注明出处
</div><script> var loginstr = '<div class="locked">查看本帖全部内容,请<a href="javascript:;" style="color:#e60000" class="loginf">登录</a>或者<a href="https://bbs.eeworld.com.cn/member.php?mod=register_eeworld.php&action=wechat" style="color:#e60000" target="_blank">注册</a></div>';
if(parseInt(discuz_uid)==0){
(function($){
var postHeight = getTextHeight(400);
$(".showpostmsg").html($(".showpostmsg").html());
$(".showpostmsg").after(loginstr);
$(".showpostmsg").css({height:postHeight,overflow:"hidden"});
})(jQuery);
} </script><script type="text/javascript">(function(d,c){var a=d.createElement("script"),m=d.getElementsByTagName("script"),eewurl="//counter.eeworld.com.cn/pv/count/";a.src=eewurl+c;m.parentNode.insertBefore(a,m)})(document,523)</script> 汇总贴在此:
CH554评测—by ddllxxrr
https://bbs.eeworld.com.cn/forum.php?mod=viewthread&tid=567444&fromuid=536508
(出处: 电子工程世界-论坛)
CH554系列USB实用例程请参考:https://bbs.eeworld.com.cn/thread-571344-1-1.html <p>这个流程不是很明白,</p>
<p>为什么单片机要主动发送Enp2BlukIn()?不是PC要什么才发什么吗?</p>
页:
[1]