打印
[其他MCU]

LPC1788 USB代码

[复制链接]
1232|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
DreamofOven|  楼主 | 2015-12-29 20:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/**********************************************************************
函数功能;USB端点0函数
函 数 名;USB_EndPoint0
函数参数;Event; 需要端点0执行的事件。
函数返回;无
作        者:        旺宝电子科技有限公司
***********************************************************************/
void USB_EndPoint0 (uint32_t Event)
{
  switch (Event) {
    case USB_EVT_SETUP:
USB_ReadEP (0, (uint8_t *)&SetupPacket);              //读端点0的数据,把数据传给SetupPacket结构体
#if PRINTF
_DBH(SetupPacket.bmRequestType.B);         //打印请求特性
_DBG_(" ");
_DBH(SetupPacket.bRequest);         //打印请求代码
_DBG_(" ");
_DBH(SetupPacket.wValue.WB.L);        //打印wValue域低字段
_DBG_(" ");
_DBH(SetupPacket.wValue.WB.H);        //打印wValue域高字段
_DBG_(" ");
_DBH(SetupPacket.wIndex.WB.L);        //打印wIndex域低字段
_DBG_(" ");
_DBH(SetupPacket.wIndex.WB.H);        //打印wIndex域高字段
_DBG_(" ");
_DBH16(SetupPacket.wLength);        //打印数据过程索要的长度
_DBG_(" ");
_DBG_("\r\n");
#endif


相关帖子

沙发
DreamofOven|  楼主 | 2015-12-29 20:51 | 只看该作者
break;
case USB_EVT_OUT:
break;
case USB_EVT_IN :
break;   
}
}

这个USB_EndPoint0函数是在中断里调用的,所以还要在中断里添加代码。

使用特权

评论回复
板凳
DreamofOven|  楼主 | 2015-12-29 20:52 | 只看该作者
/**********************************************************************
函数功能;USB中断函数
函 数 名;USB_IRQHandler
函数参数;无
函数返回;无
作        者:        旺宝电子科技有限公司
***********************************************************************/
void USB_IRQHandler (void)
{
  uint32_t disr, val;
  uint32_t episr;
  disr = LPC_USB->DevIntSt;       //读设备中断状态
#if PRINTF
_DBG_("中断号");
_DBH32(disr);
_DBG_("\r\n");
#endif
  if (disr & DEV_STAT_INT) {        //判断是否有复位、连接发生改变、挂起和恢复的中断
    LPC_USB->DevIntClr = DEV_STAT_INT;        //清除复位、挂起、链接中断
    WrCmd(CMD_SET_DEV_STAT);        //写一个设置设备状态,05命令,准备获得设备状态
    val = RdCmdDat(DAT_GET_DEV_STAT);   //读命令数据,读取设备状态
#if PRINTF
_DBG_("设备状态号");
_DBH32(val);
_DBG_("\r\n");
#endif

使用特权

评论回复
地板
DreamofOven|  楼主 | 2015-12-29 20:53 | 只看该作者
 if (val & DEV_RST){                            //判断复位
      USB_Reset();
#if PRINTF
_DBG_("复位\r\n");
#endif
    }
    if (val & DEV_SUS_CH) {                //判断挂起和恢复
      if (val & DEV_SUS) {                  //挂起
        USB_Suspend();
#if PRINTF
_DBG_("挂起\r\n");
#endif
      }
else {                        //恢复
        USB_Resume();
#if PRINTF
_DBG_("恢复\r\n");
#endif
      }
    }
  }

使用特权

评论回复
5
DreamofOven|  楼主 | 2015-12-29 20:54 | 只看该作者
 if (disr & EP_SLOW_INT) {         //端点的慢速中断
    episr = LPC_USB->EpIntSt;        //读端点中断状态
LPC_USB->EpIntClr = episr;        //清除读到的端点中断。
#if PRINTF
_DBG_("读端点中断");
_DBH32(episr);
_DBG_("\r\n");
#endif
val = RdCmdDat(DAT_SEL_EP(episr));        //读episr端点的命令数据。
#if PRINTF
_DBG_("命令数据");
_DBH32(val);
_DBG_("\r\n");
#endif
if(val & EP_SEL_F){        //如果命令位FE置位表示OUT端点
if(1 & episr){        //判断是否有端点0的中断
if(val & EP_SEL_STP){        //判断是否为SETUP(控制传输)令牌包。
USB_EndPoint0(USB_EVT_SETUP);        //让端点0处理SETUP(控制传输)包。
}
}

使用特权

评论回复
6
DreamofOven|  楼主 | 2015-12-29 20:55 | 只看该作者
else{
}
}
else{        //如果命令位FE为0表示IN端点
}
    LPC_USB->DevIntClr = EP_SLOW_INT;        //清除端点慢速中断
  }
}

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

图(323

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

27

主题

178

帖子

0

粉丝