[其他MCU] LPC1788 USB代码

[复制链接]
 楼主| DreamofOven 发表于 2015-12-29 20:49 | 显示全部楼层 |阅读模式
  1. /**********************************************************************
  2. 函数功能;USB端点0函数
  3. 函 数 名;USB_EndPoint0
  4. 函数参数;Event; 需要端点0执行的事件。
  5. 函数返回;无
  6. 作        者:        旺宝电子科技有限公司
  7. ***********************************************************************/
  8. void USB_EndPoint0 (uint32_t Event)
  9. {
  10.   switch (Event) {
  11.     case USB_EVT_SETUP:
  12. USB_ReadEP (0, (uint8_t *)&SetupPacket);              //读端点0的数据,把数据传给SetupPacket结构体
  13. #if PRINTF
  14. _DBH(SetupPacket.bmRequestType.B);         //打印请求特性
  15. _DBG_(" ");
  16. _DBH(SetupPacket.bRequest);         //打印请求代码
  17. _DBG_(" ");
  18. _DBH(SetupPacket.wValue.WB.L);        //打印wValue域低字段
  19. _DBG_(" ");
  20. _DBH(SetupPacket.wValue.WB.H);        //打印wValue域高字段
  21. _DBG_(" ");
  22. _DBH(SetupPacket.wIndex.WB.L);        //打印wIndex域低字段
  23. _DBG_(" ");
  24. _DBH(SetupPacket.wIndex.WB.H);        //打印wIndex域高字段
  25. _DBG_(" ");
  26. _DBH16(SetupPacket.wLength);        //打印数据过程索要的长度
  27. _DBG_(" ");
  28. _DBG_("\r\n");
  29. #endif


 楼主| DreamofOven 发表于 2015-12-29 20:51 | 显示全部楼层
  1. break;
  2. case USB_EVT_OUT:
  3. break;
  4. case USB_EVT_IN :
  5. break;   
  6. }
  7. }

这个USB_EndPoint0函数是在中断里调用的,所以还要在中断里添加代码。
 楼主| DreamofOven 发表于 2015-12-29 20:52 | 显示全部楼层
  1. /**********************************************************************
  2. 函数功能;USB中断函数
  3. 函 数 名;USB_IRQHandler
  4. 函数参数;无
  5. 函数返回;无
  6. 作        者:        旺宝电子科技有限公司
  7. ***********************************************************************/
  8. void USB_IRQHandler (void)
  9. {
  10.   uint32_t disr, val;
  11.   uint32_t episr;
  12.   disr = LPC_USB->DevIntSt;       //读设备中断状态
  13. #if PRINTF
  14. _DBG_("中断号");
  15. _DBH32(disr);
  16. _DBG_("\r\n");
  17. #endif
  18.   if (disr & DEV_STAT_INT) {        //判断是否有复位、连接发生改变、挂起和恢复的中断
  19.     LPC_USB->DevIntClr = DEV_STAT_INT;        //清除复位、挂起、链接中断
  20.     WrCmd(CMD_SET_DEV_STAT);        //写一个设置设备状态,05命令,准备获得设备状态
  21.     val = RdCmdDat(DAT_GET_DEV_STAT);   //读命令数据,读取设备状态
  22. #if PRINTF
  23. _DBG_("设备状态号");
  24. _DBH32(val);
  25. _DBG_("\r\n");
  26. #endif
 楼主| DreamofOven 发表于 2015-12-29 20:53 | 显示全部楼层
  1. if (val & DEV_RST){                            //判断复位
  2.       USB_Reset();
  3. #if PRINTF
  4. _DBG_("复位\r\n");
  5. #endif
  6.     }
  7.     if (val & DEV_SUS_CH) {                //判断挂起和恢复
  8.       if (val & DEV_SUS) {                  //挂起
  9.         USB_Suspend();
  10. #if PRINTF
  11. _DBG_("挂起\r\n");
  12. #endif
  13.       }
  14. else {                        //恢复
  15.         USB_Resume();
  16. #if PRINTF
  17. _DBG_("恢复\r\n");
  18. #endif
  19.       }
  20.     }
  21.   }
 楼主| DreamofOven 发表于 2015-12-29 20:54 | 显示全部楼层
  1. if (disr & EP_SLOW_INT) {         //端点的慢速中断
  2.     episr = LPC_USB->EpIntSt;        //读端点中断状态
  3. LPC_USB->EpIntClr = episr;        //清除读到的端点中断。
  4. #if PRINTF
  5. _DBG_("读端点中断");
  6. _DBH32(episr);
  7. _DBG_("\r\n");
  8. #endif
  9. val = RdCmdDat(DAT_SEL_EP(episr));        //读episr端点的命令数据。
  10. #if PRINTF
  11. _DBG_("命令数据");
  12. _DBH32(val);
  13. _DBG_("\r\n");
  14. #endif
  15. if(val & EP_SEL_F){        //如果命令位FE置位表示OUT端点
  16. if(1 & episr){        //判断是否有端点0的中断
  17. if(val & EP_SEL_STP){        //判断是否为SETUP(控制传输)令牌包。
  18. USB_EndPoint0(USB_EVT_SETUP);        //让端点0处理SETUP(控制传输)包。
  19. }
  20. }
 楼主| DreamofOven 发表于 2015-12-29 20:55 | 显示全部楼层
  1. else{
  2. }
  3. }
  4. else{        //如果命令位FE为0表示IN端点
  5. }
  6.     LPC_USB->DevIntClr = EP_SLOW_INT;        //清除端点慢速中断
  7.   }
  8. }

因为只是接收中断的数据,所以中断函数也不是太复杂。下载到开发板运行的结果如图323
2015-6-17 15:08 上传
下载附件 (31.81 KB)

图(323

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

本版积分规则

27

主题

178

帖子

0

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