单片机学习小组
直播中

牛晓渊

7年用户 144经验值
私信 关注

pic18f4550 USB程序设计

发现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);
     }


更多回帖

发帖
×
20
完善资料,
赚取积分