打印

USB 设备枚举失败 虾米原因呐~

[复制链接]
12792|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
nicnac|  楼主 | 2012-5-31 15:27 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 nicnac 于 2012-5-31 16:49 编辑

最近开发CCID设备,本以为枚举会很顺利,谁知搞了两天都没搞定,疯了~我用的芯片有USB device的demo的,demo是将其枚举成了cd-rom.
我就在原demo上改了“设备描述符”和“配置描述符”,而且两个描述符绝对没问题,我同事做的另一款CCID读卡器就是用的两个描述符,没有问题。我就把端点号,和端点的包尺寸改了下,好与我的单片机相符。

可就是枚举不过啊,每次PC让我发送完“配置描述符之后”,PC就让我的USB复位了,然后重新枚举,同样的步骤,再重复一两次。PC(win_xp)就就会弹出“无法识别的USB设备”,导致我无法安装驱动。因为驱动在枚举完成之后才回安装,如果已安装,也需要先枚举才能加载。

描述符就不贴了,很标准的,下面贴上枚举过程的log:

系统初始化开始!
>>>>>进入挂起中断-----退出挂起中断<<<<<
>>>>>进入复位中断-----退出复位中断<<<<<
***** SETUP OUT包字节数 = 8
USB标准请求:0x80, 0x06, 0x00, 0x01, 0x00, 0x00,0x40, 0x00,//请求设备描述符

GetDescriptor 开始 >>>>>>>>>>
设备描述符
0x12, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00,
0x40, 0xc3, 0x1b, 0x03,
0x02, 0x00, 0x01, 0x01, 0x02, 0x00, 0x01,

GetDescriptor 结束 <<<<<<<<<<
>>>>>进入复位中断-----退出复位中断<<<<<

***** SETUP OUT包字节数 = 8
USB标准请求:0x00, 0x05, 0x02, 0x00, 0x00, 0x00, 0x00,0x00,//设置地址
SetAddress 开始 >>>>>>>>>>
SetAddress 结束 <<<<<<<<<<
***** SETUP OUT包字节数 = 0

***** SETUP OUT包字节数 = 8
USB标准请求: 0x80, 0x06, 0x00, 0x01,0x00, 0x00, 0x12, 0x00,//获得设备描述符

GetDescriptor 开始 >>>>>>>>>>
设备描述符
0x12, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x40, 0xc3, 0x1b,
0x03, 0x02, 0x00, 0x01, 0x01, 0x02, 0x00, 0x01,
GetDescriptor 结束 <<<<<<<<<<

***** SETUP OUT包字节数 = 8
USB标准请求:0x80,0x06,0x00,0x02,0x00,0x00,0x09,0x00,//获得配置描述符

GetDescriptor 开始 >>>>>>>>>>
配置描述符
0x09,0x02,0x5d,0x00,0x01,0x01,0x00,0x80,0x32,
GetDescriptor 结束 <<<<<<<<<<

***** SETUP OUT包字节数 = 8
USB标准请求:0x80,0x06,0x00,0x02,0x00,0x00,0xff,0x00,//获取配置描述符其他内容

GetDescriptor 开始 >>>>>>>>>>
配置描述符
0x09,0x02,0x5d,0x00,0x01,0x01,0x00,0x80,0x32,//配置描述符0x09,0x04,0x00,0x00,0x03,0x0b,0x00,0x00,0x00,//接口描述符
0x36,0x21,0x10,0x01,0x00,0x07,0x01,0x00,0x00,0x00,0xa0,0x0f,0x00,0x00,0xa0,0x0f,0x00,0x00,//54字节的CCID类配置描述符
0x00,0x00,0x2a,0x00,0x00,0x08,0xf8,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x38,0x01,0x01,0x00,0x0f,0x01,0x00,0x00,0xff,0xff,0x00,0x00,0x00,0x01,
0x07,0x05,0x01,0x02,0x40,0x00,0x00,//端点1 BULK OUT
0x07,0x05,0x81,0x02,0x40,0x00,0x00,//端点1 BULK IN
0x07,0x05,0x82,0x03,0x40,0x00,0x18,//端点2 INT IN
GetDescriptor 结束 <<<<<<<<<<

***** SETUP OUT包字节数 = 0
>>>>>进入复位中断-----退出复位中断<<<<< //:'(PC咋就让我复位了呢,我了个擦~

就是到这里,刚发完完整的“配置描述符”,PC就让我的USB CCID 设备复位,然后如上同样的过程再完全相同地重复一两次,PC就会弹出“无法识别的USB设备”,导致我无法安装驱动。因为驱动在枚举完成之后才回安装,如果已安装,也需要先枚举才能加载。

各位大神,求解释,求方案啊~
问题很简单,但我真心没有眉目,请各位大神帮助~

QQ截图未命名1.png (5.09 KB )

QQ截图未命名1.png

QQ截图未命名2.png (7.67 KB )

QQ截图未命名2.png

相关帖子

沙发
l_lin2003| | 2012-5-31 16:24 | 只看该作者
驱动在枚举完成之后才回安装?不是吧,我好像觉得是在获取设备的配置描述符后就会提示安装驱动。
我看了一下你的描述符,没有什么问题,我怀疑是系统找不到设备所对应的驱动了
不知道你是怎么修改的“设备描述符”和“配置描述符”,你的情况我不太了解
你用原来没有修改前的“设备描述符”和“配置描述符”能完成枚举吗
如果能,那就是你修改“设备描述符”和“配置描述符”的问题
就你现在描述的情况,我也说不出是哪里的问题,你可以用一下方法查看一下:
(1)如果原来未修改的“设备描述符”和“配置描述符”能完成枚举,你先不动“配置描述符”,只修改“设备描述符”,如果能枚举成功,在修改配置描述符,接着往下查原因
(2)在设备管理器里吧黄色问号的设备卸载掉,在重新枚举一下,看看会不会提示你安装驱动,如果提示了你安装驱动,说明你修改描述符后,主机找不到设备对应的驱动了
以上是我的理解,可能有不对的地方

使用特权

评论回复
板凳
nicnac|  楼主 | 2012-5-31 16:43 | 只看该作者
本帖最后由 nicnac 于 2012-5-31 16:50 编辑

2# l_lin2003
首先,非常感谢你的回答哦亲~
嗯,我看了下demo的枚举和驱动加载时间点,确实是“获取配置描述符之后”。您说的没错。
也正是因为此,我给pc返回完整的“配置描述符”之后,PC发现有问题,才无法识别设备,进而无法安装/加载驱动的。
原来未修改的“设备描述符”和“配置描述符”我一开始就试过了,无法枚举通过,我才进行了修改就是改了端点尺寸,端点号啊,这在log中可以开到修改结果的。
还有我的设备管理器里也没有黄色问号的设备,而是unknow device,这种情况,我应该怎么办呢?具体详情,我贴两个图哈,这就贴~

使用特权

评论回复
地板
l_lin2003| | 2012-5-31 17:52 | 只看该作者
CCID与HID、MSD不一样,PC的系统中没有CCID的驱动程序
主机需要安装驱动程序,没有驱动程序,主机无法再继续往下获取描述符
我没做过CCID设备,只是根据HID、MSD推测的
下一步你要做的,就是找一个CCID驱动装上再试试吧,
我这里也没有,有的话可以给你一个,你在网上找找看看吧

使用特权

评论回复
5
nicnac|  楼主 | 2012-5-31 18:15 | 只看该作者
本帖最后由 nicnac 于 2012-5-31 18:19 编辑

4# l_lin2003
CCID驱动确实不是自带的,但从windows2000开始就支持了。这驱动我也有。
但不能安装啊亲~ 原因如下。
您应该清楚USB枚举与驱动安装的过程。只有当USB枚举成功完成了"获取配置描述符"之后请求之后(或者说至少要完成这步),PC才对该设备"安装/加载"驱动。
我现在的问题是,不知什么原因,"获取配置描述符"这步无法成功完成,会被PC复位。
这些我在帖子中已经说的很清楚了,请亲认真读贴哇~
还有,正确的CCID设备,在我的机子上可以被OS识别,并安装usbccid.sys(这个就是官方CCID驱动)驱动。但安装驱动前是要进行上面那些枚举过程的。

使用特权

评论回复
6
l_lin2003| | 2012-6-1 12:53 | 只看该作者
本帖最后由 l_lin2003 于 2012-6-1 13:11 编辑

你的意思是PC桌面没有弹出安装驱动的对话框是吗?
刚才拿你的配置描述符在我的设备上运行了一次,可以啊
是不是你的PC的问题,给你看看bus hound抓取的数据,在获取完配置描述符后并没有复位,而是stall了

使用特权

评论回复
7
nicnac|  楼主 | 2012-6-1 14:54 | 只看该作者
6# l_lin2003 兄弟,谢谢你了,我搞定了,是这样的:
1.l_lin2003你出现stall的原因是因为CCID 93字节的配置描述符你没有抄对啊亲,你仔细看看;P~
2.要不是我们公司有一个两万块钱的,USB分析仪(之前我不知道有的,早知道就不用这么费事了:L),原来是93字节的配置描述符没发完,中间尽然被STALL了,详情见下图。
3.所以这是USB底层库不完善造成的,我今天上午找了下synochip的FAE,添了一句配寄存器的话就好了。

不过,l_lin2003,我还是从和你的对话中学了不少呢,话说我第一次独立搞USB,谢谢你的热情呢。
要是没有这昂贵的USB分析仪,难道我就永远不知道问题所在么?亲,你说,还有别的方法么?

未命名.jpg (65.09 KB )

未命名.jpg

使用特权

评论回复
8
l_lin2003| | 2012-6-1 15:54 | 只看该作者
呵呵,刚才回去看看,真抄错了,惭愧。。。。:$
其实像这种情况(只发送了4B个字节),你可以用bus hound先抓取数据看看(bus hound用起来更方便些),就不用这么折腾了。不过用分析仪也行

使用特权

评论回复
9
nicnac|  楼主 | 2012-6-4 09:31 | 只看该作者
8# l_lin2003 bushound只能在加载驱动之后抓包,加载驱动之前的枚举过程是抓不到的,而这段枚举正是为了让pc判断安装/加载哪个驱动而做准备的,这的抓不到,不信你可以试试哦亲~

使用特权

评论回复
10
xiaojun_| | 2013-4-1 13:37 | 只看该作者
大哥  怎么回事啊  我最近也在弄这个  碰到和你一样的问题  你怎么解决的啊  

使用特权

评论回复
11
yzwguet| | 2014-7-1 17:29 | 只看该作者
最近在弄CCID协议,找到一套可以枚举成功的描述符,跟大家分享下。
/******************** (C) COPYRIGHT 2007 STMicroelectronics ********************
* File Name          : usb_prop.c
* Author             : MCD Application Team
* Version            : V1.0
* Date               : 10/08/2007
* Description        : All processings related to Joystick Mouse Demo
********************************************************************************
* THE PRESENT SOFTWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME.
* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT,
* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE
* CONTENT OF SUCH SOFTWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING
* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
*******************************************************************************/

/* Includes ------------------------------------------------------------------*/
#include "usb_lib.h"
#include "usb_conf.h"
#include "usb_prop.h"
#include "usb_desc.h"
#include "usb_pwr.h"
#include "hw_config.h"

/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
u32 ProtocolValue;

/* -------------------------------------------------------------------------- */
/*  Structures initializations */
/* -------------------------------------------------------------------------- */

DEVICE Device_Table =
  {
    EP_NUM,
    1
  };

DEVICE_PROP Device_Property =
  {
    Joystick_init,
    Joystick_Reset,
    Joystick_Status_In,
    Joystick_Status_Out,
    Joystick_Data_Setup,
    Joystick_NoData_Setup,
    Joystick_Get_Interface_Setting,
    Joystick_GetDeviceDescriptor,
    Joystick_GetConfigDescriptor,
    Joystick_GetStringDescriptor,
    0,
    0x08 /*MAX PACKET SIZE*/
  };
USER_STANDARD_REQUESTS User_Standard_Requests =
  {
    Joystick_GetConfiguration,
    Joystick_SetConfiguration,
    Joystick_GetInterface,
    Joystick_SetInterface,
    Joystick_GetStatus,
    Joystick_ClearFeature,
    Joystick_SetEndPointFeature,
    Joystick_SetDeviceFeature,
    Joystick_SetDeviceAddress
  };

ONE_DESCRIPTOR Device_Descriptor =
  {
    (u8*)Joystick_DeviceDescriptor,
    JOYSTICK_SIZ_DEVICE_DESC
  };

ONE_DESCRIPTOR Config_Descriptor =
  {
    (u8*)Joystick_ConfigDescriptor,
    JOYSTICK_SIZ_CONFIG_DESC
  };

