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

📄 f34x_msd_cf_basic_functions.src

📁 USB读写SD卡例程
💻 SRC
📖 第 1 页 / 共 2 页
字号:
	USING	0
			; SOURCE LINE # 119
; {
			; SOURCE LINE # 120
?C0019:
;   xdata char wait, wait_bsy;
;   do {
			; SOURCE LINE # 122
;     #ifndef MACRO_CF_VERSIONS
;     wait = CF_GET_REGISTER_VALUE(0x07);	// Read status register
			; SOURCE LINE # 124
	MOV  	R7,#07H
	LCALL	_CF_GET_REGISTER_VALUE
;---- Variable 'wait?246' assigned to Register 'R7' ----
;     #else
;     CF_GET_REGISTER_VALUE(0x07,wait);	// Read status register
;     #endif
;     wait_bsy = wait & 0x80;		// Wait for DRQ to SET
			; SOURCE LINE # 128
	MOV  	A,R7
	ANL  	A,#080H
	MOV  	R6,A
;---- Variable 'wait_bsy?247' assigned to Register 'R6' ----
;   } while (wait_bsy == (char)0x80);
			; SOURCE LINE # 129
	XRL  	A,#080H
	JZ   	?C0019
; }
			; SOURCE LINE # 130
	RET  	
; END OF Wait_Busy

; 
; 
; //----------------------------------------------------------------------------
; // Dtct_Card
; //----------------------------------------------------------------------------
; //
; // Function detcts if compact flash card is in slot
; //
; // Parameters   :
; // Return Value : 0 card is on , 1 off
; //----------------------------------------------------------------------------
; 
; char Dtct_Card(void)

	RSEG  ?PR?Dtct_Card?F34X_MSD_CF_BASIC_FUNCTIONS
Dtct_Card:
	USING	0
			; SOURCE LINE # 143
; {
			; SOURCE LINE # 144
;   xdata char card_detect;
;   card_detect = CF_CD1; 
			; SOURCE LINE # 146
	MOV  	C,CF_CD1
	CLR  	A
	RLC  	A
	MOV  	R7,A
;---- Variable 'card_detect?348' assigned to Register 'R7' ----
;   return (card_detect); // 0 card is on , 1 off
			; SOURCE LINE # 147
; }
			; SOURCE LINE # 148
?C0021:
	RET  	
; END OF Dtct_Card

; 
; #ifndef MACRO_CF_VERSIONS
; 
; //----------------------------------------------------------------------------
; // CF_GET_REGISTER_VALUE
; //----------------------------------------------------------------------------
; //
; // Function returns value from register pointed by addr
; //
; // Parameters   : addr - address value of CF register
; // Return Value : value stroed in register
; //----------------------------------------------------------------------------
; 
; char CF_GET_REGISTER_VALUE(char addr)

	RSEG  ?PR?_CF_GET_REGISTER_VALUE?F34X_MSD_CF_BASIC_FUNCTIONS
L?0054:
	USING	0
L?0055:
	MOV  	R7,#07H
	LCALL	_CF_SET_REGISTER_VALUE
	MOV  	R7,#01H
_CF_GET_REGISTER_VALUE:
	USING	0
			; SOURCE LINE # 162
;---- Variable 'addr?449' assigned to Register 'R7' ----
; {
			; SOURCE LINE # 163
;   xdata char ret = 0;
			; SOURCE LINE # 164
;---- Variable 'ret?450' assigned to Register 'R6' ----
;   CF_SET_ADDR_LINE(addr);
			; SOURCE LINE # 165
	LCALL	L?0062
;   CF_READ;
			; SOURCE LINE # 166
	CLR  	A
	MOV  	P4MDOUT,A
	MOV  	P4,#0FFH
	SETB 	CF_WE
	CLR  	CF_OE
;   CF_WAIT_STATE;
			; SOURCE LINE # 167
	NOP  	
	NOP  	
	NOP  	
;   ret = CF_READ_DATA;
			; SOURCE LINE # 168
	MOV  	R6,P4
;   CF_READWRITE_IDLE;
			; SOURCE LINE # 169
	LCALL	L?0065
;   return ret;
			; SOURCE LINE # 170
	XCH  	A,R7
	MOV  	A,R6
	XCH  	A,R7
; }
			; SOURCE LINE # 171
?C0022:
	RET  	
; END OF _CF_GET_REGISTER_VALUE

