搜索
bottom↓
回复: 8

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

[复制链接]

出0入0汤圆

发表于 2014-1-13 15:13:29 | 显示全部楼层 |阅读模式
本帖最后由 Coobila 于 2014-1-13 15:11 编辑

        最近在学习做个USB虚拟串口的设备。对于其中的CDC接口中断端点,是用来通知主机一些状态的,觉得不需要,所以想去掉,网上也有些说是可以不用的。但是我去掉后发现接收到串口数据,只能发送一次IN包到PC,第二次IN包一直发送不出去。OUT包都是正常的,可以从串口输出。这个困扰了我好几天了,不知哪位大虾遇到过这种问题没,都是怎样解决的?下面是我的USB配置描述符,有不妥的地方请指正。如果有成功做过的也请指点下小弟哈

  1. //-------------------------------------------------------------------------------------------
  2. //                                        USB CONFIG DESCRIPTOR TABLE
  3. //-------------------------------------------------------------------------------------------
  4. code UINT8 usb_config_descriptor[]=        //配置描述符集
  5. {
  6. //-------------------------------------------------------------------------------------------
  7. //                                                                配置描述 9字节
  8. //-------------------------------------------------------------------------------------------
  9.         /* bLength字段。配置描述符的长度为9字节。*/
  10.         0x09,        //;0 bLength;

  11.         /* bDescriptorType字段。配置描述符编号为0x02。*/
  12.         0x02,        //;1 bDescriptorType;

  13.         /* wTotalLength字段。配置描述符集合的总长度,包括配置描述符本身、接口描述符、类描述符、端点描述符等。*/
  14.         (9+(9+14/*+7*/)+(9+7+7)) & 0xFF, //;2 wTotalLength; 低字节
  15.         (9+(9+14/*+7*/)+(9+7+7)) >> 8,         //;3 与2关联; 高字节

  16.         /* bNumInterfaces字段。该配置包含的接口数。*/
  17.         2,        //;4 bNumInterFaces;

  18.         /* bConfiguration字段。该配置的值为1。*/
  19.         0X01,        //;5 bConfigurationValue; SetConfiguration()请求用于选择这个配置

  20.         /* iConfigurationz字段,该配置的字符串索引。这里没有,为0。*/
  21.         0X00,        //;6 iConfigration;

  22.         /* bmAttributes字段,该设备的属性。*/
  23.         //;7 bmAtrributes
  24.         ((1 << 7) |        //保留值,必须为1
  25.          (0 << 6) |        // 0=总线供电; 1=自供电
  26.          (1 << 5) |        // 1=支持remote;       
  27.          (0 << 0)),        //保留值0

  28.         /* bMaxPower字段,该设备需要的最大电流量。每单位电流为2mA。*/
  29.         0x32,                //8; bMaxPower 最大电流 =2*n; n为字节值
  30.        
  31. //-------------------------------------------------------------------------------------------
  32. //                                                                CDC类接口描述符 9字节
  33. //-------------------------------------------------------------------------------------------
  34.         /* bLength字段。接口描述符的长度为9字节。*/
  35.         0x09,        //;0;bLengh        长度

  36.         /* bDescriptorType字段。接口描述符的编号为0x04。*/
  37.         0x04,        //;1;bdescriptor tpye接口描述符
  38.        
  39.         /* bInterfaceNumber字段。该接口的编号,第一个接口,编号为0。*/
  40.         0,                //;2;b interface number接口编号(从0开始)

  41.         /* bAlternateSetting字段。该接口的备用编号,为0。*/
  42.         0x00,        //;3;b alternat setting备用编号

  43.         /* bNumEndpoints字段。非0端点的数目。CDC接口只使用一个中断输入端点。*/
  44.         0x00,        //;4;b num endpoints 非0端点数目

  45.         /* bInterfaceClass字段。该接口所使用的类。CDC类的类代码为0x02。*/
  46.         0x02,        //;5;b interface class 类; 0x02=CDC类

  47.         /* bInterfaceSubClass字段。该接口所使用的子类。要实现USB转串口,就必须使用Abstract Control Model(抽象控制模型)子类。它的编号为0x02。*/
  48.         0x02,        //;6;b interface sub class子类; 0x02=Abstract Control Model(抽象控制模型)子类。

  49.         /* bInterfaceProtocol字段。使用Common AT Commands(通用AT命令)协议。该协议的编号为0x01。*/
  50.         0x01,        //;7;b interface protocol

  51.         /* iConfiguration字段。该接口的字符串索引值。这里没有,为0。*/
  52.         0x00,        //;8;i configuration 该接口字符串索引值

  53. //-------------------------------------------------------------------------------------------
  54. //                                                                以下为功能描述符 (5+5+4+5)字节
  55. //-------------------------------------------------------------------------------------------
  56.         /*===================== Header Functional Descriptor ==================================*/
  57.         /* bFunctionLength字段。该描述符长度为5字节 */
  58.         0x05,

  59.         /* bDescriptorType字段。描述符类型为类特殊接口(CS_INTERFACE),编号为0x24。*/
  60.         0x24,

  61.         /* bDescriptorSubtype字段。描述符子类为Header Functional Descriptor,编号为0x00。*/
  62.         0x00,

  63.         /* bcdCDC字段。CDC版本号,为0x0110(低字节在先)*/
  64.         0x10,
  65.         0x01,

  66. //        /*=================== Call Management Functional Descriptor ===========================*/
  67. //        /* bFunctionLength字段。该描述符长度为5字节 */
  68. //        0x05,

  69. //        /* bDescriptorType字段。描述符类型为类特殊接口(CS_INTERFACE),编号为0x24。*/
  70. //        0x24,

  71. //        /* bDescriptorSubtype字段。描述符子类为Call Management functional descriptor,编号为0x01。*/
  72. //        0x01,

  73. //        /* bmCapabilities字段。设备自己不管理call management */
  74. //        0x00,

  75. //        /* bDataInterface字段。没有数据类接口用作call management */
  76. //        0x00,

  77.         /*================== Abstract Control Management Functional Descriptor ================*/
  78.         /* bFunctionLength字段。该描述符长度为4字节 */
  79.         0x04,

  80.         /* bDescriptorType字段。描述符类型为类特殊接口(CS_INTERFACE),编号为0x24。*/
  81.         0x24,

  82.         /* bDescriptorSubtype字段。描述符子类为Abstract Control Management functional descriptor,编号为0x02。*/
  83.         0x02,

  84.         /* bmCapabilities字段。支持Set_Line_Coding、Set_Control_Line_State、Get_Line_Coding请求和Serial_State通知 */
  85.         0x02,

  86.         /*======================= Union Functional Descriptor =================================*/
  87.         /* bFunctionLength字段。该描述符长度为5字节。*/
  88.         0x05,

  89.         /* bDescriptorType字段。描述符类型为类特殊接口(CS_INTERFACE),编号为0x24。*/
  90.         0x24,

  91.         /* bDescriptorSubtype字段。描述符子类为Union functional descriptor,编号为0x06。*/
  92.         0x06,

  93.         /* MasterInterface字段。这里为前面编号为0的CDC接口。*/
  94.         0x00,

  95.         /* SlaveInterface字段,这里为接下来编号为1的数据类接口。*/
  96.         0x01,
  97.        
  98. //-------------------------------------------------------------------------------------------
  99. //                                                                接口0(CDC接口)Notification端点描述 7字节
  100. //-------------------------------------------------------------------------------------------
  101. //        /* bLength字段。端点描述符长度为7字节。*/
  102. //        0x07,        //;0; b length

  103. //        /* bDescriptorType字段。端点描述符编号为0x05。*/
  104. //        0x05,        //;1; b descriptor type 0x05=端点描述

  105. //        /* bEndpointAddress字段。端点的地址。我们使用输入端点1。D7位表示数据方向,输入端点D7为1。所以输入端点1的地址为0x81。*/
  106. //        //;2; b endpoint address 端点地址
  107. //        ((1 << 7) |        // 1=输入方向; 0=输出方向
  108. //         (0 << 4) |        //保留值, 0
  109. //         (3 << 0)),        //端点号

  110. //        /* bmAttributes字段。D1~D0为端点传输类型选择。该端点为中断端点。中断端点的编号为3。其它位保留为0。*/
  111. //        //;3; bm attributes
  112. //        ((3 << 0) | //传输类型; 0=控制传输; 1=同步; 2=批量; 3=中断
  113. //         (0 << 2) | //仅同步传输使用;
  114. //         (0 << 4) | //仅同步传输使用
  115. //         (0 << 6)), //保留位

  116. //        /* wMaxPacketSize字段。该端点的最大包长。注意低字节在先。*/
  117. //        EP3_PACKET_MAX & 0xFF, //;4; b w max packet size 端点最大包大小低8位
  118. //       
  119. //        //;5; 与4关联;
  120. //        (((EP3_PACKET_MAX >> 8) << 10) | //端点最大包大小高3位
  121. //         (0 << 11) | //传输频率; 0=1次/微帧; 1=2次/微帧; 2=3次/微帧; 3=保留
  122. //         (0 << 13)), //保留位

  123. //        /* bInterval字段。端点查询的时间,我们设置为10个帧时间,即10ms。*/
  124. //        0xFF,                //;6;  数据查询时间间隔(ms)

  125. //-------------------------------------------------------------------------------------------
  126. //                                                                数据类(DCI)接口描述符 9字节
  127. //-------------------------------------------------------------------------------------------
  128.         /* bLength字段。接口描述符的长度为9字节。*/
  129.         0x09,        //;0;bLengh        长度

  130.         /* bDescriptorType字段。接口描述符的编号为0x04。*/
  131.         0x04,        //;1;bdescriptor tpye接口描述符
  132.        
  133.         /* bInterfaceNumber字段。该接口的编号,第一个接口,编号为0。*/
  134.         1,                //;2;b interface number接口编号(从0开始)

  135.         /* bAlternateSetting字段。该接口的备用编号,为0。*/
  136.         0x00,        //;3;b alternat setting备用编号

  137.         /* bNumEndpoints字段。非0端点的数目。该设备需要使用一对批量端点,设置为2。*/
  138.         0x02,        //;4;b num endpoints 非0端点数目

  139.         /* bInterfaceClass字段。该接口所使用的类。数据类接口的代码为0x0A。*/
  140.         0x0A,        //;5;b interface class 类; 0x0A=数据类

  141.         /* bInterfaceSubClass字段。该接口所使用的子类。*/
  142.         0x00,        //;6;b interface sub class子类;

  143.         /* bInterfaceProtocol字段。*/
  144.         0x00,        //;7;b interface protocol

  145.         /* iConfiguration字段。该接口的字符串索引值。这里没有,为0。*/
  146.         0x00,        //;8;i configuration 该接口字符串索引值

  147. //-------------------------------------------------------------------------------------------
  148. //                                                                数据类接口端点描述(BULK_IN) 7字节
  149. //-------------------------------------------------------------------------------------------
  150.         /* bLength字段。端点描述符长度为7字节。*/
  151.         0x07,        //;0; b length

  152.         /* bDescriptorType字段。端点描述符编号为0x05。*/
  153.         0x05,        //;1; b descriptor type 0x05=端点描述

  154.         /* bEndpointAddress字段。端点的地址。D7位表示数据方向,输入端点D7为1。*/
  155.         //;2; b endpoint address 端点地址
  156.         ((1 << 7) | // 1=输入方向; 0=输出方向
  157.          (0 << 4) | //保留值, 0
  158.          (2 << 0)), //端点号

  159.         /* bmAttributes字段。D1~D0为端点传输类型选择。该端点为批量端点。批量端点的编号为2。其它位保留为0。*/
  160.         //;3; bm attributes
  161.         ((2 << 0) | //传输类型; 0=控制传输; 1=同步; 2=批量; 3=中断
  162.          (0 << 2) | //仅同步传输使用;
  163.          (0 << 4) | //仅同步传输使用
  164.          (0 << 6)), //保留位

  165.         /* wMaxPacketSize字段。该端点的最大包长。注意低字节在先。*/
  166.         EP2_PACKET_MAX & 0xFF, //;4; b w max packet size 端点最大包大小低8位
  167.        
  168.         //;5; 与4关联;
  169.         (((EP2_PACKET_MAX >> 8) << 10) | //端点最大包大小高3位
  170.          (0 << 11) | //传输频率; 0=1次/微帧; 1=2次/微帧; 2=3次/微帧; 3=保留
  171.          (0 << 13)), //保留位

  172.         /* bInterval字段。端点查询的时间,这里对批量端点无效。*/
  173.         0x00,                //;6;  数据查询时间间隔(ms)

  174. //-------------------------------------------------------------------------------------------
  175. //                                                                数据类接口端点描述(BULK_OUT) 7字节
  176. //-------------------------------------------------------------------------------------------
  177.         /* bLength字段。端点描述符长度为7字节。*/
  178.         0x07,        //;0; b length

  179.         /* bDescriptorType字段。端点描述符编号为0x05。*/
  180.         0x05,        //;1; b descriptor type 0x05=端点描述

  181.         /* bEndpointAddress字段。端点的地址。D7位表示数据方向,输入端点D7为1。*/
  182.         //;2; b endpoint address 端点地址
  183.         ((0 << 7) | // 1=输入方向; 0=输出方向
  184.          (0 << 4) | //保留值, 0
  185.          (1 << 0)), //端点号

  186.         /* bmAttributes字段。D1~D0为端点传输类型选择。该端点为批量端点。批量端点的编号为2。其它位保留为0。*/
  187.         //;3; bm attributes
  188.         ((2 << 0) | //传输类型; 0=控制传输; 1=同步; 2=批量; 3=中断
  189.          (0 << 2) | //仅同步传输使用;
  190.          (0 << 4) | //仅同步传输使用
  191.          (0 << 6)), //保留位

  192.         /* wMaxPacketSize字段。该端点的最大包长。注意低字节在先。*/
  193.         EP1_PACKET_MAX & 0xFF, //;4; b w max packet size 端点最大包大小低8位
  194.        
  195.         //;5; 与4关联;
  196.         (((EP1_PACKET_MAX >> 8) << 10) | //端点最大包大小高3位
  197.          (0 << 11) | //传输频率; 0=1次/微帧; 1=2次/微帧; 2=3次/微帧; 3=保留
  198.          (0 << 13)), //保留位

  199.         /* bInterval字段。端点查询的时间,这里对批量端点无效。*/
  200.         0x00,                //;6;  数据查询时间间隔(ms)
  201. };
复制代码

阿莫论坛20周年了!感谢大家的支持与爱护!!

如果想吃一顿饺子,就得从冰箱里取出肉,剁馅儿,倒面粉、揉面、醒面,擀成皮儿,下锅……
一整个繁琐流程,就是为了出锅时那一嘴滚烫流油的热饺子。

如果这个过程,禁不住饿,零食下肚了,饺子出锅时也就不香了……《非诚勿扰3》

出0入0汤圆

发表于 2014-1-13 20:37:34 | 显示全部楼层
好强····

出0入0汤圆

 楼主| 发表于 2014-1-14 12:42:10 | 显示全部楼层
自己顶一下。。

出0入0汤圆

发表于 2017-4-20 14:02:59 | 显示全部楼层
楼主问题最后怎么解决的?我最近移植CDC设备也遇到同样的问题,设备只能向PC发送一次,然后就不能发送了,希望楼主能指点一下

出0入0汤圆

 楼主| 发表于 2017-5-11 12:02:44 | 显示全部楼层
贰梓 发表于 2017-4-20 14:02
楼主问题最后怎么解决的?我最近移植CDC设备也遇到同样的问题,设备只能向PC发送一次,然后就不能发送了, ...

没找到其他办法,中断端点一定要加呗

出10入61汤圆

发表于 2017-5-11 12:12:07 | 显示全部楼层
中断端点根据CDC class协议是可选的. 当然驱动怎么实现就不知道了  猜测没有中断终点,CTS DSR这些信号可能就传不了, 串口助手一定要关掉流控制,否则可能只收一次

出0入0汤圆

发表于 2017-5-19 16:28:46 | 显示全部楼层
做过cdc,endpint INT 可以不加,没问题。

出0入0汤圆

 楼主| 发表于 2017-6-21 15:47:59 | 显示全部楼层
eagles321 发表于 2017-5-19 16:28
做过cdc,endpint INT 可以不加,没问题。

那是怎样做到的呢?

出0入0汤圆

发表于 2017-6-22 11:17:21 | 显示全部楼层
去掉 EP2 interrupt之后,EP_NUM改了吗?EP_NUM的值应该取决于用到的地址最大端点,然后+1,比如EPx,EP_NUM应为x+1

看你的setting应该是 EP2为IN,EP1为OUT,再加上EP0,EP_NUM则需要改成3

另外注意所有EP的地址  ENDPx_RXADDR、ENDPx_TXADDR
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-29 00:39

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表