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

📄 mmc.lst

📁 使用单片机 读写SD卡 带FAT16功能 PIC18f452
💻 LST
📖 第 1 页 / 共 5 页
字号:
CCS PCH C Compiler, Version 3.249, 28193               21-Kas-07 00:11

               Filename: D:\Elektronik\PIC\Proje\MMC\SD_MMC\mmc.lst

               ROM used: 8026 bytes (24%)
                         Largest free fragment is 24742
               RAM used: 275 (18%) at main() level
                         378 (25%) worst case
               Stack:    4 locations

*
0000:  GOTO   1C40
....................  
.................... #include "18f452.h" 
.................... //////// Standard Header file for the PIC18F452 device //////////////// 
.................... #device PIC18F452 
.................... #list 
....................  
.................... #fuses H4,NOWDT,NOPROTECT,NOWRT,NOWRTD,NOLVP,NOOSCSEN,BORV27,PUT,STVREN,NODEBUG,NOWRTB 
.................... #use delay(clock=40000000,RESTART_WDT) 
*
01E0:  MOVLW  01
01E2:  MOVWF  FEA
01E4:  MOVLW  48
01E6:  MOVWF  FE9
01E8:  MOVF   FEF,W
01EA:  BZ    020E
01EC:  MOVLW  0C
01EE:  MOVWF  01
01F0:  MOVLW  BF
01F2:  MOVWF  00
01F4:  CLRWDT
01F6:  DECFSZ 00,F
01F8:  BRA    01F4
01FA:  DECFSZ 01,F
01FC:  BRA    01F0
01FE:  MOVLW  F7
0200:  MOVWF  00
0202:  DECFSZ 00,F
0204:  BRA    0202
0206:  NOP   
0208:  CLRWDT
020A:  DECFSZ FEF,F
020C:  BRA    01EC
020E:  RETLW  00
.................... #use rs232(baud=57600,parity=N,xmit=PIN_C6,rcv=PIN_C7,ERRORS) 
....................  
.................... #include "HDD Driver.c" 
.................... ////////////////////////////////////////////////////////////////////// 
.................... ////////////////////////////////////////////////////////////////////// 
.................... //	Name:			   HDD Driver.c                       					  // 
.................... //	Date:			   02/01/2004		                   					  // 
.................... //	Version:		   1.1											              // 
.................... //	Type:			   PIC C Driver for MMC										  // 
.................... //	Author:        Mike Luck & Douglas Kennedy				           // 
.................... //	Company:		   MPIC3.COM										           // 
.................... ////////////////////////////////////////////////////////////////////// 
.................... ////////////////////////////////////////////////////////////////////// 
....................  
.................... //	Note: 
.................... // 		This code is a work in progress & not a finished fully working 
.................... //			project. Please check www.mpic3.com reguarly for updates. 
....................  
.................... /// PIN Assignments ////////////////////////////// 
.................... #DEFINE _CS PIN_C2 // chip select for MMC 
.................... //#DEFINE SDO PIN_C5 
.................... //#DEFINE CLK PIN_C3 
.................... //#DEFINE SDI PIN_C4 
.................... // SPI hardware pins are 
.................... // SDO C5 
.................... // SDI C4 
.................... // SCK C3 
.................... /////////////////////////////////////////////////////////////// 
....................  
.................... ///// Note old values needed before all SPI modes could be set up using SPI_setup 
.................... /// for 16 parts /////////// 
.................... //#DEFINE SSPCON 0x14 
.................... //#DEFINE SSPSTAT 0x94 
.................... //#BIT SMP=SSPSTAT.7 
.................... //#BIT CKE=SSPSTAT.6 
.................... //#BIT CKP=SSPCON.4 
.................... //#BIT SSPEN=SSPCON.5 
.................... ////////////////////////////// 
....................  
.................... // For 18F452 
.................... #DEFINE SSPSTAT 0x0FC7 
.................... #DEFINE SSPCON1 0x0FC6 
.................... #BIT SMP=SSPSTAT.7 
.................... #BIT CKE=SSPSTAT.6 
.................... #BIT CKP=SSPCON1.4 
....................  
.................... #DEFINE MAX_FILES 2 /// max number of open files 
.................... #DEFINE MMC_BUFF_SIZE 32 /// 32 for PCM 
.................... #DEFINE MMC_FILE_NAME_SIZE 32 
....................  
.................... #DEFINE ROOT_CLUSTER 0 
.................... #DEFINE NEXT_CLUSTER 1 
....................  
.................... #define MMC_INIT_TRACE FALSE 
.................... #define MMC_CMD_TRACE FALSE 
.................... #define MMC_CLUSTER_TRACE FALSE // if true prints to serial port 
.................... #define MMC_OPEN_TRACE FALSE // if true prints to serial port 
.................... #define MMC_READ_TRACE FALSE // if true prints file_addr,cluster index etc 
.................... #define MMC_WRITE_TRACE FALSE 
.................... #define MMC_READ_BLOCK_TRACE FALSE 
.................... #define MMC_SET_BLOCK_LEN_TRACE FALSE 
.................... #define MMC_WRITE_BLOCK_TRACE FALSE 
.................... #define MMC_NEW_CLUSTER FALSE 
.................... ////// MMC prototypes 
.................... #separate 
.................... int init_MMC(int max_tries); 
.................... #separate 
.................... int open_file(int fnbr,char *fname,int16 rec_length); 
.................... #separate 
.................... int file_read(int8 fnbr,char *buff); 
.................... #separate 
.................... int file_write(int8 fnbr,int *buff); 
.................... #separate 
.................... int file_set(int fnbr,int32 offset); 
.................... #separate 
.................... int file_new_cluster(int8 fnbr,int8 mode); /// mode 1=fat1 2=fat2 
....................  
.................... int32 atoint32 (char *s ); 
.................... signed int strncmp(char *s1, char *s2, int n); 
.................... ///////////////////// MMC GLOBALS ///////////////////////////// 
.................... int16 cluster_size_bytes; // bytes in a cluster 
.................... //int16 dir_cluster_chain_ptr; // link to the first cluster in the dir 
....................  
.................... int32 fat1_address; // physical address of fat1 cluster table assigned by INIT_MMC 
.................... int32 fat2_address; // physical address of fat1 cluster table assigned by INIT_MMC 
.................... int32 root_dir_address; // physical address of volume,file,folder tiles assigned by INIT_MMC 
.................... int32 data_area_address; // physical address of data area assigned by INIT_MMC 
.................... int32 winhex_adj; // Win hex hides the bytes in the reserved sectors 
.................... // this means Fat1 is address 512 
.................... // so adj is fat1-512 
....................  
.................... int32 block_size; // current MMC block size 
....................  
.................... int MMC_init=FALSE; 
....................  
.................... int MMC_dir_protected=TRUE; 
....................  
.................... ////////// open file specific globals /////////////////////// 
.................... struct{ 
.................... 	char name[MMC_FILE_NAME_SIZE+1]; // fopen file name 
.................... 	int32 dir_addr_ptr; // physical address of this files tile info 
.................... 	int16 root_cluster_ptr; // location of first cluster in FAT 
.................... 	int16 this_cluster_ptr; // location of current cluster in FAT 
.................... 	int16 next_cluster_ptr; // location of the next cluster for a file or sub dir in FAT 
.................... 	int32 addr_ptr; // physical address in the file the current 
.................... 	// cluster points to 
.................... 	// address=(this_chain_ptr-2)*cluster_size_bytes+data_area_address 
.................... 	// 
.................... 	// cluster_addr(THIS_CLUSTER) assigns it 
.................... 	// cluster_addr(NEXT_CLUSTER) moves to the data the next 
.................... 	// cluster points to 
.................... 	int32 size; // size of open file in bytes 
.................... 	int32 cluster_offset; // offset within the file representing the start of the current cluster 
.................... 	// (0 is start and ends with the cluster contianing eof ) 
.................... 	// auto increased by cluster_size_bytes each time a new cluster is entered 
....................  
.................... 	int32 offset; // current offset into the open file ( 0 is start size(file size) is end) 
.................... 	// auto increased by rec size each time a rec is read 
.................... 	// addr_prt+offset-cluster_offset is physical address of 
.................... 	// the current position within the file 
.................... 	// the physical positions are not always contiguous since the 
.................... 	// clusters of the file are not always adjacent to each other 
.................... 	int16 rec_size; // fopen record_size 
.................... 	// char buff[MMC_BUFF_SIZE+1]; // used for open and for read write 
.................... 	// init MMC uses file 0 buff to fetch the globals 
....................  
.................... } file[MAX_FILES]; 
....................  
....................  
.................... #separate 
.................... int mmc_cmd(int8 cmd,int32 address,int8 tries,int8 valid,int8 invalid){ 
.................... 	int i,r1; 
.................... 	for( i=0;i<16;i++) SPI_READ(0xFF);// digest prior operation 
0210:  MOVLB  1
0212:  CLRF   x77
0214:  MOVF   x77,W
0216:  SUBLW  0F
0218:  BNC   0228
021A:  MOVF   FC9,W
021C:  MOVLW  FF
021E:  MOVWF  FC9
0220:  BTFSS  FC7.0
0222:  BRA    0220
.................... 	// commands 
.................... 	// 7 6 5 4 3 2 1 0 
.................... 	// 0 1 b b b b b b bbbbbb=cmd 
.................... 	// 16=0x50 set blocklength 
.................... 	// 17=0x51 read block 
.................... 	// 24=0x58 write block 
.................... 	#if MMC_CMD_TRACE 
0224:  INCF   x77,F
0226:  BRA    0214
.................... 	printf("\n\r cmd=%2X \n\r",cmd); 
.................... 	#endif 
.................... 	SPI_READ(cmd); 
0228:  MOVF   FC9,W
022A:  MOVFF  16F,FC9
022E:  BTFSS  FC7.0
0230:  BRA    022E
.................... 	SPI_READ(MAKE8(address,3)); 
0232:  MOVFF  173,179
0236:  MOVF   FC9,W
0238:  MOVFF  173,FC9
023C:  BTFSS  FC7.0
023E:  BRA    023C
.................... 	SPI_READ(MAKE8(address,2)); 
0240:  MOVFF  172,179
0244:  MOVF   FC9,W
0246:  MOVFF  172,FC9
024A:  BTFSS  FC7.0
024C:  BRA    024A
.................... 	SPI_READ(MAKE8(address,1)); 
024E:  MOVFF  171,179
0252:  MOVF   FC9,W
0254:  MOVFF  171,FC9
0258:  BTFSS  FC7.0
025A:  BRA    0258
.................... 	SPI_READ(MAKE8(address,0)); 
025C:  MOVFF  170,179
0260:  MOVF   FC9,W
0262:  MOVFF  170,FC9
0266:  BTFSS  FC7.0
0268:  BRA    0266
.................... 	SPI_READ(0x95); // valid crc for 0x40 only invalid for others but spi mode doesn't care 
026A:  MOVF   FC9,W
026C:  MOVLW  95
026E:  MOVWF  FC9
0270:  BTFSS  FC7.0
0272:  BRA    0270
.................... 	for(i=0;i< tries;i++) { 
0274:  CLRF   x77
0276:  MOVF   x74,W
0278:  SUBWF  x77,W
027A:  BC    029E
.................... 		r1=SPI_READ(0xFF); 
027C:  MOVF   FC9,W
027E:  MOVLW  FF
0280:  MOVWF  FC9
0282:  BTFSS  FC7.0
0284:  BRA    0282
0286:  MOVFF  FC9,178
.................... 		#if MMC_CMD_TRACE 
.................... 			printf(" %2X",r1); 
.................... 		#endif 
.................... 		if (r1==valid) break; 
028A:  MOVF   x75,W
028C:  SUBWF  x78,W
028E:  BNZ   0292
0290:  BRA    029E
.................... 		if (r1==invalid) break; 
0292:  MOVF   x76,W
0294:  SUBWF  x78,W
0296:  BNZ   029A
0298:  BRA    029E
.................... 	} 
029A:  INCF   x77,F
029C:  BRA    0276
.................... 	return(r1); 
029E:  MOVFF  178,01
.................... } 
02A2:  MOVLB  0
02A4:  RETLW  00
....................  
....................  
.................... #separate 
.................... int set_BLOCKLEN( int32 size){ 
.................... 	int r1; 
....................  
.................... 	r1=mmc_cmd(0x50,size,16,0x00,0x40); /// cmd.data,tries,valid code,invlaid code 
02A6:  MOVLW  50
02A8:  MOVLB  1
02AA:  MOVWF  x6F
02AC:  MOVFF  163,173
02B0:  MOVFF  162,172
02B4:  MOVFF  161,171
02B8:  MOVFF  160,170
02BC:  MOVLW  10
02BE:  MOVWF  x74
02C0:  CLRF   x75
02C2:  MOVLW  40
02C4:  MOVWF  x76
02C6:  MOVLB  0
02C8:  RCALL  0210
02CA:  MOVFF  01,164
.................... 	if (r1==0x00) goto done ; 
02CE:  MOVLB  1
02D0:  MOVF   x64,F
02D2:  BNZ   02D6
02D4:  BRA    02E4
.................... 	if (r1==0x40) goto invalid; 
02D6:  MOVF   x64,W
02D8:  SUBLW  40
02DA:  BNZ   02DE
02DC:  BRA    02E4
....................  
....................  
.................... 	return(false); 
02DE:  MOVLW  00
02E0:  MOVWF  01
02E2:  BRA    02F8
.................... 	invalid: 
.................... 	#IF MMC_SET_BLOCK_LEN_TRACE 
.................... 		printf("\n\r para err\n\r"); 
.................... 	#ENDIF 
.................... done: 
.................... 	block_size=size; //// assign global block size 
02E4:  MOVFF  163,1F
02E8:  MOVFF  162,1E
02EC:  MOVFF  161,1D
02F0:  MOVFF  160,1C
.................... 	//printf("\n\r blk size=%lu",block_size); 
.................... 	return(true); 
02F4:  MOVLW  01
02F6:  MOVWF  01
.................... } 
02F8:  MOVLB  0
02FA:  RETLW  00
....................  
....................  
.................... #separate 
.................... int read_BLOCK( int32 address, char *buff){ 
.................... 	//// low level read ..requires block len to be called first to set global blocksize 
.................... 	int r1; 
.................... 	long i,iw; /// allows large gt 255 buff size addressing 
.................... 	//int data[128]; 
.................... 	r1=mmc_cmd(0x51,address,16,0x00,0x40); 
02FC:  MOVLW  51
02FE:  MOVLB  1
0300:  MOVWF  x6F
0302:  MOVFF  167,173
0306:  MOVFF  166,172
030A:  MOVFF  165,171
030E:  MOVFF  164,170
0312:  MOVLW  10
0314:  MOVWF  x74
0316:  CLRF   x75
0318:  MOVLW  40
031A:  MOVWF  x76
031C:  MOVLB  0
031E:  RCALL  0210
0320:  MOVFF  01,16A
....................  
.................... 	if (r1==0x00) goto get_token ; // we can read data payload 
0324:  MOVLB  1
0326:  MOVF   x6A,F
0328:  BNZ   032C
032A:  BRA    0340
.................... 	if (r1==0x40) goto invalid; 
032C:  MOVF   x6A,W
032E:  SUBLW  40
0330:  BNZ   0334
0332:  BRA    033A
....................  
.................... 	#IF MMC_READ_BLOCK_TRACE 
.................... 		printf("\n\r read block err 1 address=%lu \n\r",address); 
.................... 	#ENDIF 
.................... 	return(false); 
0334:  MOVLW  00
0336:  MOVWF  01
0338:  BRA    03C2
.................... 	invalid: 
.................... 	#IF MMC_READ_BLOCK_TRACE 
.................... 		printf("\n\r read block err 2 adress=%lu \n\r",address); 
.................... 	#ENDIF 
.................... 	return(false); 
033A:  MOVLW  00
033C:  MOVWF  01
033E:  BRA    03C2
.................... 	get_token: 
.................... 	for(iw=0;iw<1024;iw++){ 
0340:  CLRF   x6E
0342:  CLRF   x6D
0344:  MOVF   x6E,W
0346:  SUBLW  03
0348:  BNC   0368
.................... 	r1=SPI_READ(0xFF); 
034A:  MOVF   FC9,W
034C:  MOVLW  FF
034E:  MOVWF  FC9
0350:  BTFSS  FC7.0
0352:  BRA    0350
0354:  MOVFF  FC9,16A
.................... 	//data[iw]=r1; 
.................... 	if (r1==0xFE) goto read_data; // read token $FE 
0358:  MOVF   x6A,W
035A:  SUBLW  FE
035C:  BNZ   0360
035E:  BRA    036E
.................... 	} 
.................... 	#IF MMC_READ_BLOCK_TRACE 
0360:  INCF   x6D,F
0362:  BTFSC  FD8.2
0364:  INCF   x6E,F
0366:  BRA    0344
.................... 		printf("\n\r read block err 3 address=%lu \n\r",address); 
.................... 	#ENDIF 
.................... 	return(false); 
0368:  MOVLW  00
036A:  MOVWF  01
036C:  BRA    03C2
.................... 	read_data: 
.................... 	#IF MMC_READ_BLOCK_TRACE 
.................... 		printf("\n\r read block tries for FE =%lu \n\r",iw); 
.................... 	#ENDIF 
....................  
.................... 	for (i=0;i<block_size;i++) buff[i]=SPI_READ(0xFF); 
036E:  CLRF   x6C
0370:  CLRF   x6B
0372:  MOVF   1F,F
0374:  BNZ   0388
0376:  MOVF   1E,F
0378:  BNZ   0388
037A:  MOVF   x6C,W
037C:  SUBWF  1D,W
037E:  BNC   03AA
0380:  BNZ   0388

⌨️ 快捷键说明

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