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

📄 fatfunction.c

📁 单片机读写U盘源码 基于51单片机和国产USB芯片CH374
💻 C
📖 第 1 页 / 共 3 页
字号:
     //  调试语句
     #ifdef  DEBUG_CREAT       
     printf( " 记录找到的起始簇的簇号:%d \n" , Cluster ) ;
     #endif                
     TotalSectors = FAT.SecPerClus ;
     
     while ( 1 )
     {
          //计算该簇号对应的FAT表偏移
          //读取FAT表,查询要写的簇
          FAT.FirstSectofClu = ( ( Cluster - 2 ) * FAT.SecPerClus ) + FAT.FirstDataSector ;
          NextCluster = x16List( Cluster , 0, ModeZ2 ) ;
          ProcessSector = FAT.FirstSectofClu ;
          TransNum = 0 ;
          //调试语句
          #ifdef  DEBUF_CREAT
          printf( " 本文件/目录下一个簇号:NextCluster = %d\n ", NextCluster ) ;
          #endif
          
          while( TotalSectors )
          {
               //更新读取扇区参数
               ProcessSector += TransNum ;
               TransNum = TotalSectors >= DiskNums ? DiskNums : TotalSectors ;
               
               //读取根目录N个扇区( N <= SecNum_of_BUF )到DISK_BUF中
               s = mReadSector( ProcessSector ,TransNum ,DISKBUF );
		             if ( s != USB_INT_SUCCESS )
		                  return( ERR_Check ) ;
		                  
		             //在DISK_BUF中查找文件
		             TransBytes = TransNum << FAT.shift ;
               for ( POINT2 = DISKBUF ; POINT2 < DISKBUF + TransBytes ; POINT2 += 32 )     
               {
                    if ( ! ( *POINT2 ) || ( *POINT2 == 0xE5 ) || ( *POINT2 == 0x05 ) )    //若是空文件项,则退出
                    {    
                         FindFlag = 1 ;
                         wr -> find.TransNum = TransNum ;
                         wr -> find.Sector = ProcessSector ;
                         wr -> find.Offset = POINT2 ;
                         //调试语句
                         #ifdef  DEBUG_CREAT
                         printf( " 找到目录/文件 !\n " ) ;
                         printf( " 文件地址信息记录:\n " ) ;
                         printf( " 本次传输的扇区数:%d\n ", ( UINT16 )wr -> find.TransNum ) ;
                         printf( " 本次传输的起始扇区号:%ld\n ", wr -> find.Sector ) ;
                         printf( " 本次传输的扇区内偏移:%p \n ", wr -> find.Offset ) ;
                         #endif
                         break ;
                    }
               }
               if ( FindFlag )
               break ;
               TotalSectors -= TransNum ;
          }
          if ( FindFlag || NextCluster == 0xFFFF )
               break ;
          Cluster = NextCluster ;              
     }
     
     if ( ! FindFlag && NextCluster == 0xFFFF )
     {
          NextCluster = x16CheckClus( ) ;
          if ( NextCluster == 0x00 )
               return( ERR_FullDisk ) ;
          else  if ( NextCluster == ERR_CheckClus )
               return( ERR_CheckClus ) ;
          
          wr -> find.TransNum = 1 ;
          wr -> find.Sector = ( ( NextCluster - 2 ) * FAT.SecPerClus ) + FAT.FirstDataSector ; ;
          wr -> find.Offset = DISKBUF ;
          
          //更新根目录中起始簇信息
          //调试语句
          #ifdef  DEBUG_CREAT
          printf( " 更新根目录中簇信息: " ) ;
          #endif
          s = x16List( Cluster, NextCluster, ModeZ1 ) ;
          if( s != ListSuccess )
               return( s ) ;
      
          s = x16List( NextCluster, 0xFFFF, ModeZ1 ) ;
          if( s != ListSuccess )
               return( s ) ;
     }
     
     //读取目录可写域信息
     ProcessSector = wr -> find.Sector ;
     POINT0 = wr -> find.Offset ;
     TransNum = wr -> find.TransNum ;
     
     s = mReadSector( ProcessSector, TransNum, DISKBUF );
		   if ( s != USB_INT_SUCCESS )
		        return( ERR_Read ) ;      
     
     s = xProcessDirectory( wr, Attribute ) ;
     if ( s != DirectorySuccess )
          return( s ) ;
     
     return( CreatSuccess ) ;
}       

