[STM32F1] USB通讯速度的问题

[复制链接]
3998|27
 楼主| JY-DX-JY 发表于 2015-11-2 11:13 | 显示全部楼层 |阅读模式
我们公司做一个身份*读卡器,读取身份*数据用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倍,数据丢的很严重,一半多。
见图:
1.jpg
发送100次,只收到48次。
hwl1023 发表于 2015-11-2 14:13 | 显示全部楼层
JY-DX-JY 发表于 2015-11-2 13:50
USB_Configurage();              //开启USB时钟    USB_Interrupts_Config();        //设置中断优先级 ...

是使用CDC模式吗,每次发送完成可以查询发送状态,不要死等去浪费时间。
 楼主| 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);
}
 楼主| JY-DX-JY 发表于 2015-11-2 14:21 | 显示全部楼层
看了一下,是HID模式。
cool_coder 发表于 2015-11-2 14:29 | 显示全部楼层
不知道你的CPU时钟是多少MHz,如果是72MHz,很可能间隔过短了。程序里最好通过响应硬件通知来继续下一步的操作,不要单纯定时。
 楼主| JY-DX-JY 发表于 2015-11-2 14:39 | 显示全部楼层
cool_coder 发表于 2015-11-2 14:29
不知道你的CPU时钟是多少MHz,如果是72MHz,很可能间隔过短了。程序里最好通过响应硬件通知来继续下一步的 ...

谢谢!具体怎么做呢?USB我还不太懂
cool_coder 发表于 2015-11-2 14:44 | 显示全部楼层
JY-DX-JY 发表于 2015-11-2 14:39
谢谢!具体怎么做呢?USB我还不太懂

从楼主提供的程序片段看,现在需要做的是提高效率,而不是单纯缩短操作间隔。具体就是一次发送尽可能多的数据,不让USB空跑。
 楼主| JY-DX-JY 发表于 2015-11-2 14:46 | 显示全部楼层
谢谢!发送数据多了如果快的话,也会丢包。我这里只不过是做实验。
cool_coder 发表于 2015-11-2 14:50 | 显示全部楼层
JY-DX-JY 发表于 2015-11-2 14:46
谢谢!发送数据多了如果快的话,也会丢包。我这里只不过是做实验。

注意保证前一次发完再开始下一次
mcuzone 发表于 2015-11-2 15:13 | 显示全部楼层
还得检查一下硬件,看时钟有没有偏,USB走线上有没有问题等
 楼主| JY-DX-JY 发表于 2015-11-2 15:36 | 显示全部楼层
cool_coder 发表于 2015-11-2 14:50
注意保证前一次发完再开始下一次

谢谢!如何判断前一次是否发完呢?
 楼主| JY-DX-JY 发表于 2015-11-2 15:39 | 显示全部楼层
原来最大包长是48个字节,也就是每次最多只能发48个字节。
我现在把最大包长设为256个字节,快了不少。
我试了一下,257就不对了。
请问256是不是上限那?
还有,如何判断上一次是否发完。网上搜了一个帖子,没看懂。
谢谢!
huangqi412 发表于 2015-11-2 16:09 | 显示全部楼层
。。。大帧通信。。。   唯一出路。
huangqi412 发表于 2015-11-2 16:10 | 显示全部楼层
JY-DX-JY 发表于 2015-11-2 15:39
原来最大包长是48个字节,也就是每次最多只能发48个字节。
我现在把最大包长设为256个字节,快了不少。
我 ...

上限应该是1023还是1024。具体不记得。
huangqi412 发表于 2015-11-2 16:12 | 显示全部楼层
另外,说包长是错误的。。。包长<=64   一次传输任务=N个包,这个才是你所谓的256。
 楼主| 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 */
 楼主| JY-DX-JY 发表于 2015-11-2 17:03 | 显示全部楼层
先上图 2.jpg 看了这个图我有点疑惑,左上角显示256.可是下面列出的数据只有32个。这是怎么回事?
难道只发出32个数据吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

245

主题

3351

帖子

30

粉丝
快速回复 在线客服 返回列表 返回顶部