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

📄 f34x_msd_mmc.src

📁 USB读写SD卡例程
💻 SRC
📖 第 1 页 / 共 5 页
字号:
	MOVX 	A,@DPTR
	MOV  	R3,A
	INC  	DPTR
	CLR  	A
	MOV  	B,#01H
	LCALL	?C?ILDIX
	MOV  	R1,B
	MOV  	R2,A
	MOV  	A,R7
	LCALL	?C?CSTPTR
; #else
;         SPI0DAT = 0xFF;               // (OCR);
;         while(!SPIF){}
;         SPIF = 0;
;         *pchar++ = SPI0DAT;
; #endif
; #endif
;       }
			; SOURCE LINE # 584
	SJMP 	?C0048
;     }
			; SOURCE LINE # 585
?C0019:
;     switch(current_command.trans_type)  // This conditional handles all data 
			; SOURCE LINE # 586
	MOV  	R0,#LOW (current_command?144+03H)
	MOV  	A,@R0
	ADD  	A,#0FEH
	JZ   	?C0059
	INC  	A
	JZ   	$ + 5H
	LJMP 	?C0050
;     {                                   // operations;  The command entry
			; SOURCE LINE # 587
;                                        // determines what type, if any, data
;                                        // operations need to occur;
;       case RD:                         // Read data from the MMC;
			; SOURCE LINE # 590
?C0051:
;   		  loopguard = 0;
			; SOURCE LINE # 591
	CLR  	A
	MOV  	DPTR,#loopguard?143
	MOVX 	@DPTR,A
?C0052:
; #ifdef __F326_VER__
; 	      while(Write_Read_Spi_Byte(0xFF)!=START_SBR) {
;     	  	if(!++loopguard) {BACK_FROM_ERROR;}
; 	      }	
; #else
; #ifdef SEND__IN_FUNCTION
; 	      while((Write_Read_Spi_Byte(0xFF))!=START_SBR) {
			; SOURCE LINE # 598
	LCALL	L?0178
	XRL  	A,#0FEH
	JZ   	?C0053
;           Wait_ns(700);
			; SOURCE LINE # 599
	LCALL	L?0170
; 	  	    if(!++loopguard) { 
			; SOURCE LINE # 600
	MOV  	DPTR,#loopguard?143
	MOVX 	A,@DPTR
	INC  	A
	MOVX 	@DPTR,A
	JNZ  	?C0052
;           /*printf("RD Start response not set ");*/ 
;             BACK_FROM_ERROR;}
			; SOURCE LINE # 602
	MOV  	SPI0DAT,#0FFH
?C0055:
	JNB  	SPIF,?C0055
?C0056:
	LCALL	L?0164
?C0057:
	JNB  	SPIF,?C0057
?C0058:
?C0137:
	LJMP 	?C0138
; 	        }	
			; SOURCE LINE # 603
?C0053:
; #else
;           do                            // Wait for a start read Token from
;           {                             // the MMC;
; 									   // Start a SPI transfer;
; 			      SPI0DAT = 0xFF;            
;             while(!SPIF){}
;             SPIF = 0;
; 			      if(!++loopguard) break;
;           } while(SPI0DAT != START_SBR);  // Check for a start read Token;
; 		      if(!loopguard) { BACK_FROM_ERROR; }
; #endif
; #endif
; 		
;           counter = 0;                  // Reset byte counter;
			; SOURCE LINE # 617
	LCALL	L?0162
;                                        // Read <current_blklen> bytes;
; 	//	 START_SPI_TIMEOUT;
; 		      READ_BYTES(pchar,current_blklen);
			; SOURCE LINE # 620
	LCALL	L?0150
	MOV  	R4,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R5,A
	LCALL	_READ_BYTES
; 	//	 STOP_SPI_TIME_OUT;
; 		
; #ifdef __F326_VER__
; 		      dummy_CRC = Write_Read_Spi_Byte(0xFF);
; #else
; #ifdef SEND__IN_FUNCTION
; 		      dummy_CRC = Write_Read_Spi_Byte(0xFF);
			; SOURCE LINE # 627
	MOV  	R7,#0FFH
	LCALL	_Write_Read_Spi_Byte
	MOV  	R0,#LOW (dummy_CRC?151)
	MOV  	A,R7
	MOV  	@R0,A
; #else
;           SPI0DAT = 0xFF;               // After all data is read, read the two
;           while(!SPIF){}                // CRC bytes;  These bytes are not used
;           SPIF = 0;                     // in this mode, but the placeholders 
;           dummy_CRC = SPI0DAT;          // must be read anyway;
;           SPI0DAT = 0xFF;
;           while(!SPIF){}
;           SPIF = 0;
;           dummy_CRC = SPI0DAT;
; #endif
; #endif
;           break;
			; SOURCE LINE # 639
	SJMP 	?C0050
;         case WR: 
			; SOURCE LINE # 640
?C0059:
; 	  
; #ifdef __F326_VER__
;           Write_Read_Spi_Byte(0xFF);
;           Write_Read_Spi_Byte(START_SBW);
; #else
; 
; #ifdef SEND__IN_FUNCTION
;           Write_Read_Spi_Byte(0xFF);
			; SOURCE LINE # 648
	MOV  	R7,#0FFH
	LCALL	_Write_Read_Spi_Byte
;           Write_Read_Spi_Byte(START_SBW);
			; SOURCE LINE # 649
	MOV  	R7,#0FEH
	LCALL	_Write_Read_Spi_Byte
; #else										// Write data to the MMC;
;           SPI0DAT = 0xFF;               // Start by sending 8 SPI clocks so
;           while(!SPIF){}                // the MMC can prepare for the write;
;           SPIF = 0;
;           SPI0DAT = START_SBW;          // Send the start write block Token;
;           while(!SPIF){}
;           SPIF = 0;
;          					            // Reset byte counter;
;                                        // Write <current_blklen> bytes to MMC;
; #endif
;           Wait_ns(700);
			; SOURCE LINE # 660
	MOV  	R7,#0BCH
	MOV  	R6,#02H
	LCALL	_Wait_ns
; #endif
; 
; 		 //START_SPI_TIMEOUT;
;         WRITE_BYTES(pchar,current_blklen);
			; SOURCE LINE # 664
	LCALL	L?0151
	MOV  	R4,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R5,A
	LCALL	_WRITE_BYTES
;  	    // STOP_SPI_TIME_OUT;
; 	
; #ifdef __F326_VER__
;         Write_Read_Spi_Byte(0xFF);
;         Write_Read_Spi_Byte(0xFF);
; #else
; #ifdef SEND__IN_FUNCTION
;         Write_Read_Spi_Byte(0xFF);
			; SOURCE LINE # 672
	MOV  	R7,#0FFH
	LCALL	_Write_Read_Spi_Byte
;         Write_Read_Spi_Byte(0xFF);
			; SOURCE LINE # 673
	MOV  	R7,#0FFH
	LCALL	_Write_Read_Spi_Byte
; #else
;         SPI0DAT = 0xFF;               // Write CRC bytes (don't cares);
;         while(!SPIF){}
;         SPIF = 0;
;         SPI0DAT = 0xFF;
;         while(!SPIF){}
;         SPIF = 0;
; #endif
; #endif
;         loopguard = 0;
			; SOURCE LINE # 683
	CLR  	A
	MOV  	DPTR,#loopguard?143
	MOVX 	@DPTR,A
?C0062:
;         do                            // Read Data Response from card;
;         {  
			; SOURCE LINE # 685
; #ifdef __F326_VER__
;           data_resp = Write_Read_Spi_Byte(0xFF);
;           if(!++loopguard) break;
; #else
; #ifdef SEND__IN_FUNCTION
;           data_resp = Write_Read_Spi_Byte(0xFF);
			; SOURCE LINE # 691
	MOV  	R7,#0FFH
	LCALL	_Write_Read_Spi_Byte
	MOV  	R0,#LOW (data_resp?150)
	MOV  	A,R7
	MOV  	@R0,A
;           if(!++loopguard) break;
			; SOURCE LINE # 692
	MOV  	DPTR,#loopguard?143
	MOVX 	A,@DPTR
	INC  	A
	MOVX 	@DPTR,A
	JZ   	?C0061
; #else
;           SPI0DAT = 0xFF;
;           while(!SPIF){}
;           SPIF = 0;
;           data_resp = SPI0DAT;
;           if(!++loopguard) break;
; #endif
; #endif
;         }                             // When bit 0 of the MMC response
			; SOURCE LINE # 701
?C0060:
;                                        // is clear, a valid data response
;                                        // has been received;
;         while((data_resp & DATA_RESP_MASK) != 0x01);
			; SOURCE LINE # 704
	MOV  	R0,#LOW (data_resp?150)
	MOV  	A,@R0
	ANL  	A,#011H
	MOV  	R7,A
	CJNE 	R7,#01H,?C0062
?C0061:
;         if(!loopguard) { BACK_FROM_ERROR; }
			; SOURCE LINE # 705
	MOV  	DPTR,#loopguard?143
	MOVX 	A,@DPTR
	JNZ  	?C0069
	MOV  	SPI0DAT,#0FFH
?C0065:
	JNB  	SPIF,?C0065
?C0066:
	LCALL	L?0164
?C0067:
	JNB  	SPIF,?C0067
?C0068:
?C0138:
	CLR  	SPIF
	MOV  	R6,#0FFH
	MOV  	R7,#0FFH
	RET  	
?C0069:
; 
; #ifdef __F326_VER__
;         while(Write_Read_Spi_Byte(0xFF)==0x00);
;         Write_Read_Spi_Byte(0xFF);
; #else
; #ifdef SEND__IN_FUNCTION
;         while(Write_Read_Spi_Byte(0xFF)==0x00);
			; SOURCE LINE # 712
	MOV  	R7,#0FFH
	LCALL	_Write_Read_Spi_Byte
	MOV  	A,R7
	JZ   	?C0069
?C0070:
;         Write_Read_Spi_Byte(0xFF);
			; SOURCE LINE # 713
	MOV  	R7,#0FFH
	LCALL	_Write_Read_Spi_Byte
; #else
;         do                            // Wait for end of busy signal;
;         {
;           SPI0DAT = 0xFF;            // Start SPI transfer to receive
;           while(!SPIF){}             // busy tokens;
;           SPIF = 0;
;         } while(SPI0DAT == 0x00);       // When a non-zero Token is returned,
;                                        // card is no longer busy;
; 
;         SPI0DAT = 0xFF;               // Issue 8 SPI clocks so that all card
;         while(!SPIF){}                // operations can complete;
;         SPIF = 0;
; #endif
; #endif
; 
;         break;
			; SOURCE LINE # 729
;       default: break;
			; SOURCE LINE # 730
;     }
			; SOURCE LINE # 731
?C0050:
; #ifdef __F326_VER__
;     Write_Read_Spi_Byte(0xFF);
;     SCS = 1;
;     Write_Read_Spi_Byte(0xFF);
; #else
; #ifdef SEND__IN_FUNCTION
;     Write_Read_Spi_Byte(0xFF);
			; SOURCE LINE # 738
	MOV  	R7,#0FFH
	LCALL	_Write_Read_Spi_Byte
;     NSSMD0 = 1;
			; SOURCE LINE # 739
	SETB 	NSSMD0
;     Write_Read_Spi_Byte(0xFF);
			; SOURCE LINE # 740
	MOV  	R7,#0FFH
	LCALL	_Write_Read_Spi_Byte
; #else
;     SPI0DAT = 0xFF;
;     while(!SPIF){}
;     SPIF = 0;
; 
;     NSSMD0 = 1;                         // Deselect memory card;
;     SPI0DAT = 0xFF;                     // Send 8 more SPI clocks to ensure
;     while(!SPIF){}                      // the card has finished all necessary
;     SPIF = 0;                           // operations;
;                                        // Restore old block length if needed;
; #endif
; #endif
;     if((current_command.command_byte == 9)||
			; SOURCE LINE # 753
	MOV  	R0,#LOW (current_command?144)
	MOV  	A,@R0
	MOV  	R7,A
	XRL  	A,#09H
	JZ   	?C0073
	MOV  	A,R7
	CJNE 	A,#0AH,?C0072
?C0073:
;       (current_command.command_byte == 10)) {
			; SOURCE LINE # 754
;       current_blklen = old_blklen;
			; SOURCE LINE # 755
	MOV  	DPTR,#old_blklen?147
	LCALL	L?0165
;     }
			; SOURCE LINE # 756
?C0072:
;     return card_response.i;
			; SOURCE LINE # 757
	MOV  	R0,#LOW (card_response?149)
	MOV  	A,@R0
	MOV  	R6,A
	INC  	R0
	MOV  	A,@R0
	MOV  	R7,A
; }
			; SOURCE LINE # 758
?C0018:
	RET  	
L?0144:
	MOV  	R7,#0FFH
	LCALL	_Write_Read_Spi_Byte
	MOV  	R0,#LOW (card_response?149)
	MOV  	A,R7
	MOV  	@R0,A
	MOV  	DPTR,#loopguard?143
	MOVX 	A,@DPTR
	INC  	A
	MOVX 	@DPTR,A
	RET  	
L?0153:
	MOV  	R7,#0FFH
	LCALL	_Write_Read_Spi_Byte
	MOV  	R0,#LOW (card_response?149)
	MOV  	A,R7
	MOV  	@R0,A
	MOV  	DPTR,#loopguard?143
	MOVX 	A,@DPTR
	INC  	A
	MOVX 	@DPTR,A
	RET  	
L?0170:
	MOV  	R7,#0BCH
	MOV  	R6,#02H
	LCALL	_Wait_ns
	RET  	
L?0178:
	MOV  	R7,#0FFH
	LCALL	_Write_Read_Spi_Byte
	MOV  	A,R7
	RET  	
; END OF _MMC_Command_Exec

; 
; 
; //-----------------------------------------------------------------------------
; // MMC_FLASH_Init
; //-----------------------------------------------------------------------------
; //
; // This function initializes the flash card, configures it to operate in SPI
; // mode, and reads the operating conditions register to ensure that the device
; // has initialized correctly.  It also determines the size of the card by 
; // reading the Card Specific Data Register (CSD).
; 
; void MMC_FLASH_Init(void)

	RSEG  ?PR?MMC_FLASH_Init?F34X_MSD_MMC
MMC_FLASH_Init:
	USING	0
			; SOURCE LINE # 770
; {
			; SOURCE LINE # 771
;   xdata unsigned loopguard;
;   xdata int i;
;   xdata UINT card_status;             // Stores card status returned from 
;                                        // MMC function calls(MMC_Command_Exec);
;   xdata unsigned char counter = 0;    // SPI byte counter;
			; SOURCE LINE # 776
	CLR  	A
	MOV  	DPTR,#counter?256
	MOVX 	@DPTR,A
;   unsigned char xdata *pchar;         // Xdata pointer for storing MMC 
;                                        // register values;
;                                        // Transmit at least 64 SPI clocks
;                                        // before any bus comm occurs.
; 
;   unsigned int c_size,bl_len;
;   unsigned char c_mult;
; //	PHYSICAL_SIZE=0;
; //	PHYSICAL_BLOCKS=0;
; 
;   SPI_Init();
			; SOURCE LINE # 787
	LCALL	SPI_Init
;   Wait_ms(100);
			; SOURCE LINE # 788
	MOV  	R7,#064H
	MOV  	R6,#00H
	LCALL	_Wait_ms
;   pchar = (unsigned char xdata*)LOCAL_BLOCK;
			; SOURCE LINE # 789
	MOV  	DPTR,#pchar?257
	MOV  	A,#HIGH (LOCAL_BLOCK)
	MOVX 	@DPTR,A
	INC  	DPTR
	MOV  	A,#LOW (LOCAL_BLOCK)
	MOVX 	@DPTR,A
;   for(counter = 0; counter < 8; counter++) {
			; SOURCE LINE # 790
	CLR  	A
	MOV  	DPTR,#counter?256
	MOVX 	@DPTR,A
?C0074:
; #ifdef __F326_VER__
;     Write_Read_Spi_Byte(0xFF);
; #else
; #ifdef SEND__IN_FUNCTION
;     Write_Read_Spi_Byte(0xFF);
			; SOURCE LINE # 795
; #else
;     SPI0DAT = 0xFF;
;     while(!SPIF){}
;     SPIF = 0;
; #endif
; #endif
;   }
			; SOURCE LINE # 802
	LCALL	L?0167
	SUBB 	A,#08H
	JC   	?C0074
?C0075:
;   for(counter = 0; counter < 2; counter++) {
			; SOURCE LINE # 803
	CLR  	A
	MOV  	DPTR,#counter?256
	MOVX 	@DPTR,A
?C0077:
; #ifdef __F326_VER__
;     Write_Read_Spi_Byte(0xFF);
; #else
; #ifdef SEND__IN_FUNCTION
;     Write_Read_Spi_Byte(0xFF);
			; SOURCE LINE # 808
; #else
;     SPI0DAT = 0xFF;
;     while(!SPIF){}
;     SPIF = 0;
; #endif
; #endif
;   }
			; SOURCE LINE # 815
	LCALL	L?0167
	SUBB 	A,#02H
	JC   	?C0077
?C0078:
;   
; #ifdef __F326_VER__
;   SCS = 0;
; #else
;   NSSMD0 = 0;                         // Select the MMC with the CS pin;
			; SOURCE LINE # 820
	CLR  	NSSMD0
;                                        // Send 16 more SPI clocks to 
;                                        // ensure proper startup;
; #endif
;                                        // Send the GO_IDLE_STATE command with
;                                        // CS driven low;  This causes the MMC
;                                        // to enter SPI mode; 	
;   Wait_ms(1);
			; SOURCE LINE # 827
	LCALL	L?0171
;   card_status.i = MMC_Command_Exec(GO_IDLE_STATE,EMPTY,EMPTY);
			; SOURCE LINE # 828
	MOV  	DPTR,#?_MMC_Command_Exec?BYTE+01H
	LCALL	?C?LSTKXDATA
	DB   	00H
	DB   	00H
	DB   	00H
	DB   	00H
	LCALL	L?0154
	MOV  	R7,A
	LCALL	L?0145
; 
;   loopguard=0;
			; SOURCE LINE # 830
	LCALL	L?0168
?C0082:
; 
;                                        // Send the SEND_OP_COND command
;   do                                  // until the MMC indicates that it is
;   {         
			; SOURCE LINE # 834
; 

⌨️ 快捷键说明

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