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

📄 sd001spi模式.asm

📁 用C8051F020的SPI模式控制SD卡的读写
💻 ASM
📖 第 1 页 / 共 2 页
字号:
              MOV READ_COUNT1,#128
							MOV	READ_COUNT11,#128
							MOV	READ_COUNT2,#4
							MOV	READ_COUNT22,#4
              MOV READ_COUNT3,#6
							MOV	READ_COUNT33,#6
							MOV	READ_ADD1,#00H
							MOV	READ_ADD2,#00H
READ_MUL_BLOCK_DATA:
              CLR CS
							MOV	DPL,READ_ADD1
							MOV	DPH,READ_ADD2                   
READ_MUL_BLOCK_DATA_1:
							MOV	SPI0DAT,#0FFH
READ_MUL_BLOCK_DATA_1_1:
              JB TXBSY,READ_MUL_BLOCK_DATA_1_1
							MOV	A,SPI0DAT
							JB ACC.0,READ_MUL_BLOCK_DATA_1
READ_MUL_BLOCK_DATA_2:
              MOV	SPI0DAT,#0FFH
READ_MUL_BLOCK_DATA_2_1:
              JB TXBSY,READ_MUL_BLOCK_DATA_2_1														
						  MOV	A,SPI0DAT
						  MOVX	@DPTR,A
							INC	DPTR
							DJNZ	READ_COUNT1,READ_MUL_BLOCK_DATA_2
              MOV	READ_COUNT1,READ_COUNT11
							DJNZ	READ_COUNT2,READ_MUL_BLOCK_DATA_2
							MOV	READ_COUNT2,READ_COUNT22
READ_MUL_BLOCK_DATA_3:
              MOV	SPI0DAT,#0FFH
READ_MUL_BLOCK_DATA_3_1:
              JB TXBSY,READ_MUL_BLOCK_DATA_3_1
							MOV	SPI0DAT,#0FFH									
READ_MUL_BLOCK_DATA_3_2:						 
						  JB TXBSY,READ_MUL_BLOCK_DATA_3_2
              DJNZ READ_COUNT3,READ_MUL_BLOCK_DATA_1
							MOV	READ_COUNT3,READ_COUNT33
              LCALL SEND_CMD12
						  RET              

;-----------------------------------------------------
;---------------停止多数据块读操作----------------------
SEND_CMD12:
            MOV	CMD_BUFF1,#4CH
            MOV	CMD_BUFF2,#00H
					  MOV	CMD_BUFF3,#00H
			    	MOV	CMD_BUFF4,#00H
						MOV	CMD_BUFF5,#00H
				  	MOV	CMD_BUFF6,#0FFH        
SEND_CMD12_1:
						LCALL	CMD_ENTRY
SEND_CMD12_2:
            MOV	SPI0DAT,#0FFH
SEND_CMD12_3:                      ;应答为R1B
            JB TXBSY,SEND_CMD12_3
						MOV	A,SPI0DAT
  					JZ SEND_CMD12_2
					  MOV	A,ACK_BUFF
					  CJNE	A,#00H,SEND_CMD12_1
					  RET		               

;-----------------------------------------------------
READ_DATA:
              CLR CS
							MOV	DPL,READ_ADD1
							MOV	DPH,READ_ADD2                   
READ_DATA_1:
							MOV	SPI0DAT,#0FFH
READ_DATA_1_1:
              JB TXBSY,READ_DATA_1_1
							MOV	A,SPI0DAT
							JB ACC.0,READ_DATA_1
READ_DATA_2:
              MOV	SPI0DAT,#0FFH
READ_DATA_2_1:
              JB TXBSY,READ_DATA_2_1														
						  MOV	A,SPI0DAT
						  MOVX	@DPTR,A
							INC	DPTR
							DJNZ	READ_COUNT1,READ_DATA_2
              MOV	READ_COUNT1,READ_COUNT11
							DJNZ	READ_COUNT2,READ_DATA_2
							MOV	READ_COUNT2,READ_COUNT22
READ_DATA_3:
              MOV	SPI0DAT,#0FFH
READ_DATA_3_1:
              JB TXBSY,READ_DATA_3_1
							MOV	SPI0DAT,#0FFH									
