如何修改ST的stm8s i2c 官方例程HID例程使之能枚举游戏手柄

基于STM32的USB枚举过程学习笔记 - CSDN博客
基于STM32的USB枚举过程学习笔记
&之前使用ST官方的库以及网络的资料,完成了使用USB HID类进行STM32和PC机的通讯。由于其他原因并没有深入的分析,虽然实现了功能,但是关于USB设备的枚举,以及具体的通讯方式都没有清晰的概念,所以现在回头重新学习USB相关知识。主要参考资料是《圈圈教你玩USB》、USB枚举过程图解,ST官方的USB HID例程。
一,USB数据包
&&& 1.&&&&USB数据包分类
&&& &USB总线上的数据传输以包为基本的单位。USB协议规定了四种包:令牌包、数据包、握手包、特殊包。不同的包通过包中的8位PID域区分。
&&& 令牌包用于启动&一次USB传输,USB的数据传输必须由主机发起。令牌包有四种:
&&&&&&输出令牌包(OUT):用来通知设备将要输出一个数据包。 数据方向 主机--&设备
&&&&& 输入令牌包(IN):用来通知设备将要返回一个数据包。&&数据方向& 设备--&主机
&&&&& 建立令牌包(SETUP):通知设备将要输出一个数据包,类似OUT包。不过SETUP包只能往端点0发包,只用在控制传输中。
&&&&& 帧起始包(SOF):用于帧计数,USB全速设备每毫秒产生一帧,USB高速设备每125μS产生一帧。
&&&&& OUT , IN, SETUP包的结构:同步域+8位PID+7位地址+4位端点号+5位CRC校验+包结束符EOP&
&&&& 数据包用来传输数据,分成DATA0. DATA1 。数据格式如下
&&&& 同步域+8位PID+N个字节的数据+CRC16校验+包结束符EOP
&&&&&握手包用来表示一个传输是否被对方确认,有ACK,NAK,STALL,NYET。
&&&& ACK:表示正确的接收数据并且有足够的空间容纳数据。主机和设备都可以使用ACK来确认,NAK,STALL,NYET只能够用于设备返回,主机不能使用。
&&&&&NAK:表示没有数据需要返回,或者数据正确接收但是没有空间容纳。当主机收到NAK后,知道设备还未准备好,主机会在合适的时候重新进行数据传输。
&&&&&STALL:表示设备无法执行该请求,或者端点已经被挂起。
&&&&&NYET:USB高速设备中用。
&&&&&握手包的格式:同步域+8位PID+包结束符EOP
&&& 2.&&& &数据包的处理
&&&&在传输过程中,具体的处理细节由USB接口的芯片处理完成。
&&&&当USB接口芯片正确接收到数据时,如果有空间保存,则它将数据保存并返回ACK,同时,设置一个标志表示已经正确接收到数据;如果没有空间保存数据,则自动返回NAK。
&&& &收到输入请求时,如果有数据需要发送,则发送数据,并等待接收ACK。只有到数据成功发送出去(即接收到ACK标志后),它才设置标志,表示数据已成功发送;如果无数据需要发送,则它自动返回NAK。
&&& 通常只需根据芯片提供的一些标志,准备要发送的数据到端点,或者从端点读取接收到的数据即可。
二 ,USB事务
&&& 虽然USB定义了数据在总线上传输的基本单位是包,为了传输数据,必须按照一定的关系把这些不同的包组织成事务才能传输数据。事务通常由两个或者三个包组成:令牌包、数据包和握手包。
&&& 令牌包用来启动一个事务,总是由主机发送;数据包用来传送数据,可以从主机到设备,也可以由设备到主机,方向由令牌包来指定;握手包用来指定数据传输结果。&
三,USB传输类型&&&&
&&& USB规定了4种传输类型:批量传输、等时传输、中断传输、控制传输。其中前三个传输一次数据都是一个事务;控制传输包括三个过程,建立过程和状态过程分别是一个事务,数据过程则可能包含多个事务。
&接下来介绍USB设备的枚举,枚举就是从设备读取各种描述符信息,这样主机就可以根据这些信息来加载合适的驱动,从而知道是什么样的设备,如何进行通信。&枚举过程使用的是控制传输。控制传输可以保证数据的正确性。控制传输分三个过程:建立过程,可选数据过程及状态过程。
&&& 下面介绍枚举的详细过程。
&&& USB主机检测到USB设备插入后,就会先对设备复位,并通过一个带数据过程的控制传输完成设备描述符的获取。
&&& 第一步,USB主机会往地址0的端点0发送获取设备描述符的标准请求,发送请求属于控制传输的建立过程。建立过程是一个事务。首先是令牌包,即主机发送一个SETUP令牌,令牌的格式如上一篇描述的那样,有令牌的PID,地址和端点号等;其次是数据包,SETUP使用DATA0数据包,数据包中包括标准请求的ID;最后是握手包,设备只能使用ACK来应答,除非出错不应答。下面根据网上找的USB协议分析捕捉的图分析该建立过程。
&&& 下面通过STM32官方的USB的例子,自己添加打印信息,查看该控制传输的建立工程中USB主机发送的请求。如上一篇介绍,我们只需根据硬件置的标志位来判断USB传输的状态即可。在usb_istr.c的USB_Istr()函数中,根据中断标志,添加打印信息。在正确传输中断的处理函数CTR_LP()中Setup0_Process()函数表示端点0的建立过程,即上面USB主机复位获取设备描述符将执行的函数。增加打印信息的函数如下:
在打印信息之后直接就让函数返回,使主机得不到ACK应答,下面根据打印信息看下测试情况。
根据打印信息,由于从机没有ACK应答给PC机的请求,在PC机尝试发了3次请求后,就放弃了。可以在PC机的设备管理器看到,在请求打印3次以后出现了unknown device。
关于8个字节的请求代码的具体含义请参照USB协议,或者在《圈圈教你玩USB》里面对照。
&&& 以上就是枚举过程获取设备描述符的第一步控制传输的建立过程,主机发送获取描述符的请求,下一篇我们将代码中ACK返回,使主机接收到建立过程的应答,从而进入到数据过程,即设备响应主机的请求,将设备描述符发送给主机。
上一篇介绍到了主机上电复位USB设备,在控制传输的建立过程,发送了8个字节的数据给设备,这8个字节为0x80 0x06 0x00 0x01 0x00 0x00 0x40 0x00,该请求为USB标准设备请求中的GET_DESCRIPTOR请求。0x80表示标准设备请求,数据方向是设备到主机。0x60表示请求类型GET_DESCRIPTOR。0x01表示描述符类型是设备描述符。0x40表示描述符长度。
&&&& 设备在收到该请求以后,首先进行解析,根据请求中的0x40表示该控制传输有数据过程,因此进入到Data_Setup0()函数。该函数根据请求的不同描述符,执行不同的回调函数
CopyRoutine(),并在DataStageIn()函数中把要发送给主机的描述符填入USB缓冲区,等待USB主机发送IN令牌包。
&&& 主机在建立过程最后收到ACK以后,发送IN令牌包,从而进入到数据过程。在CTR_LP()函数中判断是IN0中断后,进入In0_Process()函数。在数据过程将之前填在USB缓冲器的设备描述符发给主机,并等待主机的应答。
&&& 主机在确认接收到的设备描述符没有出错后,就会返回一个0数据长度的确认包,即控制传输的状态过程。在CTR_LP()函数中判断是OUT0中断,进入Out0_Process()函数,由于在状态过程,所以调用回调函数Process_Status_OUT()。
&&& 下面和上篇一样,对照着USB分析仪捕捉的数据分析获取设备描述符这次控制传输的数据过程和状态过程。
下面通过串口打印信息查看获取设备描述符控制传输过程中的数据包的数据。打印信息如下
&&& 至此,USB主机成功获取到设备描述符。打印信息最后可以看到,主机再次复位USB,将进入到设置地址的阶段。
&前几篇介绍中,USB主机完成了获取设备的描述符,现在进入第二步,设置设备的地址阶段。
&&& 该阶段是一个无数据过程的控制传输。首先,在建立过程中USB主机往设备的端点0发出一个设置地址的请求,新地址在建立过程的数据包中。该事务的结构包括:SETUP0令牌包+SET_ADDRESS数据包+握手包。在建立过程之后直接进入到的状态过程,因为设置地址阶段是一个无数据过程的控制传输。在状态过程,设备等待主机请求状态返回(即等待主机发送一个IN令牌包),收到IN令牌包后,设备就返回一个0长度的数据包,如果主机确认该数据包已经正确收到,就会发送应答包ACK给设备,设备收到ACK之后,就要启动新的设备地址,这样设备就分配到了一个唯一的设备地址。
&&& 接下来将这段设置地址的过程通过USB分析仪捕捉分析如下
&&& 接着分析STM32 USB_HID例子中的枚举过程的设置地址阶段。同样在接收到主机的setup0令牌后,STM32 USB进入中断处理函数Setup0_Process(),由于是没有数据过程的控制传输,接着进入NoData_Setup0()函数,函数最后通过USB_StatusIn()等待主机的IN令牌,即状态阶段。主机发IN令牌进入到状态阶段,USB中断函数中执行In0_Process()函数,该函数把在建立过程函数Setup0_Process()中保存在pInformation的地址信息,通过SetDeviceAddress()函数,配置新的设备地址。串口的调试信息如下
至此,设备新的地址设置成功,这里设置成0x6,之后的过程将使用这个新地址。
接下来,主机将使用新的设备地址和设备进行通信。 主机需要再次获取设备描述符,配置描述符,字符串描述符,另外HID设备还要获取报告描述符等。根据《圈圈教你玩USB》里面介绍,我们可以使用BUS Hound工具,对主机发送给设备的数据进行抓包,分析数据包,根据USB协议完成相应的主机的请求。
&&& 在STM32 USB_HID的例子中,和以上获取描述符相关的主要文件有Usb_desc.c(定义了各种描述符),Usb_prop.c&(其中的CustomHID_GetStringDescriptor函数完成了对主机获取字符串描述符种类的细分)。具体的内容可以自己根据调试信息按照之前几篇文章中介绍的分析方法分析。
&&& 下面给出用到的资料的下载连接
本文已收录于以下专栏:
相关文章推荐
在说枚举过程之前,先把一些必须了解的说明白
一.USB包结构和分类
    
包的共同特点是,都是以同步域开始,接着是PID,最后以EOP结束,而设备端则靠SEI(串行接口引擎,硬件上实现)来...
/order_windows_linux_mac_systems_usb_hid_similarities_and_differences_between_t...
接下来介绍USB设备的枚举,枚举就是从设备读取各种描述符信息,这样主机就可以根据这些信息来加载合适的驱动,从而知道是什么样的设备,如何进行通信。 枚举过程使用的是控制传输。控制传输可以保证数据的正确性...
上一篇介绍到了主机上电复位USB设备,在控制传输的建立过程,发送了8个字节的数据给设备,这8个字节为0x80 0x06 0x00 0x01 0x00 0x00 0x40 0x00,该请求为USB标准设...
转自:http://blog.csdn.net/qq/article/details/8179005
     上一篇介绍到了主机上电复位USB...
转自:http://blog.csdn.net/qq/article/details/8176994
   
之前使用ST官方的库以及网络的资料,...
之前使用ST官方的库以及网络的资料,完成了使用USB HID类进行STM32和PC机的通讯。由于其他原因并没有深入的分析,虽然实现了功能,但是关于USB设备的枚举,以及具体的通讯方式都没有清晰的概念,...
的插入检测
  当12脚短接,Q1截止,Q2导通,D+上拉,windows
