你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

基于STM32的USB程序开发笔记(四)——USB设备的枚举(上)

[复制链接]
乡村布拉德 发布时间:2008-12-23 12:12
USB设备能否工作,枚举步骤,用“乡村爱情”里的话说,“必须的!”,网上也有很多资料,圈圈就提供了一份详细的枚举过程,但对STM32是怎么响应的没有说明,一会详细道来,先上圈圈的提供的那个枚举图示,希望圈圈支持,如果不妥,请与我联系,谢谢。
我将此转换成了PDF文件,方便查看。
首先说明一个变量,定义在usb_core.c中:
volatile DEVICE_INFO vsDeviceInfo;
看意思就知道他的作用了,DEVICE_INFO是个结构,定义在usb_type.h中:
// *****************************************************************************
// DEVICE_INFO
// *****************************************************************************
typedef struct _DEVICE_INFO
{
  unsigned char bDeviceAddress;

  unsigned char bCurrentFeature;
  unsigned char bCurrentConfiguration;
  unsigned char bCurrentInterface;
  unsigned char bCurrentAlternateSetting;

  WORD_2BYTE    uStatusInfo;

  DEVICE_STATE  eDeviceState;
  RESUME_STATE  eResumeState;
  CONTROL_STATE eControlState;

  SETUP_DATA    SetupData;

  TRANSFER_INFO TransInfo;
}
DEVICE_INFO,
*PDEVICE_INFO;

在枚举过程中,就是如何处理好SETUP事件,如果STM32 USB接收到正确的SETUP事件,将响应函数CTR_SETUP0(),SETUP事件是特殊的OUT事件,数据方向 Host->Device,SETUP事件数据长度固定为8,数据定义在DEVICE_INFO.SetupData,其数据结构是(定义在 usb_type.h中):
typedef struct _SETUP_DATA
{
  unsigned char bmRequestType;            // request type
  unsigned char bRequest;                 // request code

  WORD_2BYTE wValue;
  WORD_2BYTE wIndex;
  WORD_2BYTE wLength;
}
SETUP_DATA,
*PSETUP_DATA;

WORD_2BYTE是定义的一个共用体:
typedef union _WORD_2BYTE
{
  unsigned short w;
  struct
  {
    unsigned char LSB;
    unsigned char MSB;
  }b;
}
WORD_2BYTE;

为什么将SETUP数据结构中的wValue,wIndex,wLength如此定义?
1:USB协议中所有数据传输都是依照低位在先的原则
2:高地位字节可能功能复用
这样在后续的程序编写中就变得十分方便,ST提供的USB固件方法同样如此,但这方面的处理让人有些摸不着头脑,详情可参阅。至于具体的SETUP数据结构含义如何,还是要具备基本知识:了解USB协议

CTR_SETUP0() 函数将SETUP数据提取出来,SETUP数据结构有0长度和非0长度的数据结构,详细参阅USB2.0官方协议第9章。在这将两种区别开来分别执行 SETUP0_NoData()和SETUP0_Data()函数,并返回结果,根据返回结果再响应USB主机
// *****************************************************************************
// Function Name  : CTR_SETUP0
// Description    :
// Input          :
// Output         :
// Return         :
// *****************************************************************************
void CTR_SETUP0(void)
{
  RESULT eResult;

  BufferCopy_PMAToUser( (unsigned char *)&vsDeviceInfo.SetupData,
                        GetBuffDescTable_RXAddr(ENDP0),
                        GetBuffDescTable_RXCount(ENDP0));

  if(vsDeviceInfo.SetupData.wLength.w == 0)
  {
    eResult = SETUP0_NoData();
  }
  else
  {
    eResult = SETUP0_Data();
  }

  switch(eResult)
  {
  case RESULT_SUCCESS:

    break;

  case RESULT_LASTDATA:

    break;

  case RESULT_ERROR:
  case RESULT_UNSUPPORT:
    SetEPR_RXStatus(ENDP0, EP_RX_VALID);
    SetEPR_TXStatus(ENDP0, EP_TX_STALL);
    break;
  }
}

SETUP0_Data() 和SETUP0_NoData()函数支持的所有USB请求类型只有罗列的这些,有多少种组合都定义在USB协议中,程序根据请求代码,再去执行对应函数,这样做的目的就是让程序结构明了。其中注释为"// done"的部分表明此部分功能已完成。对于未完成部分,希望大家在交流中完善。

// *****************************************************************************
// Routine Groups: SETUP_Data
// *****************************************************************************
RESULT SETUP0_Data(void)
{
  // SetupData.bRequest: request code
  switch(vsDeviceInfo.SetupData.bRequest)
  {
  case SR_GET_STATUS:         return SR_GetStatus();                  // done
  case SR_GET_DESCRIPTOR:     return SR_GetDescriptor();              // done
  case SR_SET_DESCRIPTOR:     return SR_SetDescriptor();              // unsupport
  case SR_GET_CONFIGURATION:  return SR_GetConfiguration();           // done
  case SR_GET_INTERFACE:      return SR_GetInterface();               // unsupport
  case SR_SYNCH_FRAME:        return SR_SynchFrame();                 // unsupport

  default: return RESULT_UNSUPPORT;
  }
}

// *****************************************************************************
// Routine Groups: SETUP_NoData
// *****************************************************************************
RESULT SETUP0_NoData(void)
{
  // SetupData.bRequest: request code
  switch(vsDeviceInfo.SetupData.bRequest)
  {
  case SR_CLEAR_FEATURE:      return SR_ClearFeature();        // unsupport
  case SR_SET_FEATURE:        return SR_SetFeature();          // unsupport
  case SR_SET_ADDRESS:        return SR_SetAddress();          // done
  case SR_SET_CONFIGURATION:  return SR_SetConfiguration();    // done
  case SR_SET_INTERFACE:      return SR_SetInterface();        // unsupport

  default: return RESULT_UNSUPPORT;
  }
}

下篇将介绍上述的各个请求函数如何响应主机。

USB枚举过程图解.pdf

下载

273.09 KB, 下载次数: 202

收藏 评论9 发布时间:2008-12-23 12:12

举报

9个回答
luoqizhu-173640 回答时间:2010-3-5 17:11:29

回复:基于STM32的USB程序开发笔记(四)——USB设备的枚举(上)

谢谢谢谢谢谢谢谢谢谢
baobaoaileilei 回答时间:2010-3-18 09:04:51

RE:基于STM32的USB程序开发笔记(四)——USB设备的枚举(上)

谢谢
lihongying-1191 回答时间:2010-4-24 10:48:49

回复:基于STM32的USB程序开发笔记(四)——USB设备的枚举(上)

good!!
fancatls 回答时间:2010-4-25 22:36:26

RE:基于STM32的USB程序开发笔记(四)——USB设备的枚举(上)

非常感谢
viking_xie 回答时间:2011-4-19 14:44:10

RE:基于STM32的USB程序开发笔记(四)——USB设备的枚举(上)

很好,谢谢分享.
aganmelody 回答时间:2011-10-6 20:33:12

回复:基于STM32的USB程序开发笔记(四)——USB设备的枚举(上)

好,正在学习中
fengye5340 回答时间:2013-3-14 14:44:57

回复:基于STM32的USB程序开发笔记(四)——USB设备的枚举(上)

感谢楼主分享资料
sunsword 回答时间:2013-6-11 09:35:31

回复:基于STM32的USB程序开发笔记(四)——USB设备的枚举(上)

谢谢你 分享资料
sange-2008502 回答时间:2013-7-8 08:55:36

RE:基于STM32的USB程序开发笔记(四)——USB设备的枚举(上)

正要学习枚举过程

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版