打印

STM32F107 USB 求救

[复制链接]
14709|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
大家好,我的代码是由STM32F107-USB_device-examples-1.0(for_ST_FW_3.10)例程的Custom_HID改的,主要是在它的基础上增加了端点2的IN功能,USB枚举、和PC机的通信都能实现了。
现在遇到的问题是,STM32给PC发数据在53条以内就没任何问题,一旦发送第54条,PC就收不到了,通过调试发现,此时STM32一直在USB中断里面打转,根本就不进主函数。
我简单说明一下我的代码,默认的OUT端点是端点1(端点1默认也可以IN,我关不关端点1的IN是一样),发送和接收的大小都是22字节。
1、在CustomHID_Reset函数中添加
OTG_DEV_EP_Init(EP2_IN, OTG_DEV_EP_TYPE_INT, 22);
2、发送函数和发送回调函数
void USB_SendString(u8 *str,u16 len)
{
     u8 i;
     if(len > 22) len = 22;
     for(i = 0;i < len;i++)
     {
           Transi_Buffer[i] = str[i];
     }
     USB_SIL_Write(EP2_IN, Transi_Buffer, 22);
}
void EP2_IN_Callback(void)
{//没做任何处理
}

3、描述符:我都设好了,双方已经能通信
4、一个很重要的现象,开优化为3的时候发送第54条(每条22)的时候出问题,而优化0的时候第2条就出问题了,估计是和栈有关。
5、程序一直在STM32_PCD_OTG_ISR_Handler上下级函数中打转转,USB_SIL_Write(甚至是到OTGD_FS_EPStartXfer)用不返回,一直驻留Stack中
沙发
liaowei230509|  楼主 | 2011-3-26 01:59 | 只看该作者
以下是配置描述符和报告描述符,是和Itspy网友一样的
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*/
    0xC0,         /* bmAttributes: Bus powered */
                  /*Bus powered: 7th bit, Self Powered: 6th bit, Remote wakeup: 5th bit, reserved: 4..0 bits */
    0x32,         /* MaxPower 100 mA: this current is used for detecting Vbus */
//    0x96,         /* MaxPower 300 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: */

    0x82,          /* bEndpointAddress: Endpoint Address (IN) */               
                   // bit 3...0 : the endpoint number
                   // bit 6...4 : reserved
                    // bit 7     : 0(OUT), 1(IN)
    0x03,          /* bmAttributes: Interrupt endpoint */
    0x40,//0x02,          /* wMaxPacketSize: 20 Bytes max */
    0x00,
    0x10,          /* bInterval: Polling Interval (21 ms) */
    /* 34 */
           
    0x07,        /* bLength: Endpoint Descriptor size */
    USB_ENDPOINT_DESCRIPTOR_TYPE,        /* bDescriptorType: */
                        /*        Endpoint descriptor type */
    0x01,        /* bEndpointAddress: */
                        /*        Endpoint Address (OUT) */
    0x03,        /* bmAttributes: Interrupt endpoint */
    0x40,//0x02,        /* wMaxPacketSize: 20 Bytes max  */
    0x00,
    0x10,        /* bInterval: Polling Interval (32 ms) */
    /* 41 */
  }
  ; /* CustomHID_ConfigDescriptor */
const u8 CustomHID_ReportDescriptor[CUSTOMHID_SIZ_REPORT_DESC] =
{
//#ifdef 0
0x05, 0x8c, /* USAGE_PAGE (ST Page) */
0x09, 0x01, /* USAGE (Demo Kit) */
0xa1, 0x01, /* COLLECTION (Application) */
/* 6 */

// The Input report
//0x85,0x01,
0x09,0x03, // USAGE ID - Vendor defined
0x15,0x00, // LOGICAL_MINIMUM (0)
0x26,0x00, 0xFF, // LOGICAL_MAXIMUM (255)
0x75,0x08, // REPORT_SIZE (8)
0x95,0x16, // REPORT_COUNT (20)
0x81,0x02, // INPUT (Data,Var,Abs)
//19
// The Output report
//0x85,0x02,
0x09,0x04, // USAGE ID - Vendor defined
0x15,0x00, // LOGICAL_MINIMUM (0)
0x26,0x00,0xFF, // LOGICAL_MAXIMUM (255)
0x75,0x08, // REPORT_SIZE (8)
0x95,0x16, // REPORT_COUNT (20)
0x91,0x02, // OUTPUT (Data,Var,Abs)
//32
0xc0 /* END_COLLECTION */
//#endif
}; /* CustomHID_ReportDescriptor */

使用特权

评论回复
板凳
liaowei230509|  楼主 | 2011-3-26 02:01 | 只看该作者
这个是出问题后的Stack,多次暂停后从没发现中断有返回过

未命名.JPG (11.2 KB )

未命名.JPG

使用特权

评论回复
地板
liaowei230509|  楼主 | 2011-3-26 02:45 | 只看该作者
哎,不知道怎么回事,STM32怎么就那么喜欢进USB中断,一直进去那CPU还做什么事

使用特权

评论回复
5
liaowei230509|  楼主 | 2011-3-26 11:30 | 只看该作者
USB_SIL_Write(EP2_IN, Transi_Buffer, 22);
OTGD_FS_FlushTxFifo(0x10);
解决了,是缓冲的问题,发送后处理一下缓冲才会好,难道这是ST故意留的BUG

使用特权

评论回复
6
lvkun1987| | 2011-4-13 20:00 | 只看该作者
哥们,小弟我最近开始搞USB,用的也是STM32F107的片子,电路是OTG结构的。网上的资料大多都针对HOST的不知道两者编程上有哪些区别,另外在端口配置上如何配置,如果方便的话能将你的程序发给我参考一下吗?邮箱lvkun19870811@163.com,不胜感激!

使用特权

评论回复
7
yinyangdianzi| | 2011-4-14 11:00 | 只看该作者
STM32F107VCT6片子有人求购吗?

使用特权

评论回复
8
lvkun1987| | 2011-4-21 13:48 | 只看该作者
哥们还在吗?能不能帮帮小弟啊,STM32F107的USB—OTG该如何入手,其中如果与PC机通信需不需要上位机编程以及驱动啊?另外 能不能留个QQ或者邮箱我想跟你学习一下

使用特权

评论回复
9
seawwh| | 2011-5-11 18:20 | 只看该作者
我也碰到了类似的问题,使用的是F105 做的虚拟串口。
在Windows 程序不打开这个串口的情况下,F105向PC 发送1帧还好,发第2帧就会在连续在中断中, F105有没有办法知道串口已经被打开呢?

thx

使用特权

评论回复
10
nuncle.lee| | 2012-12-26 12:14 | 只看该作者
:lol  感谢楼主的提醒。。虽然还不知道原因 但是增加了这个清FIFO后,终于可以连续发送数据了。我该的STM32F2的USB_OTG官方的CDC的例子。

不过为什么不清FIFO就会一直在你说的那几个中断函数里面打转呢? 我的也是这种情况,一直进入FIFO空中断,一直在里面循环,向FIFO写数据的函数执行不到。

还有楼主说的应该是个ST的BUG把,在USB_OTG的库里面F2,F4系列的,在HID的例子里,在DATAIN的回调函数中已经加入这个清FIFO的操作。

我用的STM32_USB-Host-Device_Lib_V2.1.0库

使用特权

评论回复
11
lzq1804| | 2013-5-24 11:48 | 只看该作者
楼主,我最近开始搞USB,用的也是STM32F107的片子,在发送数据出现问题,如果方便的话能将你的程序发给我参考一下吗?邮箱707543624@qq.com,不胜感激!

使用特权

评论回复
12
令狐老爷们| | 2013-11-1 22:49 | 只看该作者
不知道楼主还在吗?我最近正在研究STM32f107通过虚拟串口和PC机通信(主要是STM32向PC端发送数据),目前在发送数据方面遇上了难题。楼主如果方便的话,能不能把当初的代码发给我一份研究研究。小弟万分感谢:654010905@qq.com

使用特权

评论回复
13
香水城| | 2013-11-26 16:27 | 只看该作者
令狐老爷们 发表于 2013-11-1 22:49
不知道楼主还在吗?我最近正在研究STM32f107通过虚拟串口和PC机通信(主要是STM32向PC端发送数据),目前在 ...

可以在帖子里描述你碰到的问题,坛子里热心人还是不少的,说不定能帮上您哦。

使用STM32F107作为虚拟串口,官网上有现成demo,参考过么?

使用特权

评论回复
14
524684117| | 2015-12-20 12:51 | 只看该作者
。我也遇到了这个问题,也用这个方法解决了,但是情况缓存器会带来丢包的问题,不知道怎么解决??

使用特权

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

本版积分规则

6

主题

67

帖子

1

粉丝