USB 接口有一个全速设备,马上复位总线,并开始枚举设备。
  如果23脚短接,则
...
USB的“JoyStickMouse”例程分析——学习笔记(4)__枚举过程
他的最新文章
讲师:宋宝华
讲师:何宇健
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)HID设备通讯,最新最全的HID设备通讯资讯 - 电子工程世界网
HID设备通讯
HID设备通讯文章
你可能感兴趣的标签
热门资源推荐介绍如何应用ST USB HID例程生成一个可以输入和输出任何长度小于等于64字节的移植过程
上传时间为:
前言本文简单介绍如何应用ST USB HID(MOUSE)例程生成一个可以输入和输出任何长度小于等于64字节的移植过程。问题描述:HID的在USB的运用中是非常广泛的,但是很多应用并不是简单的鼠标或者键盘操作,而是客户自定义的一些应用,所以REPORT的定义往往跟鼠标或者键盘并不相同,因而客户常常基于ST的HID的例程进行修改。那么如何基于我们的例程生成一个可以输入输出任何长度小于等于64字节的例程?这里示范一下,抛砖引玉。代码修改:第一步:我们在usbd_hid_core.c中,找到配置描述进行修改。首先增加一个OUT 端点。同时将HID_IN_PACKET 和HID_OUT_PACKET长度修改为0x40。0x07, /* bLength: Endpoint Descriptorsize *///dum USB_ENDPOINT_DESCRIPTOR_TYPE, /*bDescriptorType: */ /* Endpoint descriptor type */ HID_OUT_EP, /* bEndpointAddress: */ /*Endpoint Address (OUT) */ 0x03, /* bmAttributes: Interruptendpoint */ HID_OUT_PACKET, /* wMaxPacketSize: 64Bytes max */ 0x00, 0x01, /* bInterval: Polling Interval(20 ms) */ /* 41 */第二步:修改报告描述符:请注意这两个report count 和report SIZE 的设定。const uint8_tHID_MOUSE_ReportDesc[HID_MOUSE_REPORT_DESC_SIZE] = { 0x05, 0x8C, /* USAGE_PAGE (VendorPage: 0xFF00) */ 0x09, 0x06, /* USAGE (Demo Kit) */ 0xa1, 0x01, /* COLLECTION(Application) */ /* 6 */ 0x09, 0x06, /* USAGE ( 1) */ 0x15, 0x00, /* LOGICAL_MINIMUM (0) */ 0x26, 0x00,0xff, /* LOGICAL_MAXIMUM(1) */ 0x75, 0x08, /* REPORT_SIZE (8) */ 0x95, 0x40, /* REPORT_COUNT (64) */ 0x91, 0x82, /* OUTPUT(Data,Var,Abs,Vol) */ /* 18 */0x09, 0x06, /* USAGE (ADC IN) */ 0x15, 0x00, /* LOGICAL_MINIMUM (0) */ 0x26, 0x00,0xff, /* LOGICAL_MAXIMUM(255) */ 0x75, 0x08, /* REPORT_SIZE (8) */ 0x95, 0X40, /* REPORT_COUNT (64) */ 0x81, 0x82, /* INPUT(Data,Var,Abs,Vol) */ /* 31 */ 0xc0 /* END_COLLECTION */ }; /* CustomHID_ReportDescriptor */第三步:修改HID CLASS 初始化代码:注意这里两个地方:1, USB FIFO的分配定义。2, Usb ENDPOINT的使能,以及准备接收数据。static uint8_t USBD_HID_Init (void*pdev, uint8_t cfgidx) { DCD_PMA_Config(pdev ,HID_IN_EP,USB_SNG_BUF,HID_IN_TX_ADDRESS); DCD_PMA_Config(pdev ,HID_OUT_EP,USB_SNG_BUF,HID_OUT_RX_ADDRESS); /* Open EP IN */ DCD_EP_Open(pdev, HID_IN_EP, HID_IN_PACKET, USB_EP_INT); /* Open EP OUT */ DCD_EP_Open(pdev, HID_OUT_EP, HID_OUT_PACKET, USB_EP_INT);DCD_EP_PrepareRx(pdev,HID_OUT_EP,Report_buf,HID_OUT_PACKET);PrevXferDone=1; return USBD_OK; }第四步:修改发送函数,注意不能一直往USB FIFO里面填充数据,一定要等上一次传输完成再填充。USBD_HID_SendReport(&USB_Device_dev, Send_Buffer,HID_IN_PACKET);最后我们一起来看看效果,可以清楚的看到MCU每毫秒都会发送64个字节的数据到主机。结论:这个例程只是基于STM32F0系列的MCU进行的修改,你只要按照这四步很容易地移植到其它系列MCU上。文章来源于网络
作者其它经验
这个家伙很懒,什么都没有留下。
作者其它经验STM32F103程序设计-3-如何下载和使用ST官方例程 - CSDN博客
STM32F103程序设计-3-如何下载和使用ST官方例程
如何下载和使用ST官方例程
一.如何下载
1.官方的网址
2.输入上述网址后,点击,接下来选择
3.注册并登陆
注册并登录成功
4.找到单片机嵌入式软件,STM32标准外设库文件
5.然后找到这里是F1的标准外设库文件
6.拉到最底下,找到GetSoftware
下载并解压缩
那么解压的文件有哪些可以看下面的图片,介绍可以阅读解压之后文件夹下的stm32f10x_stdperiph_lib_um文件。
例程在Project,一个是工程模版,一个各种外设的例程。
例程很全面,具体看看下图。
有ADC、、、等。如何使用这些例程,并不是直接打开即可,这里使用这些例程的方法尤为重要。
二.使用ST官方例程的方法
上图中下面一行便是模版工程的文件夹,点击进文件夹。进入到STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Template\MDK-ARM目录中,点击打开工程。编译完成,没有出错。
下面讲如何使用例程,以GPIO例程为例。首先看文件夹中的文件。该文件中有
介绍中的具体步骤:
1.文件的拷贝
把上面\GPIO\IOToggle文件夹中的所有文件拷贝到下面图片中
2.编译、下载程序。
3.大部分就上面两步,少数的文件中有特殊要求。
By:霜月孤鸟
CSDN博客地址:http://blog.csdn.net/ourrtems
欢迎访问、关注单片机百宝箱!
本文已收录于以下专栏:
相关文章推荐
该文写给那些处于初学ST芯片开发、英文不好而又想偷懒的人。
该文主要的目的是提醒大家:学习一门技术是需要舍得花功夫,捷径是你在起点与终点之间不断的探索,最终总结出来的一条适合自己的路。
前面我们做了ST官方库文件的分析及使用说明,本文将介绍在官方库文件建立的模板工程下使用ST官方库文件中的例程方法
1、首先找到我们要用到的ST官方库文件中的例程文件(以GPIO为例)
文件目录为STM...
Ⅰ、写在前面
很多朋友在开始学习STM32开发的时候都不怎么进入ST官网查找资料,大部分人都是“百度”。结果找了半天,有可能还没有找到自己想要的文档。
ST官网是没有受访问的限制,不像访问谷...
Ⅰ、写在前面
很多初学的朋友经常都会问“******”资料哪儿有? “******”文档在哪儿下载? “******”教程在哪儿可以获取的到?
其实,这些问题在我们每一个人初学的时候都有过,...
stm32官方下载的例程,直接编译会出错(主要原因是它官网的例程是针对对个开发板写的总例程,通过宏定义来选择不同的开发板),所以需要如下简单的设置后,方可编译通过!
官网例程下载地址:
http://...
如何制作模板例程文件,主要有以下四步:
1.从官方下载的例程中复制一些有用的文件
2.对一些文件进行一些修改
3.添加路径
4.修改两个参数
具体步骤:
1.新建一...
他的最新文章
讲师:宋宝华
讲师:何宇健
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)查看: 1815|回复: 5
如何修改ST的官方HID例程使之能枚举游戏手柄
主题帖子精华
中级会员, 积分 375, 距离下一级还需 125 积分
在线时间6 小时
刚接触USB,想让STM32的USB可以枚举到游戏手柄,需要改一些描述符么?
手中有一本圈圈教你玩USB
初步枚举、解码有线手柄成功,但是换成无线(RF2.4G)通信的枚举能成功,但是无法解码(手柄按键)。。。
拿什么让你自己信服 自己
主题帖子精华
中级会员, 积分 375, 距离下一级还需 125 积分
在线时间6 小时
初步枚举、解码有线手柄成功,但是换成无线(RF2.4G)通信的枚举能成功,但是无法解码(手柄按键)。。。
拿什么让你自己信服 自己
主题帖子精华
中级会员, 积分 246, 距离下一级还需 254 积分
在线时间6 小时
你是想要这个手柄能用来打游戏还是仅仅是让电脑识别到你这个手柄?
主题帖子精华
中级会员, 积分 375, 距离下一级还需 125 积分
在线时间6 小时
现在是识别,最终能和STM32实现基本的通信就可以!
拿什么让你自己信服 自己
主题帖子精华
初级会员, 积分 107, 距离下一级还需 93 积分
在线时间0 小时
你好!请问这个问题解决了吗?
主题帖子精华
中级会员, 积分 375, 距离下一级还需 125 积分
在线时间6 小时
回复【5楼】scorpio_b:
---------------------------------
那个无线用的是射频的,后来就没做下去。。。
拿什么让你自己信服 自己
Powered by}

我要回帖

更多关于 stm32 iap官方例程 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信