ONE_DESCRIPTOR Joystick_Report_Descriptor =
  {
    (u8 *)Joystick_ReportDescriptor,
    JOYSTICK_SIZ_REPORT_DESC
  };

ONE_DESCRIPTOR Mouse_Hid_Descriptor =
  {
    (u8*)Joystick_ConfigDescriptor + JOYSTICK_OFF_HID_DESC,
    JOYSTICK_SIZ_HID_DESC
  };

ONE_DESCRIPTOR String_Descriptor[4] =
  {
    {(u8*)Joystick_StringLangID, JOYSTICK_SIZ_STRING_LANGID},
    {(u8*)Joystick_StringVendor, JOYSTICK_SIZ_STRING_VENDOR},
    {(u8*)Joystick_StringProduct, JOYSTICK_SIZ_STRING_PRODUCT},
    {(u8*)Joystick_StringSerial, JOYSTICK_SIZ_STRING_SERIAL}
  };

/* Extern variables ----------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/
/* Extern function prototypes ------------------------------------------------*/
/* Private functions ---------------------------------------------------------*/

/*******************************************************************************
* Function Name  : Joystick_init.
* Description    : Joystick Mouse init routine.
* Input          : None.
* Output         : None.
* Return         : None.
*******************************************************************************/
void Joystick_init(void)
{
  pInformation->Current_Configuration = 0;
  /* Connect the device */
  PowerOn();
  /* USB interrupts initialization */
  _SetISTR(0);               /* clear pending interrupts */
  wInterrupt_Mask = IMR_MSK;
  _SetCNTR(wInterrupt_Mask); /* set interrupts mask */
  pInformation->Current_Feature = Joystick_ConfigDescriptor[7];
  /* Wait until device is configured */
  while (pInformation->Current_Configuration == 0)
  {
    NOP_Process();
  }

  bDeviceState = CONFIGURED;
}

/*******************************************************************************
* Function Name  : Joystick_Reset.
* Description    : Joystick Mouse reset routine.
* Input          : None.
* Output         : None.
* Return         : None.
*******************************************************************************/
void Joystick_Reset(void)
{
  /* Set Joystick_DEVICE as not configured */
  pInformation->Current_Configuration = 0;
  pInformation->Current_Interface = 0;/*the default Interface*/
  SetBTABLE(BTABLE_ADDRESS);

  /* Initialize Endpoint 0 */
  SetEPType(ENDP0, EP_CONTROL);
  SetEPTxStatus(ENDP0, EP_TX_STALL);
  SetEPRxAddr(ENDP0, ENDP0_RXADDR);
  SetEPTxAddr(ENDP0, ENDP0_TXADDR);
  Clear_Status_Out(ENDP0);
  SetEPRxCount(ENDP0, Device_Property.MaxPacketSize);
  SetEPRxValid(ENDP0);

  /* Initialize Endpoint 1 */
  SetEPType(ENDP1, EP_INTERRUPT);
  SetEPTxAddr(ENDP1, ENDP1_TXADDR);
  //SetEPRxAddr(ENDP1, ENDP1_RXADDR);
  SetEPTxCount(ENDP1, 2);
  //SetEPRxCount(ENDP1, 2);
  SetEPRxStatus(ENDP1, EP_RX_DIS);
  SetEPTxStatus(ENDP1, EP_TX_NAK);

  /* Initialize Endpoint 2 */
  SetEPType(ENDP2, EP_BULK);
  SetEPTxAddr(ENDP2, ENDP2_TXADDR);
  SetEPRxAddr(ENDP2, ENDP2_RXADDR);
  SetEPTxCount(ENDP2, 64);
  SetEPRxCount(ENDP2, 64);
  SetEPRxStatus(ENDP2, EP_RX_VALID);
  SetEPTxStatus(ENDP2, EP_TX_NAK);

  /* Set this device to response on default address */
  SetDeviceAddress(0);
}

/*******************************************************************************
* Function Name  : Joystick_Status_In.
* Description    : Joystick status IN routine.
* Input          : None.
* Output         : None.
* Return         : None.
*******************************************************************************/
void Joystick_Status_In(void)
{
}

