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

📄 ch375udevice.lst

📁 USB 1.1 U Device for CH375 & USB 2.0 for CH375A 读写usb超精简的程序
💻 LST
📖 第 1 页 / 共 2 页
字号:
 138          // 以下是非常简单的FAT文件系统的分析,正式应用绝对不应该如此简单 
 139          // 识别分析当前逻辑盘 
 140          UINT8  mIdenDisk( void ) 
 141          {
 142   1              UINT8  Status;
 143   1      
 144   1              DiskStart = 0; 
 145   1              Status = mReadSector( 0, 1, FILE_DATA_BUF );      // 读取逻辑盘引导信息 
 146   1              if ( Status != 0 ) return( Status );
 147   1      
 148   1      //      if ( (FILE_DATA_BUF[0] != 0xEB) && (FILE_DATA_BUF[0] != 0xE9) )// 不是逻辑引导扇区 
 149   1              // 不是逻辑引导扇区( EB 3E 90 ) 
 150   1              if ( (FILE_DATA_BUF[0] != 0xEB) && (FILE_DATA_BUF[1] != 0x3E) && (FILE_DATA_BUF[2] != 0x90) )
 151   1              {
 152   2                      DiskStart = FILE_DATA_BUF[0x1C6] | (UINT16)FILE_DATA_BUF[0x1C7] << 8 | (UINT32)FILE_DATA_BUF[0x1C8] << 1
             -6 | (UINT32)FILE_DATA_BUF[0x1C9] << 24;
 153   2                      Status = mReadSector( DiskStart, 1, FILE_DATA_BUF );
 154   2                      if ( Status != 0 ) return( Status );
 155   2              }
 156   1              SecPerClus  = FILE_DATA_BUF[0x0D];    // 每簇扇区数 
 157   1              ResvdSecCnt = FILE_DATA_BUF[0x0E];    // 逻辑盘的保留扇区数 
 158   1      //      ResvdSecCnt = mGetPointWord( &FILE_DATA_BUF[0x0E] );  // 逻辑盘的保留扇区数 
 159   1              FATSize16   = mGetPointWord( &FILE_DATA_BUF[0x16] );  // FAT表占用扇区数 
 160   1      
 161   1              return( 0 );                          // 成功 
 162   1      }
 163          
 164          //-------------------------------------------------------------------------------------------------
 165          // 获得指定簇号的链接簇 
 166          // 输入: iCluster 当前簇号 
 167          // 返回: 原链接簇号, 如果为 0 则说明错误 
 168          UINT16  mLinkCluster( UINT16 iCluster ) 
 169          {
 170   1              UINT8  Status;
 171   1      
 172   1              Status = mReadSector( DiskStart + ResvdSecCnt + iCluster / 256, 1, FILE_DATA_BUF );
 173   1              if ( Status != 0 ) return( 0 );       // 错误 
 174   1              
 175   1              return( mGetPointWord( &FILE_DATA_BUF[ ( iCluster + iCluster ) & 0x01FF ] ) );
 176   1      }
 177          
 178          //-------------------------------------------------------------------------------------------------
