请问CH32V307高速USB中断传输参考哪个例子?

如题,请问CH32V307高速USB的例程中,哪个是中断传输的例子?

谢谢。

另,请教一下,在哪里将高速USB的传输间隔设置成125us,

谢谢。

您好,CH32V307 USBHS例程中关于KM的键鼠例程均属于中断传输,若做设备数据传输的间隔则由主机决定,倘若做主机,则需要修改定时器的时间间隔,每125us发一次IN包即可。


@沁恒张工,谢谢。我是想用CH32V307做设备,使用中断传输。PC和CH32V307进行通讯。我测试了HIDKeyboardDevice例程,并且修改了配置描述符如下:

/* USB配置描述符(高速) */
const UINT8  MyCfgDescr_HS[ ] =
{
    0x09, 0x02, 0x22, 0x00, 0x01, 0x01, 0x00, 0xC0, 0x32,/* Config Desc */
    0x09, 0x04, 0x00, 0x00, 0x01, 0x03, 0x00, 0x00, 0x00,/* Interface Desc */
    0x09, 0x21, 0x11, 0x01, 0x00, 0x01, 0x22, RepDescSize, 0x00,/* HID Desc */
    0x07, 0x05, 0x81, 0x03, (UINT8)DEF_USB_HS_EP_SIZE, (UINT8)( DEF_USB_HS_EP_SIZE >> 8 ), 0x00,
};

修改成了custom hid设备,

但实际测试的时候,发现,还是被识别成了HID键盘(我想的是,应该识别成一个HID Compilant Device)。并且,Ep1_Tx发送时,还是只能发送8字节。

我看了USB2.0的微帧概念,知道可以每125us发送最大一包1024字节的数据,并且,可以提供最多2次的增发(相当于3072字节每125us)。 想实现这样的通讯的话,应该如何修改呢,请指点一下。谢谢。



如果您想实现的是HID的兼容性设备或自定义设备,需要将HID报表描述符Usage Page改为FF00-FFFF之间的任意数值即可,具体参数如图所示:

微信截图_20220920104728.png

此外需要将所有描述符中涉及端点传输字符个数的值改为1024个字符,需要注意的是描述符的字符数需要对应修改。




@一帆风顺 谢谢指点。我做了如下修改,但bus hound抓包显示,上位机在获取配置描述符时返回bad parameter。能否百忙之中帮我看一下描述符配置哪里出了错。谢谢了。

#define RepDescSize           28
#define DEF_USB_HS_EP_SIZE         512            /* 端点高速模式大小(1024和512都不行) */
....
/* USB配置描述符(高速) */
const UINT8  MyCfgDescr_HS[ ] =
{
    0x09, 0x02, 0x29, 0x00, 0x01, 0x01, 0x00, 0xA0, 0x32,/* Config Desc */
    0x09, 0x04, 0x00, 0x00, 0x02, 0x03, 0x00, 0x00, 0x00,/* Interface Desc */
    0x09, 0x21, 0x11, 0x01, 0x00, 0x01, 0x22, RepDescSize, 0x00,/* HID Desc */
    0x07, 0x05, 0x81, 0x03, (UINT8)DEF_USB_HS_EP_SIZE, (UINT8)( DEF_USB_HS_EP_SIZE >> 8 ), 0x01,
    0x07, 0x05, 0x01, 0x03, (UINT8)DEF_USB_HS_EP_SIZE, (UINT8)( DEF_USB_HS_EP_SIZE >> 8 ), 0x01,
};

const UINT8 MyReportDesc[] =
{
    0x06, 0x00, 0xFF,            // (GLOBAL) USAGE_PAGE         0xFF00 Vendor-defined
    0xA1, 0x01,                  // (MAIN)   COLLECTION         0x01 Application (Usage=0x0: Page=, Usage=, Type=) <-- Warning: USAGE type should be CA (Application)
    0x15, 0x00,                  //   (GLOBAL) LOGICAL_MINIMUM    0x00 (0) <-- Redundant: LOGICAL_MINIMUM is already 0
    0x26, 0xFF, 0x00,            //   (GLOBAL) LOGICAL_MAXIMUM    0x00FF (255)
    0x75, 0x08,                  //   (GLOBAL) REPORT_SIZE        0x08 (8) Number of bits per field
    0x85, 0x01,                  //   (GLOBAL) REPORT_ID          0x01 (1)
    0x96, 0x00,0x04,                  //   (GLOBAL) REPORT_COUNT       0x40 (64) Number of fields
    0x09, 0x01,                  //   (LOCAL)  USAGE              0xFF000001
    0x81, 0x02,                  //   (MAIN)   INPUT              0x00000002 (64 fields x 8 bits) 0=Data 1=Variable 0=Absolute 0=NoWrap 0=Linear 0=PrefState 0=NoNull 0=NonVolatile 0=Bitmap
    0x85, 0x02,                  //   (GLOBAL) REPORT_ID          0x02 (2)
    0x09, 0x01,                  //   (LOCAL)  USAGE              0xFF000001
    0x91, 0x02,                  //   (MAIN)   OUTPUT             0x00000002 (64 fields x 8 bits) 0=Data 1=Variable 0=Absolute 0=NoWrap 0=Linear 0=PrefState 0=NoNull 0=NonVolatile 0=Bitmap
    0xC0,                        // (MAIN)   END_COLLECTION     Application
};


另:附上代码,使用的是CH32V307EVT中的示例代码。

icon_rar.gifHIDKeyboardDevice.zip



您好,设备枚举请参考附件HID报表描述符,数据传输部分请您自行实现。

emobile_2022-09-22_10-54-19.png

icon_rar.gifHIDCompliantVendorDefined.zip



谢谢张工,我试一下。


@沁恒张工,你好。你的程序我测试了。但有个问题。调用一次Ep1_Tx函数后,USBHS_Endp1_Up_Flag一直为1(发送中)。usb貌似就卡住了。重新插拔usb接口(但板子不断电),PC提示无法识别的设备。


哦。又试了一下。在moudriver的debug状态下会出现这个问题,但断开调试后,看上去正常了。但连续(调用两次Ep1_Tx后,隔几百毫秒再调两次,这样)调用几次Ep1_Tx后,就又卡住了。


您好,测试USB收发不建议使用仿真,可以通过打印调试。如果出现卡死现象,请通过打印信息判断程序死在什么位置,通过打印标志位或数据长度亦或是寄存器等信息确定程序卡死原因。


谢谢张工,你给的这个工程基本上是能通的。我再查一下卡死是什么原因。有消息再更新。谢谢。


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