7232|22

524

帖子

0

TA的资源

一粒金砂(高级)

楼主
 

【Atmel SAM R21创意大赛周计划】第5周 初次体验usb功能 [复制链接]

R21的usb例程还是比较丰富的。跑了个HID的例程

跑了个HID键盘的

升级,这个更新真的很快呀,似乎每次都能碰到什么要升级的

这是板子插入前的

这是板子插入后的

这是详细信息

具体看下程序
  1. int main(void)
  2. {
  3.         irq_initialize_vectors();
  4.         cpu_irq_enable();

  5.         // Initialize the sleep manager
  6.         sleepmgr_init();

  7. #if !SAMD21 && !SAMR21 && !SAMD11 && !SAML21
  8.         sysclk_init();
  9.         board_init();
  10. #else
  11.         system_init();
  12. #endif
  13.         ui_init();
  14.         ui_powerdown();

  15.         // Start USB stack to authorize VBus monitoring
  16.         udc_start();

  17.         // The main loop manages only the power mode
  18.         // because the USB management is done by interrupt
  19.         while (true) {
  20. #ifdef   USB_DEVICE_LOW_SPEED
  21.                 // No USB "Keep a live" interrupt available in low speed
  22.                 // to scan keyboard interface then use main loop
  23.                 if (main_b_kbd_enable) {
  24.                         static volatile uint16_t virtual_sof_sub = 0;
  25.                         if (sysclk_get_cpu_hz()/50000 ==
  26.                                 virtual_sof_sub++) {
  27.                                 virtual_sof_sub = 0;
  28.                                 static uint16_t virtual_sof = 0;
  29.                                 ui_process(virtual_sof++);
  30.                         }
  31.                 }
  32. #else
  33.                 sleepmgr_enter_sleep();
  34. #endif
  35.         }
  36. }
复制代码
就主函数而言可以看出其实与ST的还是蛮像的。
  1. void ui_init(void)
  2. {
  3.         struct extint_chan_conf config_extint_chan;

  4.         extint_chan_get_config_defaults(&config_extint_chan);

  5.         config_extint_chan.gpio_pin            = BUTTON_0_EIC_PIN;
  6.         config_extint_chan.gpio_pin_mux        = BUTTON_0_EIC_MUX;
  7.         config_extint_chan.gpio_pin_pull       = EXTINT_PULL_UP;
  8.         config_extint_chan.filter_input_signal = true;
  9.         config_extint_chan.detection_criteria  = EXTINT_DETECT_FALLING;
  10.         extint_chan_set_config(BUTTON_0_EIC_LINE, &config_extint_chan);
  11.         extint_register_callback(ui_wakeup_handler, BUTTON_0_EIC_LINE,
  12.                         EXTINT_CALLBACK_TYPE_DETECT);
  13.         extint_chan_enable_callback(BUTTON_0_EIC_LINE,EXTINT_CALLBACK_TYPE_DETECT);

  14.         /* Initialize LEDs */
  15.         LED_Off(LED_0_PIN);
  16. }
复制代码
仔细分析其实还是不怎么一样的。
这个函数原以为是USB的初始化函数,打开看了下才发现是对板子上按键的处理。
实际实现的效果就只是板子按下后led灯亮了。
  1. /*! \brief Start the USB Device stack
  2. */
  3. void udc_start(void)
  4. {
  5.         udd_enable();
  6. }
复制代码
  1. void udd_enable(void)
  2. {
  3.         irqflags_t flags;

  4.         /* To avoid USB interrupt before end of initialization */
  5.         flags = cpu_irq_save();

  6. #if USB_ID_EIC
  7.         if (usb_dual_enable()) {
  8.                 /* The current mode has been started by otg_dual_enable() */
  9.                 cpu_irq_restore(flags);
  10.                 return;
  11.         }
  12. #endif
  13.         struct usb_config config_usb;

  14.         /* USB Module configuration */
  15.         usb_get_config_defaults(&config_usb);
  16.         config_usb.source_generator = UDD_CLOCK_GEN;
  17.         usb_init(&usb_device, USB, &config_usb);

  18.         /* USB Module Enable */
  19.         usb_enable(&usb_device);

  20.         /* Check clock after enable module, request the clock */
  21.         udd_wait_clock_ready();

  22.         udd_sleep_mode(UDD_STATE_SUSPEND);

  23. #if USB_VBUS_EIC
  24.         _usb_vbus_config();
  25.         if (is_usb_vbus_high()) {
  26.                 /* USB Attach */
  27.                 _uhd_vbus_handler();
  28.         }
  29. #else
  30.         // No VBus detect, assume always high
  31. # ifndef USB_DEVICE_ATTACH_AUTO_DISABLE
  32.         udd_attach();
  33. # endif
  34. #endif

  35.         cpu_irq_restore(flags);
  36. }