/*********************************************************************************************************
** 函数名称: CheckFile
** 功能描述: 在一定范围内查找文件/目录
**
** 输 入: wr : 指向文件信息结构FILE的指针
**         TotalSectors: 为该范围总扇区数
**         ProcessSector: 为该范围首地址
** 输 出: 在该范围内查找文件,返回FindFlag标识,以便外部程序调用
**         找到的文件/目录在簇内的地址信息记录在FIND结构中
**           A.返回ERR_Check报告异常传输错误
**           B.返回FindFlag为0x00表示未找到文件
**           C.返回FindFlag为0x01表示找到文件
**         
** 全局变量: wr -> find.Offset, wr -> find.TransNum, wr -> find.Sector, DiskNums
** 调用模块: mReadSector
** 调试码:   DEBUG_CF
**
**
** 作 者: 徐亦朱
** 日 期: 2007年9月21日
**-------------------------------------------------------------------------------------------------------
** 修改人: 徐亦朱
** 日 期: 2007.9.27
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
UINT8  CheckFile( FILE * wr, UINT16 TotalSectors, UINT32 ProcessSector ) 
{
     UINT8  i ;
     UINT8  s ;
     UINT8  *POINT1 ;
     UINT8  *POINT2 ;
     UINT8  FindFlag ;
	    UINT8  TransNum ;
     UINT16 TransBytes ;
  
     //初始化变量
     FindFlag = 0 ;
     TransNum = 0 ;
     //在范围内( 1簇或根目录内 )查找文件
     while ( TotalSectors )      
     {
          //更新读取扇区参数
          ProcessSector += TransNum ;
          TransNum = TotalSectors >= DiskNums ? DiskNums : TotalSectors ;
          
          //读取根目录N个扇区( N <= DiskNums )到DISK_BUF中
          s = mReadSector( ProcessSector ,TransNum ,DISKBUF );
		        if ( s != USB_INT_SUCCESS )
		             return( ERR_Check ) ;
		        
		        //在DISK_BUF中查找文件
		        TransBytes = TransNum << FAT.shift ;
          for ( POINT1 = DISKBUF ; POINT1 < DISKBUF + TransBytes ; POINT1 += 32 )     
          {
               if ( ! ( *POINT1 ) )               //若是空文件项,则退出
               {    
                    FindFlag = 0 ;
                    return( FindFlag ) ;
               }
               else                               //判断文件名是否相同
               {
                    POINT2 = wr -> Name ;
                    for ( i = 0; i < 11; i ++ )
                    {
                         if ( *( POINT1 + i ) == *( POINT2 + i ) )
                         {
                              FindFlag = 1 ;
                              continue ;
                         }
                         FindFlag = 0 ;
                         break ;
                    }
                    if ( FindFlag )
                    {
                         wr -> find.TransNum = TransNum ;
                         wr -> find.Sector = ProcessSector ;
                         wr -> find.Offset = POINT1 ;
                         //调试语句
                         #ifdef  DEBUG_CF
                         printf( " 找到目录/文件 !\n " ) ;
                         printf( " 文件地址信息记录:\n " ) ;
                         printf( " 本次传输的扇区数:%d\n ", ( UINT16 )wr -> find.TransNum ) ;
                         printf( " 本次传输的起始扇区号:%ld\n ", wr -> find.Sector ) ;
                         printf( " 本次传输的扇区内偏移:%p \n ", wr -> find.Offset ) ;
                         #endif
                         return( FindFlag ) ;
                    }
               }
          }
          TotalSectors -= TransNum ;
     }
     return( FindFlag ) ;
}

/*********************************************************************************************************
** 函数名称: CheckFirst16
** 功能描述: 在FAT16根目录内查找文件 /目录
**
** 输 入: wr : 指向文件信息结构FILE的指针
** 输 出: 在该范围内查找文件,返回FindFlag标识,以便外部程序调用
**         找到的文件/目录在簇内的地址信息记录在FIND结构中
**           A.返回ERR_Check报告异常传输错误
**           B.返回FindFlag为0x00表示未找到文件
**           C.返回FindFlag为0x01表示找到文件
**         
** 全局变量: FAT.RootDirSectors, FAT.FirstRootSector
** 调用模块: CheckFile
** 调试码:   无
**
**
** 作 者: 徐亦朱
** 日 期: 2007年9月21日
**-------------------------------------------------------------------------------------------------------
** 修改人: 徐亦朱 
** 日 期: 2007.9.27
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
UINT8  CheckFirst16( FILE * wr )
{
     UINT8  s ;
     UINT8  FindFlag ;
     
     //初始化标记位
     FindFlag = 0 ;

     s = CheckFile( wr, FAT.RootDirSectors, FAT.FirstRootSector ) ;
     if ( s == ERR_Check )
          return( s ) ;
     FindFlag = s ? 0x01 : 0x00 ;
     return( FindFlag ) ;
}

/*********************************************************************************************************
** 函数名称: x16CheckFile
** 功能描述: 在FAT16目录内查找文件
**
** 输 入: wr : 指向文件信息结构FILE的指针
** 输 出: 在该范围内查找文件,返回FindFlag标识,以便外部程序调用
**         找到的文件/目录在簇内的地址信息记录在FIND结构中
**           A.返回ERR_Check报告异常传输错误
**           B.返回FindFlag为0x00表示未找到文件
**           C.返回FindFlag为0x01表示找到文件
**         
** 全局变量: wr -> find.Offset, FAT.SecPerClus, FAT.FirstSectofClu
** 调用模块: x16List, CheckFile
** 调试码:   DEBUG_XCF
**
**
** 作 者: 徐亦朱
** 日 期: 2007年9月21日
**-------------------------------------------------------------------------------------------------------
** 修改人: 徐亦朱
** 日 期: 2007.9.27
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
UINT8  x16CheckFile( FILE * wr )
{
     UINT8  s ;
     UINT8  *POINT0 ;
     UINT8  FindFlag ;
     UINT16 Cluster ;
     UINT16 NextCluster ;
     
     //初始化变量
     FindFlag = 0 ;
     POINT0 = wr -> find.Offset ;
     Cluster = ( UINT16 )( *( POINT0 + 26 ) ) | ( UINT16 )( *( POINT0 + 27 ) ) << 8 ;
     
     //调试语句
     #ifdef  DEBUG_XCF
     printf( " 本文件/目录起始簇号:Cluster = %d\n ", Cluster ) ;
     #endif
     
     while ( 1 )
     {
          //计算FAT表信息
          FAT.FirstSectofClu = ( ( Cluster - 2 ) * FAT.SecPerClus ) + FAT.FirstDataSector ;
          NextCluster = x16List( Cluster , 0, ModeZ2 ) ;
          
          s = CheckFile( wr, FAT.SecPerClus, FAT.FirstSectofClu ) ;
          if ( s == ERR_Check )
               return( s ) ;
          else  if ( s == 0x01 )
          {
               FindFlag = 0x01 ;
               return( FindFlag ) ;
          }
          if ( NextCluster == 0xFFFF )
               return( FindFlag ) ; 
          Cluster = NextCluster ;
     }
}

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

⌨️ 快捷键说明

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