基于STM32的USB程序开发笔记(3)
} } }
// Other endpoints else {
http://www.hkaco.com
wValENDP = GetEPR(wEPIndex);
SetEPR_RXStatus(wEPIndex, EP_RX_NAK); SetEPR_TXStatus(wEPIndex, EP_TX_NAK);
if((wValENDP & EP_CTR_TX) != 0) {
ClrEPR_CTR_TX(wEPIndex); switch(wEPIndex) {
case ENDP1: CTR_IN1(); break; case ENDP2: CTR_IN2(); break; case ENDP3: CTR_IN3(); break; case ENDP4: CTR_IN4(); break; case ENDP5: CTR_IN5(); break; case ENDP6: CTR_IN6(); break; case ENDP7: CTR_IN7(); break; default: break; } }
if((wValENDP & EP_CTR_RX) != 0) {
ClrEPR_CTR_RX(wEPIndex); switch(wEPIndex) {
case ENDP1: CTR_OUT1(); break; case ENDP2: CTR_OUT2(); break; case ENDP3: CTR_OUT3(); break; case ENDP4: CTR_OUT4(); break; case ENDP5: CTR_OUT5(); break; case ENDP6: CTR_OUT6(); break; case ENDP7: CTR_OUT7(); break; default: break; } } } }
}
http://www.hkaco.com
INT_ISTR_CTR()函数将各自响应事件提取出来,默认端点EP0也是最为复杂的,这个需要查看STM32的参考手册以及USB协议才能更好了解为何如此。到这里STM32 USB里数据传输事件就指向了各个对应的端点。下篇着重说明USB设备的枚举。
基于STM32的USB程序开发笔记(四)——USB设备的枚举(上)
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事件数据长度固
http://www.hkaco.com
定为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;
http://www.hkaco.com
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协议中,程序根据请求代码,再去执行对应函数,这样做的目的就是让程序结构明了。其中注释为\的部分表明此部分功能已完成。对于未完成部分,希望大家在交流中完善。
// ***************************************************************************** // Routine Groups: SETUP_Data
// ***************************************************************************** RESULT SETUP0_Data(void) {
// SetupData.bRequest: request code switch(vsDeviceInfo.SetupData.bRequest) {
http://www.hkaco.com
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: …… 此处隐藏:3235字,全部文档内容请下载后查看。喜欢就下载吧 ……
相关推荐:
- [实用模板]第八章:法国“新浪潮”与“左岸派”
- [实用模板]2021年北京上半年临床医学检验技师生物
- [实用模板]SAP GUI 7.10客户端安装配置文档
- [实用模板]2001年临床执业医师资格考试综合笔试试
- [实用模板]36机场工作实用英语词汇总结
- [实用模板](一)社会保险稽核通知书
- [实用模板]安全教育主题班会材料
- [实用模板]濉溪县春季呼吸道传染病防控应急演练方
- [实用模板]长沙房地产市场周报(1.30-2.3)
- [实用模板]六年级数学上册典中点 - 图文
- [实用模板]C程序设计(红皮书)习题官方参考答案
- [实用模板]中国证监会第一届创业板发行审核委员会
- [实用模板]桥梁工程复习题
- [实用模板]2011学而思数学及答案
- [实用模板]初中病句修改专项练习
- [实用模板]监理学习知识1 - 图文
- [实用模板]小机灵杯四年级试题
- [实用模板]国贸专业毕业论文模板
- [实用模板]教育学概论考试练习题-判断题4
- [实用模板]2015届高考英语一轮复习精品资料(译林
- 00Nkmhe_市场营销学工商管理_电子商务_
- 事业单位考试法律常识
- 诚信教育实施方案
- 吉大小天鹅食品安全检测箱方案(高中低
- 房地产销售培训资料
- 高一地理必修1复习提纲
- 新概念英语第二册lesson_1_练习题
- 证券公司内部培训资料
- 小学英语时间介词专项练习
- 新世纪英语专业综合教程(第二版)第1册U
- 【新课标】浙教版最新2018年八年级数学
- 工程建设管理纲要
- 外研版 必修一Module 4 A Social Surve
- Adobe认证考试 AE复习资料
- 基于H.264AVC与AVS标准的帧内预测技术
- 《食品检验机构资质认定管理办法》(质
- ABB变频器培训课件
- (完整版)小学说明文阅读练习题及答案
- 深思洛克(SenseLock) 深思IV,深思4,深
- 弟子规全文带拼音




