查看: 1142|回复: 0

【SAMV71】USB Device之HID Mouse

[复制链接]
  • TA的每日心情
    开心
    2017-7-4 13:51
  • 签到天数: 347 天

    连续签到: 1 天

    [LV.8]以坛为家I

    发表于 2015-11-10 11:01:35 | 显示全部楼层 |阅读模式
    分享到:
    今天试了下usb端口作为设备的HID Mouse。
    常用的作为usb设备的主要就是HID(类似鼠标、键盘)和MSC(类似U盘),网上讲解很多啦。
    在我看来常作为这两个来了解usb最大的好处是这个不需要另外的安装驱动,而且是比较好来了解款新的芯片,厂家对于usb协议是如何来构架底层的,这蛮有意思的。而且比较幸运的是ateml也对于这几类都提供了自己的例程

    先来看看HID的,鼠标键盘例程都有,不难看出atmel的细心啊

    例程导入,打开主函数


    个人不大好的习惯,拿到程序,我喜欢先看现象,再来分析分析程序O(∩_∩)O~

    这是板子未插时的,

    这是板子插了后的

    真奇怪,作为HID设备,这里居然没变化
    检查发现,是少插了一根usb线啦
    atmel板子设计是一个usb口用来供电兼调试程序,另一个作为usb通信使用
    不过个人觉得有点浪费,完全可以只设计一个嘛,那多炫,况且在项目中,正常也只设计一个吧,不然多占体积

    板子上电,另一个口usb线也插上,会提示自动安装驱动
    同时设备管理器会出现新的设备提示

    安装好后,如上图,会有提示

    可以看见作为鼠标的那确实多出了一个枚举成功,顺利识别成HID mouse的设备
    这时候就有点遗憾,如果板子上有个加速度传感器之类的就好了,此时就可以当做鼠标了,那就比较炫了
    可以考虑外接个加速度传感器之类的,或者简单点,装几个按键,模拟向左向右上下之类的移动
    再来看看程序
    主函数整体框架还是比较简洁的
    int main(void){        irq_initialize_vectors();        cpu_irq_enable();#if !SAM0        sysclk_init();        board_init();#else        system_init();#endif        // Initialize the sleep manager        sleepmgr_init();        ui_init();        ui_powerdown();        // Start USB stack to authorize VBus monitoring        udc_start();        // The main loop manages only the power mode        // because the USB management is done by interrupt        while (true) {#ifdef USB_DEVICE_LOW_SPEED                // No USB "Keep a live" interrupt available in low speed                // to scan mouse interface then use main loop                if (main_b_mouse_enable) {                        static volatile uint16_t virtual_sof_sub = 0;                        static uint16_t virtual_sof = 0;                        if (sysclk_get_cpu_hz()/50000 ==                                virtual_sof_sub++) {                                virtual_sof_sub = 0;                                static uint16_t virtual_sof = 0;                                ui_process(virtual_sof++);                        }                }#else /* #ifdef USB_DEVICE_LOW_SPEED */                sleepmgr_enter_sleep();#endif        }}但与st的usb相比,还是比较复杂。应该也是各有特色吧,atmel尽可能使吧所有型号的框在一起尽可能兼容大多数型号的,因此程序看起来有些冗长,很多与自己无关的都想删,而st的分系列,一个系列中型号很少,兼容起来就比较方便,程序看起来很简洁
    发现AS7还有个不好的地方,就是右击函数,想跳到函数定义的地方,没反应,跳不进去,不知道是我安装问题还是AS7的通病
    usb初始化,usb电源设置,usb枚举。初步看下来基本一样。
    后面详细分析V71  usb的枚举部分的程序
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    手机版|小黑屋|与非网

    GMT+8, 2024-11-19 00:35 , Processed in 0.123129 second(s), 17 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.