READ_DATA_3_2:						 
						  JB TXBSY,READ_DATA_3_2
							SETB CS
              MOV	SPI0DAT,#0FFH
READ_DATA_4:
              JB TXBSY,READ_DATA_4 
              MOV	SPI0DAT,#0FFH
READ_DATA_4_1:
              JB TXBSY,READ_DATA_4_1 
							RET
;------------------------------------------------						  							
;-------------写一个块长度数据------------------
WRITE_BLOCK: 
;--------------送CMD16设置写数据块长度---------------
              MOV	CMD_BUFF1,#50H
							MOV	CMD_BUFF2,#00H
							MOV	CMD_BUFF3,#00H
							MOV	CMD_BUFF4,#02H
							MOV	CMD_BUFF5,#00H
							MOV	CMD_BUFF6,#0FFH
WRITE_BLOCK_1:
							LCALL	CMD_ENTRY
 	            SETB	CS
							MOV	SPI0DAT,#0FFH
WRITE_BLOCK_1_1:
              JB TXBSY,WRITE_BLOCK_1_1
							MOV	A,ACK_BUFF
							CJNE	A,#00H,WRITE_BLOCK_1

 ;------------发送单块写指令CMD24---------------
              MOV	CMD_BUFF1,#58H
              MOV	CMD_BUFF2,#00H
							MOV	CMD_BUFF3,#1EH
							MOV	CMD_BUFF4,#0B0H
							MOV	CMD_BUFF5,#00H
							MOV	CMD_BUFF6,#0FFH          ; ????
WRITE_BLOCK_2:
							LCALL	CMD_ENTRY
              MOV	SPI0DAT,#0FFH
WRITE_BLOCK_2_1:
              JB TXBSY,WRITE_BLOCK_2_1
							MOV	A,ACK_BUFF
							CJNE	A,#00H,WRITE_BLOCK_2
;----------------
							MOV	WRITE_COUNT1,#128
							MOV	WRITE_COUNT2,#4
							MOV	WRITE_DATA1,#0
              MOV	ROT_COUNT,#16
              MOV	SPI0DAT,#0FFH
WRITE_BLOCK_2_2:
              JB TXBSY,WRITE_BLOCK_2_2
							LCALL	WRITE_DATA
							RET
;--------------------------------
WRITE_DATA:
              MOV	SPI0DAT,#0FEH
WRITE_DATA_1:
              JB TXBSY,WRITE_DATA_1
WRITE_DATA_2:
							MOV SPI0DAT,WRITE_DATA1
							INC WRITE_DATA1
WRITE_DATA_2_1:
              JB TXBSY,WRITE_DATA_2_1
							;read data from ram in MCU.
              DJNZ	WRITE_COUNT1,WRITE_DATA_2;jmp
							MOV	  WRITE_COUNT1,#128
							DJNZ	WRITE_COUNT2,WRITE_DATA_2;jmp
              MOV	WRITE_COUNT2,#4
;WRITE_DATA_2jmp:
							;ljmp  WRITE_DATA_2
							MOV	SPI0DAT,#0FFH
WRITE_DATA_3:
              JB TXBSY,WRITE_DATA_3
              MOV	SPI0DAT,#0FFH
WRITE_DATA_3_1:
              JB TXBSY,WRITE_DATA_3_1
              MOV	SPI0DAT,#0FFH
WRITE_DATA_4:
              JB TXBSY,WRITE_DATA_4
							MOV	A,SPI0DAT
							MOV	ACK_BUFF,A
WRITE_DATA_5:
              MOV	SPI0DAT,#0FFH
WRITE_DATA_5_1:
              JB TXBSY,WRITE_DATA_5_1
							MOV	A,SPI0DAT
							JZ WRITE_DATA_5
							SETB CS
							MOV	SPI0DAT,#0FFH
WRITE_DATA_6:
              JB TXBSY,WRITE_DATA_6
              MOV	SPI0DAT,#0FFH
WRITE_DATA_6_1:
              JB TXBSY,WRITE_DATA_6_1
  						RET
