打印
[USB接口]

请教usb cdc虚拟串口怎样可以不用占用一个中断端点?

[复制链接]
4636|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Coobila|  楼主 | 2014-1-14 21: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)
};


相关帖子

沙发
Coobila|  楼主 | 2014-1-15 22:15 | 只看该作者
自顶一下,等高手指教下啊

使用特权

评论回复
板凳
Coobila|  楼主 | 2014-1-27 00:41 | 只看该作者
要回家了,我再顶。。。

使用特权

评论回复
地板
与时俱进| | 2014-3-17 13:05 | 只看该作者
Coobila 发表于 2014-1-15 22:15
自顶一下,等高手指教下啊

问题搞清楚没?

使用特权

评论回复
5
Coobila|  楼主 | 2014-3-21 18:04 | 只看该作者
与时俱进 发表于 2014-3-17 13:05
问题搞清楚没?

还没有啊,问了很多也没人知道:L

使用特权

评论回复
6
liuyuema09| | 2014-4-9 14:36 | 只看该作者
我也被这个问题困扰着,盼高手指点呀!

使用特权

评论回复
7
xugenyuan| | 2017-4-20 12:53 | 只看该作者
楼主问题解决了吗?能分享一下解决过程吗

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

30

帖子

0

粉丝