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

📄 main.c

📁 单片机读写U盘源码 基于51单片机和国产USB芯片CH374
💻 C
字号:
/****************************************Copyright (c)**************************************************
**                               CH374做主机操作U盘读写程序
**                                     
**                                         主函数
**
**                                        VBeat 0.1
**
**--------------文件信息--------------------------------------------------------------------------------
**文   件   名: Main.C
**创   建   人: 徐亦朱
**最后修改日期: 2007年9月24日
**描        述: A.使用CH374作USB主机
**              B.Bulkonly传输方式与大容量存储设备通信
**              C.支持部分常用的UFI命令集
**              D.目前支持FAT16格式操作
**              E.速度有待进一步改进
**              
**--------------历史版本信息----------------------------------------------------------------------------
** 创建人: 徐亦朱
** 版  本: VBeat 0.1
** 日 期: 2007年9月24日
** 描 述: 原始版本
**
**--------------当前版本修订------------------------------------------------------------------------------
** 修改人: 徐亦朱
** 日 期: 2007年9月24日
** 描 述: 原始版本
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#include  <stdio.h>
#include  <string.h>

#include  "Main.H"

/*********************************************************************************************************
** 函数名称: main
** 功能描述: 主函数
**
** 输 入: 
** 输 出: 
**         
** 全局变量: 无
** 调用模块: 无
** 调试码:   无
**  
**
** 作 者: 徐亦朱
** 日 期: 2007年9月24日
**-------------------------------------------------------------------------------------------------------
** 修改人: 
** 日 期: 
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
int  main( void )
{
     UINT8  i ;
     UINT8  s ;
     UINT8  idata buf[ 64 ] ;
     
     mDelaymS( 50 );          //等待CH374复位完成
     CH374_PORT_INIT( );      //CH374接口初始化
     
     mInitSTDIO( );           //为了让计算机通过串口监控演示过程
     printf( "Start CH374 Host\n" );
     
     Init374Host( );          //初始化USB主机
     while( 1 )
     {
          HostSetBusFree( );       //设定USB主机空闲
          printf( "Wait Device In\n" );
          while( 1 )
          {
               if ( Query374Interrupt( ) )   //如果有USB主机中断则处理
                    HostDetectInterrupt( );  //处理USB插拔事件中断
               if ( Query374DeviceIn( ) )    //有USB设备,实际上是在查中断寄存器中BIT_IF_DEV_ATTACH
                    break;
          }
          mDelaymS( 250 );    //由于USB设备刚插入尚未稳定,故等待USB设备数百ms,消除插拔抖动
          if ( Query374Interrupt( ) )        //如果有USB主机中断则处理
               HostDetectInterrupt( );
               
          printf( "Reset Device\n" );
          HostSetBusReset( ); //总线复位
          for ( i = 0; i < 100; i ++ )  // 等待USB设备复位后重新连接
          {
               if ( Query374DeviceIn( ) )
                    break;
               mDelaymS( 1 );
          }
               
          if ( Query374Interrupt( ) )        //如果有USB主机中断则处理
               HostDetectInterrupt( );
          if ( Query374DeviceIn( ) )         //如果有USB设备
          {
               if ( Query374DevFullSpeed( ) )
               {
                    printf( "Start Full-Speed Device\n" );
                    HostSetFullSpeed( );     //设定全速USB设备运行环境
               }
               else
               {
                    printf( "Start Low-Speed Device\n" );
                    HostSetLowSpeed( );      //设定低速USB设备运行环境
               }
          }
          else
          {
               printf( "Device gone !\n" );
               continue;                // 设备已经断开,继续等待
          }
          mDelaymS( 20 );
          
          printf( "GetDeviceDescr: " );
          s = GetDeviceDescr( buf );    // 获取设备描述符
          if ( s != USB_INT_SUCCESS )
          {
               printf( "ERROR = %02X\n", (UINT16)s );
               goto WaitDeviceOut;      // 终止操作,等待USB设备拔出
          }
          for ( i = 0; i < ( (PUSB_SETUP_REQ)SetupGetDevDescr ) -> wLengthL; i ++ )
               printf( "%02X ", (UINT16)( buf[ i ] ) );
          printf( "\n" );
          
          printf( "SetUsbAddress: " );
          s = SetUsbAddress( 0x02 );    // 设置USB设备地址
          if(  s != USB_INT_SUCCESS )
          {
               printf( "ERROR = %02X\n", (UINT16)s );
               goto WaitDeviceOut;      // 终止操作,等待USB设备拔出
          }
          printf( "\n" );
          
          printf( "GetConfigDescr: " );
          s = GetConfigDescr( buf );    // 获取配置描述符
          if ( s != USB_INT_SUCCESS )
          {
               printf( "ERROR = %02X\n", (UINT16)s );
               goto WaitDeviceOut;      // 终止操作,等待USB设备拔出
          }
          for ( i = 0; i < ( (PUSB_SETUP_REQ)SetupGetDevDescr ) -> wLengthL; i ++ )
               printf( "%02X ", (UINT16)( buf[i] ) );
          printf( "\n" );
		      
		        //分析配置描述符
		        //获取端点数据/各端点地址/各端点大小等
		        //更新变量endp_addr和endp_size等
		        if ( ( ( PUSB_CFG_DESCR_LONG )buf ) -> itf_descr.bInterfaceClass != 0x08 )
		             goto WaitDeviceOut;      // 终止操作,等待USB设备拔出
		        mDiskInterfNumber = ( ( PUSB_CFG_DESCR_LONG ) buf ) -> itf_descr.bInterfaceNumber;
		        mDiskBulkInEndp = 0;
		        mDiskBulkOutEndp = 0;
		        for ( i =0; i < 2; i ++ )     //分析前两个端点
		        {
		             if ( ( (PUSB_CFG_DESCR_LONG)buf ) -> endp_descr[ i ].wMaxPacketSize == 64 && ( (PUSB_CFG_DESCR_LONG)buf ) -> endp_descr[ i ].bmAttributes == 2 ) 
		             {
		                  if ( ( ( PUSB_CFG_DESCR_LONG )buf ) -> endp_descr[ i ].bEndpointAddress & 0x80 )
		                  //IN端点
		                       mDiskBulkInEndp = ( ( PUSB_CFG_DESCR_LONG )buf ) -> endp_descr[ i ].bEndpointAddress & 0x0F ;
		                  else 
		                  //OUT端点
		                       mDiskBulkOutEndp = ( ( PUSB_CFG_DESCR_LONG )buf ) -> endp_descr[ i ].bEndpointAddress & 0x0F ;
		             }
		        }
		      
		        //不是USB存储类设备,不支持
		        if ( ( ( PUSB_CFG_DESCR_LONG )buf ) -> itf_descr.bInterfaceClass != 0x08 || mDiskBulkInEndp == 0 || mDiskBulkOutEndp == 0 )
		        {
		             printf( " Not USB Mass Storage Device\n " );
		             goto WaitDeviceOut;      // 终止操作,等待USB设备拔出
		        }     
		      
		        printf( "SetUsbConfig: " );
		        s = SetUsbConfig( ( (PUSB_CFG_DESCR)buf ) -> bConfigurationValue );   // 设置USB设备配置
		        if( s != USB_INT_SUCCESS )
		        {
		             printf( "ERROR = %02X\n", (UINT16)s );
		             goto WaitDeviceOut;      // 终止操作,等待USB设备拔出
		        }
		        printf( "\n" );
		      
		        mSaveDevEndpTog = 0x00;       //清同步标志
		      
		        printf( " Disk Inquiry : \n" );
		        s = mDiskInquiry( buf );           //获取磁盘特性
		        if ( s != USB_INT_SUCCESS )
		        {
		             printf( " ERROR = %02X \n ", (UINT16)s );
		             goto WaitDeviceOut;      //终止操作,等待USB设备拔出
		        }
		        for ( i = 0; i < 8; i ++ )
		             printf( " %02X \n ", ( UINT16 ) ( buf[ i ] ) );
		        printf( " , " );
		        for ( i = 8; i < 36; i ++ )
		             printf( "%c", buf[ i ] );
		        printf( "\n" );
		        /*
		        s = mRequestSense( ) ;
		        printf( " ERROR = %02X \n ", ( UINT16 )s );
		        *//*
		        for ( i = 0; i < 5; i ++ )
		        {
		             mDelaymS( 100 );
		             printf( " Disk Capacity " );
		             s = mDiskCapacity( buf );     //获取磁盘容量
		             if ( s != USB_INT_SUCCESS )
		             {
		                  printf( " ERROR = %02X \n ", ( UINT16 )s );
		                  //mRequestSense( );
		             }
		             else
		             {
		                  for ( i = 0; i < 8; i ++ )
		                       printf( " %2X ", ( UINT16 ) ( buf[ i ] ) );
		                  printf( " , %3d MB \n ", ( UINT16 )( ( ( ( ( UINT32 )( buf[ 0 ] ) << 24 ) | ( UINT32 )( buf[ 1 ] ) << 16 | ( UINT16 ) ( buf[ 2 ] ) << 8 | ( UINT16 )  buf[ 3 ] ) + 1 ) << 11 ) ) ; 
		                  break;
		             }
		        }
		        */
		        printf( " Disk Ready : " );
		        s = mDiskTestReady( ) ;            //测试磁盘是否就绪
		        if ( s != USB_INT_SUCCESS )
		        {
		             printf( " ERROR = %02X \n ", ( UINT16 )s );
		        }
		        else
		        printf( " \n " );

		        s = FATInit( ) ; 
		        if ( s != InitSuccess )
		        {
		             printf( " The Init Process Has A BIG WRONG: " ) ;
		             printf( " ERROR = %02X \n ", ( UINT16 )s );
		             goto WaitDeviceOut;      //终止操作,等待USB设备拔出
		        }				 
				
				      s = FATCopy( "/XUYIZHU.C", "/CH375/1.TXT" );
				      if ( s != CopySuccess )
		        {
		             printf( " The Copy Process Has A BIG WRONG: " ) ;
		             printf( " ERROR = %02X \n ", ( UINT16 )s );
		             goto WaitDeviceOut;      //终止操作,等待USB设备拔出
		        }
				
				      s = FATOpen( "/X", ModeC1 ) ;
				      if ( s != OpenSuccess )
		        {
		             printf( " The Open Process Has A BIG WRONG: " ) ;
		             printf( " ERROR = %02X \n ", ( UINT16 )s );
		             goto WaitDeviceOut;      //终止操作,等待USB设备拔出
		        }

			      	s = FATOpen( "/X/Y", ModeC1 ) ;
				      if ( s != OpenSuccess )
		        {
		             printf( " The Open Process Has A BIG WRONG: " ) ;
		             printf( " ERROR = %02X \n ", ( UINT16 )s );
		             goto WaitDeviceOut;      //终止操作,等待USB设备拔出
		        }

				      s = FATOpen( "/X/Y/Z", ModeC1 ) ;
				      if ( s != OpenSuccess )
		        {
		             printf( " The Open Process Has A BIG WRONG: " ) ;
		             printf( " ERROR = %02X \n ", ( UINT16 )s );
		             goto WaitDeviceOut;      //终止操作,等待USB设备拔出
		        }
		        
		        s = FATCopy( "/X/Y/Z/XU.H", "/CH375/1.TXT" );
				      if ( s != CopySuccess )
		        {
		             printf( " The Copy Process Has A BIG WRONG: " ) ;
		             printf( " ERROR = %02X \n ", ( UINT16 )s );
		             goto WaitDeviceOut;      //终止操作,等待USB设备拔出
		        }

				      s = FATOpen( "/CH375/1.TXT", ModeC2 ) ;
				      if ( s != OpenSuccess )
		        {
		             printf( " The Open Process Has A BIG WRONG: " ) ;
		             printf( " ERROR = %02X \n ", ( UINT16 )s );
		             goto WaitDeviceOut;      //终止操作,等待USB设备拔出
		        }
		        
WaitDeviceOut:      // 等待USB设备拔出
          printf( "Wait Device Out\n" );
          while( 1 )
          {
               if( Query374Interrupt( ) )    //如果有USB主机中断则处理
                    HostDetectInterrupt( );
               if( Query374DeviceIn( ) == FALSE )      //没有USB设备
                    break;
          }
          mDelaymS( 100 );         //等待设备完全断开,消除插拔抖动
          if( Query374DeviceIn( ) )
               goto WaitDeviceOut; //没有完全断开
          //HostSetBusFree( );       //设定USB主机空闲,主要目的是关闭SOF
     }
}  

/*********************************************************************************************************
**                            End Of File
********************************************************************************************************/

⌨️ 快捷键说明

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