; 
; 
; //----------------------------------------------------------------------------
; // CF_SET_REGISTER_VALUE
; //----------------------------------------------------------------------------
; //
; // Function sets value of register
; //
; // Parameters   : addr - register address
; //				  value - value to set
; // Return Value : 
; //----------------------------------------------------------------------------
; 
; void CF_SET_REGISTER_VALUE(char addr, char value)

	RSEG  ?PR?_CF_SET_REGISTER_VALUE?F34X_MSD_CF_BASIC_FUNCTIONS
L?0053:
	USING	0
	MOV  	R5,#01H
	MOV  	R7,#02H
	LCALL	_CF_SET_REGISTER_VALUE
	XCH  	A,R7
	MOV  	A,R1
	XCH  	A,R7
	XCH  	A,R5
	MOV  	A,R7
	XCH  	A,R5
	MOV  	R7,#03H
_CF_SET_REGISTER_VALUE:
	USING	0
			; SOURCE LINE # 185
;---- Variable 'value?552' assigned to Register 'R5' ----
;---- Variable 'addr?551' assigned to Register 'R7' ----
; {
			; SOURCE LINE # 186
;   CF_SET_ADDR_LINE(addr);
			; SOURCE LINE # 187
	LCALL	L?0062
;   CF_WR_DATA(value);
			; SOURCE LINE # 188
	MOV  	P4MDOUT,#0FFH
	XCH  	A,R7
	MOV  	A,R5
	XCH  	A,R7
	MOV  	P4,R7
;   CF_WRITE;
			; SOURCE LINE # 189
	SETB 	CF_OE
	CLR  	CF_WE
;   CF_WAIT_STATE;
			; SOURCE LINE # 190
	NOP  	
	NOP  	
	NOP  	
;   CF_READWRITE_IDLE;
			; SOURCE LINE # 191
	CLR  	A
	LCALL	L?0065
; }
			; SOURCE LINE # 192
	RET  	
; END OF _CF_SET_REGISTER_VALUE

; #endif
; 
; //----------------------------------------------------------------------------
; // Write_Sector
; //----------------------------------------------------------------------------
; //
; // Function writes buffer into address
; //
; // Parameters   : address - LBA address
; //                buffer - buffer with data to write
; // Return Value : return error status or 0 if everything was OK
; //----------------------------------------------------------------------------
; 
; char Write_Sector(unsigned long address, char* buffer)

	RSEG  ?PR?_Write_Sector?F34X_MSD_CF_BASIC_FUNCTIONS
_Write_Sector:
	USING	0
			; SOURCE LINE # 206
	MOV  	DPTR,#address?653
	LCALL	?C?LSTXDATA
	MOV  	DPTR,#buffer?654
; {
			; SOURCE LINE # 207
;   xdata char cylinder_low, cylinder_high,sector,head;
;   xdata char result, error;
;   xdata int i;
;   result = Dtct_Card(); 
			; SOURCE LINE # 211
;---- Variable 'result?659' assigned to Register 'R7' ----
;   if (result == 1) return (CF_NO_CARD); 
			; SOURCE LINE # 212
	LCALL	L?0051
	CJNE 	A,#01H,?C0024
	MOV  	R7,#01H
	RET  	
?C0024:
; 	
;   Led2=1;
			; SOURCE LINE # 214
	SETB 	Led2
;   sector = address & 0xff;
			; SOURCE LINE # 215
	MOV  	DPTR,#address?653
	LCALL	L?0048
;---- Variable 'sector?657' assigned to Register 'R1' ----
;   cylinder_low = (address >> 8 ) & 0x0FF; 
			; SOURCE LINE # 216
	MOV  	DPTR,#address?653
	LCALL	L?0059
;---- Variable 'cylinder_low?655' assigned to Register 'R3' ----
;   cylinder_high = (address >> 16) & 0xff; 
			; SOURCE LINE # 217
	MOV  	DPTR,#address?653
	LCALL	L?0047
;---- Variable 'cylinder_high?656' assigned to Register 'R2' ----
	LCALL	L?0066
;   head = (address >> 24) & 0x0f;
			; SOURCE LINE # 218
	MOV  	DPTR,#address?653
	LCALL	L?0048
	LCALL	L?0063
;---- Variable 'head?658' assigned to Register 'R6' ----
	XCH  	A,R6
	MOV  	A,R7
	XCH  	A,R6
; 
; 	
;   CF_SET_REGISTER_VALUE(2,0x01);
			; SOURCE LINE # 221
;   CF_SET_REGISTER_VALUE(3,sector);
			; SOURCE LINE # 222
	LCALL	L?0053
;   CF_SET_REGISTER_VALUE(4,cylinder_low);
			; SOURCE LINE # 223
	XCH  	A,R5
	MOV  	A,R3
	XCH  	A,R5
	MOV  	R7,#04H
	LCALL	_CF_SET_REGISTER_VALUE
;   CF_SET_REGISTER_VALUE(5,cylinder_high);
			; SOURCE LINE # 224
	XCH  	A,R5
	MOV  	A,R2
	XCH  	A,R5
	MOV  	R7,#05H
	LCALL	_CF_SET_REGISTER_VALUE
;   CF_SET_REGISTER_VALUE(6,(0xE0 | head));
			; SOURCE LINE # 225
	MOV  	A,R6
	LCALL	L?0060
;   CF_SET_REGISTER_VALUE(7,0x30);
			; SOURCE LINE # 226
	MOV  	R5,#030H
; 
;   error = CF_GET_REGISTER_VALUE(1);
			; SOURCE LINE # 228
	LCALL	L?0054
	MOV  	DPTR,#error?660
	MOV  	A,R7
	MOVX 	@DPTR,A
; 
;   Wait_Drq(); // Wait for DRQ
			; SOURCE LINE # 230
	LCALL	Wait_Drq
;   Wait_Busy(); 
			; SOURCE LINE # 231
	LCALL	Wait_Busy
; 
;   for(i=0;i<PHYSICAL_BLOCK_SIZE;i++) {
			; SOURCE LINE # 233
	CLR  	A
	MOV  	DPTR,#i?661
	MOVX 	@DPTR,A
	INC  	DPTR
	MOVX 	@DPTR,A
?C0026:
	MOV  	DPTR,#i?661
	MOVX 	A,@DPTR
	MOV  	R6,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R7,A
	CLR  	C
	MOV  	A,R6
	XRL  	A,#080H
	SUBB 	A,#082H
	JNC  	?C0027
;     CF_SET_REGISTER_VALUE(0,buffer[i]);
			; SOURCE LINE # 234
	MOV  	DPTR,#buffer?654
	MOVX 	A,@DPTR
	MOV  	R3,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R2,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R1,A
	MOV  	DPL,R7
	MOV  	DPH,R6
	LCALL	?C?CLDOPTR
	MOV  	R5,A
	CLR  	A
	MOV  	R7,A
	LCALL	_CF_SET_REGISTER_VALUE
;   }
			; SOURCE LINE # 235
	MOV  	DPTR,#i?661+01H
	MOVX 	A,@DPTR
	INC  	A
	MOVX 	@DPTR,A
	JNZ  	?C0041
	MOV  	DPTR,#i?661
	MOVX 	A,@DPTR
	INC  	A
	MOVX 	@DPTR,A
?C0041:
	SJMP 	?C0026
?C0027:
; 
;   Wait_Busy(); 
			; SOURCE LINE # 237
	LCALL	Wait_Busy
;   #ifndef MACRO_CF_VERSIONS
;   error = CF_GET_REGISTER_VALUE(1);
			; SOURCE LINE # 239
	MOV  	R7,#01H
	LCALL	_CF_GET_REGISTER_VALUE
	MOV  	DPTR,#error?660
	MOV  	A,R7
	MOVX 	@DPTR,A
;   #else
;   CF_GET_REGISTER_VALUE(1,error);
;   #endif
;   Led2=0;
			; SOURCE LINE # 243
	CLR  	Led2
;   return(error); 
			; SOURCE LINE # 244
; }
			; SOURCE LINE # 245
?C0025:
	RET  	
; END OF _Write_Sector

; 
; 
; //----------------------------------------------------------------------------
; // Read_Sector
; //----------------------------------------------------------------------------
; //
; // Function reads buffer from address
; //
; // Parameters   : address - LBA address
; //                buffer - buffer with data to write
; // Return Value : return error status or 0 if everything was OK
; //----------------------------------------------------------------------------
; 
; char Read_Sector(unsigned long address, char* buffer)

	RSEG  ?PR?_Read_Sector?F34X_MSD_CF_BASIC_FUNCTIONS
_Read_Sector:
	USING	0
			; SOURCE LINE # 259
	MOV  	DPTR,#address?762
	LCALL	?C?LSTXDATA
	MOV  	DPTR,#buffer?763
