📄 sapmel sdcard reading driver.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 + -