ddllxxrr 发表于 2017-10-21 13:14

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>

okhxyyo 发表于 2017-10-23 09:38

汇总贴在此:
CH554评测—by ddllxxrr
https://bbs.eeworld.com.cn/forum.php?mod=viewthread&tid=567444&fromuid=536508
(出处: 电子工程世界-论坛)

沁恒USB单片机 发表于 2017-10-23 11:53

CH554系列USB实用例程请参考:https://bbs.eeworld.com.cn/thread-571344-1-1.html

lanmanck 发表于 2020-3-24 18:11

<p>这个流程不是很明白,</p>

<p>为什么单片机要主动发送Enp2BlukIn()?不是PC要什么才发什么吗?</p>
页: [1]
查看完整版本: CH554评测:四,HID例程详解