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

📄 ch375.lst

📁 STC51系列的源码
💻 LST
📖 第 1 页 / 共 2 页
字号:
 159   2              {  return 0x0;  //* 操作成功
 160   3              }
 161   2          }
 162   1          return mflag;       //* 操作失败
 163   1      }
 164          
 165          
 166          /********************************************************************************/
 167          /* function : ch375b_get_point()                                                */
 168          /* recension: xillinx                                                           */
 169          /* descript : 获取字数据,因为MCS51是大端格式                                    */
 170          /********************************************************************************/
 171          uint16t ch375b_get_point(uint08t * addr)
 172          {   uint16t paddr=addr[0x0];
 173   1          paddr+=addr[0x1]<<8;
 174   1          return paddr;
 175   1      }
 176          
 177          /********************************************************************************/
 178          /* function : ch375b_ident_disk()                                               */
C51 COMPILER V8.02   CH375                                                                 10/19/2008 17:05:12 PAGE 4   

 179          /* recension: xillinx                                                           */
 180          /* descript : 识别分析当前逻辑盘                                                */
 181          /********************************************************************************/
 182          uint08t ch375b_ident_disk(void)
 183          {   uint08t status;
 184   1          logic_disk_begin=0x0;  //* 以下是非常简单的FAT文件系统的分析
 185   1          status=ch375b_read_sector(0x0,0x1,ch375b_disk_buffer);  //* 读取逻辑盘引导信息
 186   1          if(status!=0x0)
 187   1          {  return status;
 188   2          }
 189   1          if((ch375b_disk_buffer[0x0]!=0xEB)&&(ch375b_disk_buffer[0x0]!=0xE9))   //* 不是逻辑引导扇区
 190   1          {  logic_disk_begin =ch375b_disk_buffer[0x1C6]<<0x00;
 191   2             logic_disk_begin+=ch375b_disk_buffer[0x1C7]<<0x08;
 192   2             logic_disk_begin+=ch375b_disk_buffer[0x1C8]<<0x10;
 193   2             logic_disk_begin+=ch375b_disk_buffer[0x1C9]<<0x18;
 194   2             status=ch375b_read_sector(logic_disk_begin,0x1,ch375b_disk_buffer);
 195   2             if(status!=0x0)
 196   2             {  return status;
 197   3             }
 198   2          }
 199   1          logic_section_per_cluster= ch375b_disk_buffer[0x0D];    //* 每簇扇区数
 200   1          logic_rsvd_section_num   = ch375b_disk_buffer[0x0E];    //* 逻辑盘的保留扇区数
 201   1          logic_fat_section_num    = ch375b_get_point(&ch375b_disk_buffer[0x16]);   //* FAT表占用扇区数
 202   1          return 0x0;
 203   1      }
 204          
 205          /********************************************************************************/
 206          /* function : ch375b_link_cluster()                                             */
 207          /* recension: xillinx                                                           */
 208          /* descript : 获得指定簇号的链接簇                                              */
 209          /* 输入cluster当前簇号,返回原链接簇号,如果为0x0则说明错误                       */
 210          /********************************************************************************/
 211          uint16t ch375b_link_cluster(uint16t cluster)
 212          {   uint08t status;
 213   1          status=ch375b_read_sector(logic_disk_begin+logic_rsvd_section_num+cluster/256,0x1,ch375b_disk_buffer);
 214   1          if(status!=0x0)
 215   1          {  return 0x0;
 216   2          }
 217   1          return ch375b_get_point(&ch375b_disk_buffer[(cluster+cluster)&0x01FF]);
 218   1      }
 219          
 220          /********************************************************************************/
 221          /* function : ch375b_cluster_2_lba()                                            */
 222          /* recension: xillinx                                                           */
 223          /* descript : 将簇号转换为绝对LBA扇区地址                                       */
 224          /********************************************************************************/
 225          uint32t ch375b_cluster_2_lba(uint16t cluster)
 226          {   return logic_disk_begin+logic_rsvd_section_num+logic_fat_section_num*0x2+32+(cluster-0x2)*logic_sectio
             -n_per_cluster;
 227   1      }
 228          
 229          /********************************************************************************/
 230          /* function : ch375_display_error()                                             */
 231          /* recension: xillinx                                                           */
 232          /* descript : 如果错误则停止运行并显示错误状态                                  */
 233          /********************************************************************************/
 234          void ch375_display_error(uint08t status)
 235          {   if(status==0x0)
 236   1          {  return;
 237   2          }
 238   1          UART_printf("error status: %bx.\r\n",status);
 239   1      }
C51 COMPILER V8.02   CH375                                                                 10/19/2008 17:05:12 PAGE 5   

 240          
 241          /********************************************************************************/
 242          /* function : ch375b_mode_initialize()                                          */
 243          /* recension: xillinx                                                           */
 244          /* descript : 将簇号转换为绝对LBA扇区地址                                       */
 245          /********************************************************************************/
 246          void ch375b_mode_initialize(uint08t mode)
 247          {   ch375b_write_cmd(CMD_SET_USB_MODE);
 248   1          ch375b_write_dat(mode);
 249   1      }
 250          
 251          /********************************************************************************/
 252          /* function : ch375b_main()                                                     */
 253          /* recension: xillinx                                                           */
 254          /* descript : 将簇号转换为绝对LBA扇区地址                                       */
 255          /********************************************************************************/
 256          uint32t ch375b_main(void)
 257          {   uint08t * cur_dir;
 258   1          uint16t   cluster;
 259   1          uint08t   status;
 260   1          ch375b_mode_initialize(0x6);
 261   1          while(ch375b_wait_interrupt()!=USB_INT_CONNECT)
 262   1          {  ;
 263   2          }
 264   1          UART_printf("USB connect.\r\n");
 265   1          ch375_delay_ms(250);                //* 延时等待U盘进入正常工作状态
 266   1          
 267   1          UART_printf("USB disk init.\r\n");
 268   1          status=ch375b_disk_initialize();    //* 初始化U盘,实际是识别U盘的类型,必须进行此步骤
 269   1          ch375_display_error(status);
 270   1          
 271   1          UART_printf("USB read ident.\r\n");
 272   1          status=ch375b_ident_disk( );        //* 识别分析U盘文件系统,必要操作
 273   1          ch375_display_error(status);
 274   1          
 275   1          UART_printf("USB read section.\r\n");
 276   1          logic_lba_begin=logic_disk_begin+logic_rsvd_section_num+logic_fat_section_num*0x2;
 277   1          status = ch375b_read_sector(logic_lba_begin,4,ch375b_disk_buffer);
 278   1          ch375_display_error(status);        //* 读取FAT16逻辑盘的根目录,通常根目录占用32个扇区
 279   1                                              
 280   1          UART_printf("USB read dir.\r\n");
 281   1          for(cur_dir=ch375b_disk_buffer; cur_dir[0x0]!=0x0; cur_dir+=0x20)//* 显示根目录下的所有文件名
 282   1          {   if((cur_dir[0x0B]&0x08)==0x0&&cur_dir[0x0]!=0xE5)
 283   2              {   cur_dir[0x0B]=0x0;          //* 为了便于显示,设置文件名或者目录名的结束标志
 284   3                  UART_printf("name: %s.\r\n",cur_dir);
 285   3              }
 286   2          }
 287   1          UART_printf("USB read file.\r\n");
 288   1          if((ch375b_disk_buffer[0x0B]&0x08)==0x0&&ch375b_disk_buffer[0x0]!=0xE5 && ch375b_disk_buffer[0x8]=='C'
             -)
 289   1          {   cluster=ch375b_get_point(&ch375b_disk_buffer[0x1A]);  //* 文件的首簇
 290   2              while(cluster<0xFFF8)                           //* 文件簇未结束
 291   2              {   if(cluster==0x0)
 292   3                  {  ch375_display_error(0x8F);               //* 对于首簇,可能是0长度文件
 293   4                  }
 294   3                  status=ch375b_read_sector(ch375b_cluster_2_lba(cluster),4,ch375b_disk_buffer);
 295   3                  ch375_display_error(status);                //* 读取首簇到缓冲区 */
 296   3                  ch375b_disk_buffer[30]=0x0;
 297   3                  UART_printf( "Data: %s\n",ch375b_disk_buffer);   //* 显示首行
 298   3                  cluster=ch375b_link_cluster(cluster);       //* 获取链接簇,返回0说明错误
 299   3              }
 300   2          }
C51 COMPILER V8.02   CH375                                                                 10/19/2008 17:05:12 PAGE 6   

 301   1          UART_printf("USB wait disconnect.\r\n");
 302   1          while(ch375b_wait_interrupt()!=USB_INT_DISCONNECT); //* 等待U盘拔出
 303   1          ch375_delay_ms( 250 );
 304   1          
 305   1          return 0x0;
 306   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   1518    ----
   CONSTANT SIZE    =    211    ----
   XDATA SIZE       =  16396      26
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----    ----
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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