📄 m16_vs1003_test.lst
字号:
(0166) //SPI_High(); /* Use High Speed SPI*/
(0167)
(0168) r1 = SD_SendCommand(24, sector<<9);//写命令 //send command
4B5 E089 LDI R24,0x9
4B6 E090 LDI R25,0
4B7 8508 LDD R16,Y+8
4B8 8519 LDD R17,Y+9
4B9 852A LDD R18,Y+10
4BA 853B LDD R19,Y+11
4BB 938A ST -Y,R24
4BC 940E 0E5A CALL lsl32
4BE 8328 ST Y,R18
4BF 8339 STD Y+1,R19
4C0 0198 MOVW R18,R16
4C1 E108 LDI R16,0x18
4C2 DEE8 RCALL _SD_SendCommand
4C3 2F60 MOV R22,R16
(0169) if(r1 != 0x00)
4C4 2300 TST R16
4C5 F009 BEQ 0x04C7
(0170) return r1;
4C6 C043 RJMP 0x050A
(0171)
(0172) SPI_CS_Assert;
4C7 98D9 CBI 0x1B,1
(0173)
(0174) SPI_SrByte(0xff);
4C8 EF0F LDI R16,0xFF
4C9 940E 0C45 CALL _SPI_SrByte
(0175) SPI_SrByte(0xff);
4CB EF0F LDI R16,0xFF
4CC 940E 0C45 CALL _SPI_SrByte
(0176) SPI_SrByte(0xff);
4CE EF0F LDI R16,0xFF
4CF 940E 0C45 CALL _SPI_SrByte
(0177)
(0178) SPI_SrByte(0xfe);//发开始符 //send start byte "token"
4D1 EF0E LDI R16,0xFE
4D2 940E 0C45 CALL _SPI_SrByte
(0179)
(0180) for(i=0; i<512; i++)//送512字节数据 //send 512 bytes data
4D4 24AA CLR R10
4D5 24BB CLR R11
4D6 C00B RJMP 0x04E2
(0181) {
(0182) SPI_SrByte(buffer[i]);
4D7 01F5 MOVW R30,R10
4D8 840C LDD R0,Y+12
4D9 841D LDD R1,Y+13
4DA 0DE0 ADD R30,R0
4DB 1DF1 ADC R31,R1
4DC 8100 LD R16,Z
4DD 940E 0C45 CALL _SPI_SrByte
4DF 01C5 MOVW R24,R10
4E0 9601 ADIW R24,1
4E1 015C MOVW R10,R24
4E2 01C5 MOVW R24,R10
4E3 3080 CPI R24,0
4E4 E0E2 LDI R30,2
4E5 079E CPC R25,R30
4E6 F380 BCS 0x04D7
(0183) }
(0184)
(0185) SPI_SrByte(0xff); //dummy crc
4E7 EF0F LDI R16,0xFF
4E8 940E 0C45 CALL _SPI_SrByte
(0186) SPI_SrByte(0xff);
4EA EF0F LDI R16,0xFF
4EB 940E 0C45 CALL _SPI_SrByte
(0187)
(0188) r1 = SPI_SrByte(0xff);
4ED EF0F LDI R16,0xFF
4EE 940E 0C45 CALL _SPI_SrByte
4F0 2F60 MOV R22,R16
(0189)
(0190) if( (r1&0x1f) != 0x05)//等待是否成功 //judge if it successful
4F1 2F86 MOV R24,R22
4F2 718F ANDI R24,0x1F
4F3 3085 CPI R24,5
4F4 F069 BEQ 0x0502
(0191) {
(0192) SPI_CS_Deassert;
4F5 9AD9 SBI 0x1B,1
(0193) return r1;
4F6 C013 RJMP 0x050A
(0194) }
(0195) //等待操作完 //wait no busy
(0196) while(!SPI_SrByte(0xff))if(retry++ > 0xfffe){SPI_CS_Deassert;return 1;}
4F7 01BA MOVW R22,R20
4F8 5F4F SUBI R20,0xFF
4F9 4F5F SBCI R21,0xFF
4FA EF8E LDI R24,0xFE
4FB EF9F LDI R25,0xFF
4FC 1786 CP R24,R22
4FD 0797 CPC R25,R23
4FE F418 BCC 0x0502
4FF 9AD9 SBI 0x1B,1
500 E001 LDI R16,1
501 C008 RJMP 0x050A
502 EF0F LDI R16,0xFF
503 940E 0C45 CALL _SPI_SrByte
505 2EA0 MOV R10,R16
506 2300 TST R16
507 F379 BEQ 0x04F7
(0197)
(0198) SPI_CS_Deassert;
508 9AD9 SBI 0x1B,1
(0199) //SPI_SrByte(0xff);// extra 8 CLK
(0200)
(0201) return 0;
509 2700 CLR R16
50A 9622 ADIW R28,2
50B 940E 0E13 CALL pop_xgsetF00C
50D 9624 ADIW R28,4
50E 9508 RET
_Fat_Init:
temp --> Y,+2
50F 940E 0E0C CALL push_xgsetF00C
511 9726 SBIW R28,6
FILE: C:\DOCUME~1\浪仔\桌面\教学实验板\M16_VS1003_test\fat.c
(0001)
(0002) //---------------------------- 文件系统程序 -----------------------------
(0003) //
(0004) //文件系统:简易FAT32
(0005) //代码作者:廖华明(师兄)
(0006) //时间:2009.7.8
(0007) //
(0008) //------------------------------------------------------------------------
(0009)
(0010) #include"fat.h"
(0011)
(0012) uint32 SearchFile_Clust;
(0013) uint32 Music_Dir;
(0014)
(0015) uint32 fclust[20];
(0016) uint8 fcount;
(0017) uint32 fsize[20];
(0018)
(0019) uint32 NextCluster; //指向当前正在读取文件的簇号
(0020) uint32 SectorIndex=0; //正在读扇区
(0021)
(0022) uint32 Partition_StartLBA; // 该分区内第一个扇区地址
(0023)
(0024) uint16 BPB_BytesPerSec; //扇区字节数
(0025) uint8 BPB_SecPerClus; //每簇扇区数
(0026) uint16 BPB_RsvdSecCnt; //保留扇区数
(0027) uint8 BPB_NumFATs; //FAT数目
(0028) uint16 BPB_RootEntCnt; //根目录项数 0
(0029) uint16 BPB_TotSec16; //小扇区总数 0
(0030) uint8 BPB_Media; //媒体描述符
(0031) uint16 BPB_FATSz16; //每FAT扇区数fat32不用为0
(0032) uint16 BPB_SecPerTrk; //每道扇区数
(0033) uint16 BPB_NumHeads; //磁头数
(0034) uint32 BPB_HiddSec; //隐藏扇区数
(0035) uint32 BPB_TotSec32; //总扇区数
(0036) uint32 BPB_FATSz32; //每FAT扇区数fat32
(0037) uint16 BPB_ExtFlags; //fat32扩展标志
(0038) uint16 BPB_FSVer; //fat32特有,高位为fat32的主版本号,底位为次版本号
(0039) uint32 BPB_RootClus; //根目录簇号
(0040) uint16 BPB_FSInfo; //文件系统信息扇区号
(0041) uint16 BPB_BKBootSec; //引导扇区备份号
(0042)
(0043) uint8 deName[8];
(0044) uint8 deExtension[3];
(0045) uint32 Clust; //当前目录的簇号
(0046) uint16 Nums; //仅FAT12—FAT16中的根目录区有效
(0047) uint32 Index; //当前的BLOCK中目录项索引
(0048) uint32 FileSize; //文件长度
(0049)
(0050) uint32 FAT1Sec; //FAT1表的位置
(0051) uint32 FAT2Sec;
(0052) uint32 FirstDataSector; //第一个根目录位置,区号为2
(0053) uint32 FirstDirSector;
(0054)
(0055) uint8 Fat_Buffer[512];
(0056)
(0057)
(0058) uint32 FAT_MASK;
(0059) uint16 RootDirEnts; // 根目录总的项数(FAT12&FAT16)
(0060)
(0061)
(0062) uint8 Fat_Init(void)
(0063) {
(0064)
(0065) uint32 temp;
(0066)
(0067) SD_ReadBlock(0,Fat_Buffer);
512 EF8A LDI R24,0xFA
513 E090 LDI R25,0
514 8399 STD Y+1,R25
515 8388 ST Y,R24
516 E000 LDI R16,0
517 E010 LDI R17,0
518 E020 LDI R18,0
519 E030 LDI R19,0
51A 940E 045E CALL _SD_ReadBlock
(0068)
(0069) Partition_StartLBA = (Fat_Buffer[454]|(Fat_Buffer[455]<<8)|((uint32)Fat_Buffer[456]<<16)|((uint32)Fat_Buffer[457]<<24));
51C 9020 02C1 LDS R2,0x02C1
51E 2433 CLR R3
51F 2C32 MOV R3,R2
520 2422 CLR R2
521 9040 02C0 LDS R4,0x02C0
523 2455 CLR R5
524 2842 OR R4,R2
525 2853 OR R5,R3
526 0112 MOVW R2,R4
527 2444 CLR R4
528 FC37 SBRC R3,7
529 9440 COM R4
52A 2455 CLR R5
52B FC47 SBRC R4,7
52C 9450 COM R5
52D 9060 02C2 LDS R6,0x02C2
52F 2477 CLR R7
530 2488 CLR R8
531 2499 CLR R9
532 0143 MOVW R8,R6
533 2466 CLR R6
534 2477 CLR R7
535 2826 OR R2,R6
536 2837 OR R3,R7
537 2848 OR R4,R8
538 2859 OR R5,R9
539 E188 LDI R24,0x18
53A E090 LDI R25,0
53B 9100 02C3 LDS R16,0x02C3
53D 2711 CLR R17
53E 2722 CLR R18
53F 2733 CLR R19
540 938A ST -Y,R24
541 940E 0E5A CALL lsl32
543 2A20 OR R2,R16
544 2A31 OR R3,R17
545 2A42 OR R4,R18
546 2A53 OR R5,R19
547 9230 00EB STS Partition_StartLBA+1,R3
549 9220 00EA STS Partition_StartLBA,R2
54B 9250 00ED STS Partition_StartLBA+3,R5
54D 9240 00EC STS Partition_StartLBA+2,R4
(0070)
(0071) SD_ReadBlock(Partition_StartLBA,Fat_Buffer); //FAT32 read BPB
54F EF8A LDI R24,0xFA
550 E090 LDI R25,0
551 8399 STD Y+1,R25
552 8388 ST Y,R24
553 0181 MOVW R16,R2
554 0192 MOVW R18,R4
555 940E 045E CALL _SD_ReadBlock
(0072)
(0073) BPB_BytesPerSec = Fat_Buffer[11] |(Fat_Buffer[12] << 8); //0x0200 //每个扇区字节数
557 9020 0106 LDS R2,0x0106
559 2433 CLR R3
55A 2C32 MOV R3,R2
55B 2422 CLR R2
55C 9040 0105 LDS R4,0x0105
55E 2455 CLR R5
55F 2842 OR R4,R2
560 2853 OR R5,R3
561 9250 00E9 STS BPB_BytesPerSec+1,R5
563 9240 00E8 STS BPB_BytesPerSec,R4
(0074) BPB_SecPerClus = Fat_Buffer[13]; //0x08 //每个簇的扇区数
565 9020 0107 LDS R2,0x0107
567 9220 00E7 STS BPB_SecPerClus,R2
(0075) BPB_RsvdSecCnt = Fat_Buffer[14] |(Fat_Buffer[15] << 8); //0x20 //保留扇区数
569 9020 0109 LDS R2,0x0109
56B 2433 CLR R3
56C 2C32 MOV R3,R2
56D 2422 CLR R2
56E 9040 0108 LDS R4,0x0108
570 2455 CLR R5
571 2842 OR R4,R2
572 2853 OR R5,R3
573 9250 00E6 STS BPB_RsvdSecCnt+1,R5
575 9240 00E5 STS BPB_RsvdSecCnt,R4
(0076) BPB_NumFATs = Fat_Buffer[16]; //0x02 //FAT 表数目
577 9020 010A LDS R2,0x010A
579 9220 00E4 STS BPB_NumFATs,R2
(0077) BPB_RootEntCnt = Fat_Buffer[17] | (Fat_Buffer[18] << 8);
57B 9020 010C LDS R2,0x010C
57D 2433 CLR R3
57E 2C32 MOV R3,R2
57F 2422 CLR R2
580 9040 010B LDS R4,0x010B
582 2455 CLR R5
583 2842 OR R4,R2
584 2853 OR R5,R3
585 9250 00E3 STS BPB_RootEntCnt+1,R5
587 9240 00E2 STS BPB_RootEntCnt,R4
(0078) BPB_TotSec16 = Fat_Buffer[19] | (Fat_Buffer[20] << 8);
589 9020 010E LDS R2,0x010E
58B 2433 CLR R3
58C 2C32 MOV R3,R2
58D 2422 CLR R2
58E 9040 010D LDS R4,0x010D
590 2455 CLR R5
591 2842 OR R4,R2
592 2853 OR R5,R3
593 9250 00E1 STS BPB_TotSec16+1,R5
595 9240 00E0 STS BPB_TotSec16,R4
(0079) BPB_Media = Fat_Buffer[21];
597 9020 010F LDS R2,0x010F
599 9220 00DF STS BPB_Media,R2
(0080) BPB_FATSz16 = Fat_Buffer[22] | (Fat_Buffer[23] << 8);
59B 9020 0111 LDS R2,0x0111
59D 2433 CLR R3
59E 2C32 MOV R3,R2
59F 2422 CLR R2
5A0 9040 0110 LDS R4,0x0110
5A2 2455 CLR R5
5A3 2842 OR R4,R2
5A4 2853 OR R5,R3
5A5 9250 00DE STS BPB_FATSz16+1,R5
5A7 9240 00DD STS BPB_FATSz16,R4
(0081) BPB_SecPerTrk = Fat_Buffer[24] | (Fat_Buffer[25] << 8);
5A9 9020 0113 LDS R2,0x0113
5AB 2433 CLR R3
5AC 2C32 MOV R3,R2
5AD 2422 CLR R2
5AE 9040 0112 LDS R4,0x0112
5B0 2455 CLR R5
5B1 2842 OR R4,R2
5B2 2853 OR R5,R3
5B3 9250 00DC STS BPB_SecPerTrk+1,R5
5B5 9240 00DB STS BPB_SecPerTrk,R4
(0082) BPB_NumHeads = Fat_Buffer[26] | (Fat_Buffer[27] << 8);
5B7 9020 0115 LDS R2,0x0115
5B9 2433 CLR R3
5BA 2C32 MOV R3,R2
5BB 2422 CLR R2
5BC 9040 0114 LDS R4,0x0114
5BE 2455 CLR R5
5BF 2842 OR R4,R2
5C0 2853 OR R5,R3
5C1 9250 00DA STS BPB_NumHeads+1,R5
5C3 9240 00D9 STS BPB_NumHeads,R4
(0083) BPB_HiddSec = Fat_Buffer[28] | (Fat_Buffer[29] << 8) | ((uint32)Fat_Buffer[30] << 16) | ((uint32)Fat_Buffer[31] << 24);
5C5 9020 0117 LDS R2,0x0117
5C7 2433 CLR R3
5C8 2C32 MOV R3,R2
5C9 2422 CLR R2
5CA 9040 0116 LDS R4,0x0116
5CC 2455 CLR R5
5CD 2842 OR R4,R2
5CE 2853 OR R5,R3
5CF 0112 MOVW R2,R4
5D0 2444 CLR R4
5D1 FC37 SBRC R3,7
5D2 9440 COM R4
5D3 2455 CLR R5
5D4 FC47 SBRC R4,7
5D5 9450 COM R5
5D6 9060 0118 LDS R6,0x0118
5D8 2477 CLR R7
5D9 2488 CLR R8
5DA 2499 CLR R9
5DB 0143 MOVW R8,R6
5DC 2466 CLR R6
5DD 2477 CLR R7
5DE 2826 OR R2,R6
5DF 2837 OR R3,R7
5E0 2848 OR R4,R8
5E1 2859 OR R5,R9
5E2 E188 LDI R24,0x18
5E3 E090 LDI R25,0
5E4 9100 0119 LDS R16,0x0119
5E6 2711 CLR R17
5E7 2722 CLR R18
5E8 2733 CLR R19
5E9 938A ST -Y,R24
5EA 940E 0E5A CALL lsl32
5EC 2A20 OR R2,R16
5ED 2A31 OR R3,R17
5EE 2A42 OR R4,R18
5EF 2A53 OR R5,R19
5F0 9230 00D6 STS BPB_HiddSec+1,R3
5F2 9220 00D5 STS BPB_HiddSec,R2
5F4 9250 00D8 STS BPB_HiddSec+3,R5
5F6 9240 00D7 STS BPB_HiddSec+2,R4
(0084) BPB_TotSec32 = Fat_Buffer[32] | (Fat_Buffer[33] << 8) | ((uint32)Fat_Buffer[34] << 16) | ((uint32)Fat_Buffer[35] << 24);
5F8 9020 011B LDS R2,0x011B
5FA 2433 CLR R3
5FB 2C32 MOV R3,R2
5FC 2422 CLR R2
5FD 9040 011A LDS R4,0x011A
5FF 2455 CLR R5
600 2842 OR R4,R2
601 2853 OR R5,R3
602 0112 MOVW R2,R4
603 2444 CLR R4
604 FC37 SBRC R3,7
605 9440 COM R4
606 2455 CLR R5
607 FC47 SBRC R4,7
608 9450 COM R5
609 9060 011C LDS R6,0x011C
60B 2477 CLR R7
60C 2488 CLR R8
60D 2499 CLR R9
60E 0143 MOVW R8,R6
60F 2466 CLR R6
610 2477 CLR R7
611 2826 OR R2,R6
612 2837 OR R3,R7
613 2848 OR R4,R8
614 2859 OR R5,R9
615 E188 LDI R24,0x18
616 E090 LDI R25,0
617 9100 011D LDS R16,0x011D
619 2711 CLR R17
61A 2722 CLR R18
61B 2733 CLR R19
61C 938A ST -Y,R24
61D 940E 0E5A CALL lsl32
61F 2A20 OR R2,R16
620 2A
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -