如题,请问CH32V307高速USB的例程中,哪个是中断传输的例子?
谢谢。
另,请教一下,在哪里将高速USB的传输间隔设置成125us,
谢谢。
如题,请问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之间的任意数值即可,具体参数如图所示:
此外需要将所有描述符中涉及端点传输字符个数的值改为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中的示例代码。
谢谢张工,我试一下。
@沁恒张工,你好。你的程序我测试了。但有个问题。调用一次Ep1_Tx函数后,USBHS_Endp1_Up_Flag一直为1(发送中)。usb貌似就卡住了。重新插拔usb接口(但板子不断电),PC提示无法识别的设备。
哦。又试了一下。在moudriver的debug状态下会出现这个问题,但断开调试后,看上去正常了。但连续(调用两次Ep1_Tx后,隔几百毫秒再调两次,这样)调用几次Ep1_Tx后,就又卡住了。
您好,测试USB收发不建议使用仿真,可以通过打印调试。如果出现卡死现象,请通过打印信息判断程序死在什么位置,通过打印标志位或数据长度亦或是寄存器等信息确定程序卡死原因。
谢谢张工,你给的这个工程基本上是能通的。我再查一下卡死是什么原因。有消息再更新。谢谢。