[新手园地] M0的USB接口初探

[复制链接]
 楼主| dong_abc 发表于 2011-5-4 00:50 | 显示全部楼层 |阅读模式
本帖最后由 dong_abc 于 2011-5-4 00:59 编辑

首先建议看看午夜粪车的笔记


然后再建议看看五谷道场的笔记


看了上面的笔记再看例程便很容易理解了,当然USB通信里的一些协议和细节就要去查阅相关资料了



  1. /*******************************************************************
  2. main.c file
  3. USB HID设备实例(USB鼠标/键盘),分析官方例程做的笔记,希望能给比我
  4. 还菜的鸟带来点小小帮助。按住HOT学习板中间那个按键,鼠标便往右移动
  5.            
  6. ********************************************************************/
  7. #include "main.h"
  8. /********************************************************************
  9. 函数功能:系统初始化。
  10. 入口参数:无。
  11. 返    回:无。
  12. 备    注:无。
  13. ********************************************************************/
  14. void Sys_Init(void)
  15. {
  16. UNLOCKREG();              // 芯片注册解锁
  17.   SYSCLK->PWRCON.XTL12M_EN = 1;    // 设定12M外部晶振
  18. DrvSYS_Delay(5000);         // 等待时钟就绪
  19. /*
  20.   在主程序中,PLL时钟频率应该设置为48MHz,因为USB PHY也要PLL提供
  21. 时钟信号,系统时钟设置为外部12MHz,用来处理USB和HID的事件。
  22. */
  23.   DrvSYS_SetPLLMode(0);        //  Enable PLL
  24. DrvSYS_Delay(1000);        

  25. DrvSYS_SelectHCLKSource(2);       //  Switch to PLL clock
  26.   DrvSYS_Delay(100);
  27.   SystemCoreClockUpdate();      //  Update system core clock
  28. Uart_Init();            // 串口初始化配置
  29. GPIOB->IEN = (1 << 15);       // GPIOB_15中断使能
  30.   NVIC_EnableIRQ(EINT1_IRQn);     // EINT1中断使能
  31. }
  32. void PowerDown(void)
  33. {
  34. printf("Enter power down ...\n");
  35.   UNLOCKREG();
  36.   /* Wakeup Enable */
  37.   USBD->INTEN.WAKEUP_EN = 1;
  38.   /* Deep sleep */
  39.   outp32(0xE000ED10, 4);
  40.   SYSCLK->PWRCON.PD_WAIT_CPU = 1;
  41.   SYSCLK->PWRCON.PWR_DOWN = 1;
  42. __WFI();
  43.   SYSCLK->PWRCON.PWR_DOWN = 0;
  44. if(DrvUSB_GetUsbState() & eDRVUSB_SUSPENDED)
  45. {
  46.   /* Note HOST to resume USB tree if it is suspended and remote wakeup enabled */
  47.   if(DrvUSB_IsRemoteWakeupEnabled())
  48.   {
  49.    /* Enable PHY before sending Resume('K') state */
  50.    USBD->ATTR.PHY_EN = 1;
  51.    /* Keep remote wakeup for 1 ms */
  52.    USBD->ATTR.RWAKEUP = 1;
  53.    DrvSYS_Delay(1000); /* Delay 1ms */
  54.    USBD->ATTR.RWAKEUP = 0;
  55.   }
  56. }
  57. printf("device wakeup!\n");

  58. }

  59. /********************************************************************
  60. 函数功能:系统主函数。
  61. 入口参数:无。
  62. 返    回:无。
  63. 备    注:无。
  64. ********************************************************************/
  65. int main (void)
  66. {
  67.                               
  68. int32_t i32Ret = 0;
  69. E_DRVUSB_STATE eUsbState;

  70. Sys_Init();
  71. /*
  72. 硬件初始化完成后,执行函数DrvUSB_Open() 来为HID设备初始化USB端点信息结构,
  73. 现在系统准备好使能中断并等待插入USB主机。插入USB主机后,USB状态将从
  74. eDRVUSB_DETACHED 变为eDRVUSB_ATTACHED ,插入主机后执行函数HID_Init
  75. 来初始化HID供应商描述符为HID键盘或者HID鼠标。
  76. 这个函数可以用来复位USB 控制器,初始化USB 端点、中断和USB 驱动结构。
  77. 如果在调用DrvUSB_Open 之前,USB 已经插入,函数DrvUSB_Open 会处理这
  78. 种情况。用户在调用DrvUSB_Open 之前必须填好结构sEpDescription 和g_sBusOps.
  79. DrvUSB_DispatchEvent便是用来写入sEpDescription 和g_sBusOps.
  80. */     
  81.   i32Ret = DrvUSB_Open((void *)DrvUSB_DispatchEvent);
  82.   if(i32Ret != 0)
  83.    return i32Ret;
  84.   
  85. while(1)
  86. {
  87.   _DRVUSB_ENABLE_MISC_INT(0);     //使能/关闭各种USB 中断.
  88.   _DRVUSB_ENABLE_FLDET_INT();    //使能 float-detection 中断.USB 插入/拔出将发生中断
  89.   //设置HID报告描述符和报告缓冲区
  90.   HID_Init();
  91.   //使能各种USB中断.
  92.   _DRVUSB_ENABLE_MISC_INT(INTEN_WAKEUP | INTEN_WAKEUPEN | INTEN_FLDET | INTEN_USB | INTEN_BUS);
  93.   PowerDown();           //PowerDown直到USB 设备已经连接到主机.
  94.   //检测USB总线并分派USB相关事件,一直到拔出USB主机
  95.   while(1)
  96.   {
  97.    /*
  98.    USB 状态描述
  99.    eDRVUSB_DETACHED: USB 设备已经脱离主机.
  100.    eDRVUSB_ATTACHED: USB 设备已经连接到主机.
  101.    eDRVUSB_POWERED: The USB is powered.
  102.    eDRVUSB_DEFAULT: 缺省USB 状态.
  103.    eDRVUSB_ADDRESS: USB 设备已经被分配地址.
  104.    eDRVUSB_CONFIGURED: USB设备已经被设置CONFIGURATION.
  105.    eDRVUSB_SUSPENDED: USB 暂停.
  106.    */
  107.    eUsbState = DrvUSB_GetUsbState();
  108.    
  109.    //USB 设备已经脱离主机
  110.    if (eUsbState == eDRVUSB_DETACHED)
  111.    {
  112.     printf("USB Detached!\n");
  113.     break;
  114.    }
  115.    
  116.    //USB 设备已经暂停
  117.    if(eUsbState & eDRVUSB_SUSPENDED)
  118.    {
  119.     PowerDown();               
  120.    }
  121.    //USB设备已经被设置CONFIGURATION
  122.    if (eUsbState == eDRVUSB_CONFIGURED)
  123.    {
  124.     HID_SetInReport();       //HID设备传输中断返回报告
  125.    }
  126.   }
  127.   _DRVUSB_ENABLE_MISC_INT(0);     //使能/关闭各种USB 中断.
  128.   }   
  129. }



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
tlb 发表于 2011-5-4 05:34 | 显示全部楼层
好资料
hotpower 发表于 2011-5-4 10:46 | 显示全部楼层
这好像是园地里第一篇有关usb的笔记。
不错,继续努力。
weshiluwei6 发表于 2011-5-4 20:19 | 显示全部楼层
:loveliness: 好东西 支持
hotpower 发表于 2011-5-6 08:33 | 显示全部楼层
这篇笔记也忘了添加到网友笔记汇编里
lixupengarm 发表于 2011-5-23 18:28 | 显示全部楼层
mark!!
weshiluwei6 发表于 2011-5-24 20:59 | 显示全部楼层
USB实现了什么功能呢??请指教 还有 您说的中间那个按键 是那个按键捏
JIESHENG189 发表于 2011-6-19 20:45 | 显示全部楼层
看看!
hotpower 发表于 2011-6-20 09:26 | 显示全部楼层
新唐的usb例程在助学板上几乎都能直接应用,注意sd卡有两个地方要改io
moreand 发表于 2011-7-1 10:48 | 显示全部楼层
学习
passerby2008 发表于 2011-7-19 16:00 | 显示全部楼层
狂找资料啊
oumeng 发表于 2011-7-21 11:07 | 显示全部楼层
学习学习
jllj2899 发表于 2011-8-9 11:17 | 显示全部楼层
大家讨论一下用什么上位机软件啊?
lixiaoxu2meng 发表于 2011-8-9 14:49 | 显示全部楼层
用VC vb开发都可以吧
 楼主| dong_abc 发表于 2011-11-29 14:17 | 显示全部楼层
本帖最后由 dong_abc 于 2014-2-15 23:32 编辑

QT也非常好用http://www.cnblogs.com/dong1/category/544944.html
yyt8888yyt 发表于 2011-12-8 13:22 | 显示全部楼层
mark!!!!!!!!!!!!!!!
haolaishi 发表于 2011-12-8 22:49 | 显示全部楼层
stul海盗 发表于 2014-2-14 13:29 | 显示全部楼层
多谢楼主分享
1471225546 发表于 2014-4-28 17:10 | 显示全部楼层
学习了,O(∩_∩)O谢谢
wjsjdeng 发表于 2014-4-28 21:36 | 显示全部楼层
标记下,以后需要再来看
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:此id已冬眠...

43

主题

5074

帖子

22

粉丝
快速回复 在线客服 返回列表 返回顶部
个人签名:此id已冬眠...

43

主题

5074

帖子

22

粉丝
快速回复 在线客服 返回列表 返回顶部