📄 sd001spi模式.asm
字号:
$include (c8051F020.inc) ; Include register definition file
;-----------------------------------------------------------------------------
; EQUATES
;-----------------------------------------------------------------------------
CS BIT P0.4
CMD_BUFF1 EQU 31H
CMD_BUFF2 EQU 32H
CMD_BUFF3 EQU 33H
CMD_BUFF4 EQU 34H
CMD_BUFF5 EQU 35H
CMD_BUFF6 EQU 36H
ROT_COUNT EQU 37H
ACK_BUFF EQU 38H
READ_COUNT1 EQU 39H
READ_COUNT11 EQU 3AH
READ_COUNT2 EQU 3BH
READ_COUNT22 EQU 3CH
READ_ADD1 EQU 3DH
READ_ADD2 EQU 3EH
WRITE_COUNT1 EQU 3FH
WRITE_COUNT2 EQU 40H
WRITE_DATA1 EQU 41H
READ_COUNT3 EQU 42H
READ_COUNT33 EQU 43H
;-----------------------------------------------------------------------------
; VARIABLES
;-----------------------------------------------------------------------------
;-----------------------------------------------------------------------------
; RESET and INTERRUPT VECTORS
;-----------------------------------------------------------------------------
; Reset Vector
CSEG AT 00h
ljmp Main ; Jump beyond interrupt vector space.
;-----------------------------------------------------------------------------; CODE SEGMENT;-----------------------------------------------------------------------------RAM_Fill segment CODE
rseg RAM_Fill ; Switch to this code segment.
using 0 ; Specify register bank for the
; following program code.Main: ; Disable the WDT. (IRQs not enabled at this point.) ; If interrupts were enabled, we would need to explicitly
; disable them so that the 2nd move to WDTCN occurs no more
; than four clock cycles after the first move to WDTCN. mov WDTCN, #0DEh mov WDTCN, #0ADh
mov R0, #00H ; use R0 as pointer to memory location
loop: mov @R0, AR0 ; write to indexed address with
; address value
djnz R0, loop ; check if finished
;====================================================================================================
;-------------------------------
INIT:
;---------------外部RAM清0------------
MOV DPH,#00H
MOV DPL,#00H
MOV R7,#0
MOV R6,#0
MOV A,#0
INIT_1:
MOVX @DPTR,A
INC DPTR
DJNZ R6,INIT_1
DJNZ R7,INIT_1
;----------------
MOV XBR2,#40H ;使能交叉开关
MOV XBR0,#02H ;SPI0 的SCK、MISO、MOSI 和NSS 连到4 个端口引脚。
MOV P0MDOUT,#0DH
MOV SPI0CFG,#0C7H ;?????????????/
MOV SPI0CN,#03H
MOV SPI0CKR,#00H ;11M
;--------------------
MOV OSCICN,#00010111B ;INTER 16Mhz
MOV OSCXCN,#01100111B
;-------------延时40MS------------------------
DEL:
MOV R7,#5
DEL1:
MOV R6,#0
DEL2:
MOV R5,#0
DJNZ R5,$
DJNZ R6,DEL2
DJNZ R7,DEL1
MOV A,OSCXCN
ANL A,#80H
JZ DEL
MOV OSCICN,#00011011B ;开启外部时钟
MOV ROT_COUNT,#10
TEST:
MOV SPI0DAT,#98H
MOV SPI0DAT,#78H
CLR CS
SETB CS
CLR CS
SETB CS
;--------------------------
MAIN_LOOP:
LCALL START
; LCALL READ_CSD
LCALL WRITE_BLOCK
; LCALL READ_BLOCK
; LCALL EREASE_BLOCK
LCALL READ_BLOCK
; LCALL READ_MUL_BLOCK
LJMP END1
;---------------------------
START:
MOV SPI0DAT,#0FFH
START_WAIT:
JB TXBSY,START_WAIT
DJNZ ROT_COUNT,START
MOV ROT_COUNT,#30H
;--------------发送CMD0进行初始化操作--------
MOV CMD_BUFF1,#40H
MOV CMD_BUFF2,#00H
MOV CMD_BUFF3,#00H
MOV CMD_BUFF4,#00H
MOV CMD_BUFF5,#00H
MOV CMD_BUFF6,#95H
START_1:
LCALL CMD_ENTRY
SETB CS
MOV SPI0DAT,#0FFH
START_1_1:
JB TXBSY,START_1_1
MOV A,ACK_BUFF
CJNE A,#01H,START_1
;---------------发送CMD55提示接下来指令为特殊指令-----------
START_2:
MOV CMD_BUFF1,#77H
MOV CMD_BUFF2,#00H
MOV CMD_BUFF3,#00H
MOV CMD_BUFF4,#00H
MOV CMD_BUFF5,#00H
MOV CMD_BUFF6,#0FFH
START_2_0:
LCALL CMD_ENTRY
SETB CS
MOV SPI0DAT,#0FFH
START_2_1:
JB TXBSY,START_2_1
MOV A,ACK_BUFF
CJNE A,#01H,START_2_0
;------------发送ACMD41初始化---------------------
MOV CMD_BUFF1,#69H
MOV CMD_BUFF2,#00H
MOV CMD_BUFF3,#00H
MOV CMD_BUFF4,#00H
MOV CMD_BUFF5,#00H
MOV CMD_BUFF6,#0FFH
START_3:
LCALL CMD_ENTRY
SETB CS
MOV SPI0DAT,#0FFH
START_3_1:
JB TXBSY,START_3_1
MOV A,ACK_BUFF
CJNE A,#00H,START_2
;------------- 发送CMD59 关CRC--------------------
MOV CMD_BUFF1,#7BH
MOV CMD_BUFF2,#00H
MOV CMD_BUFF3,#00H
MOV CMD_BUFF4,#00H
MOV CMD_BUFF5,#00H
MOV CMD_BUFF6,#0FFH
START_4:
LCALL CMD_ENTRY
SETB CS
MOV SPI0DAT,#0FFH
START_4_1:
JB TXBSY,START_4_1
MOV A,ACK_BUFF
CJNE A,#00H,START_4
RET
;-----------------------------------------------
;-------------读CSD寄存器---------------
READ_CSD:
MOV CMD_BUFF1,#49H
MOV CMD_BUFF2,#00H
MOV CMD_BUFF3,#00H
MOV CMD_BUFF4,#00H
MOV CMD_BUFF5,#00H
MOV CMD_BUFF6,#0FFH
READ_CSD_1:
LCALL CMD_ENTRY
MOV A,ACK_BUFF
CJNE A,#00H,READ_CSD_1
;----------------------
MOV READ_COUNT1,#16
MOV READ_COUNT11,#16
MOV READ_COUNT2,#1
MOV READ_COUNT22,#1
MOV READ_ADD1,#00H
MOV READ_ADD2,#00H
LCALL READ_DATA
RET
;-------------------------------
;---------------读一个数据块---------------------
READ_BLOCK:
;----------------设置读数据长度为512个字节---------
MOV CMD_BUFF1,#50H
MOV CMD_BUFF2,#00H
MOV CMD_BUFF3,#00H
MOV CMD_BUFF4,#02H
MOV CMD_BUFF5,#00H
MOV CMD_BUFF6,#0FFH
READ_BLOCK_1:
LCALL CMD_ENTRY
SETB CS
MOV SPI0DAT,#0FFH
READ_BLOCK_1_1:
JB TXBSY,READ_BLOCK_1_1
MOV A,ACK_BUFF
CJNE A,#00H,READ_BLOCK_1
;--------------发送读数据指令------------------
MOV CMD_BUFF1,#51H
MOV CMD_BUFF2,#00H
MOV CMD_BUFF3,#1EH
MOV CMD_BUFF4,#0B0H
MOV CMD_BUFF5,#10H
MOV CMD_BUFF6,#0FFH
READ_BLOCK_2_1:
LCALL CMD_ENTRY
MOV A,ACK_BUFF
CJNE A,#00H,READ_BLOCK_2_1
;-------------读512个字节数据-----------------
MOV READ_COUNT1,#128
MOV READ_COUNT11,#128
MOV READ_COUNT2,#4
MOV READ_COUNT22,#4
MOV READ_ADD1,#20H
MOV READ_ADD2,#00H
LCALL READ_DATA
RET
;----------------------------------------------
READ_MUL_BLOCK:
;----------------设置多倍读数据长度为512个字节---------
MOV CMD_BUFF1,#50H
MOV CMD_BUFF2,#00H
MOV CMD_BUFF3,#00H
MOV CMD_BUFF4,#02H
MOV CMD_BUFF5,#00H
MOV CMD_BUFF6,#0FFH
READ_MUL_BLOCK_1:
LCALL CMD_ENTRY
SETB CS
MOV SPI0DAT,#0FFH
READ_MUL_BLOCK_1_1:
JB TXBSY,READ_MUL_BLOCK_1_1
MOV A,ACK_BUFF
CJNE A,#00H,READ_MUL_BLOCK_1
;--------------发送读多个数据块指令------------
READ_MUL_BLOCK_2:
MOV CMD_BUFF1,#52H
MOV CMD_BUFF2,#00H
MOV CMD_BUFF3,#00H
MOV CMD_BUFF4,#00H
MOV CMD_BUFF5,#00H
MOV CMD_BUFF6,#0FFH
READ_MUL_BLOCK_2_1:
LCALL CMD_ENTRY
MOV A,ACK_BUFF
CJNE A,#00H,READ_MUL_BLOCK_2_1
;------------读多个数据块---------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -