⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 usbhost.c

📁 单片机读写U盘源码 基于51单片机和国产USB芯片CH374
💻 C
📖 第 1 页 / 共 3 页
字号:

/*********************************************************************************************************
** 函数名称: mSetControlIn
** 功能描述: 设置默认控制数据输入
**
** 输 入: 
** 输 出: 
**         
** 全局变量: 无
** 调用模块: 无
** 调试码:   无
**  
**
** 作 者: 徐亦朱
** 日 期: 2007年9月24日
**-------------------------------------------------------------------------------------------------------
** 修改人: 
** 日 期: 
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void  mSetControlIn( void )
{
     mSaveUsbPid = DEF_USB_PID_IN ;
     Write374Byte( REG_USB_H_PID, M_MK_HOST_PID_ENDP( DEF_USB_PID_IN, mDiskDefaultEndp ) ) ;
     Write374Byte( REG_USB_H_CTRL, mSaveDevEndpTog | BIT_HOST_START );
}

/*********************************************************************************************************
** 函数名称: mSetControlOut
** 功能描述: 设置默认控制数据输出
**
** 输 入: 
** 输 出: 
**         
** 全局变量: 无
** 调用模块: 无
** 调试码:   无
**  
**
** 作 者: 徐亦朱
** 日 期: 2007年9月24日
**-------------------------------------------------------------------------------------------------------
** 修改人: 
** 日 期: 
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void  mSetControlOut( void )
{
     mSaveUsbPid = DEF_USB_PID_OUT ; 
     Write374Byte( REG_USB_H_PID, M_MK_HOST_PID_ENDP( DEF_USB_PID_OUT, mDiskDefaultEndp ) );
     Write374Byte( REG_USB_H_CTRL, mSaveDevEndpTog | BIT_HOST_START );
}

/*********************************************************************************************************
** 函数名称: mSetBulkIn
** 功能描述: 设置批量数据输入
**
** 输 入: 
** 输 出: 
**         
** 全局变量: 无
** 调用模块: 无
** 调试码:   无
**  
**
** 作 者: 徐亦朱
** 日 期: 2007年9月24日
**-------------------------------------------------------------------------------------------------------
** 修改人: 
** 日 期: 
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void  mSetBulkIn( void )
{
     mSaveUsbPid = DEF_USB_PID_IN ;
     Write374Byte( REG_USB_H_PID, M_MK_HOST_PID_ENDP( DEF_USB_PID_IN, mDiskBulkInEndp ) ) ;
     Write374Byte( REG_USB_H_CTRL, mSaveDevEndpTog | BIT_HOST_START );
}

/*********************************************************************************************************
** 函数名称: mSetBulkOut
** 功能描述: 设置批量数据输出
**
** 输 入: 
** 输 出: 
**         
** 全局变量: 无
** 调用模块: 无
** 调试码:   无
**  
**
** 作 者: 徐亦朱
** 日 期: 2007年9月24日
**-------------------------------------------------------------------------------------------------------
** 修改人: 
** 日 期: 
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void  mSetBulkOut( void )
{
     mSaveUsbPid = DEF_USB_PID_OUT ; 
     Write374Byte( REG_USB_H_PID, M_MK_HOST_PID_ENDP( DEF_USB_PID_OUT, mDiskBulkOutEndp ) );
     Write374Byte( REG_USB_H_CTRL, mSaveDevEndpTog | BIT_HOST_START );
}

/*********************************************************************************************************
** 函数名称: HostTransactInter
** 功能描述: CH374传输事务
**           需预先输入mSaveUsbPid,PID令牌+目的端点地址,同步标志
**           NAK重试,超时出错重试
** 输 入: 
** 输 出: 返回同CH375
**         
** 全局变量: 无
** 调用模块: 无
** 调试码:   无
**  
**
** 作 者: 徐亦朱
** 日 期: 2007年9月24日
**-------------------------------------------------------------------------------------------------------
** 修改人: 
** 日 期: 
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
UINT8  HostTransactInter( void )
{
     UINT8 retry;
     UINT8 s;
     UINT8 r;
     UINT8 u;
     for ( retry = 3; retry != 0; retry -- )
     {
          s = Wait374Interrupt( ) ;
          if ( s == ERR_USB_UNKNOWN )   //中断超时,可能是硬件异常,返回错误值
               return( s );
          s = Read374Byte( REG_INTER_FLAG );
          if ( s & BIT_IF_DEV_DETECT )  //USB设备插拔事件
          {
               mDelayuS( 200 );         // 等待传输完成
               Write374Byte( REG_INTER_FLAG, BIT_IF_USB_PAUSE | BIT_IF_DEV_DETECT | BIT_IF_TRANSFER );   // 清中断标志
               if ( s & BIT_IF_DEV_ATTACH )  //USB设备的当前连接状态:1 = 已经连接/插入
               {
                    u = Read374Byte( REG_USB_SETUP );
                    if( s & BIT_IF_USB_DX_IN )    //速度匹配,不需要切换速度
                    {
                         if ( u & BIT_SETP_USB_SPEED )      //低速USB设备
                              return( USB_INT_CONNECT_LS );
                         return( USB_INT_CONNECT );         // 全速USB设备
                    }
                    else                //速度失配,需要切换速度
                    {
                         if ( u & BIT_SETP_USB_SPEED )
                              return( USB_INT_CONNECT );    // 全速USB设备
                         return( USB_INT_CONNECT_LS );      // 低速USB设备
                    }
               }
               else 
                    return( USB_INT_DISCONNECT );           // USB设备断开事件 
          }
          else  if ( s & BIT_IF_TRANSFER )                  //传输完成
          {
               //mDelayuS( 200 );         // 等待传输完成
               #ifdef DEBUG_NOW
               printf( " 传输完成中断.\n " ) ;
               #endif
               Write374Byte( REG_INTER_FLAG, BIT_IF_USB_PAUSE | BIT_IF_TRANSFER );   // 清中断标志
               s = Read374Byte( REG_USB_STATUS );           // USB状态
               r = s & BIT_STAT_DEV_RESP;                   // USB设备应答状态
                          
               if ( mSaveUsbPid == DEF_USB_PID_IN )         //IN事务
               {
                    #ifdef DEBUG_NOW
                    printf ( " The PID is IN \n " ) ;
                    #endif
                    if ( M_IS_HOST_IN_DATA( s ) )           //DEF_USB_PID_DATA0 or DEF_USB_PID_DATA1
                    {
                         if ( s & BIT_STAT_TOG_MATCH )
                         {
                              #ifdef DEBUG_NOW
                              printf( " The In_PID's Hand is Right \n " ) ;
                              #endif
                              return( USB_INT_SUCCESS );
                         }    
                         goto mHostTransRetry;              //不同步则需丢弃后重试
                    }
               }
               else  if ( mSaveUsbPid == DEF_USB_PID_OUT )  //OUT事务
               {
                    #ifdef DEBUG_NOW
                    printf ( " The PID is OUT \n " ) ;
                    #endif
                    if ( r == DEF_USB_PID_ACK )
                    {     
                         #ifdef DEBUG_NOW
                         printf( " The OUT_PID's Hand is ACK \n " ) ;
                         #endif
                         return( USB_INT_SUCCESS ) ;
                    }
               }
               else  if ( mSaveUsbPid == DEF_USB_PID_SETUP )//SETUP事务
               {
                    #ifdef DEBUG_NOW
                    printf ( " The PID is SETUP \n " ) ;
                    #endif
                    /*if ( r == DEF_USB_PID_ACK )
                    {     
                         #ifdef DEBUG_NOW
                         printf( " The SETUP_PID's Hand is ACK \n " ) ;
                         #endif
                         return( USB_INT_SUCCESS ) ;
                    }*/
                    return( USB_INT_SUCCESS ) ;
               }
               if ( r == DEF_USB_PID_NAK )                  //NAK重试
               {
                    #ifdef DEBUG_NOW
                    printf ( " The Hand is NAK \n " ) ;
                    #endif
                    retry ++ ;
                    goto mHostTransRetry;
               }
               else  if ( ! M_IS_HOST_TIMEOUT( s ) )        //错误或者无需重试或者意外应答,不是超时/出错
               {    
                    #ifdef DEBUG_NOW
                    printf ( " The Hand is 错误或者无需重试或者意外应答,不是超时/出错 \n " ) ;
                    #endif
                    return( r | 0x20 );
               }
          }
          else                          //其他中断,不应该发生的情况
          {
               mDelaymS( 200 );         //等待传输完成
               #ifdef DEBUG_NOW
               printf ( " 其他中断,不应该发生的情况 \n " ) ;
               #endif
               Write374Byte( REG_INTER_FLAG, BIT_IF_USB_PAUSE | BIT_IF_INTER_FLAG );      //清中断标志 
          }
               
mHostTransRetry:
     if( retry > 1 )          //继续重试
     {
          #ifdef DEBUG_NOW
          printf ( " 继续重试 \n " ) ;
          #endif
          Write374Byte( REG_USB_H_CTRL, Read374Byte( REG_USB_H_CTRL ) | BIT_HOST_START ); //再次启动传输
     }
     
     }
     return( 0x20 );
}

/*********************************************************************************************************
** 函数名称: HostCtrlTransfer374
** 功能描述: 执行控制传输
**           需预先输入mSaveUsbPid,PID令牌+目的端点地址,同步标志
**           NAK重试,超时出错重试
** 输 入:   ReqBuf指向8字节请求码,DatBuf为收发缓冲区
**           如果需要接收和发送数据,那么DatBuf需要指向有效缓冲区用于存放后续数据,
**           实际成功收发的总长度保存在ReqLen指向的字节变量中
** 输 出:   返回同CH375
**         
** 全局变量: 无
** 调用模块: 无
** 调试码:   无
**  
**
** 作 者: 徐亦朱

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -