CH554 模拟HID兼容设备 例程中报表描述符问题

/*HID类报表描述符*/

UINT8C HIDRepDesc[ ] =

{

    0x06, 0x00,0xff,

    0x09, 0x01,

    0xa1, 0x01,               //集合开始

    0x09, 0x02,               //Usage Page  用法

    0x15, 0x00,               //Logical  Minimun

    0x26, 0x00,0xff,           //Logical  Maximun

    0x75, 0x08,               //Report Size

    0x95, THIS_ENDP0_SIZE,       //Report Counet

    0x81, 0x06,               //Input

    0x09, 0x02,               //Usage Page  用法

    0x15, 0x00,              //Logical  Minimun

    0x26, 0x00,0xff,           //Logical  Maximun

    0x75, 0x08,              //Report Size

    0x95, THIS_ENDP0_SIZE,       //Report Counet

    0x91, 0x06,              //Output

    0xC0

};

红色处应该是0x26, 0xFF, 0x00才对吧

                                     

/*HID类报表描述符*/

UINT8C HIDRepDesc[ ] =

{

    0x06, 0x00,0xff,

    0x09, 0x01,

    0xa1, 0x01,               //集合开始

    0x09, 0x02,               //Usage Page  用法

    0x15, 0x00,               //Logical  Minimun

    0x26, 0x00,0xff,           //Logical  Maximun

    0x75, 0x08,               //Report Size

    0x95, THIS_ENDP0_SIZE,       //Report Counet

    0x81, 0x06,               //Input

    0x09, 0x02,               //Usage Page  用法

    0x15, 0x00,              //Logical  Minimun

    0x26, 0x00,0xff,           //Logical  Maximun

    0x75, 0x08,              //Report Size

    0x95, THIS_ENDP0_SIZE,       //Report Counet

    0x91, 0x06,              //Output

    0xC0

};

红色处应该是0x26, 0xFF, 0x00才对吧

           



严谨一点的话还是0XFF00对的,但是实际测下来是不影响的,你说的逻辑值范围0x00-0xFF,例程给的是是0x00~0xff00。HID兼容设备,一个reportsize的大小超过0X00FF即可,反正数据都小于0X00FF,怎么会不小于0XFF00呢?而且,这是HID兼容设备,假设你逻辑上限是0x08,windows系统也不会判断你设备有问题,数据一样可以上报。



这个是限定逻辑最大值用的,你写0x26,0xFF,0x00,因为8位MCU,实际值不会超过0xFF,所以没问题,如果换成16位或者32位MCU,按照你的该法,就只能传不超过0xFF的值了。

例子程序的写法对8位,16位,32位应用上问题不大,你的写法就比较局限了,以上。


Report Size 是8 ,严谨就是0x00FF是对的。而且你要逻辑范围0xFF00,不是写0x26, 0x00,0xff,,该写成0x27, 0x00, 0xFF,0x00,0x00。


UIF_SUSPEND = 0;

UIF_TRANSFER = 0;

UIF_BUS_RST = 0;    //清中断标志


例程里还有这样清中断对吗?不是写1清中断吗?



direct bit address clear or write 1 to clear  你可以看仔细一点。


 sbit UIF_FIFO_OV   = USB_INT_FG^4; // FIFO overflow interrupt flag for USB, direct bit address clear or write 1 to clear

 sbit UIF_HST_SOF   = USB_INT_FG^3; // host SOF timer interrupt flag for USB host, direct bit address clear or write 1 to clear

 sbit UIF_SUSPEND   = USB_INT_FG^2; // USB suspend or resume event interrupt flag, direct bit address clear or write 1 to clear

 sbit UIF_TRANSFER  = USB_INT_FG^1; // USB transfer completion interrupt flag, direct bit address clear or write 1 to clear

 sbit UIF_DETECT    = USB_INT_FG^0; // device detected event interrupt flag for USB host mode, direct bit address clear or write 1 to clear

 sbit UIF_BUS_RST   = USB_INT_FG^0; // bus reset event interrupt flag for USB device mode, direct bit address clear or write 1 to clear



                           

Report Size 是8 ,严谨就是0x00FF是对的。而且你要逻辑范围0xFF00,不是写0x26, 0x00,0xff,,该写成0x27, 0x00, 0xFF,0x00,0x00。

                       

blob.png


                           


引用:

                           

Report Size 是8 ,严谨就是0x00FF是对的。而且你要逻辑范围0xFF00,不是写0x26, 0x00,0xff,,该写成0x27, 0x00, 0xFF,0x00,0x00。


                       


blob.png

                       


DT工具可以验证。


无标题.jpg


昨天立创商城上买的CH552,到了,刚焊接测试位写0可以清写1清不了中断


测试直接位访问也清不了0,很奇怪哦


你安照例子的写法操作就行了,直接地址清0,这个肯定没错。


头文件的说法是汇编的用法,不是所有的直接访问都能清空。


031D 30DA2C            JNB     UIF_SUSPEND,?C0089

                                           ; SOURCE LINE # 358

0320 D2DA              CLR     UIF_SUSPEND


这就是编译后的一段汇编代码



只有登录才能回复,可以选择微信账号登录