/*******************************************************************************
* Function Name  : Joystick_Status_Out
* Description    : Joystick status OUT routine.
* Input          : None.
* Output         : None.
* Return         : None.
*******************************************************************************/
void Joystick_Status_Out (void)
{
}

/*******************************************************************************
* Function Name  : Joystick_Data_Setup
* Description    : Handle the data class specific requests.
* Input          : Request Nb.
* Output         : None.
* Return         : USB_UNSUPPORT or USB_SUCCESS.
*******************************************************************************/
RESULT Joystick_Data_Setup(u8 RequestNo)
{
  u8 *(*CopyRoutine)(u16);

  CopyRoutine = 0;

  if ((RequestNo == GET_DESCRIPTOR)
      && (Type_Recipient == (STANDARD_REQUEST | INTERFACE_RECIPIENT))
      && (pInformation->USBwIndex0 == 0))
  {

    if (pInformation->USBwValue1 == REPORT_DESCRIPTOR)
    {
      CopyRoutine = Joystick_GetReportDescriptor;
    }
    else if (pInformation->USBwValue1 == HID_DESCRIPTOR_TYPE)
    {
      CopyRoutine = Joystick_GetHIDDescriptor;
    }

  } /* End of GET_DESCRIPTOR */

  /*** GET_PROTOCOL ***/
  else if ((Type_Recipient == (CLASS_REQUEST | INTERFACE_RECIPIENT))
           && RequestNo == GET_PROTOCOL)
  {
    CopyRoutine = Joystick_GetProtocolValue;
  }

  if (CopyRoutine == 0)
  {
    return USB_UNSUPPORT;
  }

  pInformation->Ctrl_Info.CopyData = CopyRoutine;
  pInformation->Ctrl_Info.Usb_wOffset = 0;
  (*CopyRoutine)(0);
  return USB_SUCCESS;
}

/*******************************************************************************
* Function Name  : Joystick_NoData_Setup
* Description    : handle the no data class specific requests
* Input          : Request Nb.
* Output         : None.
* Return         : USB_UNSUPPORT or USB_SUCCESS.
*******************************************************************************/
RESULT Joystick_NoData_Setup(u8 RequestNo)
{
  if ((Type_Recipient == (CLASS_REQUEST | INTERFACE_RECIPIENT))
      && (RequestNo == SET_PROTOCOL))
  {
    return Joystick_SetProtocol();
  }

  else
  {
    return USB_UNSUPPORT;
  }
}

/*******************************************************************************
* Function Name  : Joystick_GetDeviceDescriptor.
* Description    : Gets the device descriptor.
* Input          : Length
* Output         : None.
* Return         : The address of the device descriptor.
*******************************************************************************/
u8 *Joystick_GetDeviceDescriptor(u16 Length)
{
  return Standard_GetDescriptorData(Length, &Device_Descriptor);
}

/*******************************************************************************
* Function Name  : Joystick_GetConfigDescriptor.
* Description    : Gets the configuration descriptor.
* Input          : Length
* Output         : None.
* Return         : The address of the configuration descriptor.
*******************************************************************************/
u8 *Joystick_GetConfigDescriptor(u16 Length)
{
  return Standard_GetDescriptorData(Length, &Config_Descriptor);
}

/*******************************************************************************
* Function Name  : Joystick_GetStringDescriptor
* Description    : Gets the string descriptors according to the needed index
* Input          : Length
* Output         : None.
* Return         : The address of the string descriptors.
*******************************************************************************/
u8 *Joystick_GetStringDescriptor(u16 Length)
{
  u8 wValue0 = pInformation->USBwValue0;
  return Standard_GetDescriptorData(Length, &String_Descriptor[wValue0]);
}

/*******************************************************************************
* Function Name  : Joystick_GetReportDescriptor.
* Description    : Gets the HID report descriptor.
* Input          : Length
* Output         : None.
* Return         : The address of the configuration descriptor.
*******************************************************************************/
u8 *Joystick_GetReportDescriptor(u16 Length)
{
  return Standard_GetDescriptorData(Length, &Joystick_Report_Descriptor);
}

/*******************************************************************************
* Function Name  : Joystick_GetHIDDescriptor.
* Description    : Gets the HID descriptor.
* Input          : Length
* Output         : None.
* Return         : The address of the configuration descriptor.
*******************************************************************************/
u8 *Joystick_GetHIDDescriptor(u16 Length)
{
  return Standard_GetDescriptorData(Length, &Mouse_Hid_Descriptor);
}

/*******************************************************************************
* Function Name  : Joystick_Get_Interface_Setting.
* Description    : tests the interface and the alternate setting according to the
*                  supported one.
* Input          : - Interface : interface number.
*                  - AlternateSetting : Alternate Setting number.
* Output         : None.
* Return         : USB_SUCCESS or USB_UNSUPPORT.
*******************************************************************************/
RESULT Joystick_Get_Interface_Setting(u8 Interface, u8 AlternateSetting)
{
  if (AlternateSetting > 0)
  {
    return USB_UNSUPPORT;
  }
  else if (Interface > 0)
  {
    return USB_UNSUPPORT;
  }
  return USB_SUCCESS;
}

/*******************************************************************************
* Function Name  : Joystick_SetProtocol
* Description    : Joystick Set Protocol request routine.
* Input          : None.
* Output         : None.
* Return         : USB SUCCESS.
*******************************************************************************/
RESULT Joystick_SetProtocol(void)
{
  u8 wValue0 = pInformation->USBwValue0;
  ProtocolValue = wValue0;
  return USB_SUCCESS;
}

/*******************************************************************************
* Function Name  : Joystick_GetProtocolValue
* Description    : get the protocol value
* Input          : Length.
* Output         : None.
* Return         : address of the protcol value.
*******************************************************************************/
u8 *Joystick_GetProtocolValue(u16 Length)
{
  if (Length == 0)
  {
    pInformation->Ctrl_Info.Usb_wLength = 1;
    return 0;
  }
  else
  {
    return (u8 *)(&ProtocolValue);
  }
}

void Joystick_SetConfiguration(void)
{
  if (pInformation->Current_Configuration != 0)
  {
    /* Device configured */
    bDeviceState = CONFIGURED;

#ifdef STM32F10X_CL
    /* Init EP1 IN as Bulk endpoint */
    OTG_DEV_EP_Init(EP1_IN, OTG_DEV_EP_TYPE_BULK, BULK_MAX_PACKET_SIZE);
  
    /* Init EP2 OUT as Bulk endpoint */
    OTG_DEV_EP_Init(EP2_OUT, OTG_DEV_EP_TYPE_BULK, BULK_MAX_PACKET_SIZE);     
#else   
    ClearDTOG_TX(ENDP1);
    ClearDTOG_RX(ENDP2);
#endif /* STM32F10X_CL */
/* Initialize Endpoint 1 */
#if 0
  SetEPType(ENDP1, EP_INTERRUPT);
  SetEPTxAddr(ENDP1, ENDP1_TXADDR);
  //SetEPRxAddr(ENDP1, ENDP1_RXADDR);
  SetEPTxCount(ENDP1, 2);
  //SetEPRxCount(ENDP1, 2);
  SetEPRxStatus(ENDP1, EP_RX_DIS);
  SetEPTxStatus(ENDP1, EP_TX_NAK);

  /* Initialize Endpoint 2 */
  SetEPType(ENDP2, EP_BULK);
  SetEPTxAddr(ENDP2, ENDP2_TXADDR);
  SetEPRxAddr(ENDP2, ENDP2_RXADDR);
  SetEPTxCount(ENDP2, 64);
  SetEPRxCount(ENDP2, 64);
  SetEPRxStatus(ENDP2, EP_RX_VALID);
  SetEPTxStatus(ENDP2, EP_TX_NAK);
  #endif
  // Bot_State = BOT_IDLE; /* set the Bot state machine to the IDLE state */
  }
}

/******************* (C) COPYRIGHT 2007 STMicroelectronics *****END OF FILE****/

使用特权

评论回复
12
pnm_0881| | 2014-7-3 09:35 | 只看该作者
高大上,涨姿势哇

使用特权

评论回复
13
wabcho| | 2016-9-27 01:44 | 只看该作者
隔层的楼上乱弹琴,枚举数据哪里?贴一堆无用代码有**用?

使用特权

评论回复
14
freezjf| | 2017-8-3 14:39 | 只看该作者
居然跟楼主遇到一模一样的问题。正在焦头烂额中。。。
请教怎么改了一下寄存器,楼主献身啊!

使用特权

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

本版积分规则

0

主题

12

帖子

1

粉丝