发现pic u***内部设计原理跟飞思卡尔单片机u***硬件结构差不多!都需要通过缓冲描述表(DBT)来获端点信息。 第一步:初始化u***设备( 配置全速 使能内部上拉电阻 等) void InitializeUSBDriver(void) 第二步: 等待u***中断。接收中断跳转到相应的服务代码 void USBDriverService(void) { if(u***_device_state == DETACHED_STATE) return; if(ACTVIF && ACTVIE) USBWakeFromSuspend(); //唤醒中断 if(SUSPND==1) return; if(URSTIF && URSTIE) USBProtocolReset(); //复位中断 if(IDLEIF && IDLEIE) USBSuspend(); //挂起中断 if(SOFIF && SOFIE) USB_SOF_(); //帧起始中断 if(STALLIF && STALLIE) USBStall(); if(UERRIF && UERRIE) USBError(); //数据错误中断 if(u***_device_state < DEFAULT_STATE) return; if(TRNIF && TRNIE) { USBCtrlEPService(); //端点激活中断 TRNIF = 0; } } 第三步:枚举u***设备 通过端点Ep0_In Ep0_Out完成 第四步:u***应用数据收发 void UserTasks(void) { unsigned char u***_dat[10],i,lenght; DATA_PACKET dataPacket; if((u***_device_state < CONFIGURED_STATE)||(SUSPND==1)) return; if(USBEp1Read((byte*)&dataPacket,sizeof(dataPacket))) { lenght = mUSBEp1GetRxLength(); if (dataPacket._byte[1]==0) RB7=!RB7; USBEp1Write((byte*)&dataPacket,lenght); } if(USBEp2Read((byte*)&dataPacket,sizeof(dataPacket))) { lenght = mUSBEp2GetRxLength(); if (dataPacket._byte[1]==0) RB7=!RB7; USBEp2Write((byte*)&dataPacket,lenght); } |
更多回帖