复制代码
这边才是对usb的初始化处理
  1. void ui_process(uint16_t framenumber)
  2. {
  3.         bool b_btn_state, success;
  4.         static bool btn_last_state = false;
  5.         static bool sequence_running = false;
  6.         static uint8_t sequence_pos = 0;
  7.         uint8_t value;
  8.         static uint16_t cpt_sof = 0;

  9.         if ((framenumber % 1000) == 0) {
  10.                 LED_On(LED_0_PIN);
  11.         }
  12.         if ((framenumber % 1000) == 500) {
  13.                 LED_Off(LED_0_PIN);
  14.         }
  15.         // Scan process running each 2ms
  16.         cpt_sof++;
  17.         if ((cpt_sof % 2) == 0) {
  18.                 return;
  19.         }

  20.         // Scan buttons on switch 0 to send keys sequence
  21.         b_btn_state = (!port_pin_get_input_level(BUTTON_0_PIN));
  22.         if (b_btn_state != btn_last_state) {
  23.                 btn_last_state = b_btn_state;
  24.                 if (btn_wakeup) {
  25.                         if (!b_btn_state) {
  26.                                 btn_wakeup = false;
  27.                         }
  28.                 } else {
  29.                         sequence_running = true;
  30.                 }
  31.         }

  32.         // Sequence process running each period
  33.         if (SEQUENCE_PERIOD > cpt_sof) {
  34.                 return;
  35.         }
  36.         cpt_sof = 0;

  37.         if (sequence_running) {
  38.                 // Send next key
  39.                 value = ui_sequence[sequence_pos].value;
  40.                 if (value!=0) {
  41.                         if (ui_sequence[sequence_pos].b_modifier) {
  42.                                 if (ui_sequence[sequence_pos].b_down) {
  43.                                         success = udi_hid_kbd_modifier_down(value);
  44.                                 } else {
  45.                                         success = udi_hid_kbd_modifier_up(value);
  46.                                 }
  47.                         } else {
  48.                                 if (ui_sequence[sequence_pos].b_down) {
  49.                                         success = udi_hid_kbd_down(value);
  50.                                 } else {
  51.                                         success = udi_hid_kbd_up(value);
  52.                                 }
  53.                         }
  54.                         if (!success) {
  55.                                 return; // Retry it on next schedule
  56.                         }
  57.                 }
  58.                 // Valid sequence position
  59.                 sequence_pos++;
  60.                 if (sequence_pos >=
  61.                         sizeof(ui_sequence) / sizeof(ui_sequence[0])) {
  62.                         sequence_pos = 0;
  63.                         sequence_running = false;
  64.                 }
  65.         }
  66. }
复制代码
整个usb过程貌似是这块。
可能对ASF了解还是不够多,找了半天还是没找到中断函数部分的文件在哪。因为板子毕竟是作为设备,可能有个对主机的做出中断的函数文件。就使用ST的USB的体会而言,主函数部分其实是比较简单的,真正的处理应该在中断函数那块
很遗憾的是这边没有pdf进行详细的说明,可能得再好好摸索下

这是usb部分的资料,其中usb_protocol.h主要是是基于usb协议部分的定义,包括各种描述符之类的。具体的还在看。。。。。。








最新回复

前面说错了,是USB Standard IO(stdio) Example,就是倒数第二个例程。这个例程可以将USB模拟为一个CDC串口,将接收到的数据直接返回,很方便做测试。 [attach]187211[/attach]   详情 回复 发表于 2015-1-26 20:58
点赞 关注
 

回复
举报

1万

帖子

25

TA的资源

版主

沙发
 
试过这个例程,也是不行。用SMAM4L可以。能不能把你的例程打包上传,我试试看。

点评

这是我用的那个工程,你试试看行不行  详情 回复 发表于 2015-1-25 17:42
 
 
 

回复

524

帖子

0

TA的资源

一粒金砂(高级)

板凳
 
dcexpert 发表于 2015-1-25 17:26
试过这个例程,也是不行。用SMAM4L可以。能不能把你的例程打包上传,我试试看。

这是我用的那个工程,你试试看行不行


KEYBOARD_EXAMPLE1.rar

4.73 MB, 下载次数: 15

 
 
 

回复

524

帖子

0

TA的资源

一粒金砂(高级)

4
 
不过AtmelStudio例程usb部分确实有的是有问题的

跑的是MSC的例程


但结果判断的是HID的,我特意用另外一块又试了下,确实识别的是HID的,并不在存储设备部分

点评

还是不行,不知道是哪里的问题了。试Xmega-b1和SAM4L都是可以的,就SAM R21的不行。 [attachimg]187038[/attachimg]  详情 回复 发表于 2015-1-25 20:59
 
 
 

回复

1万

帖子

25

TA的资源

版主

5
 
770781327 发表于 2015-1-25 18:20
不过AtmelStudio例程usb部分确实有的是有问题的

跑的是MSC的例程


但结果判断的是HID的,我特意用另外一块又试了下,确实识别的是HID的,并不在存储设备部分



还是不行,不知道是哪里的问题了。试Xmega-b1和SAM4L都是可以的,就SAM R21的不行。

 
 
 

回复

1万

帖子

25

TA的资源

版主

6
 
应该没有其他需要设置的地方了吧?试了几个例程都一样,应该不是程序问题。
 
 
 

回复

1万

帖子

25

TA的资源

版主

7
 
本帖最后由 dcexpert 于 2015-1-25 21:32 编辑

换了几台计算机,系统有win7、winxp,都是一样不能识别出设备,感觉还是某个地方设置的问题造成的。是不是熔丝位或者其他地方需要设置什么?

点评

我系统是win8的,是可以的  详情 回复 发表于 2015-1-25 22:52
我没有设置什么,就导入例程、选择下载方式、编译,烧入,这正常的几部。 你这现象让我想到我前几天用SAM4S运行starter_kit_demo这个例程。我无论用ASF21、ASF20、ASF19还是哪个都不能实现对应功能。但我在很久之  详情 回复 发表于 2015-1-25 22:48
 
 
 

回复

524

帖子

0

TA的资源

一粒金砂(高级)

8
 
本帖最后由 770781327 于 2015-1-25 22:55 编辑
dcexpert 发表于 2015-1-25 21:21
换了几台计算机,系统有win7、winxp,都是一样不能识别出设备,感觉还是某个地方设置的问题造成的。是不是熔丝位或者其他地方需要设置什么?

我没有设置什么,就导入例程、选择下载方式、编译,烧入,这正常的几部。
你这现象让我想到我前几天用SAM4S运行starter_kit_demo这个例程。我无论用ASF21、ASF20、ASF19还是哪个都不能实现对应功能。但我在很久之前刚拿到板子时是可以实现的,后来我用单独的asf-3.21.0中的对应例程,用IAR编译,效果是实现的。我也比较了AtmelStudio的设置和网上其他人的,是完全一样的。

我最后得出的结论是,可能是软件与我系统的冲突,要么就是软件有处设置被改变了,不再是最初的默认状态了。


我给你的建议是,你看下asf-3.21.0或其他版本也行,里面R21对应的usb例程是否能用,用IAR跑下试试



 
 
 

回复

524

帖子

0

TA的资源

一粒金砂(高级)

9
 
dcexpert 发表于 2015-1-25 21:21
换了几台计算机,系统有win7、winxp,都是一样不能识别出设备,感觉还是某个地方设置的问题造成的。是不是熔丝位或者其他地方需要设置什么?

我系统是win8的,是可以的


 
 
 

回复

524

帖子

0

TA的资源

一粒金砂(高级)

10
 
 

回复

1万

帖子

25

TA的资源

版主

11
 
本帖最后由 dcexpert 于 2015-1-25 23:07 编辑

初步发现原因了,使用ASF3.21的例程就出问题,换低版本的就正常了。正在对比文件看看问题到底在哪。
文件比较多,估计要明天才有结果了。

点评

感觉这还是跟系统有关系吧,因为我就是用的ASF3.21,HID的是没问题的[/backcolor]  详情 回复 发表于 2015-1-26 10:09
 
 
 

回复

5979

帖子

8

TA的资源

版主

12
 
写的很不错,我要跟着后面学习了
 
个人签名生活就是油盐酱醋再加一点糖,快活就是一天到晚乐呵呵的忙
===================================
做一个简单的人,踏实而务实,不沉溺幻想,不庸人自扰
 
 

回复

524

帖子

0

TA的资源

一粒金砂(高级)

13
 
dcexpert 发表于 2015-1-25 22:59
初步发现原因了,使用ASF3.21的例程就出问题,换低版本的就正常了。正在对比文件看看问题到底在哪。
文件比较多,估计要明天才有结果了。

感觉这还是跟系统有关系吧,因为我就是用的ASF3.21,HID的是没问题的


点评

是独立版本的ASF3.21还是通过AS6.2升级的?两个好像有区别。  详情 回复 发表于 2015-1-26 10:13
 
 
 

回复

1万

帖子

25

TA的资源

版主

14
 
770781327 发表于 2015-1-26 10:09
感觉这还是跟系统有关系吧,因为我就是用的ASF3.21,HID的是没问题的

是独立版本的ASF3.21还是通过AS6.2升级的?两个好像有区别。
而且我用你昨天发的那个例程也是不行。



点评

我是通过AS6.2升级的,真奇怪,为啥我可以呢。 那个例程我特意又编译了一次,也是行的。  详情 回复 发表于 2015-1-26 11:38
 
 
 

回复

524

帖子

0

TA的资源

一粒金砂(高级)

15
 
dcexpert 发表于 2015-1-26 10:13
是独立版本的ASF3.21还是通过AS6.2升级的?两个好像有区别。
而且我用你昨天发的那个例程也是不行。
我是通过AS6.2升级的,真奇怪,为啥我可以呢。
那个例程我特意又编译了一次,也是行的。




点评

要不你新建一个项目文件,试试 STDIO USB CDC那个例子,然后发上来大家仔细分析一下。  详情 回复 发表于 2015-1-26 11:43
 
 
 

回复

1万

帖子

25

TA的资源

版主

16
 
本帖最后由 dcexpert 于 2015-1-26 11:50 编辑
770781327 发表于 2015-1-26 11:38
我是通过AS6.2升级的,真奇怪,为啥我可以呢。
那个例程我特意又编译了一次,也是行的。

我是直接通过device programm下载你编译的HEX文件也不行的。
要不你新建一个项目文件,试试 STDIO USB CDC那个例子,然后发上来大家仔细分析一下。

点评

这是USB device CDC的,没找到STDIO[/backcolor]https://bbs.eeworld.com.cn/thread-455103-1-1.html 不过现象虽然不大对,但也不是提示未知设备的  详情 回复 发表于 2015-1-26 20:47
行,我晚上回去试下这例子  详情 回复 发表于 2015-1-26 13:15
 
 
 

回复

1万

帖子

25

TA的资源

版主

17
 
还有你的编译器是哪个版本的?会不会是编译器版本的问题?

点评

我AtemlStudio软件上星期更新过,是最新版的,确实有可能是这原因  详情 回复 发表于 2015-1-26 13:17
 
 
 

回复

524

帖子

0

TA的资源

一粒金砂(高级)

18
 
dcexpert 发表于 2015-1-26 11:43
我是直接通过device programm下载你编译的HEX文件也不行的。
要不你新建一个项目文件,试试 STDIO USB CDC那个例子,然后发上来大家仔细分析一下。
行,我晚上回去试下这例子


 
 
 

回复

524

帖子

0

TA的资源

一粒金砂(高级)

19
 
dcexpert 发表于 2015-1-26 11:53
还有你的编译器是哪个版本的?会不会是编译器版本的问题?
我AtemlStudio软件上星期更新过,是最新版的,确实有可能是这原因



点评

我也是在AS6.2中更新的,现在版本是 AS6:6.2.1502 arm gnu toolchain:4.8.4.1437, ARM_TOOLchain_Version:4.8.4.371 CMSIS 3.20  详情 回复 发表于 2015-1-26 13:22
 
 
 

回复

1万

帖子

25

TA的资源

版主

20
 
770781327 发表于 2015-1-26 13:17
我AtemlStudio软件上星期更新过,是最新版的,确实有可能是这原因


我也是在AS6.2中更新的,现在版本是
AS6:6.2.1502
arm gnu toolchain:4.8.4.1437,
ARM_TOOLchain_Version:4.8.4.371
CMSIS 3.20


点评

[attachimg]187172[/attachimg]这是我的,AS版本似乎是相同的,其他的不知道在哪看,就没看。我再试试其他例程  详情 回复 发表于 2015-1-26 19:59
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表