找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4211|回复: 0
收起左侧

pic18f4550 USB 程序设计

[复制链接]
ID:73477 发表于 2015-2-10 00:35 | 显示全部楼层 |阅读模式
发现pic usb内部设计原理跟飞思卡尔单片机usb硬件结构差不多!都需要通过缓冲描述表(DBT)来获端点信息。

第一步:初始化usb设备( 配置全速 使能内部上拉电阻 等)  void InitializeUSBDriver(void)
第二步: 等待usb中断。接收中断跳转到相应的服务代码
void USBDriverService(void)
{   
    if(usb_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(usb_device_state < DEFAULT_STATE) return;
    if(TRNIF && TRNIE)
    {
        USBCtrlEPService();                                               //端点激活中断
        TRNIF = 0;
    }  
}
第三步:枚举usb设备 通过端点Ep0_In   Ep0_Out完成


第四步:usb应用数据收发

  void UserTasks(void)
{
    unsigned char usb_dat[10],i,lenght;
        DATA_PACKET dataPacket;

    if((usb_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);
    }


回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表