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

📄 f34x_msd_usb_isr.src

📁 USB读写SD卡例程
💻 SRC
📖 第 1 页 / 共 4 页
字号:
	SJMP 	?C0042
;             case SET_CONFIGURATION:
			; SOURCE LINE # 217
?C0051:
;                Set_Configuration();
			; SOURCE LINE # 218
	LCALL	Set_Configuration
;                break;
			; SOURCE LINE # 219
	SJMP 	?C0042
;             case GET_INTERFACE:
			; SOURCE LINE # 220
?C0052:
;                Get_Interface();
			; SOURCE LINE # 221
	LCALL	Get_Interface
;                break;
			; SOURCE LINE # 222
	SJMP 	?C0042
;             case SET_INTERFACE:
			; SOURCE LINE # 223
?C0053:
;                Set_Interface();
			; SOURCE LINE # 224
	LCALL	Set_Interface
;                break;
			; SOURCE LINE # 225
	SJMP 	?C0042
; /*
; /* Removed these to safe some memory space (not called on Windows platform anyway).
; /*
; 			case MSD_RESET:
; 				Reset_Msd();
; 				break;
; 			case MSD_GET_MAX_LUN:
; 				Get_MaxLUN();
; 				break;
; */
;             default:
			; SOURCE LINE # 236
?C0054:
;                Force_Stall();           // Send stall to host if invalid request
			; SOURCE LINE # 237
	LCALL	Force_Stall
;                break;
			; SOURCE LINE # 238
;          }
			; SOURCE LINE # 239
;       }
			; SOURCE LINE # 240
;    } 
			; SOURCE LINE # 241
?C0042:
; 
;    if (Ep_Status[0] == EP_TX)           // See if the endpoint has data to transmit to host
			; SOURCE LINE # 243
	MOV  	DPTR,#Ep_Status
	MOVX 	A,@DPTR
	XRL  	A,#01H
	JZ   	$ + 5H
	LJMP 	?C0036
;    {
			; SOURCE LINE # 244
;       if (!(control_reg & rbINPRDY))     // Make sure you don't overwrite last packet
			; SOURCE LINE # 245
	MOV  	DPTR,#control_reg?344
	MOVX 	A,@DPTR
	JNB  	ACC.1,$ + 6H
	LJMP 	?C0036
;       {
			; SOURCE LINE # 246
?C0057:
;                                         // Endpoint 0 transmit mode
;          //Delay();
;          POLL_READ_BYTE(E0CSR, control_reg);
			; SOURCE LINE # 249
	MOV  	A,USB0ADR
	JB   	ACC.7,?C0057
?C0058:
	MOV  	USB0ADR,#091H
?C0059:
	MOV  	A,USB0ADR
	JB   	ACC.7,?C0059
?C0060:
	MOV  	DPTR,#control_reg?344
	MOV  	A,USB0DAT
	MOVX 	@DPTR,A
;                                         // Read control register
; 		 
;          if ((!(control_reg & rbSUEND)) || (!(control_reg & rbOPRDY)))
			; SOURCE LINE # 252
	MOVX 	A,@DPTR
	JNB  	ACC.4,?C0062
	JNB  	ACC.0,$ + 6H
	LJMP 	?C0036
?C0062:
;                                         // Check to see if Setup End or Out Packet received, if so			                      
;                                         // do not put any new data on FIFO
;          {     
			; SOURCE LINE # 255
;             TempReg = rbINPRDY;         // Add In Packet ready flag to E0CSR bitmask              
			; SOURCE LINE # 256
	MOV  	DPTR,#TempReg?345
	MOV  	A,#02H
	MOVX 	@DPTR,A
; 			 
; 			                            // Break Data into multiple packets if larger than Max Packet
;             if (Data_Size >= EP0_PACKET_SIZE)
			; SOURCE LINE # 259
	CLR  	C
	MOV  	DPTR,#Data_Size+01H
	MOVX 	A,@DPTR
	SUBB 	A,#040H
	MOV  	DPTR,#Data_Size
	MOVX 	A,@DPTR
	SUBB 	A,#00H
	MOV  	DPTR,#Data_Ptr
	LCALL	L?0140
	JC   	?C0063
;             {
			; SOURCE LINE # 260
;                Fifo_Write(FIFO_EP0, EP0_PACKET_SIZE, (BYTE *)Data_Ptr);// Put Data on Fifo
			; SOURCE LINE # 261
	MOV  	R4,#00H
	MOV  	R5,#040H
	MOV  	R7,#020H
	LCALL	_?Fifo_Write
;                Data_Ptr  += EP0_PACKET_SIZE;                           // Advance data pointer
			; SOURCE LINE # 262
	MOV  	DPTR,#Data_Ptr+01H
	CLR  	A
	MOV  	B,#040H
	LCALL	?C?IILDX
;                Data_Size -= EP0_PACKET_SIZE;                           // Decrement data size
			; SOURCE LINE # 263
	MOV  	DPTR,#Data_Size+01H
	MOVX 	A,@DPTR
	ADD  	A,#0C0H
	MOVX 	@DPTR,A
	MOV  	DPTR,#Data_Size
	MOVX 	A,@DPTR
	ADDC 	A,#0FFH
	MOVX 	@DPTR,A
;                Data_Sent += EP0_PACKET_SIZE;                           // Increment data sent counter
			; SOURCE LINE # 264
	MOV  	DPTR,#Data_Sent+01H
	MOVX 	A,@DPTR
	ADD  	A,#040H
	MOVX 	@DPTR,A
	MOV  	DPTR,#Data_Sent
	MOVX 	A,@DPTR
	ADDC 	A,#00H
	MOVX 	@DPTR,A
;             }
			; SOURCE LINE # 265
	SJMP 	?C0064
?C0063:
; 			else                        // If data is less than Max Packet size or zero
;             {
			; SOURCE LINE # 267
;                Fifo_Write(FIFO_EP0, Data_Size, (BYTE *)Data_Ptr);       // Put Data on Fifo
			; SOURCE LINE # 268
	MOV  	DPTR,#Data_Size
	MOVX 	A,@DPTR
	MOV  	R4,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R5,A
	MOV  	R7,#020H
	LCALL	_?Fifo_Write
;                TempReg |= rbDATAEND;                                  // Add Data End bit to bitmask
			; SOURCE LINE # 269
;                Ep_Status[0] = EP_IDLE;                                // Return EP 0 to idle state
			; SOURCE LINE # 270
	LCALL	L?0142
;             }
			; SOURCE LINE # 271
?C0064:
;             if (Data_Sent == Setup.wLength.i)
			; SOURCE LINE # 272
	MOV  	DPTR,#Setup+06H
	MOVX 	A,@DPTR
	MOV  	R6,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R7,A
	MOV  	DPTR,#Data_Sent
	MOVX 	A,@DPTR
	XRL  	A,R6
	JNZ  	?C0134
	INC  	DPTR
	MOVX 	A,@DPTR
	XRL  	A,R7
?C0134:
	JNZ  	?C0066
; 			                            // This case exists when the host requests an even multiple of
;                                         // your endpoint zero max packet size, and you need to exit
;                                         // transmit mode without sending a zero length packet
;             {
			; SOURCE LINE # 276
;                TempReg |= rbDATAEND;    // Add Data End bit to mask
			; SOURCE LINE # 277
;                Ep_Status[0] = EP_IDLE;  // and return Endpoint 0 to an idle state
			; SOURCE LINE # 278
	LCALL	L?0142
;             }
			; SOURCE LINE # 279
?C0066:
;             POLL_WRITE_BYTE(E0CSR, TempReg);                          // Write mask to E0CSR
			; SOURCE LINE # 280
	MOV  	A,USB0ADR
	JB   	ACC.7,?C0066
?C0067:
	MOV  	USB0ADR,#011H
	MOV  	DPTR,#TempReg?345
	MOVX 	A,@DPTR
	MOV  	USB0DAT,A
;          }
			; SOURCE LINE # 281
;       }
			; SOURCE LINE # 282
;    }
			; SOURCE LINE # 283
; }
			; SOURCE LINE # 284
?C0036:
	RET  	
; END OF Handle_Setup

; 
; 
; //----------------------------------------------------------------------------
; // Handle_In1
; //----------------------------------------------------------------------------
; //
; // - This routine loads the current value from In_Packet on the Endpoint 1 
; // fifo, after an interrupt is received from the last packet being 
; // transmitted
; //
; // Parameters   : ptr_buf - pointer to buffer with in_pocket
; // Return Value :
; //----------------------------------------------------------------------------
; 
; void Handle_In1(BYTE* ptr_buf)

	RSEG  ?PR?_Handle_In1?F34X_MSD_USB_ISR
_Handle_In1:
	USING	0
			; SOURCE LINE # 299
;---- Variable 'ptr_buf?446' assigned to Register 'R1/R2/R3' ----
; {
			; SOURCE LINE # 300
?C0068:
;    BYTE control_reg;
; 
;    POLL_WRITE_BYTE(INDEX, EP1_IN_IDX);           // Set index to endpoint 1 registers
			; SOURCE LINE # 303
	MOV  	A,USB0ADR
	JB   	ACC.7,?C0068
?C0069:
	MOV  	USB0ADR,#0EH
	MOV  	USB0DAT,#01H
?C0070:
;    POLL_READ_BYTE(EINCSR1, control_reg); // Read contol register for EP 1
			; SOURCE LINE # 304
	MOV  	A,USB0ADR
	JB   	ACC.7,?C0070
?C0071:
	MOV  	USB0ADR,#091H
?C0072:
	MOV  	A,USB0ADR
	JB   	ACC.7,?C0072
?C0073:
;---- Variable 'control_reg?447' assigned to Register 'R7' ----
	MOV  	R7,USB0DAT
; 
;    if (Ep_Status[1] == EP_HALT)         // If endpoint is currently halted, send a stall
			; SOURCE LINE # 306
	MOV  	DPTR,#Ep_Status+01H
	MOVX 	A,@DPTR
	CJNE 	A,#03H,?C0074
;    {
			; SOURCE LINE # 307
?C0075:
;       POLL_WRITE_BYTE(EINCSR1, rbInSDSTL);
			; SOURCE LINE # 308
	MOV  	A,USB0ADR
	JB   	ACC.7,?C0075
?C0076:
	MOV  	USB0ADR,#011H
	MOV  	USB0DAT,#010H
;    }
			; SOURCE LINE # 309
	RET  	
?C0074:
; 
;    else                                 // Otherwise send last updated data to host
;    {
			; SOURCE LINE # 312
;       if (control_reg & rbInSTSTL)       // Clear sent stall if last packet returned a stall
			; SOURCE LINE # 313
	MOV  	A,R7
	JNB  	ACC.5,?C0078
;       {
			; SOURCE LINE # 314
?C0079:
;          POLL_WRITE_BYTE(EINCSR1, rbInCLRDT);
			; SOURCE LINE # 315
	MOV  	A,USB0ADR
	JB   	ACC.7,?C0079
?C0080:
	MOV  	USB0ADR,#011H
	MOV  	USB0DAT,#040H
;       }
			; SOURCE LINE # 316
?C0078:
; 
;       if (control_reg & rbInUNDRUN)      // Clear underrun bit if it was set
			; SOURCE LINE # 318
	MOV  	A,R7
	JNB  	ACC.2,?C0081
;       {
			; SOURCE LINE # 319
?C0082:
;          POLL_WRITE_BYTE(EINCSR1, 0x00);
			; SOURCE LINE # 320
	MOV  	A,USB0ADR
	JB   	ACC.7,?C0082
?C0083:
	MOV  	USB0ADR,#011H
	CLR  	A
	MOV  	USB0DAT,A
;       }
			; SOURCE LINE # 321
?C0081:
; 
;                                         // Put new data on Fifo
; //      Fifo_Write(FIFO_EP1, EP1_PACKET_SIZE, (BYTE *)IN_PACKET);
;       Fifo_Write(FIFO_EP1, In_count, (BYTE *)ptr_buf);
			; SOURCE LINE # 325
	MOV  	DPTR,#In_count
	MOVX 	A,@DPTR
	MOV  	R5,A
	MOV  	R4,#00H
	MOV  	R7,#021H
	LCALL	_?Fifo_Write
?C0084:
;       POLL_WRITE_BYTE(EINCSR1, rbInINPRDY);   
			; SOURCE LINE # 326
	MOV  	A,USB0ADR
	JB   	ACC.7,?C0084
?C0085:
	MOV  	USB0ADR,#011H
	MOV  	USB0DAT,#01H
;                                         // Set In Packet ready bit, indicating fresh data
;    }                                    // on Fifo 1
			; SOURCE LINE # 328
; }
			; SOURCE LINE # 329
?C0086:
	RET  	
; END OF _Handle_In1

; 
; //----------------------------------------------------------------------------
; // USB_Bulk_Init
; //----------------------------------------------------------------------------
; //
; // Function rests the input and output counters for USB
; //
; // Parameters   :
; // Return Value :
; //----------------------------------------------------------------------------
; 
; void USB_Bulk_Init() {

	RSEG  ?PR?USB_Bulk_Init?F34X_MSD_USB_ISR
USB_Bulk_Init:
			; SOURCE LINE # 341
; 	In_count=0;
			; SOURCE LINE # 342
	CLR  	A
	MOV  	DPTR,#In_count
	MOVX 	@DPTR,A
; 	Out_Count=0;
			; SOURCE LINE # 343
	MOV  	DPTR,#Out_Count
	MOVX 	@DPTR,A
	INC  	DPTR
	MOVX 	@DPTR,A
; }
			; SOURCE LINE # 344
	RET  	
; END OF USB_Bulk_Init

; 
; //----------------------------------------------------------------------------
; // USB_In
; //----------------------------------------------------------------------------
; //
; // The function sends the series of characters via USB
; //
; // Parameters   : ptr_buf - pointer to buffer, 
; //                count - number of bytes
; // Return Value :
; //----------------------------------------------------------------------------
; 
; void USB_In(BYTE* ptr_buf,unsigned count) {

	RSEG  ?PR?_USB_In?F34X_MSD_USB_ISR
_USB_In:
	USING	0
			; SOURCE LINE # 357
	MOV  	DPTR,#ptr_buf?648
	MOV  	A,R3
	MOVX 	@DPTR,A
	INC  	DPTR
	MOV  	A,R2
	MOVX 	@DPTR,A
	INC  	DPTR
	MOV  	A,R1
	MOVX 	@DPTR,A
	INC  	DPTR
	MOV  	A,R4
	MOVX 	@DPTR,A
	INC  	DPTR
	MOV  	A,R5
	MOVX 	@DPTR,A
; 	DWORD t1=tickcount+500;
			; SOURCE LINE # 358
	MOV  	DPTR,#tickcount
	MOVX 	A,@DPTR
	MOV  	R4,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R5,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R6,A
	INC  	DPTR
	MOVX 	A,@DPTR
	ADD  	A,#0F4H
	MOV  	R7,A
	MOV  	A,R6
	ADDC 	A,#01H
	MOV  	R6,A
	CLR  	A
	ADDC 	A,R5
	MOV  	R5,A
	CLR  	A
	ADDC 	A,R4
	MOV  	R4,A
	MOV  	DPTR,#t1?650
	LCALL	?C?LSTXDATA
?C0088:
; 	while(In_count && (tickcount<t1))
			; SOURCE LINE # 359
	MOV  	DPTR,#In_count
	MOVX 	A,@DPTR
	JZ   	?C0089
	MOV  	DPTR,#t1?650
	MOVX 	A,@DPTR
	MOV  	R4,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R5,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R6,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R7,A
	MOV  	DPTR,#tickcount
	MOVX 	A,@DPTR
	MOV  	R0,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R1,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R2,A
	INC  	DPTR
	MOVX 	A,@DPTR
	MOV  	R3,A
	CLR  	C
	LCALL	?C?ULCMP
	JC   	?C0088

⌨️ 快捷键说明

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