;--------------------------------
;--------------擦除指定的数据------------------
EREASE_BLOCK:
;---------------设定擦除数据首地址----------------
              MOV	CMD_BUFF1,#60H
              MOV	CMD_BUFF2,#00H
							MOV	CMD_BUFF3,#50H
							MOV	CMD_BUFF4,#00H
							MOV	CMD_BUFF5,#00H
							MOV	CMD_BUFF6,#0FFH        
EREASE_BLOCK_1:
							LCALL	CMD_ENTRY
							SETB	CS
							MOV	SPI0DAT,#0FFH
EREASE_BLOCK_1_1:
              JB TXBSY,EREASE_BLOCK_1_1
							MOV	A,ACK_BUFF
							CJNE	A,#00H,EREASE_BLOCK_1
;--------------设定擦除数据末地址--------------------
             MOV	CMD_BUFF1,#61H
             MOV	CMD_BUFF2,#00H
						 MOV	CMD_BUFF3,#0F0H
					 	 MOV	CMD_BUFF4,#00H
						 MOV	CMD_BUFF5,#00H
						 MOV	CMD_BUFF6,#0FFH        
EREASE_BLOCK_2:
						 LCALL	CMD_ENTRY
						 SETB	CS
					 	 MOV	SPI0DAT,#0FFH
EREASE_BLOCK_2_1:
              JB TXBSY,EREASE_BLOCK_2_1
							MOV	A,ACK_BUFF
							CJNE	A,#00H,EREASE_BLOCK_2
;--------------发送擦除数据命令---------------------
            MOV	CMD_BUFF1,#66H
            MOV	CMD_BUFF2,#00H
					  MOV	CMD_BUFF3,#00H
			    	MOV	CMD_BUFF4,#00H
						MOV	CMD_BUFF5,#00H
				  	MOV	CMD_BUFF6,#0FFH        
EREASE_BLOCK_3:
						LCALL	CMD_ENTRY
EREASE_BLOCK_3_0:
            MOV	SPI0DAT,#0FFH
EREASE_BLOCK_3_1:                      ;应答为R1B
            JB TXBSY,EREASE_BLOCK_3_1
						MOV	A,SPI0DAT
  					JZ EREASE_BLOCK_3_0
					 	SETB	CS
						MOV	SPI0DAT,#0FFH
EREASE_BLOCK_3_2:
            JB TXBSY,EREASE_BLOCK_3_2
					  MOV	A,ACK_BUFF
					  CJNE	A,#00H,EREASE_BLOCK_3
					  RET		
;--------------------------------------------------
CMD_ENTRY:
              CLR CS
							NOP
							NOP
							MOV	SPI0DAT,CMD_BUFF1
CMD_ENTRY_1:
							JB TXBSY,CMD_ENTRY_1
							MOV	SPI0DAT,CMD_BUFF2
CMD_ENTRY_2:
							JB TXBSY,CMD_ENTRY_2						 							
              MOV	SPI0DAT,CMD_BUFF3
CMD_ENTRY_3:
							JB TXBSY,CMD_ENTRY_3						 							
              MOV	SPI0DAT,CMD_BUFF4
CMD_ENTRY_4:
							JB TXBSY,CMD_ENTRY_4						 							
              MOV	SPI0DAT,CMD_BUFF5
CMD_ENTRY_5:
							JB TXBSY,CMD_ENTRY_5						 							
              MOV	SPI0DAT,CMD_BUFF6
CMD_ENTRY_6:
							JB TXBSY,CMD_ENTRY_6	
              MOV	SPI0DAT,#0FFH
CMD_ENTRY_7:
              JB TXBSY,CMD_ENTRY_7 
CMD_ENTRY_8:
							MOV	SPI0DAT,#0FFH
CMD_ENTRY_9:
					    JB TXBSY,CMD_ENTRY_9
							MOV	A,SPI0DAT
							JB ACC.7,CMD_ENTRY_8
							MOV	ACK_BUFF,A	
							MOV	 SPI0DAT,#0FFH
							RET					 							
;---------------------------
		       
END1:								
	    					
              sjmp  $                 ; loop here forever


;-----------------------------------------------------------------------------
; End of file.

END

⌨️ 快捷键说明

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