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

📄 mmc.lst

📁 使用单片机 读写SD卡 带FAT16功能 PIC18f452
💻 LST
📖 第 1 页 / 共 5 页
字号:
0382:  MOVF   1C,W
0384:  SUBWF  x6B,W
0386:  BC    03AA
0388:  MOVF   x68,W
038A:  ADDWF  x6B,W
038C:  MOVWF  FE9
038E:  MOVF   x69,W
0390:  ADDWFC x6C,W
0392:  MOVWF  FEA
0394:  MOVF   FC9,W
0396:  MOVLW  FF
0398:  MOVWF  FC9
039A:  BTFSS  FC7.0
039C:  BRA    039A
039E:  MOVFF  FC9,FEF
03A2:  INCF   x6B,F
03A4:  BTFSC  FD8.2
03A6:  INCF   x6C,F
03A8:  BRA    0372
.................... 	SPI_READ(0xFF); // read crc 
03AA:  MOVF   FC9,W
03AC:  MOVLW  FF
03AE:  MOVWF  FC9
03B0:  BTFSS  FC7.0
03B2:  BRA    03B0
.................... 	SPI_READ(0xFF); 
03B4:  MOVF   FC9,W
03B6:  MOVLW  FF
03B8:  MOVWF  FC9
03BA:  BTFSS  FC7.0
03BC:  BRA    03BA
....................  
.................... 	return(true); 
03BE:  MOVLW  01
03C0:  MOVWF  01
.................... } 
03C2:  MOVLB  0
03C4:  RETLW  00
....................  
.................... ////////////////////////////////////////////////////////////////// 
.................... ///////////////////////////////// INIT MMC /////////////////////// 
.................... ////////////////////////////////////////////////////////////////// 
.................... #separate 
....................  
.................... int init_MMC(int max_tries){ 
.................... 	int32 start_lsec; 
.................... 	int16 sec_resv,sec_for_FAT,bytes_per_sector,root_dir_entries, 
.................... 	sec_for_data,count_of_clusters,root_dir_sectors,total_sectors; 
.................... 	int i,tries,sec_per_cluster,c; 
.................... 	char buff[32]; 
.................... 	tries=0; 
*
048C:  MOVLB  1
048E:  CLRF   x25
.................... 	cmd0: 
.................... 	///////////////////// place null treminators in globals fname and buff 
.................... 	for(i=0;i<MAX_FILES;i++){ 
0490:  CLRF   x24
0492:  MOVF   x24,W
0494:  SUBLW  01
0496:  BNC   04DE
.................... 		file[i].name[0]=0; 
0498:  MOVF   x24,W
049A:  MULLW  3D
049C:  MOVF   FF3,W
049E:  CLRF   x49
04A0:  MOVWF  x48
04A2:  MOVLW  22
04A4:  ADDWF  x48,W
04A6:  MOVWF  FE9
04A8:  MOVLW  00
04AA:  ADDWFC x49,W
04AC:  MOVWF  FEA
04AE:  CLRF   FEF
.................... 		file[i].rec_size=32; //// default rec_size = 32 byte tile size of FAT16 
04B0:  MOVF   x24,W
04B2:  MULLW  3D
04B4:  MOVF   FF3,W
04B6:  CLRF   x49
04B8:  MOVWF  x48
04BA:  MOVLW  3B
04BC:  ADDWF  x48,W
04BE:  MOVWF  01
04C0:  MOVLW  00
04C2:  ADDWFC x49,W
04C4:  MOVWF  03
04C6:  MOVF   01,W
04C8:  ADDLW  22
04CA:  MOVWF  FE9
04CC:  MOVLW  00
04CE:  ADDWFC 03,W
04D0:  MOVWF  FEA
04D2:  CLRF   FEC
04D4:  MOVF   FED,F
04D6:  MOVLW  20
04D8:  MOVWF  FEF
.................... 	} 
04DA:  INCF   x24,F
04DC:  BRA    0492
.................... 	//buff[MMC_BUFF_SIZE]=0; 
.................... 	//frec_size=32; //// default rec_size = 32 byte tile size of FAT16 
.................... 	output_high(_CS); /// reset chip hardware !!! required 
04DE:  BCF    F94.2
04E0:  BSF    F8B.2
.................... 	delay_ms(20); 
04E2:  MOVLW  14
04E4:  MOVWF  x48
04E6:  MOVLB  0
04E8:  RCALL  01E0
.................... 	for(i=0;i<20;i++) SPI_READ(0xFF); // min 80 clocks to get MMC ready 
04EA:  MOVLB  1
04EC:  CLRF   x24
04EE:  MOVF   x24,W
04F0:  SUBLW  13
04F2:  BNC   0502
04F4:  MOVF   FC9,W
04F6:  MOVLW  FF
04F8:  MOVWF  FC9
04FA:  BTFSS  FC7.0
04FC:  BRA    04FA
04FE:  INCF   x24,F
0500:  BRA    04EE
.................... 	output_low(_CS); /// !!! required 
0502:  BCF    F94.2
0504:  BCF    F8B.2
.................... 	delay_ms(20); 
0506:  MOVLW  14
0508:  MOVWF  x48
050A:  MOVLB  0
050C:  RCALL  01E0
.................... 	#if MMC_INIT_TRACE 
.................... 		printf("cmd0"); 
.................... 	#ENDIF 
.................... 	c=mmc_cmd(0x40,0x00000000,128,0x01,0x99); 
050E:  MOVLW  40
0510:  MOVLB  1
0512:  MOVWF  x6F
0514:  CLRF   x73
0516:  CLRF   x72
0518:  CLRF   x71
051A:  CLRF   x70
051C:  MOVLW  80
051E:  MOVWF  x74
0520:  MOVLW  01
0522:  MOVWF  x75
0524:  MOVLW  99
0526:  MOVWF  x76
0528:  MOVLB  0
052A:  RCALL  0210
052C:  MOVFF  01,127
....................  
.................... 	if (c==0x01) goto exit_cmd1; 
0530:  MOVLB  1
0532:  DECFSZ x27,W
0534:  BRA    0538
0536:  BRA    054C
....................  
.................... 	// note: i must cycle at least 8 times (16 is safe ) 
....................  
.................... 	if (tries++<max_tries) goto cmd0; /// restart 
0538:  MOVF   x25,W
053A:  INCF   x25,F
053C:  SUBWF  x0F,W
053E:  BZ    0546
0540:  BNC   0546
0542:  BRA    0490
.................... 	else return (10); 
0544:  BRA    054C
0546:  MOVLW  0A
0548:  MOVWF  01
054A:  BRA    0872
.................... 	exit_cmd1: 
.................... 	// CPDMOD - This SOMETIMES seems to be necessary 
.................... 	// output_high(_CS); 
.................... 	// SPI_READ(0xFF); // min 8 clocks to get MMC ready 
.................... 	// output_low(_CS); 
.................... 	//CPDMOD End 
....................  
....................  
.................... 	tries=0; 
054C:  CLRF   x25
.................... 	cmd1: 
....................  
.................... 	/// now try to switch to idle mode 
.................... 	/// Note: cmd1(idle) is the only command allowed after a cmd0(reset) 
.................... 	// 
....................  
.................... 	c=mmc_cmd(0x41,0x00000000,128,0x00,0x99); 
054E:  MOVLW  41
0550:  MOVWF  x6F
0552:  CLRF   x73
0554:  CLRF   x72
0556:  CLRF   x71
0558:  CLRF   x70
055A:  MOVLW  80
055C:  MOVWF  x74
055E:  CLRF   x75
0560:  MOVLW  99
0562:  MOVWF  x76
0564:  MOVLB  0
0566:  RCALL  0210
0568:  MOVFF  01,127
.................... 	if (c==0x00) { goto ready;} 
056C:  MOVLB  1
056E:  MOVF   x27,F
0570:  BNZ   0574
0572:  BRA    05A2
....................  
....................  
.................... 	if( tries++<max_tries) { printf("cmd1"); goto cmd1;} 
0574:  MOVF   x25,W
0576:  INCF   x25,F
0578:  SUBWF  x0F,W
057A:  BZ    059C
057C:  BNC   059C
057E:  CLRF   x48
0580:  MOVF   x48,W
0582:  MOVLB  0
0584:  RCALL  0004
0586:  IORLW  00
0588:  BZ    0596
058A:  MOVLB  1
058C:  INCF   x48,F
058E:  BTFSS  F9E.4
0590:  BRA    058E
0592:  MOVWF  FAD
0594:  BRA    0580
0596:  MOVLB  1
0598:  BRA    054E
.................... 	else return(11); 
059A:  BRA    05A2
059C:  MOVLW  0B
059E:  MOVWF  01
05A0:  BRA    0872
.................... 	ready: 
.................... 	//for( i=0;i<32;i++) SPI_READ(0xFF);// digest operation 
.................... 	/// MMC is inialized and in idle state ready for commands 
.................... 	//// 
.................... 	//// we need to first access the master boot sector physical address=0 
.................... 	/// 
.................... 	if(set_BLOCKLEN((int32)32)==false) return(12); /// sets global block_size to 32 
05A2:  CLRF   x63
05A4:  CLRF   x62
05A6:  CLRF   x61
05A8:  MOVLW  20
05AA:  MOVWF  x60
05AC:  MOVLB  0
05AE:  RCALL  02A6
05B0:  MOVF   01,F
05B2:  BNZ   05BC
05B4:  MOVLW  0C
05B6:  MOVWF  01
05B8:  MOVLB  1
05BA:  BRA    0872
....................  
.................... 	if (read_block(0x00000000,buff)==false) return (99); /// read the first few bytes 
05BC:  MOVLB  1
05BE:  CLRF   x67
05C0:  CLRF   x66
05C2:  CLRF   x65
05C4:  CLRF   x64
05C6:  MOVLW  01
05C8:  MOVWF  x69
05CA:  MOVLW  28
05CC:  MOVWF  x68
05CE:  MOVLB  0
05D0:  RCALL  02FC
05D2:  MOVF   01,F
05D4:  BNZ   05DE
05D6:  MOVLW  63
05D8:  MOVWF  01
05DA:  MOVLB  1
05DC:  BRA    0872
.................... 	#if MMC_INIT_TRACE 
.................... 		printf("\n\r sector0="); 
.................... 		for(i=0;i<32;i++)printf("%2X ",buff[i]); 
.................... 	#ENDIF 
.................... 	if (buff[0]==0xEB || buff[0]==0xE9){ 
05DE:  MOVLB  1
05E0:  MOVF   x28,W
05E2:  SUBLW  EB
05E4:  BZ    05EC
05E6:  MOVF   x28,W
05E8:  SUBLW  E9
05EA:  BNZ   05EE
.................... 		/// sector 0 is the boot sector 
.................... 		#if MMC_INIT_TRACE 
.................... 			printf("\n\r boot sector= 0"); 
.................... 		#ENDIF 
.................... 	} 
.................... 	else{ 
05EC:  BRA    065C
.................... 		//// partition 
....................  
.................... 		/// access the master boot sector physical address 0 at offset 1BE 
.................... 		if (read_BLOCK(0x000001BE,buff)==false) return(13); 
05EE:  CLRF   x67
05F0:  CLRF   x66
05F2:  MOVLW  01
05F4:  MOVWF  x65
05F6:  MOVLW  BE
05F8:  MOVWF  x64
05FA:  MOVLW  01
05FC:  MOVWF  x69
05FE:  MOVLW  28
0600:  MOVWF  x68
0602:  MOVLB  0
0604:  RCALL  02FC
0606:  MOVF   01,F
0608:  BNZ   0614
060A:  MOVLW  0D
060C:  MOVWF  01
060E:  MOVLB  1
0610:  BRA    0872
0612:  MOVLB  0
.................... 		#if MMC_INIT_TRACE 
.................... 			for(i=0;i<32;i++)printf("%2X ",buff[i]); 
.................... 		#ENDIF 
.................... 		// start_lsec is address of the partion boot sector 
.................... 		start_lsec=make32(buff[11],buff[10],buff[9],buff[8]); 
0614:  MOVFF  133,113
0618:  MOVFF  132,112
061C:  MOVFF  131,111
0620:  MOVFF  130,110
.................... 		#if MMC_INIT_TRACE 
.................... 			printf("\n\r boot sector= %lu",start_lsec); 
.................... 		#ENDIF 
.................... 		if (read_BLOCK(start_lsec*512,buff)==false) return(14); 
0624:  BCF    FD8.0
0626:  MOVLB  1
0628:  CLRF   x48
062A:  RLCF   x10,W
062C:  MOVWF  x49
062E:  RLCF   x11,W
0630:  MOVWF  x4A
0632:  RLCF   x12,W
0634:  MOVWF  x4B
0636:  MOVWF  x67
0638:  MOVFF  14A,166
063C:  MOVFF  149,165
0640:  MOVFF  148,164
0644:  MOVLW  01
0646:  MOVWF  x69
0648:  MOVLW  28
064A:  MOVWF  x68
064C:  MOVLB  0
064E:  RCALL  02FC
0650:  MOVF   01,F
0652:  BNZ   065E
0654:  MOVLW  0E
0656:  MOVWF  01
0658:  MOVLB  1
065A:  BRA    0872
065C:  MOVLB  0
.................... 	} 
....................  
.................... 	bytes_per_sector=make16(buff[12],buff[11]); 
065E:  MOVFF  134,119
0662:  MOVFF  133,118
.................... 	if(bytes_per_sector!=512) return(15); 
0666:  MOVLB  1
0668:  MOVF   x18,F
066A:  BNZ   0672
066C:  MOVF   x19,W
066E:  SUBLW  02
0670:  BZ    0678
0672:  MOVLW  0F
0674:  MOVWF  01
0676:  BRA    0872
.................... 	sec_per_cluster=buff[13]; 
0678:  MOVFF  135,126
.................... 	cluster_size_bytes=(int16)sec_per_cluster*bytes_per_sector; 
067C:  CLRF   x49
067E:  MOVFF  126,148
0682:  MOVFF  149,14B
0686:  MOVFF  126,14A
068A:  MOVFF  119,14D
068E:  MOVFF  118,14C
0692:  MOVLB  0
0694:  RCALL  03C6
0696:  MOVFF  02,07
069A:  MOVFF  01,06
....................  
....................  
.................... 	sec_resv=make16(buff[15],buff[14]); 
069E:  MOVFF  137,115
06A2:  MOVFF  136,114
....................  
.................... 	root_dir_entries=make16(buff[18],buff[17]);// number of 32 byte tiles 
06A6:  MOVFF  13A,11B
06AA:  MOVFF  139,11A
....................  
.................... 	total_sectors=make16(buff[20],buff[19]); 
06AE:  MOVFF  13C,123
06B2:  MOVFF  13B,122
....................  
.................... 	sec_for_FAT=make16(buff[23],buff[22]); 
06B6:  MOVFF  13F,117
06BA:  MOVFF  13E,116
.................... 	//branch to file directory 
.................... 	fat1_address=(start_lsec+sec_resv)*bytes_per_sector; 
06BE:  MOVLB  1
06C0:  MOVF   x14,W
06C2:  ADDWF  x10,W
06C4:  MOVWF  x48
06C6:  MOVF   x15,W
06C8:  ADDWFC x11,W
06CA:  MOVWF  x49
06CC:  MOVLW  00
06CE:  ADDWFC x12,W
06D0:  MOVWF  x4A
06D2:  MOVLW  00
06D4:  ADDWFC x13,W
06D6:  MOVWF  x4B
06D8:  MOVWF  x6F
06DA:  MOVFF  14A,16E
06DE:  MOVFF  149,16D
06E2:  MOVFF  148,16C
06E6:  CLRF   x73
06E8:  CLRF   x72
06EA:  MOVFF  119,171

⌨️ 快捷键说明

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