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

📄 fatfunction.c

📁 单片机读写U盘源码 基于51单片机和国产USB芯片CH374
💻 C
📖 第 1 页 / 共 3 页
字号:
          Cluster = ( ( ProcessSector - FAT.RsvdSecCnt ) << ( FAT.shift - 1 ) ) + ( ( POINT0 - DISKBUF ) >> 1 ) ;
     else
          Cluster = 0x00 ;
     return( Cluster ) ;
}

/*********************************************************************************************************
** 函数名称: xProcessDirectory
** 功能描述: 处理目录/文件名
**
** 输 入: wr:        指向文件信息结构FILE的指针
**         Attribute: 目录/文件操作模式
**           A.模式ModeX1: 创建新文件
**           B.模式ModeX2: 创建新目录
**           C.模式ModeX3: 对打开的文件截0
**           D.模式ModeX4: 删除文件/目录
** 输 出: 根据模式选择完成相应的操作
**           A.返回ERR_Directory 报告异常传输错误
**           B.返回DirectorySuccess表示操作成功完成
**         
** 全局变量: wr -> find.Offset, wr -> find.TransNum, wr -> find.Sector, FAT.FirstSectofClu
** 调用模块: mReadSector, mWriteSector, x16CheckClus, x16List
** 调试码:   无
**
**
** 作 者: 徐亦朱
** 日 期: 2007年9月21日
**-------------------------------------------------------------------------------------------------------
** 修改人: 徐亦朱  
** 日 期: 2007.9.27 
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
UINT8  xProcessDirectory( FILE * wr, UINT8 Attribute )
{
     UINT8  s ;
     UINT16 i ;
     UINT8  TransNum ;
     UINT8  *POINT0 ;
     UINT8  *POINT1 ;
     UINT8  Directory[ 32 ]  = { 0x2E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,     0x00,0x00,0x00,
                                 0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                                 0x00,0x00,0x00,0x00,0x00,0x00 } ; 
     UINT16 time ;
     UINT16 date ;
     UINT16 Cluster ;
	    UINT32 ProcessSector ;
     
     //计算系统日期、时间
     time = sysclock.time.hour << 11 + sysclock.time.min << 5 + sysclock.time.sec >> 1 ;
     date = sysclock.date.year >> 9 + sysclock.date.month << 5 + sysclock.date.day ;
     
     if ( Attribute == ModeX2 )
     {
          Cluster = x16CheckClus( ) ;
          if ( Cluster == 0x00 )
               return( ERR_FullDisk ) ;
          else  if ( Cluster == ERR_CheckClus )
               return( ERR_CheckClus ) ;
          
		        s = x16List( Cluster, 0xFFFF, ModeZ1 ) ;     //更新FAT表中簇信息
          if( s != ListSuccess )
               return( s ) ;  
          
          FAT.FirstSectofClu = ( ( Cluster - 2 ) * FAT.SecPerClus ) + FAT.FirstDataSector ;    //计算该簇号对应的起始扇区数
          
          //为新目录分配簇后,须将该簇初始化
          for ( i = 0; i < FAT.BytesPerSec; i ++ )
               DISKBUF[ i ] = 0 ;
          for ( ProcessSector = FAT.FirstSectofClu; ProcessSector < FAT.FirstSectofClu + FAT.SecPerClus ; ProcessSector ++ )
          {
               s = mWriteSector( ProcessSector, 0x01, DISKBUF );
		             if ( s != USB_INT_SUCCESS )
		                  return( ERR_Write ) ;              
          }
          
          Directory[ 14 ] = ( UINT8 )time ;
          Directory[ 15 ] = ( UINT8 )( time >> 8 ) ;
          Directory[ 16 ] = ( UINT8 )date ;
          Directory[ 17 ] = ( UINT8 )( date >> 8 ) ;
          Directory[ 18 ] = ( UINT8 )date ;
          Directory[ 19 ] = ( UINT8 )( date >> 8 ) ;
          Directory[ 22 ] = ( UINT8 )time ;
          Directory[ 23 ] = ( UINT8 )( time >> 8 ) ;
          Directory[ 24 ] = ( UINT8 )date ;
          Directory[ 25 ] = ( UINT8 )( date >> 8 ) ;
          Directory[ 26 ] = ( UINT8 )Cluster ;
          Directory[ 27 ] = ( UINT8 )( Cluster >> 8 ) ;
          memcpy ( DISKBUF, Directory, 32 ) ;
          Directory[ 1 ]  = 0x2E ;
          Directory[ 26 ] = ( UINT8 )wr -> clus.fat16.LastClus ;
          Directory[ 27 ] = ( UINT8 )( wr -> clus.fat16.LastClus >> 8 ) ;
          memcpy ( DISKBUF+32, Directory, 32 ) ;
          s = mWriteSector( FAT.FirstSectofClu, 0x01, DISKBUF );
		        if ( s != USB_INT_SUCCESS )
		             return( ERR_Write ) ;
          
          TransNum = wr -> find.TransNum ;
          ProcessSector = wr -> find.Sector ;
          s = mReadSector( ProcessSector, TransNum ,DISKBUF );
		        if ( s != USB_INT_SUCCESS )
		             return( ERR_Check ) ;
     }
     POINT0 = wr -> find.Offset ;
     TransNum = wr -> find.TransNum ;
     ProcessSector = wr -> find.Sector ;
     //DISK_BUF内操作
     
     POINT1 = wr -> Name ;
     if ( Attribute == ModeX4 )
          ( ( PUSB_FDT )POINT0 ) -> FileName  [ 0 ] = 0xE5 ;
     else
          ( ( PUSB_FDT )POINT0 ) -> FileName  [ 0 ] = *  POINT1 ;
     ( ( PUSB_FDT )POINT0 ) -> FileName       [ 1 ] = *( POINT1 + 1 ) ;
     ( ( PUSB_FDT )POINT0 ) -> FileName       [ 2 ] = *( POINT1 + 2 ) ;
     ( ( PUSB_FDT )POINT0 ) -> FileName       [ 3 ] = *( POINT1 + 3 ) ;
     ( ( PUSB_FDT )POINT0 ) -> FileName       [ 4 ] = *( POINT1 + 4 ) ;
     ( ( PUSB_FDT )POINT0 ) -> FileName       [ 5 ] = *( POINT1 + 5 ) ;
     ( ( PUSB_FDT )POINT0 ) -> FileName       [ 6 ] = *( POINT1 + 6 ) ;
     ( ( PUSB_FDT )POINT0 ) -> FileName       [ 7 ] = *( POINT1 + 7 ) ;
     ( ( PUSB_FDT )POINT0 ) -> FileName       [ 8 ] = *( POINT1 + 8 ) ;
     ( ( PUSB_FDT )POINT0 ) -> FileName       [ 9 ] = *( POINT1 + 9 ) ;
     ( ( PUSB_FDT )POINT0 ) -> FileName       [ 10 ]= *( POINT1 + 10 ) ;
     if ( Attribute == ModeX2 )
          ( ( PUSB_FDT )POINT0 ) -> Attribute       = 0x10 ;
     else
          ( ( PUSB_FDT )POINT0 ) -> Attribute       = 0x00 ;
     ( ( PUSB_FDT )POINT0 ) -> Reserved_NT          = 0x00 ;
     ( ( PUSB_FDT )POINT0 ) -> CtrlTimeTeenth       = 0x00 ;
     ( ( PUSB_FDT )POINT0 ) -> CrtTime        [ 0 ] = ( UINT8 )time ;
     ( ( PUSB_FDT )POINT0 ) -> CrtTime        [ 1 ] = ( UINT8 )( time >> 8 ) ;
     ( ( PUSB_FDT )POINT0 ) -> CrtDate        [ 0 ] = ( UINT8 )date ;
     ( ( PUSB_FDT )POINT0 ) -> CrtDate        [ 1 ] = ( UINT8 )( date >> 8 ) ;
     ( ( PUSB_FDT )POINT0 ) -> LastAccDate    [ 0 ] = ( UINT8 )date;
     ( ( PUSB_FDT )POINT0 ) -> LastAccDate    [ 1 ] = ( UINT8 )( date >> 8 ) ;
     ( ( PUSB_FDT )POINT0 ) -> Reserved       [ 0 ] = 0x00 ;
     ( ( PUSB_FDT )POINT0 ) -> Reserved       [ 1 ] = 0x00 ;
     ( ( PUSB_FDT )POINT0 ) -> WrtTime        [ 0 ] = ( UINT8 )time ;
     ( ( PUSB_FDT )POINT0 ) -> WrtTime        [ 1 ] = ( UINT8 )( time >> 8 ) ;
     ( ( PUSB_FDT )POINT0 ) -> WrtDate        [ 0 ] = ( UINT8 )date ;
     ( ( PUSB_FDT )POINT0 ) -> WrtDate        [ 1 ] = ( UINT8 )( date >> 8 ) ;
     if ( Attribute == ModeX2 )
     {
          ( ( PUSB_FDT )POINT0 ) -> StartClus [ 0 ] = ( UINT8 )Cluster ;
          ( ( PUSB_FDT )POINT0 ) -> StartClus [ 1 ] = ( UINT8 )( Cluster >> 8 ) ;
     }
     else
     {
          ( ( PUSB_FDT )POINT0 ) -> StartClus [ 0 ] = 0x00 ;
          ( ( PUSB_FDT )POINT0 ) -> StartClus [ 1 ] = 0x00 ;
     }
     ( ( PUSB_FDT )POINT0 ) -> FileSize       [ 0 ] = 0x00 ; 
     ( ( PUSB_FDT )POINT0 ) -> FileSize       [ 1 ] = 0x00 ;  
     ( ( PUSB_FDT )POINT0 ) -> FileSize       [ 2 ] = 0x00 ;  
     ( ( PUSB_FDT )POINT0 ) -> FileSize       [ 3 ] = 0x00 ;
     
     //回写数据到目录内
		   s = mWriteSector( ProcessSector, TransNum, DISKBUF );
		   if ( s != USB_INT_SUCCESS )
		        return( ERR_Directory ) ;
		   return( DirectorySuccess ) ;
}

/*********************************************************************************************************
** 函数名称: x16RootDirectory
** 功能描述: FAT16根目录下新建目录/文件名
**
** 输 入: wr :       指向文件信息结构FILE的指针
**         Attribute: 目录/文件操作模式
**           A.模式ModeX1: 创建新文件
**           B.模式ModeX2: 创建新目录
** 输 出: 根据模式选择完成相应的操作
**           A.返回ERR_Directory 报告异常传输错误
**           B.返回DirectorySuccess表示操作成功完成
**           C.返回ERR_FullRoot报告根目录已写满,无法正常创建文件/目录
**         
** 全局变量: wr -> find.Offset, wr -> find.TransNum, wr -> find.Sector, FAT.RootDirSectors, FAT.FirstRootSector, 
** 调用模块: mReadSector, mWriteSector, xProcessDirectory
** 调试码:   DEBUG_YCF
**
**
** 作 者: 徐亦朱
** 日 期: 2007年9月21日
**-------------------------------------------------------------------------------------------------------
** 修改人: 徐亦朱
** 日 期: 2007.9.27
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
UINT8  x16RootDirectory( FILE * wr, UINT8 Attribute ) 
{
     UINT8  s ;
     UINT8  *POINT1 ;
     UINT8  FindFlag ;
	    UINT8  TransNum ;
     UINT16 TransBytes ;
     UINT16 TotalSectors ;
     UINT32 ProcessSector ;
                         
     //初始化变量
     FindFlag = 0 ;
     TransNum = 0 ;
     TotalSectors = FAT.RootDirSectors ;
     ProcessSector = FAT.FirstRootSector ;
     //在范围内( 1簇或根目录内 )查找文件
     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 ( POINT1 = DISKBUF ; POINT1 < DISKBUF + TransBytes ; POINT1 += 32 )     
          {
               if ( ! ( *POINT1 ) || ( *POINT1 == 0xE5 ) || ( *POINT1 == 0x05 ) )    //若是空文件项,则退出
               {    
                    FindFlag = 1 ;
                    wr -> find.TransNum = TransNum ;
                    wr -> find.Sector = ProcessSector ;
                    wr -> find.Offset = POINT1 ;
                    //调试语句
                    #ifdef  DEBUG_YCF
                    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  )
          return( ERR_FullRoot ) ;
     wr -> clus.fat16.LastClus = 0 ;
     s = xProcessDirectory( wr, Attribute ) ;
          return( s ) ;
}

/*********************************************************************************************************
** 函数名称: x16Creat
** 功能描述: FAT16目录下处理目录/文件名
**
** 输 入: wr :       指向文件信息结构FILE的指针
**         Attribute: 目录/文件操作模式
**           A.模式ModeX1: 创建新文件
**           B.模式ModeX2: 创建新目录
** 输 出: 根据模式选择完成相应的操作
**           A.返回ERR_Creat 报告异常传输错误
**           B.返回Creat_Success表示操作成功完成
**         
** 全局变量: wr -> find.Offset, wr -> find.TransNum, wr -> find.Sector
**           FAT.SecPerClus, FAT.FirstSectofClu, FAT.shift, DiskNums
** 调用模块: mReadSector, mWriteSector, x16List, x16CheckClus, xProcessDirectory
** 调试码:   DEBUG_CREAT
**
**
** 作 者: 徐亦朱
** 日 期: 2007年9月21日
**-------------------------------------------------------------------------------------------------------
** 修改人: 徐亦朱
** 日 期: 2007.9.27
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
UINT8  x16Creat( FILE * wr, UINT8 Attribute ) 
{
     UINT8  s ;
     UINT8  FindFlag ;
     UINT8  *POINT0 ;
     UINT8  *POINT2 ;
     UINT8  TransNum ;
     UINT8  TotalSectors ;
     UINT16 TransBytes ;
     UINT16 Cluster ;
     UINT16 NextCluster ;
     UINT32 ProcessSector ;
     
     #ifdef  DEBUG_CREAT
     printf( " 文件不存在,创建新文件 " ) ;
     #endif
     
     //读取目录信息
     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 ) ;
     Cluster = ( UINT16 )( *( POINT0 + 26 ) ) | ( UINT16 )( *( POINT0 + 27 ) ) << 8 ;
     wr -> clus.fat16.LastClus = Cluster ;

⌨️ 快捷键说明

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