📄 kw_fat32.lst
字号:
391 4 }
392 3 pDir ++;
393 3 }
394 2 }
395 1 return 0;
396 1 }
397
398 /*************************************************************************************
399 Function: FM_WriteData2Clu
400 Description: 写数据到簇中
401 Called By:
402 Input: Clu@WORD:簇号
403 pBuffer@BYTE *:数据
404 Length@WORD:数据长度
405 Start@WORD: 起始偏移
406 Output: N/A
407 Return: 1:成功,0:失败
408 Others:
409 *************************************************************************************/
410 bit FM_WriteData2Clu(WORD Clu, BYTE * pBuffer, WORD Length,WORD Start)
411 {
412 1 xdata WORD tmp;
413 1 xdata DWORD fp_start_sector;
414 1
415 1 if((Start + Length) > FM_sectors_clus * 512) //如果当前簇不够则返回
416 1 {
417 2 return 0;
418 2 }
419 1
420 1 fp_start_sector = (Clu-2) * FM_sectors_clus + FM_ptr_data; //计算开始扇区
421 1 fp_start_sector += Start/512; //加上偏移量所占扇区
422 1
423 1 Start = Start - Start/512*512; //计算扇区内偏移
424 1 tmp = 512 - Start; //当前扇区剩余量
425 1
426 1 while(Length)
C51 COMPILER V7.50 KW_FAT32 10/12/2007 17:05:47 PAGE 8
427 1 {
428 2 if(Start != 0) //如果不是从扇区起始开始写
429 2 {
430 3 NM_ReadPage(fp_start_sector); //则需要读当前扇区
431 3 }
432 2
433 2 if(Length > tmp) //如果当前扇区不足写下所有数据
434 2 {
435 3 NM_WritePagesFromBuff(fp_start_sector,pBuffer,Start,tmp);
436 3 pBuffer += tmp; //则写满当前扇区
437 3 Length -= tmp;
438 3 }
439 2 else
440 2 { //否则写全部数据并可以返回
441 3 NM_WritePagesFromBuff(fp_start_sector,pBuffer,Start,Length);
442 3 pBuffer += tmp;
443 3 Length = 0;
444 3 }
445 2
446 2 fp_start_sector ++; //获取下一扇区
447 2 tmp = 512; //设置下一扇区剩余空间为512
448 2 Start = 0; //设置下一扇区起始偏移为0
449 2 }
450 1 return 1;
451 1 }
452
453 /*************************************************************************************
454 Function: FM_SetNextClu
455 Description: 设置当前簇的下簇地址,用于建立簇链
456 Called By:
457 Input: Current@WORD:当前簇号
458 Next@WORD:下一簇号
459 Output: N/A
460 Return: 1:成功,0:失败
461 Others:
462 *************************************************************************************/
463 bit FM_SetNextClu(WORD Current, WORD Next)
464 {
465 1 WORD xdata * pTmp;
466 1
467 1 NM_ReadPage(FM_ptr_fats+((Current>>8)&0xff)); //读取当前簇
468 1 pTmp = (WORD *)EP6FIFOBUF;
469 1 pTmp[Current&0xff] = ((Next>>8)&0xff) | ((Next&0xff)<<8); //设置下簇
470 1 NM_WritePages(FM_ptr_fats+((Current>>8)&0xff)); //回写
471 1 return 1;
472 1 }
473
474 /*************************************************************************************
475 Function: FM_WriteFile
476 Description: 写数据到当前已打开的文件中,追加方式
477 Called By:
478 Input: Buffer@BYTE*:数据
479 Length@WORD:长度
480 Output: N/A
481 Return: 1:成功,0:失败
482 Others:
483 *************************************************************************************/
484 bit FM_WriteFile(BYTE * Buffer, WORD Length)
485 {
486 1 DWORD xdata i;
487 1 WORD xdata tmpClu,Start,tmp;
488 1 WORD xdata LastClu = 0;
C51 COMPILER V7.50 KW_FAT32 10/12/2007 17:05:47 PAGE 9
489 1 if(FM_CurrentDirLBA == 0 || FM_pCurrentDir == 0) //如果当前打开文件不存在则返回
490 1 {
491 2 return 0;
492 2 }
493 1
494 1 NM_ReadPage(FM_CurrentDirLBA); //读取文件目录,并获取文件长度
495 1 ((BYTE *)&FM_CurrentFileLength)[0] = FM_pCurrentDir->FileLength[3];
496 1 ((BYTE *)&FM_CurrentFileLength)[1] = FM_pCurrentDir->FileLength[2];
497 1 ((BYTE *)&FM_CurrentFileLength)[2] = FM_pCurrentDir->FileLength[1];
498 1 ((BYTE *)&FM_CurrentFileLength)[3] = FM_pCurrentDir->FileLength[0];
499 1
500 1 ((BYTE *)&LastClu)[0] = FM_pCurrentDir->StartClus[1]; //获取首簇
501 1 ((BYTE *)&LastClu)[1] = FM_pCurrentDir->StartClus[0];
502 1
503 1
504 1 //计算簇链尾
505 1 for(i = 0; i<(FM_CurrentFileLength/(FM_sectors_clus * 512)); i++)
506 1 {
507 2 tmpClu = FM_GetNextClus(LastClu);
508 2 if(tmpClu == 0xffff)
509 2 break;
510 2 LastClu = tmpClu;
511 2 }
512 1
513 1
514 1 if(tmpClu == 0xffff && Length > 0) //文件长度有效且末簇地址无效
515 1 {
516 2 tmpClu = FM_GetFreeClu(); //这种情况较特殊,可能由于文件系统错误引起
517 2 while(tmpClu == 0 || tmpClu > 0xf900) //需要重新分配簇
518 2 {
519 3 FM_DeleteFirstFile();
520 3 tmpClu = FM_GetFreeClu();
521 3 }
522 2
523 2 FM_SetNextClu(LastClu, tmpClu);
524 2 LastClu = tmpClu;
525 2 }
526 1
527 1
528 1 //计算末簇已使用字节数Start,以及剩余数tmp
529 1 Start = FM_CurrentFileLength - FM_CurrentFileLength/(FM_sectors_clus * 512)*(FM_sectors_clus * 512);
530 1 tmp = FM_sectors_clus * 512 - Start;
531 1
532 1
533 1 while(Length)
534 1 {
535 2 if(tmp < Length) //如果剩余数不足写完不数据
536 2 {
537 3 if(tmp != 0) //如果剩余数不为零则满当前簇
538 3 {
539 4 FM_WriteData2Clu(LastClu, Buffer, tmp, Start);
540 4 }
541 3 //Set Clu link
542 3 tmpClu = FM_GetFreeClu(); //分配心簇
543 3
544 3 while(tmpClu == 0 || tmpClu > 0xf900) //当分配失败时删除文件
545 3 {
546 4 FM_DeleteFirstFile();
547 4 tmpClu = FM_GetFreeClu();
548 4 }
549 3
550 3 if(tmp == Length) //如果当前簇足以写入全部数据
C51 COMPILER V7.50 KW_FAT32 10/12/2007 17:05:47 PAGE 10
551 3 FM_SetNextClu(LastClu, 0xffff); //则关闭促链
552 3 else
553 3 {
554 4 FM_SetNextClu(LastClu, tmpClu); //否则增加一个簇到链尾
555 4 LastClu = tmpClu;
556 4 }
557 3
558 3 FM_CurrentFileLength += tmp; //设置文件大小
559 3 Buffer += tmp; //设置数据缓冲首地址
560 3 Length -= tmp; //设置剩余量
561 3 tmp = FM_sectors_clus * 512; //设置下簇容量
562 3 Start = 0; //设置下簇起始偏移
563 3 }
564 2 else
565 2 {
566 3 FM_WriteData2Clu(LastClu, Buffer, Length, Start); //当前簇可以写完所有数据
567 3 FM_CurrentFileLength += Length; //写数据
568 3 break;
569 3 }
570 2 }
571 1
572 1 //close file
573 1 NM_ReadPage(FM_CurrentDirLBA); //回写文件目录,保存文件长度
574 1 FM_pCurrentDir->FileLength[0] = ((BYTE *)&FM_CurrentFileLength)[3];
575 1 FM_pCurrentDir->FileLength[1] = ((BYTE *)&FM_CurrentFileLength)[2];
576 1 FM_pCurrentDir->FileLength[2] = ((BYTE *)&FM_CurrentFileLength)[1];
577 1 FM_pCurrentDir->FileLength[3] = ((BYTE *)&FM_CurrentFileLength)[0];
578 1 NM_WritePages(FM_CurrentDirLBA);
579 1 }
580
581
582 /*************************************************************************************
583 Function: FM_GetLastFileNameBySN
584 Description: 按文件编号排序,获取最后一个文件名
585 Called By:
586 Input: N/A
587 Output: N/A
588 Return: void
589 Others: 获取的文件名存放在全局变量 FM_FileName
590 *************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -