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

📄 sapmel sdcard reading driver.asm

📁 基於MCU c51/8051 讀寫SD/MMC card 再以USB 傳回電腦的範例程序
💻 ASM
字号:
;------------------------------------------------------------------------------------------
		;SPI PINS
;------------------------------------------------------------------------------------------
CS              EQU 	P1.0
MOSI        	EQU 	P1.1
SCK             EQU		P1.2
MISO       		EQU 	P1.3

A3            	EQU		20H
A2             	EQU     21H
A1             	EQU     22H
A0             	EQU     23H

COUNT1			EQU		24H
COUNT2			EQU		25H

;------------------------------------------

ORG 0000H
;******************* MAIN ************************
MAIN:
	LCALL INT_SD
	LCALL SD_READ

LJMP $
;-------------------------------------------------
 

;********************* SD FUNCTION******************
INT_SD:	
	MOV A3,#00H
	MOV A2,#00H
	MOV A1,#00H
	MOV A0,#00H

	SETB MOSI
	SETB MISO
	SETB SCK
	CLR CS
	
	MOV R7,#90H
	INT_LOOP:
		SETB SCK
		NOP
		NOP
		CLR SCK
		DJNZ R7,INT_LOOP
	CHECK_R1_CMD0:		;send CMD0 until get 1
 		LCALL CMD0
		LCALL GET_RES
		CJNE  R7,#01H,CHECK_R1_CMD0	
	CHECK_R1_CMD1:
		LCALL CMD1
		LCALL GET_RES
		CJNE  R7,#00H,CHECK_R1_CMD1
	CHECK_R1_CMD16:
		LCALL CMD16
		LCALL GET_RES
		CJNE  R7,#00H,CHECK_R1_CMD16
RET


;--------------------------------------------
			;COMMAND TO SD CARD
;--------------------------------------------
CMD0:
	CLR CS
	MOV R7, #40H
	LCALL SPIWRITE
	MOV R7, #00H
	LCALL SPIWRITE
	MOV R7, #00H
	LCALL SPIWRITE
	MOV R7, #00H
	LCALL SPIWRITE
	MOV R7, #00H
	LCALL SPIWRITE
	MOV R7, #95H
	LCALL SPIWRITE
RET
       
CMD1:  
	CLR CS
	MOV R7, #41H
	LCALL SPIWRITE
	MOV R7, #00H
	LCALL SPIWRITE
	MOV R7, #00H
	LCALL SPIWRITE
	MOV R7, #00H
	LCALL SPIWRITE
	MOV R7, #00H
	LCALL SPIWRITE
	MOV R7, #95H
	LCALL SPIWRITE
RET

CMD16:
	CLR CS
	MOV R7, #50H;
	LCALL SPIWRITE;
	MOV R7, #00H;
	LCALL SPIWRITE;
	MOV R7, #00H;
	LCALL SPIWRITE;
	MOV R7, #02H;
	LCALL SPIWRITE;
	MOV R7, #00H;
	LCALL SPIWRITE;
	MOV R7, #95H;
	LCALL SPIWRITE;
RET

CMD17: 
	CLR CS
	MOV R7, #51H
	LCALL SPIWRITE
	MOV R7, A3
	LCALL SPIWRITE
	MOV R7, A2
	LCALL SPIWRITE
	MOV R7, A1
	LCALL SPIWRITE
	MOV R7, A0
	LCALL SPIWRITE
	MOV R7, #95H
	LCALL SPIWRITE
RET      

CMD24: 
	CLR CS
	MOV R7, #58H
	LCALL SPIWRITE
	MOV R7, A3
	LCALL SPIWRITE
	MOV R7, A2
	LCALL SPIWRITE
	MOV R7, A1
	LCALL SPIWRITE
	MOV R7, A0
	LCALL SPIWRITE
	MOV R7, #95H
	LCALL SPIWRITE
RET      

;-----------------------------------------------------

;***************** SPI FUNCTION ********************************
SPIWRITE:
	MOV A, R7		; Store passed variable in A
	MOV R7,#08H		; Load R7 to count bits
	;CLR C
	SPI_LOOP:
		SETB SCK		; Clock High
		;NOP
		;NOP
		RLC A			; Rotate MSB into Carry Bit
		MOV MOSI,C		; Move bit out to MOSI
		SETB MISO
		CLR SCK			; Clock Low
		NOP
		;NOP
		MOV C, MISO		;GET ONE BIT FROM SD CARD
	DJNZ R7,SPI_LOOP	; Loop for another bit until done
		
	RLC A
	MOV R7, A
RET

GET_RES:						;GETTING RESPONSE
		MOV   R7, #08H          ; Load R7 to count bits
RESLoop:            
        SETB  SCK;
        JB    4FH , TRANSFER
        JB    MISO, SKIP
        SETB  4FH;
        MOV   R7, #08H       
TRANSFER:   
	MOV   C, MISO           ;Move MISO into Carry Bit
        RLC   A;        
SKIP:       
        CLR   SCK               ;Clock Low
        DJNZ  R7, RESLoop                ; Loop for another bit until finished

        MOV   R7, A
        JNB   4FH ,GET_RES;
        CLR   4FH               ; Store return value in R7

RET 

SD_READ:	
        LCALL CMD17
        LCALL GET_RES
        CJNE R7, #00H, SD_READ
      	
START_TOKEN:
	SETB SCK
	NOP
	NOP
	CLR SCK
	MOV C, MISO
	RLC A
	CJNE A, #0FEH, START_TOKEN
	
	MOV COUNT1, #04H		;ONE BLOCK=512 BYTES
R_BLOCK:
	MOV R1, #80H
	
LOOP_128:
	MOV R7, #0FFH
	LCALL SPIWRITE
	;PUSH ACC
	MOV A , R7
	MOV @R1, A
	;POP ACC
	
	MOV A, R1
	INC A
	MOV R1, A
	
	CJNE R1, #00H, LOOP_128
	DJNZ COUNT1, R_BLOCK
	
	MOV R7, #0FFH
	LCALL SPIWRITE
	MOV R7, #0FFH
	LCALL SPIWRITE
RET


;---------------------------------------------------------------

END

⌨️ 快捷键说明

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