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

📄 ch375udevice.lst

📁 USB 1.1 U Device for CH375 & USB 2.0 for CH375A 读写usb超精简的程序
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V7.20   CH375UDEVICE                                                          11/15/2005 22:07:19 PAGE 1   


C51 COMPILER V7.20, COMPILATION OF MODULE CH375UDEVICE
OBJECT MODULE PLACED IN CH375UDevice.OBJ
COMPILER INVOKED BY: C:\Program Files\Keil Uvision V7.20\C51\BIN\C51.EXE CH375UDevice.C BROWSE DEBUG OBJECTEXTEND

line level    source

   1          //=================================================================================================
   2          //*************************************************************************************************
   3          // Module Name  : CH375UDevice.C
   4          // Device object: 
   5          // Create date  : 2005-11-07 
   6          // Modify date  : 2005-11-11 
   7          // Description  : USB 1.1 U Device for CH375 
   8          //                
   9          // Author       : Li yuanzheng 
  10          // Version      : V1.0  
  11          //*************************************************************************************************
  12          //=================================================================================================
  13          // 
  14          /* 这个程序用180行C代码就能够读取FAT16文件系统U盘的根目录,可以看到根目录下的文件
  15          名,并可显示
  16          首文件内容,不过,该程序很不严谨,也没有任何错误处理,对U盘兼容性较差,只是用于简单试
  17          验,作为参考.
  18          这个程序可以支持WINDOWS按FAT16格式化的U盘,因为程序精简,所以只兼容超过50%以上的U
  19          盘品牌,如果换
  20          成CH375A芯片则兼容性可提高到85%,当然,如果使用WCH公司的子程序库或者正式版本的C源
  21          程序兼容性更好。
  22          下
  23          欢测试以下U盘通过:郎科/超稳经典64M/超稳迷你128M/U160-64M/超稳普及128M,爱国者/迷
  24          你王16M/邮箱型,
  25          黑匣子/64M,微闪/64M,飙王/32M/64M/128M,晶彩/C200-64M,新科/256M,昂达/128M...,欢迎
  26          提供测试结果
  27          未通过U盘:爱国者/智慧棒128M,清华普天/USB2.0-128M,当然,使用WCH的子程序库或CH375A
  28          都可以测试通过 */
  29          //-------------------------------------------------------------------------------------------------
  30          // Includes 
  31          //-------------------------------------------------------------------------------------------------
  32          
  33          #include <regx52.h>  // 以下定义适用于MCS-51单片机,其它单片机参照修改 
  34          #include <stdio.h>
  35          #include "CH375H.H"
  36          #include "CH375UDevice.H"
  37          
  38          //=================================================================================================
  39          // 
  40          //UINT8X  FILE_DATA_BUF[512*32] _at_ 0x0000;  // 外部RAM数据缓冲区的起始地址 (DISK_BUFFER) 
  41          
  42          UINT32  DiskStart;    // 逻辑盘的起始绝对扇区号LBA 
  43          UINT8   SecPerClus;   // 逻辑盘的每簇扇区数 
  44          UINT8   ResvdSecCnt;  // 逻辑盘的保留扇区数 
  45          UINT16  FATSize16;    // FAT16逻辑盘的FAT表占用的扇区数 
  46          
  47          //=================================================================================================
  48          // 
  49          //=================================================================================================
  50          // 
  51          
  52          //=================================================================================================
  53          // BulkOnly传输协议层,被CH375内置了,无需编写单片机程序 
  54          //=================================================================================================
  55          // 
C51 COMPILER V7.20   CH375UDEVICE                                                          11/15/2005 22:07:19 PAGE 2   

  56          //=================================================================================================
  57          //=================================================================================================
  58          // RBC/SCSI命令层,虽然被CH375内置了,但是要写程序发出命令及收发数据 
  59          //=================================================================================================
  60          //=================================================================================================
  61          // 
  62          //-------------------------------------------------------------------------------------------------
  63          // 初始化磁盘 
  64          UINT8  mInitDisk( void ) 
  65          {  
  66   1              xWriteCH375Cmd( CMD_GET_STATUS );     // 产生操作完成中断, 获取中断状态 
  67   1              xQueryInterrupt( );                   // 等待中断并获取状态 
  68   1              if( CH375IntStatus == USB_INT_DISCONNECT ) return( CH375IntStatus );  // USB设备断开 
  69   1      
  70   1              xWriteCH375Cmd( CMD_DISK_INIT );      // 初始化USB存储器     
  71   1              xQueryInterrupt( );                   // 等待中断并获取状态 
  72   1              if( CH375IntStatus != USB_INT_SUCCESS ) return( CH375IntStatus );     // 出现错误 
  73   1      
  74   1              xWriteCH375Cmd( CMD_DISK_SIZE );      // 获取USB存储器的容量 
  75   1              xQueryInterrupt( );                   // 等待中断并获取状态 
  76   1              if( CH375IntStatus != USB_INT_SUCCESS )     // 出错重试 
  77   1              {                                     // 对于CH375A芯片,建议在此执行一次CMD_DISK_R_SENSE命令 
  78   2                      mDelaymS( 250 );
  79   2                      xWriteCH375Cmd( CMD_DISK_SIZE );  // 获取USB存储器的容量 
  80   2                      xQueryInterrupt( );               // 等待中断并获取状态 
  81   2              }
  82   1              if( CH375IntStatus != USB_INT_SUCCESS ) return( CH375IntStatus );     // 出现错误 
  83   1              
  84   1              return( 0 );                          // U盘已经成功初始化 
  85   1      }
  86          
  87          //-------------------------------------------------------------------------------------------------
  88          // 从USB存储器的指定地点读数据块到外部缓冲区 
  89          UINT8  mReadSector( UINT32 iLbaStart, UINT8 iSectorCount, UINT8X *DataBuffer ) 
  90          {
  91   1              UINT16  mBlockCount;
  92   1      
  93   1              // 从USB存储器读数据块 
  94   1              xWriteCH375Cmd( CMD_DISK_READ );   
  95   1      
  96   1              xWriteCH375Data( (UINT8)iLbaStart           );  // LBA的最低8位 
  97   1              xWriteCH375Data( (UINT8)( iLbaStart >> 8  ) );
  98   1              xWriteCH375Data( (UINT8)( iLbaStart >> 16 ) );
  99   1              xWriteCH375Data( (UINT8)( iLbaStart >> 24 ) );  // LBA的最高8位 
 100   1      
 101   1              xWriteCH375Data( iSectorCount );      // 扇区数 
 102   1              for ( mBlockCount = iSectorCount * 8; mBlockCount != 0; mBlockCount -- ) 
 103   1              {
 104   2                      xQueryInterrupt( );               // 等待中断并获取状态 
 105   2                      if ( CH375IntStatus == USB_INT_DISK_READ )  // 等待中断并获取状态,请求数据读出 
 106   2                      {  
 107   3                              xWriteCH375Cmd( CMD_RD_USB_DATA );      // 从CH375缓冲区读取数据块 
 108   3                              CH375IntStatus = xReadCH375Data( );     // 后续数据的长度 
 109   3                              while ( CH375IntStatus -- ) *DataBuffer++ = xReadCH375Data( );
 110   3                              xWriteCH375Cmd( CMD_DISK_RD_GO );       // 继续执行USB存储器的读操作 
 111   3                      }
 112   2                      else break;                       // 返回错误状态 
 113   2              }
 114   1      
 115   1              if ( mBlockCount == 0 ) 
 116   1              {
 117   2                      xQueryInterrupt( );               // 等待中断并获取状态 
C51 COMPILER V7.20   CH375UDEVICE                                                          11/15/2005 22:07:19 PAGE 3   

 118   2                      if ( CH375IntStatus == USB_INT_SUCCESS ) return( 0 );     // 操作成功 
 119   2              }
 120   1      
 121   1              return( CH375IntStatus );             // 操作失败 
 122   1      }
 123          
 124          //=================================================================================================
 125          //=================================================================================================
 126          // FAT文件系统层,这层程序量实际较大,不过,该程序仅演示极简单的功能,所以精简 
 127          //=================================================================================================
 128          //=================================================================================================
 129          // 
 130          //-------------------------------------------------------------------------------------------------
 131          // 获取字数据,因为MCS51是大端格式 
 132          UINT16  mGetPointWord( UINT8X *iAddr ) 
 133          {  
 134   1              return( iAddr[0] | (UINT16)iAddr[1] << 8 );
 135   1      }
 136          
 137          //-------------------------------------------------------------------------------------------------

⌨️ 快捷键说明

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