; {
			; SOURCE LINE # 260
;   xdata char cylinder_low, cylinder_high,sector,head;
;   xdata char result, error;
;   xdata int i;
;   result = Dtct_Card(); 
			; SOURCE LINE # 264
;---- Variable 'result?768' assigned to Register 'R7' ----
;   if (result == 1) return (CF_NO_CARD); 
			; SOURCE LINE # 265
	LCALL	L?0051
	CJNE 	A,#01H,?C0029
	MOV  	R7,#01H
	RET  	
?C0029:
;   Led1 = 1;
			; SOURCE LINE # 266
	SETB 	Led1
;   sector = address & 0xff;
			; SOURCE LINE # 267
	MOV  	DPTR,#address?762
	LCALL	L?0048
;---- Variable 'sector?766' assigned to Register 'R1' ----
;   cylinder_low = (address >> 8 ) & 0x0FF; 
			; SOURCE LINE # 268
	MOV  	DPTR,#address?762
	LCALL	L?0059
;---- Variable 'cylinder_low?764' assigned to Register 'R3' ----
;   cylinder_high = (address >> 16) & 0xff; 
			; SOURCE LINE # 269
	MOV  	DPTR,#address?762
	LCALL	L?0047
;---- Variable 'cylinder_high?765' assigned to Register 'R2' ----
	LCALL	L?0066
;   head = (address >> 24) & 0x0f;
			; SOURCE LINE # 270
	MOV  	DPTR,#address?762
	LCALL	L?0048
	LCALL	L?0063
;---- Variable 'head?767' assigned to Register 'R4' ----
	XCH  	A,R4
	MOV  	A,R7
	XCH  	A,R4
; 
;   error = CF_GET_REGISTER_VALUE(1);
			; SOURCE LINE # 272
	LCALL	L?0056
; 	
;   CF_SET_REGISTER_VALUE(2,0x01);
			; SOURCE LINE # 274
;   CF_SET_REGISTER_VALUE(3,sector);
			; SOURCE LINE # 275
	LCALL	L?0053
;   CF_SET_REGISTER_VALUE(4,cylinder_low);
			; SOURCE LINE # 276
	XCH  	A,R7
	MOV  	A,R3
	XCH  	A,R7
	XCH  	A,R5
	MOV  	A,R7
	XCH  	A,R5
	MOV  	R7,#04H
	LCALL	_CF_SET_REGISTER_VALUE
;   CF_SET_REGISTER_VALUE(5,cylinder_high);
			; SOURCE LINE # 277
	XCH  	A,R7
	MOV  	A,R2
	XCH  	A,R7
	XCH  	A,R5
	MOV  	A,R7
	XCH  	A,R5
	MOV  	R7,#05H
	LCALL	_CF_SET_REGISTER_VALUE
;   CF_SET_REGISTER_VALUE(6,(0xE0 | head));
			; SOURCE LINE # 278
	XCH  	A,R7
	MOV  	A,R4
	XCH  	A,R7
	MOV  	A,R7
	LCALL	L?0060
;   CF_SET_REGISTER_VALUE(7,0x20);
			; SOURCE LINE # 279
	MOV  	R5,#020H
; 
;   error = CF_GET_REGISTER_VALUE(1);
			; SOURCE LINE # 281
	LCALL	L?0054
	MOV  	A,R7
	MOVX 	@DPTR,A
; 
;   Wait_Drq(); // Wait for DRQ
			; SOURCE LINE # 283
	LCALL	Wait_Drq
; 
;   #ifndef MACRO_CF_VERSIONS
;   error = CF_GET_REGISTER_VALUE(1);
			; SOURCE LINE # 286
	LCALL	L?0056
;   #else
;   CF_GET_REGISTER_VALUE(1,error);
;   #endif
; 
; 		
; 
;   for(i=0;i<PHYSICAL_BLOCK_SIZE;i++) {
			; SOURCE LINE # 293
;---- Variable 'i?770' assigned to Register 'R4/R5' ----
	CLR  	A
	MOV  	R5,A
	MOV  	R4,A
?C0031:
; #ifndef MACRO_CF_VERSIONS
;     buffer[i] = CF_GET_REGISTER_VALUE(0);
			; SOURCE LINE # 295
	CLR  	A
	MOV  	R7,A
	LCALL	_CF_GET_REGISTER_VALUE
	MOV  	DPTR,#buffer?763
; #else
;     CF_GET_REGISTER_VALUE(0,buffer[i]);
; #endif
;   }
			; SOURCE LINE # 299
	LCALL	L?0058
	CJNE 	R5,#00H,?C0042
	INC  	R4
?C0042:
	MOV  	A,R5
	JNZ  	?C0043
	MOV  	A,R4
	XRL  	A,#02H
?C0043:
	JNZ  	?C0031
?C0032:
;   Wait_Busy();
			; SOURCE LINE # 300
	LCALL	Wait_Busy
;   #ifndef MACRO_CF_VERSIONS
;   error = CF_GET_REGISTER_VALUE(1);
			; SOURCE LINE # 302
	LCALL	L?0057
;   #else
;   CF_GET_REGISTER_VALUE(1,error);
;   #endif
;   Led1 = 0;
			; SOURCE LINE # 306
	CLR  	Led1
;   return(error); 
			; SOURCE LINE # 307
; }
			; SOURCE LINE # 308
?C0030:
	RET  	
; END OF _Read_Sector

; 
; //----------------------------------------------------------------------------
; // Identify_Drive
; //----------------------------------------------------------------------------
; //
; // This function reads identifier from card
; //
; // Parameters   : buffer - buffer on data from CF
; // Return Value : error number if occurs 
; //----------------------------------------------------------------------------
; 
; char Identify_Drive(char* buffer)

	RSEG  ?PR?_Identify_Drive?F34X_MSD_CF_BASIC_FUNCTIONS
_Identify_Drive:
	USING	0
			; SOURCE LINE # 320
	MOV  	DPTR,#buffer?871
; {
			; SOURCE LINE # 321
;   xdata char error,result;
;   xdata int i;
; 	
;   result = Dtct_Card();
			; SOURCE LINE # 325
;---- Variable 'result?873' assigned to Register 'R7' ----
;   if (result == 1) return (CF_NO_CARD); 
			; SOURCE LINE # 326
	LCALL	L?0052
	CJNE 	A,#01H,?C0036
	MOV  	R7,#01H
	RET  	
?C0036:
; 
;   while(((error = CF_GET_REGISTER_VALUE(1)) & 0xF0) != 0);
			; SOURCE LINE # 328
	LCALL	L?0064
	MOV  	A,R7
	ANL  	A,#0F0H
	JNZ  	?C0036
?C0037:
; 			
; 
;   CF_SET_REGISTER_VALUE(6,0);
			; SOURCE LINE # 331
	CLR  	A
	LCALL	L?0061
;   CF_SET_REGISTER_VALUE(7,0xEC);
			; SOURCE LINE # 332
	MOV  	R5,#0ECH
; 
;   error = CF_GET_REGISTER_VALUE(1);
			; SOURCE LINE # 334
	LCALL	L?0055
	MOV  	DPTR,#error?872
	MOV  	A,R7
	MOVX 	@DPTR,A
; 
; 	
;   Wait_Drq();
			; SOURCE LINE # 337
	LCALL	Wait_Drq
;   for (i = 0; i < PHYSICAL_BLOCK_SIZE; i++) {
			; SOURCE LINE # 338
;---- Variable 'i?874' assigned to Register 'R4/R5' ----
	CLR  	A
	MOV  	R5,A
	MOV  	R4,A
?C0038:
;     #ifndef MACRO_CF_VERSIONS
;     *(buffer + i) = CF_GET_REGISTER_VALUE(0);
			; SOURCE LINE # 340
	CLR  	A
	MOV  	R7,A
	LCALL	_CF_GET_REGISTER_VALUE
	MOV  	DPTR,#buffer?871
;     #else
;     CF_GET_REGISTER_VALUE(0,*(buffer + i));
;     #endif
;   }
			; SOURCE LINE # 344
	LCALL	L?0058
	CJNE 	R5,#00H,?C0044
	INC  	R4
?C0044:
	MOV  	A,R5
	JNZ  	?C0045
	MOV  	A,R4
	XRL  	A,#02H
?C0045:
	JNZ  	?C0038
?C0039:
;   #ifndef MACRO_CF_VERSIONS
;   error = CF_GET_REGISTER_VALUE(1);
			; SOURCE LINE # 346
	LCALL	L?0064
;   #else
;   CF_GET_REGISTER_VALUE(1,error);
;   #endif
;   return error; 
			; SOURCE LINE # 350
; }			; SOURCE LINE # 351
?C0035:
	RET  	
; END OF _Identify_Drive

	END

⌨️ 快捷键说明

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