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

📄 sd001spi模式.asm

📁 用C8051F020的SPI模式控制SD卡的读写
💻 ASM
📖 第 1 页 / 共 2 页
字号:

$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 + -