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

📄 fat16.lst

📁 sd卡 fat16文件系统 spi模式十分详细读写操作
💻 LST
📖 第 1 页 / 共 5 页
字号:
   1               		.file	"FAT16.c"
   2               		.arch atmega32
   3               	__SREG__ = 0x3f
   4               	__SP_H__ = 0x3e
   5               	__SP_L__ = 0x3d
   6               	__tmp_reg__ = 0
   7               	__zero_reg__ = 1
   8               		.global __do_copy_data
   9               		.global __do_clear_bss
  11               		.text
  12               	.Ltext0:
  87               	.global	ReadBlock
  89               	ReadBlock:
   1:FAT16.c       **** //-------------------------------------------------------------------------
   2:FAT16.c       **** #include	<avr/io.h>
   3:FAT16.c       **** #include 	<stdint.h>
   4:FAT16.c       **** 
   5:FAT16.c       **** #include	"FAT16.h"
   6:FAT16.c       **** #include	"mmc.h"
   7:FAT16.c       **** //------------------------------------------------------------------------
   8:FAT16.c       **** #define	SEC_Size				512
   9:FAT16.c       **** #define	MBR_Sector				0				//绝对地址
  10:FAT16.c       **** #define	FAT_Sector				0				//逻辑地址
  11:FAT16.c       **** //-------------------------------------------------------------------------
  12:FAT16.c       **** uint8_t		BUFFER[SEC_Size];
  13:FAT16.c       **** uint8_t		PB_RelativeSector;
  14:FAT16.c       **** uint16_t	BPB_BytesPerSec;
  15:FAT16.c       **** uint8_t		BPB_SecPerClus;
  16:FAT16.c       **** uint16_t	BPB_RsvdSecCnt;
  17:FAT16.c       **** uint8_t		BPB_NumFATs;
  18:FAT16.c       **** uint16_t	BPB_RootEntCnt;
  19:FAT16.c       **** uint16_t	BPB_TotSec16;
  20:FAT16.c       **** uint16_t	BPB_FATSz16;							//FAT占用的sectors
  21:FAT16.c       **** uint32_t	BPB_HiddSec;
  22:FAT16.c       **** 
  23:FAT16.c       **** //-------------------------------------------------------------------------
  24:FAT16.c       **** uint8_t ReadBlock(uint32_t LBA){					//绝对地址读一个扇区
  91               	.LM1:
  92               	/* prologue: frame size=0 */
  93 0000 EF92      		push r14
  94 0002 FF92      		push r15
  95 0004 0F93      		push r16
  96 0006 1F93      		push r17
  97               	/* prologue end (size=4) */
  98 0008 7B01      		movw r14,r22
  99 000a 8C01      		movw r16,r24
  25:FAT16.c       **** 	mmcReset();
 101               	.LM2:
 102 000c 0E94 0000 		call mmcReset
  26:FAT16.c       **** 	if(mmcRead(LBA,BUFFER)!=0)return SD_FAIL;
 104               	.LM3:
 105 0010 40E0      		ldi r20,lo8(BUFFER)
 106 0012 50E0      		ldi r21,hi8(BUFFER)
 107 0014 C801      		movw r24,r16
 108 0016 B701      		movw r22,r14
 109 0018 0E94 0000 		call mmcRead
 110 001c 8823      		tst r24
 111 001e 19F0      		breq .L2
 113               	.LM4:
 114 0020 81E0      		ldi r24,lo8(1)
 115 0022 90E0      		ldi r25,hi8(1)
 116 0024 02C0      		rjmp .L1
 117               	.L2:
  27:FAT16.c       **** 	return SD_SUCC;
 119               	.LM5:
 120 0026 80E0      		ldi r24,lo8(0)
 121 0028 90E0      		ldi r25,hi8(0)
 122               	.L1:
 123               	/* epilogue: frame size=0 */
 124 002a 1F91      		pop r17
 125 002c 0F91      		pop r16
 126 002e FF90      		pop r15
 127 0030 EF90      		pop r14
 128 0032 0895      		ret
 129               	/* epilogue end (size=5) */
 130               	/* function ReadBlock size 26 (17) */
 132               	.Lscope0:
 135               	.global	WriteBlock
 137               	WriteBlock:
  28:FAT16.c       **** }
  29:FAT16.c       **** //-------------------------------------------------------------------------
  30:FAT16.c       **** uint8_t WriteBlock(uint32_t LBA){					//绝对地址写一个扇区
 139               	.LM6:
 140               	/* prologue: frame size=0 */
 141 0034 EF92      		push r14
 142 0036 FF92      		push r15
 143 0038 0F93      		push r16
 144 003a 1F93      		push r17
 145               	/* prologue end (size=4) */
 146 003c 7B01      		movw r14,r22
 147 003e 8C01      		movw r16,r24
  31:FAT16.c       **** 	mmcReset();
 149               	.LM7:
 150 0040 0E94 0000 		call mmcReset
  32:FAT16.c       **** 	if(mmcWrite(LBA,BUFFER)!=0)return SD_FAIL;
 152               	.LM8:
 153 0044 40E0      		ldi r20,lo8(BUFFER)
 154 0046 50E0      		ldi r21,hi8(BUFFER)
 155 0048 C801      		movw r24,r16
 156 004a B701      		movw r22,r14
 157 004c 0E94 0000 		call mmcWrite
 158 0050 8823      		tst r24
 159 0052 19F0      		breq .L4
 161               	.LM9:
 162 0054 81E0      		ldi r24,lo8(1)
 163 0056 90E0      		ldi r25,hi8(1)
 164 0058 02C0      		rjmp .L3
 165               	.L4:
  33:FAT16.c       **** 	return SD_SUCC;
 167               	.LM10:
 168 005a 80E0      		ldi r24,lo8(0)
 169 005c 90E0      		ldi r25,hi8(0)
 170               	.L3:
 171               	/* epilogue: frame size=0 */
 172 005e 1F91      		pop r17
 173 0060 0F91      		pop r16
 174 0062 FF90      		pop r15
 175 0064 EF90      		pop r14
 176 0066 0895      		ret
 177               	/* epilogue end (size=5) */
 178               	/* function WriteBlock size 26 (17) */
 180               	.Lscope1:
 183               	.global	ReadFatBlock
 185               	ReadFatBlock:
  34:FAT16.c       **** }
  35:FAT16.c       **** //-------------------------------------------------------------------------
  36:FAT16.c       **** uint8_t ReadFatBlock(uint32_t Add){					//逻辑地址读一个扇区
 187               	.LM11:
 188               	/* prologue: frame size=0 */
 189               	/* prologue end (size=0) */
 190 0068 DC01      		movw r26,r24
 191 006a CB01      		movw r24,r22
  37:FAT16.c       **** 	return ReadBlock(Add+PB_RelativeSector);
 193               	.LM12:
 194 006c 2091 0000 		lds r18,PB_RelativeSector
 195 0070 820F      		add r24,r18
 196 0072 911D      		adc r25,__zero_reg__
 197 0074 A11D      		adc r26,__zero_reg__
 198 0076 B11D      		adc r27,__zero_reg__
 199 0078 BC01      		movw r22,r24
 200 007a CD01      		movw r24,r26
 201 007c 0E94 0000 		call ReadBlock
  38:FAT16.c       **** }
 203               	.LM13:
 204 0080 9927      		clr r25
 205               	/* epilogue: frame size=0 */
 206 0082 0895      		ret
 207               	/* epilogue end (size=1) */
 208               	/* function ReadFatBlock size 14 (13) */
 210               	.Lscope2:
 213               	.global	WriteFatBlock
 215               	WriteFatBlock:
  39:FAT16.c       **** //-------------------------------------------------------------------------
  40:FAT16.c       **** uint8_t WriteFatBlock(uint32_t Add){				//逻辑地址写一个扇区
 217               	.LM14:
 218               	/* prologue: frame size=0 */
 219               	/* prologue end (size=0) */
 220 0084 DC01      		movw r26,r24
 221 0086 CB01      		movw r24,r22
  41:FAT16.c       **** 	return WriteBlock(Add+PB_RelativeSector);
 223               	.LM15:
 224 0088 2091 0000 		lds r18,PB_RelativeSector
 225 008c 820F      		add r24,r18
 226 008e 911D      		adc r25,__zero_reg__
 227 0090 A11D      		adc r26,__zero_reg__
 228 0092 B11D      		adc r27,__zero_reg__
 229 0094 BC01      		movw r22,r24
 230 0096 CD01      		movw r24,r26
 231 0098 0E94 0000 		call WriteBlock
  42:FAT16.c       **** }
 233               	.LM16:
 234 009c 9927      		clr r25
 235               	/* epilogue: frame size=0 */
 236 009e 0895      		ret
 237               	/* epilogue end (size=1) */
 238               	/* function WriteFatBlock size 14 (13) */
 240               	.Lscope3:
 245               	.global	CopyBytes
 247               	CopyBytes:
  43:FAT16.c       **** //-------------------------------------------------------------------------
  44:FAT16.c       **** void CopyBytes(uint8_t *ps,uint8_t *pd,uint16_t size){	//内存拷贝
 249               	.LM17:
 250               	/* prologue: frame size=0 */
 251               	/* prologue end (size=0) */
 252 00a0 DC01      		movw r26,r24
 253 00a2 FB01      		movw r30,r22
 254               	.L14:
  45:FAT16.c       **** 	for(;size;size--)*pd++=*ps++;
 256               	.LM18:
 257 00a4 4115      		cp r20,__zero_reg__
 258 00a6 5105      		cpc r21,__zero_reg__
 259 00a8 29F0      		breq .L13
 260 00aa 8D91      		ld r24,X+
 261 00ac 8193      		st Z+,r24
 262 00ae 4150      		subi r20,lo8(-(-1))
 263 00b0 5040      		sbci r21,hi8(-(-1))
 264 00b2 F8CF      		rjmp .L14
 265               	.L13:
 266 00b4 0895      		ret
 267               	/* epilogue: frame size=0 */
 268               	/* epilogue: noreturn */
 269               	/* epilogue end (size=0) */
 270               	/* function CopyBytes size 11 (11) */
 272               	.Lscope4:
 277               	.global	IsEqual
 279               	IsEqual:
  46:FAT16.c       **** }
  47:FAT16.c       **** //-------------------------------------------------------------------------
  48:FAT16.c       **** uint8_t IsEqual(uint8_t *pa,uint8_t *pb,uint8_t size){	//内存比较
 281               	.LM19:
 282               	/* prologue: frame size=0 */
 283               	/* prologue end (size=0) */
 284 00b6 DC01      		movw r26,r24
 285 00b8 FB01      		movw r30,r22
 286               	.L23:
  49:FAT16.c       **** 	for(;size;size--)if(*pa++!=*pb++)return 0;
 288               	.LM20:
 289 00ba 4423      		tst r20
 290 00bc 49F0      		breq .L22
 291 00be 9191      		ld r25,Z+
 292 00c0 8D91      		ld r24,X+
 293 00c2 8917      		cp r24,r25
 294 00c4 19F0      		breq .L18
 295 00c6 80E0      		ldi r24,lo8(0)
 296 00c8 90E0      		ldi r25,hi8(0)
 297 00ca 0895      		ret
 298               	.L18:
 299 00cc 4150      		subi r20,lo8(-(-1))
 300 00ce F5CF      		rjmp .L23
 301               	.L22:
  50:FAT16.c       **** 	return 1;
 303               	.LM21:
 304 00d0 81E0      		ldi r24,lo8(1)
 305 00d2 90E0      		ldi r25,hi8(1)
  51:FAT16.c       **** }
 307               	.LM22:
 308 00d4 0895      		ret
 309               	/* epilogue: frame size=0 */
 310               	/* epilogue: noreturn */
 311               	/* epilogue end (size=0) */
 312               	/* function IsEqual size 16 (16) */
 314               	.Lscope5:
 318               	.global	EmptyBytes
 320               	EmptyBytes:
  52:FAT16.c       **** //-------------------------------------------------------------------------
  53:FAT16.c       **** void EmptyBytes(uint8_t *pd,uint16_t size){			//内存清空
 322               	.LM23:
 323               	/* prologue: frame size=0 */
 324               	/* prologue end (size=0) */
 325 00d6 FC01      		movw r30,r24
 326               	.L31:
  54:FAT16.c       **** 	for(;size;size--)*pd++ =0;
 328               	.LM24:
 329 00d8 6115      		cp r22,__zero_reg__
 330 00da 7105      		cpc r23,__zero_reg__
 331 00dc 21F0      		breq .L30
 332 00de 1192      		st Z+,__zero_reg__
 333 00e0 6150      		subi r22,lo8(-(-1))
 334 00e2 7040      		sbci r23,hi8(-(-1))
 335 00e4 F9CF      		rjmp .L31
 336               	.L30:
 337 00e6 0895      		ret
 338               	/* epilogue: frame size=0 */
 339               	/* epilogue: noreturn */
 340               	/* epilogue end (size=0) */
 341               	/* function EmptyBytes size 9 (9) */
 343               	.Lscope6:
 345               	.global	ReadMBR
 347               	ReadMBR:
  55:FAT16.c       **** }
  56:FAT16.c       **** //-------------------------------------------------------------------------
  57:FAT16.c       **** uint8_t ReadMBR(void){									//读取MBR数据结构
 349               	.LM25:
 350               	/* prologue: frame size=0 */
 351               	/* prologue end (size=0) */
  58:FAT16.c       **** 	uint8_t ok;
  59:FAT16.c       **** 	FAT_MBR * MBR=(FAT_MBR*)BUFFER;
  60:FAT16.c       **** 	ok=ReadBlock(MBR_Sector);
 353               	.LM26:
 354 00e8 60E0      		ldi r22,lo8(0)
 355 00ea 70E0      		ldi r23,hi8(0)
 356 00ec 80E0      		ldi r24,hlo8(0)
 357 00ee 90E0      		ldi r25,hhi8(0)
 358 00f0 0E94 0000 		call ReadBlock
  61:FAT16.c       **** 	if(ok==SD_FAIL)return SD_FAIL;
 360               	.LM27:
 361 00f4 8130      		cpi r24,lo8(1)
 362 00f6 39F0      		breq .L35
  62:FAT16.c       **** 	if(MBR->MBR_Signature!=0xAA55)return SD_FAIL;		//读有效标志
 364               	.LM28:
 365 00f8 8091 0000 		lds r24,BUFFER+510
 366 00fc 9091 0000 		lds r25,(BUFFER+510)+1
 367 0100 8555      		subi r24,lo8(-21931)
 368 0102 9A4A      		sbci r25,hi8(-21931)
 369 0104 19F0      		breq .L34
 370               	.L35:
 371 0106 81E0      		ldi r24,lo8(1)
 372 0108 90E0      		ldi r25,hi8(1)
 373 010a 0895      		ret
 374               	.L34:
  63:FAT16.c       **** 		
  64:FAT16.c       **** 	//获取参数
  65:FAT16.c       **** 	PB_RelativeSector=MBR->MBR_pb[0].PB_RelativeSector;//读逻辑地址与绝对地址的偏移
 376               	.LM29:
 377 010c 8091 0000 		lds r24,BUFFER+454
 378 0110 8093 0000 		sts PB_RelativeSector,r24
  66:FAT16.c       **** 	return SD_SUCC;
 380               	.LM30:
 381 0114 80E0      		ldi r24,lo8(0)
 382 0116 90E0      		ldi r25,hi8(0)
  67:FAT16.c       **** }
 384               	.LM31:
 385 0118 0895      		ret
 386               	/* epilogue: frame size=0 */
 387               	/* epilogue: noreturn */
 388               	/* epilogue end (size=0) */
 389               	/* function ReadMBR size 26 (26) */
 391               	.Lscope7:
 393               	.global	ReadBPB
 395               	ReadBPB:
  68:FAT16.c       **** //-------------------------------------------------------------------------
  69:FAT16.c       **** uint8_t ReadBPB(void){									//读取BPB数据结构
 397               	.LM32:
 398               	/* prologue: frame size=0 */
 399               	/* prologue end (size=0) */
  70:FAT16.c       **** 	uint8_t ok;
  71:FAT16.c       **** 	FAT_BPB * BPB=(FAT_BPB*)BUFFER;
  72:FAT16.c       **** 	ok=ReadFatBlock(FAT_Sector);

⌨️ 快捷键说明

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