27
178
534
高级技术员
/********************************************************************** 函数功能;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
使用特权
break; case USB_EVT_OUT: break; case USB_EVT_IN : break; } }
/********************************************************************** 函数功能;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
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 } } }
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(控制传输)包。 } }
else{ } } else{ //如果命令位FE为0表示IN端点 } LPC_USB->DevIntClr = EP_SLOW_INT; //清除端点慢速中断 } }
发表回复 本版积分规则 回帖后跳转到最后一页
0
扫码关注 21ic 官方微信
扫码关注嵌入式微处理器
扫码关注21ic项目外包
扫码关注21ic视频号
扫码关注21ic抖音号
本站介绍 | 申请友情链接 | 欢迎投稿 | 隐私声明 | 广告业务 | 网站地图 | 联系我们 | 诚聘英才 | 论坛帮助
京公网安备 11010802024343号