C51 COMPILER V7.20   CH375UDEVICE                                                          11/15/2005 22:07:19 PAGE 4   

 179          // 将簇号转换为绝对LBA扇区地址 
 180          UINT32  mClusterToLba( UINT16 iCluster ) 
 181          {
 182   1              return( DiskStart + ResvdSecCnt + FATSize16 * 2 + 32 + ( iCluster - 2 ) * SecPerClus );
 183   1      }
 184          
 185          //=================================================================================================
 186          //=================================================================================================
 187          // 用于调试 
 188          //=================================================================================================
 189          //=================================================================================================
 190          // 
 191          //-------------------------------------------------------------------------------------------------
 192          // 仅用于调试用途及显示内容到PC机,与该程序功能完全无关 
 193          void  mInitSTDIO( void ) 
 194          {
 195   1              SCON = 0x50; PCON = 0x80; TMOD = 0x20; TH1 = 0xf3; TR1=1; TI=1;  // 24MHz, 9600bps 
 196   1      }
 197          
 198          //-------------------------------------------------------------------------------------------------
 199          // 如果错误则停止运行并显示错误状态 
 200          void  mStopIfError( UINT8 iErrCode ) 
 201          {
 202   1              if ( iErrCode == 0 ) return;
 203   1              printf( "Error status, %02X\n", (UINT16)iErrCode );
 204   1      }
 205          
 206          //=================================================================================================
 207          //=================================================================================================
 208          // Main 
 209          //=================================================================================================
 210          //=================================================================================================
 211          // 
 212          void main( void ) 
 213          {
 214   1              UINT8  Status;
 215   1              UINT8X  *CurrentDir;
 216   1              UINT16  Cluster;
 217   1              
 218   1              mDelaymS( 200 );                      // 延时200毫秒 
 219   1              mInitSTDIO( );
 220   1              
 221   1              xWriteCH375Cmd( CMD_SET_USB_MODE );   // 初始化CH375,设置USB工作模式 
 222   1              xWriteCH375Data( 6 );                 // 模式代码,自动检测USB设备连接 
 223   1      
 224   1              while ( 1 ) 
 225   1              {
 226   2                      printf( "Insert USB disk\n" );
 227   2                      while ( mWaitInterrupt( ) != USB_INT_CONNECT );    // 等待U盘连接 
*** WARNING C206 IN LINE 227 OF CH375UDEVICE.C: 'mWaitInterrupt': missing function-prototype
 228   2                      mDelaymS( 250 );                  // 延时等待U盘进入正常工作状态 
 229   2      
 230   2                      Status = mInitDisk( );            // 初始化U盘,实际是识别U盘的类型,必须进行此步骤 
 231   2                      mStopIfError( Status );
 232   2                      Status = mIdenDisk( );            // 识别分析U盘文件系统,必要操作 
 233   2                      mStopIfError( Status );
 234   2                      
 235   2                      // 读取FAT16逻辑盘的根目录,通常根目录占用32个扇区 
 236   2                      Status = mReadSector( DiskStart + ResvdSecCnt + FATSize16 * 2, 32, FILE_DATA_BUF );
 237   2                      mStopIfError( Status );           
 238   2                      for ( CurrentDir = FILE_DATA_BUF; CurrentDir[0] != 0; CurrentDir += 32 ) 
 239   2                      {
C51 COMPILER V7.20   CH375UDEVICE                                                          11/15/2005 22:07:19 PAGE 5   

 240   3                              if ( ( CurrentDir[0x0B] & 0x08 ) == 0 && CurrentDir[0] != 0xE5 ) 
 241   3                              {
 242   4                                      CurrentDir[0x0B] = 0;     // 为了便于显示,设置文件名或者目录名的结束标志 
 243   4                                      printf( "Name: %s\n", CurrentDir ); // 通过串口输出显示 
 244   4                              }
 245   3                      }  
 246   2                      
 247   2                      // 以上显示根目录下的所有文件名,以下打开第一个文件,如果是C文件的话 
 248   2                      if ( (FILE_DATA_BUF[0x0B]&0x08)==0 && FILE_DATA_BUF[0]!=0xE5 && FILE_DATA_BUF[8]=='C' ) 
 249   2                      {
 250   3                              Cluster = mGetPointWord( &FILE_DATA_BUF[0x1A] ); // 文件的首簇 
 251   3                              while ( Cluster < 0xFFF8 )    // 文件簇未结束 
 252   3                              {  
 253   4                                      if ( Cluster == 0 ) mStopIfError( 0x8F );  // 对于首簇,可能是0长度文件 
 254   4                                      Status = mReadSector( mClusterToLba( Cluster ), SecPerClus, FILE_DATA_BUF );
 255   4                                      mStopIfError( Status );   // 读取首簇到缓冲区 
 256   4                                      FILE_DATA_BUF[30] = 0; 
 257   4                                      printf( "Data: %s\n", FILE_DATA_BUF );// 显示首行 
 258   4                                      Cluster = mLinkCluster( Cluster );  // 获取链接簇,返回0说明错误 
 259   4                              }
 260   3                      }
 261   2      
 262   2                      while ( mWaitInterrupt( ) != USB_INT_DISCONNECT ); // 等待U盘拔出 
 263   2                      mDelaymS( 250 );
 264   2              }
 265   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   1015    ----
   CONSTANT SIZE    =     57    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      8      18
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  1 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

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