|
本帖最后由 Coobila 于 2014-1-13 15:11 编辑
最近在学习做个USB虚拟串口的设备。对于其中的CDC接口中断端点,是用来通知主机一些状态的,觉得不需要,所以想去掉,网上也有些说是可以不用的。但是我去掉后发现接收到串口数据,只能发送一次IN包到PC,第二次IN包一直发送不出去。OUT包都是正常的,可以从串口输出。这个困扰了我好几天了,不知哪位大虾遇到过这种问题没,都是怎样解决的?下面是我的USB配置描述符,有不妥的地方请指正。如果有成功做过的也请指点下小弟哈 。
- //-------------------------------------------------------------------------------------------
- // USB CONFIG DESCRIPTOR TABLE
- //-------------------------------------------------------------------------------------------
- code UINT8 usb_config_descriptor[]= //配置描述符集
- {
- //-------------------------------------------------------------------------------------------
- // 配置描述 9字节
- //-------------------------------------------------------------------------------------------
- /* bLength字段。配置描述符的长度为9字节。*/
- 0x09, //;0 bLength;
- /* bDescriptorType字段。配置描述符编号为0x02。*/
- 0x02, //;1 bDescriptorType;
- /* wTotalLength字段。配置描述符集合的总长度,包括配置描述符本身、接口描述符、类描述符、端点描述符等。*/
- (9+(9+14/*+7*/)+(9+7+7)) & 0xFF, //;2 wTotalLength; 低字节
- (9+(9+14/*+7*/)+(9+7+7)) >> 8, //;3 与2关联; 高字节
- /* bNumInterfaces字段。该配置包含的接口数。*/
- 2, //;4 bNumInterFaces;
- /* bConfiguration字段。该配置的值为1。*/
- 0X01, //;5 bConfigurationValue; SetConfiguration()请求用于选择这个配置
- /* iConfigurationz字段,该配置的字符串索引。这里没有,为0。*/
- 0X00, //;6 iConfigration;
- /* bmAttributes字段,该设备的属性。*/
- //;7 bmAtrributes
- ((1 << 7) | //保留值,必须为1
- (0 << 6) | // 0=总线供电; 1=自供电
- (1 << 5) | // 1=支持remote;
- (0 << 0)), //保留值0
- /* bMaxPower字段,该设备需要的最大电流量。每单位电流为2mA。*/
- 0x32, //8; bMaxPower 最大电流 =2*n; n为字节值
-
- //-------------------------------------------------------------------------------------------
- // CDC类接口描述符 9字节
- //-------------------------------------------------------------------------------------------
- /* bLength字段。接口描述符的长度为9字节。*/
- 0x09, //;0;bLengh 长度
- /* bDescriptorType字段。接口描述符的编号为0x04。*/
- 0x04, //;1;bdescriptor tpye接口描述符
-
- /* bInterfaceNumber字段。该接口的编号,第一个接口,编号为0。*/
- 0, //;2;b interface number接口编号(从0开始)
- /* bAlternateSetting字段。该接口的备用编号,为0。*/
- 0x00, //;3;b alternat setting备用编号
- /* bNumEndpoints字段。非0端点的数目。CDC接口只使用一个中断输入端点。*/
- 0x00, //;4;b num endpoints 非0端点数目
- /* bInterfaceClass字段。该接口所使用的类。CDC类的类代码为0x02。*/
- 0x02, //;5;b interface class 类; 0x02=CDC类
- /* bInterfaceSubClass字段。该接口所使用的子类。要实现USB转串口,就必须使用Abstract Control Model(抽象控制模型)子类。它的编号为0x02。*/
- 0x02, //;6;b interface sub class子类; 0x02=Abstract Control Model(抽象控制模型)子类。
- /* bInterfaceProtocol字段。使用Common AT Commands(通用AT命令)协议。该协议的编号为0x01。*/
- 0x01, //;7;b interface protocol
- /* iConfiguration字段。该接口的字符串索引值。这里没有,为0。*/
- 0x00, //;8;i configuration 该接口字符串索引值
- //-------------------------------------------------------------------------------------------
- // 以下为功能描述符 (5+5+4+5)字节
- //-------------------------------------------------------------------------------------------
- /*===================== Header Functional Descriptor ==================================*/
- /* bFunctionLength字段。该描述符长度为5字节 */
- 0x05,
- /* bDescriptorType字段。描述符类型为类特殊接口(CS_INTERFACE),编号为0x24。*/
- 0x24,
- /* bDescriptorSubtype字段。描述符子类为Header Functional Descriptor,编号为0x00。*/
- 0x00,
- /* bcdCDC字段。CDC版本号,为0x0110(低字节在先)*/
- 0x10,
- 0x01,
- // /*=================== Call Management Functional Descriptor ===========================*/
- // /* bFunctionLength字段。该描述符长度为5字节 */
- // 0x05,
- // /* bDescriptorType字段。描述符类型为类特殊接口(CS_INTERFACE),编号为0x24。*/
- // 0x24,
- // /* bDescriptorSubtype字段。描述符子类为Call Management functional descriptor,编号为0x01。*/
- // 0x01,
- // /* bmCapabilities字段。设备自己不管理call management */
- // 0x00,
- // /* bDataInterface字段。没有数据类接口用作call management */
- // 0x00,
- /*================== Abstract Control Management Functional Descriptor ================*/
- /* bFunctionLength字段。该描述符长度为4字节 */
- 0x04,
- /* bDescriptorType字段。描述符类型为类特殊接口(CS_INTERFACE),编号为0x24。*/
- 0x24,
- /* bDescriptorSubtype字段。描述符子类为Abstract Control Management functional descriptor,编号为0x02。*/
- 0x02,
- /* bmCapabilities字段。支持Set_Line_Coding、Set_Control_Line_State、Get_Line_Coding请求和Serial_State通知 */
- 0x02,
- /*======================= Union Functional Descriptor =================================*/
- /* bFunctionLength字段。该描述符长度为5字节。*/
- 0x05,
- /* bDescriptorType字段。描述符类型为类特殊接口(CS_INTERFACE),编号为0x24。*/
- 0x24,
- /* bDescriptorSubtype字段。描述符子类为Union functional descriptor,编号为0x06。*/
- 0x06,
- /* MasterInterface字段。这里为前面编号为0的CDC接口。*/
- 0x00,
- /* SlaveInterface字段,这里为接下来编号为1的数据类接口。*/
- 0x01,
-
- //-------------------------------------------------------------------------------------------
- // 接口0(CDC接口)Notification端点描述 7字节
- //-------------------------------------------------------------------------------------------
- // /* bLength字段。端点描述符长度为7字节。*/
- // 0x07, //;0; b length
- // /* bDescriptorType字段。端点描述符编号为0x05。*/
- // 0x05, //;1; b descriptor type 0x05=端点描述
- // /* bEndpointAddress字段。端点的地址。我们使用输入端点1。D7位表示数据方向,输入端点D7为1。所以输入端点1的地址为0x81。*/
- // //;2; b endpoint address 端点地址
- // ((1 << 7) | // 1=输入方向; 0=输出方向
- // (0 << 4) | //保留值, 0
- // (3 << 0)), //端点号
- // /* bmAttributes字段。D1~D0为端点传输类型选择。该端点为中断端点。中断端点的编号为3。其它位保留为0。*/
- // //;3; bm attributes
- // ((3 << 0) | //传输类型; 0=控制传输; 1=同步; 2=批量; 3=中断
- // (0 << 2) | //仅同步传输使用;
- // (0 << 4) | //仅同步传输使用
- // (0 << 6)), //保留位
- // /* wMaxPacketSize字段。该端点的最大包长。注意低字节在先。*/
- // EP3_PACKET_MAX & 0xFF, //;4; b w max packet size 端点最大包大小低8位
- //
- // //;5; 与4关联;
- // (((EP3_PACKET_MAX >> 8) << 10) | //端点最大包大小高3位
- // (0 << 11) | //传输频率; 0=1次/微帧; 1=2次/微帧; 2=3次/微帧; 3=保留
- // (0 << 13)), //保留位
- // /* bInterval字段。端点查询的时间,我们设置为10个帧时间,即10ms。*/
- // 0xFF, //;6; 数据查询时间间隔(ms)
- //-------------------------------------------------------------------------------------------
- // 数据类(DCI)接口描述符 9字节
- //-------------------------------------------------------------------------------------------
- /* bLength字段。接口描述符的长度为9字节。*/
- 0x09, //;0;bLengh 长度
- /* bDescriptorType字段。接口描述符的编号为0x04。*/
- 0x04, //;1;bdescriptor tpye接口描述符
-
- /* bInterfaceNumber字段。该接口的编号,第一个接口,编号为0。*/
- 1, //;2;b interface number接口编号(从0开始)
- /* bAlternateSetting字段。该接口的备用编号,为0。*/
- 0x00, //;3;b alternat setting备用编号
- /* bNumEndpoints字段。非0端点的数目。该设备需要使用一对批量端点,设置为2。*/
- 0x02, //;4;b num endpoints 非0端点数目
- /* bInterfaceClass字段。该接口所使用的类。数据类接口的代码为0x0A。*/
- 0x0A, //;5;b interface class 类; 0x0A=数据类
- /* bInterfaceSubClass字段。该接口所使用的子类。*/
- 0x00, //;6;b interface sub class子类;
- /* bInterfaceProtocol字段。*/
- 0x00, //;7;b interface protocol
- /* iConfiguration字段。该接口的字符串索引值。这里没有,为0。*/
- 0x00, //;8;i configuration 该接口字符串索引值
- //-------------------------------------------------------------------------------------------
- // 数据类接口端点描述(BULK_IN) 7字节
- //-------------------------------------------------------------------------------------------
- /* bLength字段。端点描述符长度为7字节。*/
- 0x07, //;0; b length
- /* bDescriptorType字段。端点描述符编号为0x05。*/
- 0x05, //;1; b descriptor type 0x05=端点描述
- /* bEndpointAddress字段。端点的地址。D7位表示数据方向,输入端点D7为1。*/
- //;2; b endpoint address 端点地址
- ((1 << 7) | // 1=输入方向; 0=输出方向
- (0 << 4) | //保留值, 0
- (2 << 0)), //端点号
- /* bmAttributes字段。D1~D0为端点传输类型选择。该端点为批量端点。批量端点的编号为2。其它位保留为0。*/
- //;3; bm attributes
- ((2 << 0) | //传输类型; 0=控制传输; 1=同步; 2=批量; 3=中断
- (0 << 2) | //仅同步传输使用;
- (0 << 4) | //仅同步传输使用
- (0 << 6)), //保留位
- /* wMaxPacketSize字段。该端点的最大包长。注意低字节在先。*/
- EP2_PACKET_MAX & 0xFF, //;4; b w max packet size 端点最大包大小低8位
-
- //;5; 与4关联;
- (((EP2_PACKET_MAX >> 8) << 10) | //端点最大包大小高3位
- (0 << 11) | //传输频率; 0=1次/微帧; 1=2次/微帧; 2=3次/微帧; 3=保留
- (0 << 13)), //保留位
- /* bInterval字段。端点查询的时间,这里对批量端点无效。*/
- 0x00, //;6; 数据查询时间间隔(ms)
- //-------------------------------------------------------------------------------------------
- // 数据类接口端点描述(BULK_OUT) 7字节
- //-------------------------------------------------------------------------------------------
- /* bLength字段。端点描述符长度为7字节。*/
- 0x07, //;0; b length
- /* bDescriptorType字段。端点描述符编号为0x05。*/
- 0x05, //;1; b descriptor type 0x05=端点描述
- /* bEndpointAddress字段。端点的地址。D7位表示数据方向,输入端点D7为1。*/
- //;2; b endpoint address 端点地址
- ((0 << 7) | // 1=输入方向; 0=输出方向
- (0 << 4) | //保留值, 0
- (1 << 0)), //端点号
- /* bmAttributes字段。D1~D0为端点传输类型选择。该端点为批量端点。批量端点的编号为2。其它位保留为0。*/
- //;3; bm attributes
- ((2 << 0) | //传输类型; 0=控制传输; 1=同步; 2=批量; 3=中断
- (0 << 2) | //仅同步传输使用;
- (0 << 4) | //仅同步传输使用
- (0 << 6)), //保留位
- /* wMaxPacketSize字段。该端点的最大包长。注意低字节在先。*/
- EP1_PACKET_MAX & 0xFF, //;4; b w max packet size 端点最大包大小低8位
-
- //;5; 与4关联;
- (((EP1_PACKET_MAX >> 8) << 10) | //端点最大包大小高3位
- (0 << 11) | //传输频率; 0=1次/微帧; 1=2次/微帧; 2=3次/微帧; 3=保留
- (0 << 13)), //保留位
- /* bInterval字段。端点查询的时间,这里对批量端点无效。*/
- 0x00, //;6; 数据查询时间间隔(ms)
- };
复制代码 |
阿莫论坛20周年了!感谢大家的支持与爱护!!
如果想吃一顿饺子,就得从冰箱里取出肉,剁馅儿,倒面粉、揉面、醒面,擀成皮儿,下锅……
一整个繁琐流程,就是为了出锅时那一嘴滚烫流油的热饺子。
如果这个过程,禁不住饿,零食下肚了,饺子出锅时也就不香了……《非诚勿扰3》
|