打印
[STM32F1]

USB通讯速度的问题

[复制链接]
3349|27
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
我们公司做一个身份*读卡器,读取身份*数据用USB通讯,通讯已经没问题了。
只不过速度有点慢,读取身份*数据1295个数据要好几秒。
我想请问,如何提高读取速度呢?谢谢!
沙发
cool_coder| | 2015-11-2 13:22 | 只看该作者
会不会是读卡的接口慢?先不考虑读卡,直接从RAM里发等量的数据试试~

使用特权

评论回复
板凳
JY-DX-JY|  楼主 | 2015-11-2 13:42 | 只看该作者
本帖最后由 JY-DX-JY 于 2015-11-2 13:51 编辑

谢谢!另外一位同事搞的,我刚接手。
上次问题没描述清楚。
是这样的,USB发送数据慢的时候,没问题。
数据都对。但是发送数据快了,就会出现丢包现象。
我的任务是当USB发送数据快的时候,也不丢包。

使用特权

评论回复
地板
JY-DX-JY|  楼主 | 2015-11-2 13:50 | 只看该作者
   USB_Configurage();              //开启USB时钟    USB_Interrupts_Config();        //设置中断优先级2.0
    Set_USBClock();                 //USB时钟设置
    USB_Init();                     //USB接口初始化
    //IWDG_Feed();
                USB_Send_Buf[0]=0xaa;
                USB_Send_Buf[1]=0xaa;
                USB_Send_Buf[2]=0xaa;
                USB_Send_Buf[3]=0x96;
                USB_Send_Buf[4]=0x69;
                USB_Send_Buf[5]=0x00;
                USB_Send_Buf[6]=0x03;
                USB_Send_Buf[7]=0x20;
                USB_Send_Buf[8]=0x01;
                USB_Send_Buf[9]=0x23;
                for(i=0;i<1000000;i++);
                for(i=0;i<1000000;i++);
                for(i=0;i<1000000;i++);
                for(i=0;i<1000000;i++);
                //for(i=0;i<1000000;i++);
                for(j=0;j<100;j++)
                {
                        EP1_SendData(USB_Send_Buf);
                        for(i=0;i<100000;i++);
                }
部分程序如上。
当for(i=0;i<1000000;i++);时,数据一次也不丢。
当for(i=0;i<100000;i++);时,时间缩小10倍,数据丢的很严重,一半多。
见图:

发送100次,只收到48次。

使用特权

评论回复
5
hwl1023| | 2015-11-2 14:13 | 只看该作者
JY-DX-JY 发表于 2015-11-2 13:50
USB_Configurage();              //开启USB时钟    USB_Interrupts_Config();        //设置中断优先级 ...

是使用CDC模式吗,每次发送完成可以查询发送状态,不要死等去浪费时间。

使用特权

评论回复
6
JY-DX-JY|  楼主 | 2015-11-2 14:17 | 只看该作者
谢谢!我刚开始搞,不太懂。发送程序如下:
void EP1_SendData(uint8_t *buf)
{
    buf[0] = HID_REPORT_ID0;//REPORT_ID;  
   
    UserToPMABufferCopy(buf, ENDP1_TXADDR, HidLenth);
    SetEPTxCount(ENDP1, HidLenth);
    SetEPTxValid(ENDP1);
       
    SetEPRxStatus(ENDP1, EP_RX_VALID);
}

使用特权

评论回复
7
JY-DX-JY|  楼主 | 2015-11-2 14:21 | 只看该作者
看了一下,是HID模式。

使用特权

评论回复
8
cool_coder| | 2015-11-2 14:29 | 只看该作者
不知道你的CPU时钟是多少MHz,如果是72MHz,很可能间隔过短了。程序里最好通过响应硬件通知来继续下一步的操作,不要单纯定时。

使用特权

评论回复
9
JY-DX-JY|  楼主 | 2015-11-2 14:39 | 只看该作者
cool_coder 发表于 2015-11-2 14:29
不知道你的CPU时钟是多少MHz,如果是72MHz,很可能间隔过短了。程序里最好通过响应硬件通知来继续下一步的 ...

谢谢!具体怎么做呢?USB我还不太懂

使用特权

评论回复
10
cool_coder| | 2015-11-2 14:44 | 只看该作者
JY-DX-JY 发表于 2015-11-2 14:39
谢谢!具体怎么做呢?USB我还不太懂

从楼主提供的程序片段看,现在需要做的是提高效率,而不是单纯缩短操作间隔。具体就是一次发送尽可能多的数据,不让USB空跑。

使用特权

评论回复
11
JY-DX-JY|  楼主 | 2015-11-2 14:46 | 只看该作者
谢谢!发送数据多了如果快的话,也会丢包。我这里只不过是做实验。

使用特权

评论回复
12
cool_coder| | 2015-11-2 14:50 | 只看该作者
JY-DX-JY 发表于 2015-11-2 14:46
谢谢!发送数据多了如果快的话,也会丢包。我这里只不过是做实验。

