发新帖本帖赏金 10.00元(功能说明)我要提问
返回列表
打印
[STM32F4]

【F446RE开发板试用】+USB_OTG读取USB手柄数据(keil工程内有彩蛋)

[复制链接]
楼主: 湛只为无双
手机看帖
扫描二维码
随时随地手机跟帖
21
mintspring| | 2015-10-4 08:12 | 只看该作者 回帖奖励 |倒序浏览
我来帮忙贴出来楼主的主函数。
-----------------------------------------------
#include "stm32f4xx.h"
#include "delay.h"
#include "USART2.h"
#include "usbh_usr.h"
#include "string.h"

USBH_HOST  USB_Host;
USB_OTG_CORE_HANDLE  USB_OTG_Core_dev;
extern HID_Machine_TypeDef HID_Machine;
//HID重新连接
void USBH_HID_Reconnect(void)
{
        //关闭之前的连接
        USBH_DeInit(&USB_OTG_Core_dev,&USB_Host);        //复位USB HOST
        USB_OTG_StopHost(&USB_OTG_Core_dev);                //停止USBhost
        if(USB_Host.usr_cb->DeviceDisconnected)                //存在,才禁止
        {
                USB_Host.usr_cb->DeviceDisconnected();         //关闭USB连接
                USBH_DeInit(&USB_OTG_Core_dev, &USB_Host);
                USB_Host.usr_cb->DeInit();
                USB_Host.class_cb->DeInit(&USB_OTG_Core_dev,&USB_Host.device_prop);
        }
        USB_OTG_DisableGlobalInt(&USB_OTG_Core_dev);//关闭所有中断
        //重新复位USB
        RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_OTG_FS,ENABLE);//USB OTG FS 复位
        //delay_ms(5);
        RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_OTG_FS,DISABLE);        //复位结束  

        memset(&USB_OTG_Core_dev,0,sizeof(USB_OTG_CORE_HANDLE));
        memset(&USB_Host,0,sizeof(USB_Host));
        //重新连接USB HID设备
        USBH_Init(&USB_OTG_Core_dev,USB_OTG_FS_CORE_ID,&USB_Host,&HID_cb,&USR_Callbacks);  
}
int main(void)
{
        USART2_Init();
       
        USBH_Init(&USB_OTG_Core_dev,USB_OTG_FS_CORE_ID,&USB_Host,&HID_cb,&USR_Callbacks);
        while(1)
        {
                USBH_Process(&USB_OTG_Core_dev, &USB_Host);
                if(bDeviceState==1)//连接建立了
                {
                        if(USBH_Check_HIDCommDead(&USB_OTG_Core_dev,&HID_Machine))//检测USB HID通信,是否还正常?
                        {
                                USBH_HID_Reconnect();//重连
                        }
                }else        //连接未建立的时候,检测
                {
                        if(USBH_Check_EnumeDead(&USB_Host))        //检测USB HOST 枚举是否死机了?死机了,则重新初始化
                        {             
                                USBH_HID_Reconnect();//重连
                        }
                }
                delay_ms(5);
        }
}


使用特权

评论回复
22
cedar_renjun| | 2015-10-7 20:51 | 只看该作者
很赞啊,刚好有这个F4板子,学习一下USB

使用特权

评论回复
23
天灵灵地灵灵| | 2015-10-10 09:06 | 只看该作者
这板子,这拍照水平也是很给力的。

使用特权

评论回复
24
huangcunxiake| | 2015-10-10 10:12 | 只看该作者
Keil昨天看了一下,都升级到5.16a了,好在激活方法没变,还可以注册机激活。

使用特权

评论回复
25
gejigeji521| | 2015-10-10 10:52 | 只看该作者
那个数据怎么识别的,楼主知道那个手柄的协议吗

使用特权

评论回复
26
lingergz| | 2015-10-11 18:46 | 只看该作者
本次分享使用的keil版本为5.15.0,ARMCC版本为V5.05 Update2(Bulid169)。


这开发环境好新啊,要是能分享下 下载链接就更好了

使用特权

评论回复
27
ranqingfa| | 2015-10-12 09:28 | 只看该作者
不错,啥时候俺也弄一块

使用特权

评论回复
28
湛只为无双|  楼主 | 2015-10-14 11:48 | 只看该作者
天灵灵地灵灵 发表于 2015-10-10 09:06
这板子,这拍照水平也是很给力的。

哈哈,谢谢了。不过拍照水平确实不咋地。

使用特权

评论回复
29
湛只为无双|  楼主 | 2015-10-14 11:50 | 只看该作者
gejigeji521 发表于 2015-10-10 10:52
那个数据怎么识别的,楼主知道那个手柄的协议吗

这个在源代码里面有协议的识别的,具体可以参考上传的源代码。
另外,有个板子移植了nes游戏,用这个手柄玩了把超级玛丽和坦克大战。

使用特权

评论回复
30
lib6303c| | 2015-10-16 16:38 | 只看该作者
mark!学习了!

使用特权

评论回复
31
nefusmzj| | 2015-10-18 21:36 | 只看该作者
对于不同的USB device设备,他们驱动各部相同,这里是如何实现的?

使用特权

评论回复
32
gohold的绝| | 2015-10-20 16:30 | 只看该作者
做的真厉害,看得本小白激情澎湃

使用特权

评论回复
33
michael.xing| | 2015-10-20 17:23 | 只看该作者
我的理解是,楼主用446访问usb设备,对吗?

使用特权

评论回复
34
湛只为无双|  楼主 | 2015-10-20 18:20 | 只看该作者
nefusmzj 发表于 2015-10-18 21:36
对于不同的USB device设备,他们驱动各部相同,这里是如何实现的?

这个目前我也不是很清楚,对于USB_HID设备来说,常用的有键盘,鼠标,手柄等,其实查看内部函数可以知道是对应的传输断点不同和设备描述不同,再往应用层说是不同的设备底层已经写好了,只要调用对应的回调函数就可以了。就好比USB_APP里面的手柄回调,如果对应键盘,就有键盘的回调,对应鼠标就有鼠标的回调。

使用特权

评论回复
35
湛只为无双|  楼主 | 2015-10-20 18:21 | 只看该作者
michael.xing 发表于 2015-10-20 17:23
我的理解是,楼主用446访问usb设备,对吗?

是的,就是这样的,使用446来访问设备,这个设备可以是键盘、鼠标、手柄等,也可以是U盘。目前我能做到的就这几个。。。多的也不是很懂,具体可以参考官方的例程。

使用特权

评论回复
36
nefusmzj| | 2015-10-20 19:52 | 只看该作者
湛只为无双 发表于 2015-10-20 18:20
这个目前我也不是很清楚,对于USB_HID设备来说,常用的有键盘,鼠标,手柄等,其实查看内部函数可以知道 ...

恩,不过市面上USB手柄种类这么多,如果连接电脑的话驱动各不相同,不知道它是怎么读取这些设备的。

使用特权

评论回复
37
湛只为无双|  楼主 | 2015-10-20 21:57 | 只看该作者
nefusmzj 发表于 2015-10-20 19:52
恩,不过市面上USB手柄种类这么多,如果连接电脑的话驱动各不相同,不知道它是怎么读取这些设备的。 ...

看似不一样,实际上都是差不多的。不同的可能包括了VID PID等,还有就是每个键位的值不一样。总之,只要是免驱的USB手柄,基本上都是一样的。

使用特权

评论回复
38
wahahaheihei| | 2015-10-20 22:01 | 只看该作者
OTG这应用挺爽的,可以读U盘。

使用特权

评论回复
39
643757107| | 2015-10-20 22:49 | 只看该作者
OTG就是让设备接上USB。

使用特权

评论回复
40
nefusmzj| | 2015-10-21 09:20 | 只看该作者
湛只为无双 发表于 2015-10-20 21:57
看似不一样,实际上都是差不多的。不同的可能包括了VID PID等,还有就是每个键位的值不一样。总之,只要 ...

这样啊,不错不错!开来是我自己想得太难阻挡了脚步!感谢!

使用特权

评论回复
发新帖 本帖赏金 10.00元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则