注意保证前一次发完再开始下一次

使用特权

评论回复
13
mcuzone| | 2015-11-2 15:13 | 只看该作者
还得检查一下硬件,看时钟有没有偏,USB走线上有没有问题等

使用特权

评论回复
14
JY-DX-JY|  楼主 | 2015-11-2 15:36 | 只看该作者
cool_coder 发表于 2015-11-2 14:50
注意保证前一次发完再开始下一次

谢谢!如何判断前一次是否发完呢?

使用特权

评论回复
15
JY-DX-JY|  楼主 | 2015-11-2 15:39 | 只看该作者
原来最大包长是48个字节,也就是每次最多只能发48个字节。
我现在把最大包长设为256个字节,快了不少。
我试了一下,257就不对了。
请问256是不是上限那?
还有,如何判断上一次是否发完。网上搜了一个帖子,没看懂。
谢谢!

使用特权

评论回复
16
huangqi412| | 2015-11-2 16:09 | 只看该作者
。。。大帧通信。。。   唯一出路。

使用特权

评论回复
17
huangqi412| | 2015-11-2 16:10 | 只看该作者
JY-DX-JY 发表于 2015-11-2 15:39
原来最大包长是48个字节,也就是每次最多只能发48个字节。
我现在把最大包长设为256个字节,快了不少。
我 ...

上限应该是1023还是1024。具体不记得。

使用特权

评论回复
18
huangqi412| | 2015-11-2 16:12 | 只看该作者
另外,说包长是错误的。。。包长<=64   一次传输任务=N个包,这个才是你所谓的256。

使用特权

评论回复
19
JY-DX-JY|  楼主 | 2015-11-2 16:22 | 只看该作者
/* USB Configuration Descriptor */
/*   All Descriptors (Configuration, Interface, Endpoint, Class, Vendor */
const u8 CustomHID_ConfigDescriptor[CUSTOMHID_SIZ_CONFIG_DESC] =
  {
    0x09, /* bLength: Configuation Descriptor size */
    USB_CONFIGURATION_DESCRIPTOR_TYPE, /* bDescriptorType: Configuration */
    CUSTOMHID_SIZ_CONFIG_DESC,
    /* wTotalLength: Bytes returned */
    0x00,
    0x01,         /* bNumInterfaces: 1 interface */
    0x01,         /* bConfigurationValue: Configuration value */
    0x00,         /* iConfiguration: Index of string descriptor describing
                                 the configuration*/
    0x40,         /* bmAttributes: 自供电 powered */
    0xFA,         /* MaxPower 500 mA: this current is used for detecting Vbus */

    /************** Descriptor of Custom HID interface ****************/
    /* 09 */
    0x09,         /* bLength: Interface Descriptor size */
    USB_INTERFACE_DESCRIPTOR_TYPE,/* bDescriptorType: Interface descriptor type */
    0x00,         /* bInterfaceNumber: Number of Interface */
    0x00,         /* bAlternateSetting: Alternate setting */
    0x02,         /* bNumEndpoints */
    0x03,         /* bInterfaceClass: HID */
    0x00,         /* bInterfaceSubClass : 1=BOOT, 0=no boot */
    0x00,         /* nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse */
    0,            /* iInterface: Index of string descriptor */
    /******************** Descriptor of Custom HID HID ********************/
    /* 18 */
    0x09,         /* bLength: HID Descriptor size */
    HID_DESCRIPTOR_TYPE, /* bDescriptorType: HID */
    0x10,         /* bcdHID: HID Class Spec release number */
    0x01,
    0x00,         /* bCountryCode: Hardware target country */
    0x01,         /* bNumDescriptors: Number of HID class descriptors to follow */
    0x22,         /* bDescriptorType */   
    CUSTOMHID_SIZ_REPORT_DESC,/* wItemLength: Total length of Report descriptor */
    0x00,
    /******************** Descriptor of Custom HID endpoints ******************/
    /* 27 */
    0x07,          /* bLength: Endpoint Descriptor size */
    USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: */

    0x81,          /* bEndpointAddress: Endpoint Address (IN) */
    0x03,          /* bmAttributes: Interrupt endpoint */
    0x00,          /* wMaxPacketSize: 12 Bytes max */
    0x01,
                                       这个地方我设成0x0100就是256了。请问还可以设更大吗?要改那?我试的再大就出错了。
    0x32,          /* bInterval: Polling Interval (50 ms) */
    /* 34 */

使用特权

评论回复
20
JY-DX-JY|  楼主 | 2015-11-2 17:03 | 只看该作者
先上图 看了这个图我有点疑惑,左上角显示256.可是下面列出的数据只有32个。这是怎么回事?
难道只发出32个数据吗?

使用特权

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

本版积分规则

个人签名:晴天响霹雳,平地一声雷。

245

主题

3351

帖子

30

粉丝