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

📄 sdcmd.s

📁 mega128的串口发送文件.可以发送0X55上位机使用串口调试工具就可以接收了.
💻 S
📖 第 1 页 / 共 5 页
字号:
; 			 INT8U resptype  : 响应类型						  INT8U resptype  : response type
; 			 INT32U parameter: 块操作参数			 		  INT32U parameter: parameter of block operation
; ** 输   出: 0:   正确    >0:   错误码		  		Output:	  0:  right		>0:  error code
; *********************************************************************************************************************/
; uint8 SD_BlockCommand(uint8 cmd, uint8 resptype, uint32 parameter)
; {
	.dbline 102
; 	uint8 param[4],resp,ret;
; 	
; 	parameter <<= SD_BLOCKSIZE_NBITS;					 /* 调整地址:左移9位 adjust address: move 9 bits left */
	ldi R24,9
	ldi R25,0
	movw R30,R28
	ldd R2,z+13
	ldd R3,z+14
	ldd R4,z+15
	ldd R5,z+16
	st -y,R24
	movw R16,R2
	movw R18,R4
	xcall lsl32
	movw R30,R28
	std z+13,R16
	std z+14,R17
	std z+15,R18
	std z+16,R19
	.dbline 104
; 
; 	SD_PackParam(param, parameter);						 /* 将参数转化为字节形式 change the parameter to bytes form */	
	movw R30,R28
	ldd R2,z+13
	ldd R3,z+14
	ldd R4,z+15
	ldd R5,z+16
	std y+0,R4
	std y+1,R5
	movw R18,R2
	movw R16,R28
	subi R16,252  ; offset = 4
	sbci R17,255
	xcall _SD_PackParam
	.dbline 106
; 
; 	ret = SD_SendCmd(cmd, param, resptype, &resp);
	movw R24,R28
	adiw R24,8
	std y+3,R25
	std y+2,R24
	std y+0,R22
	movw R18,R28
	subi R18,252  ; offset = 4
	sbci R19,255
	mov R16,R20
	xcall _SD_SendCmd
	mov R20,R16
	.dbline 107
; 	if (ret != SD_NO_ERR)
	tst R16
	breq L24
	.dbline 108
; 	   	 return ret;							 		 /* 结束数据传输失败 stop transmission operation fail */
	xjmp L23
L24:
	.dbline 110
; 	
; 	if (resp != 0)
	ldd R2,y+8
	tst R2
	breq L26
	.dbline 111
; 		 return SD_ERR_CMD_RESP;		 				 /* 响应错误 response is error */
	ldi R16,18
	xjmp L23
L26:
	.dbline 113
; 		 
; 	return SD_NO_ERR;
	clr R16
	.dbline -2
L23:
	adiw R28,9
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym l resp 8 c
	.dbsym l param 4 A[4:4]c
	.dbsym r ret 20 c
	.dbsym l parameter 13 l
	.dbsym r resptype 22 c
	.dbsym r cmd 20 c
	.dbend
	.area lit(rom, con, rel)
L29:
	.byte 0,0
	.byte 0,0
	.area text(rom, con, rel)
	.dbfile D:\new_sd\SD\SD\sdcmd.c
	.dbfunc e SD_ResetSD _SD_ResetSD fc
;           resp -> y+8
;          param -> y+4
	.even
_SD_ResetSD::
	sbiw R28,9
	.dbline -1
	.dbline 131
; }
; 
; 	/*
; 	************************************************
; 	
; 	 	下面为SD卡SPI命令
; 
; 	************************************************
; 	*/
; 	
; /********************************************************************************************************************
; ** 函数名称: INT8U SD_ResetSD()						Name:	  INT8U SD_ResetSD()
; ** 功能描述: 复位SD卡								Function: reset sd card
; ** 输   入: 无										Input:	  NULL
; ** 输   出: 0:   正确    >0:   错误码		  		Output:	  0:  right		>0:  error code
; *********************************************************************************************************************/
; uint8 SD_ResetSD(void)		/////
; {
	.dbline 132
; 	uint8 param[4] = {0,0,0,0},resp;
	ldi R24,<L29
	ldi R25,>L29
	movw R30,R28
	adiw R30,4
	ldi R16,4
	ldi R17,0
	st -y,R31
	st -y,R30
	st -y,R25
	st -y,R24
	xcall asgncblk
	.dbline 134
; 	
;     return (SD_SendCmd(CMD0, param, CMD0_R, &resp));	/* 复位命令 command that reset sd card */
	movw R24,R28
	adiw R24,8
	std y+3,R25
	std y+2,R24
	ldi R24,1
	std y+0,R24
	movw R18,R28
	subi R18,252  ; offset = 4
	sbci R19,255
	clr R16
	xcall _SD_SendCmd
	.dbline -2
L28:
	adiw R28,9
	.dbline 0 ; func end
	ret
	.dbsym l resp 8 c
	.dbsym l param 4 A[4:4]c
	.dbend
	.area lit(rom, con, rel)
L31:
	.byte 0,0
	.byte 0,0
	.area text(rom, con, rel)
	.dbfile D:\new_sd\SD\SD\sdcmd.c
	.dbfunc e SD_ReadCSD _SD_ReadCSD fc
;           resp -> y+8
;          param -> y+4
;            ret -> R10
;         recbuf -> R22,R23
;         csdlen -> R20
	.even
_SD_ReadCSD::
	xcall push_gset3
	movw R22,R18
	mov R20,R16
	sbiw R28,9
	.dbline -1
	.dbline 145
; }
; 
; /********************************************************************************************************************
; ** 函数名称: INT8U SD_ReadCSD()						Name:	  INT8U SD_ReadCSD()
; ** 功能描述: 读SD卡的CSD寄存器						Function: read CSD register of sd card 
; ** 输   入: INT8U csdlen  : 寄存器长度(固定为16)			  INT8U csdlen  : len of register (fixed,is 16)
; 			 INT8U *recbuf : 接收缓冲区					      INT8U *recbuf : recbuffer	
; ** 输   出: 0:   正确    >0:   错误码		  		Output:	  0:  right		>0:  error code
; *********************************************************************************************************************/
; uint8 SD_ReadCSD(uint8 csdlen, uint8 *recbuf)
; {
	.dbline 146
;     uint8 param[4] = {0,0,0,0},resp,ret;
	ldi R24,<L31
	ldi R25,>L31
	movw R30,R28
	adiw R30,4
	ldi R16,4
	ldi R17,0
	st -y,R31
	st -y,R30
	st -y,R25
	st -y,R24
	xcall asgncblk
	.dbline 148
;   
;     ret = SD_SendCmd(CMD9, param, CMD9_R, &resp);		/* 读CSD寄存器命令 command that read CSD register */
	movw R24,R28
	adiw R24,8
	std y+3,R25
	std y+2,R24
	ldi R24,1
	std y+0,R24
	movw R18,R28
	subi R18,252  ; offset = 4
	sbci R19,255
	ldi R16,9
	xcall _SD_SendCmd
	mov R10,R16
	.dbline 149
;     if (ret != SD_NO_ERR) 									
	tst R16
	breq L32
	.dbline 150
;         return ret;									
	xjmp L30
L32:
	.dbline 152
;   
;     if (resp != 0)
	ldd R2,y+8
	tst R2
	breq L34
	.dbline 153
;         return SD_ERR_CMD_RESP;							/* 响应错误 response is error */
	ldi R16,18
	xjmp L30
L34:
	.dbline 155
;     
; 	return (SD_ReadRegister(csdlen, recbuf));
	std y+1,R23
	std y+0,R22
	mov R2,R20
	clr R3
	clr R4
	clr R5
	movw R16,R2
	movw R18,R4
	xcall _SD_ReadRegister
	.dbline -2
L30:
	adiw R28,9
	xcall pop_gset3
	.dbline 0 ; func end
	ret
	.dbsym l resp 8 c
	.dbsym l param 4 A[4:4]c
	.dbsym r ret 10 c
	.dbsym r recbuf 22 pc
	.dbsym r csdlen 20 c
	.dbend
	.area lit(rom, con, rel)
L37:
	.byte 0,0
	.byte 0,0
	.area text(rom, con, rel)
	.dbfile D:\new_sd\SD\SD\sdcmd.c
	.dbfunc e SD_StopTransmission _SD_StopTransmission fc
;           resp -> y+8
;          param -> y+4
	.even
_SD_StopTransmission::
	sbiw R28,9
	.dbline -1
	.dbline 188
; }
; 
; /*******************************************************************************************************************
; ** 函数名称: INT8U SD_ReadCID()						Name:	  INT8U SD_ReadCID()
; ** 功能描述: 读SD卡的CID寄存器						Function: read CID register of sd card
; ** 输   入: INT8U cidlen  : 寄存器长度(固定为16)			  INT8U cidlen  : len of register (fixed,is 16)
; 			 INT8U *recbuf : 接收缓冲区					      INT8U *recbuf : recbuffer	
; ** 输   出: 0:   正确    >0:   错误码		  		Output:	  0:  right		>0:  error code
; ********************************************************************************************************************/
; #if SD_ReadCID_EN
; uint8 SD_ReadCID(uint8 cidlen, uint8 *recbuf)
; {
;     uint8 param[4] = {0,0,0,0},resp,ret;
;  
;     ret = SD_SendCmd(CMD10, param, CMD10_R, &resp);		/* 读CID寄存器命令 command that read CID register */
;     if ( ret != SD_NO_ERR)
;    		return ret;			  									
;    
;     if (resp != 0)
;         return SD_ERR_CMD_RESP;							/* 响应错误 response is error */
;       
;   	return (SD_ReadRegister(cidlen, recbuf));
; }
; #endif
; 
; /********************************************************************************************************************
; ** 函数名称: INT8U SD_StopTransmission()			Name:	  INT8U SD_StopTransmission()
; ** 功能描述: 停止数据传输							Function: stop data transmission 
; ** 输   入: 无								 		Input:    NULL
; ** 输   出: 0:   正确    >0:   错误码		  		Output:	  0:  right		>0:  error code
; *********************************************************************************************************************/
; uint8 SD_StopTransmission(void)
; {
	.dbline 189
; 	uint8 param[4] = {0,0,0,0},resp;
	ldi R24,<L37
	ldi R25,>L37
	movw R30,R28
	adiw R30,4
	ldi R16,4
	ldi R17,0
	st -y,R31
	st -y,R30
	st -y,R25
	st -y,R24
	xcall asgncblk
	.dbline 191
; 	
;  	return (SD_SendCmd(CMD12, param, CMD12_R, &resp));	/* 结束数据传输命令失败 stop transmission command fail */
	movw R24,R28
	adiw R24,8
	std y+3,R25
	std y+2,R24
	ldi R24,2
	std y+0,R24
	movw R18,R28
	subi R18,252  ; offset = 4
	sbci R19,255
	ldi R16,12
	xcall _SD_SendCmd
	.dbline -2
L36:
	adiw R28,9
	.dbline 0 ; func end
	ret
	.dbsym l resp 8 c
	.dbsym l param 4 A[4:4]c
	.dbend
	.area lit(rom, con, rel)
L39:
	.byte 0,0
	.byte 0,0
	.area text(rom, con, rel)
	.dbfile D:\new_sd\SD\SD\sdcmd.c
	.dbfunc e SD_ReadCard_Status _SD_ReadCard_Status fc
;          param -> y+4
;         buffer -> R20,R21
;            len -> R22
	.even
_SD_ReadCard_Status::
	xcall push_gset2
	movw R20,R18
	mov R22,R16
	sbiw R28,8
	.dbline -1
	.dbline 202
; }
; 
; /*********************************************************************************************************************
; ** 函数名称: INT8U SD_ReadCard_Status()				Name:	  INT8U SD_ReadCard_Status()
; ** 功能描述: 读SD卡的 Card Status 寄存器			Function: read Card Status register of sd card 
; ** 输   入: INT8U len: 	 寄存器长度(固定为2)			  INT8U len:      len of register (fixed,is 2)
; 			 INT8U *recbuf : 接收缓冲区					      INT8U *recbuf : recbuffer
; ** 输   出: 0:   正确    >0:   错误码		  		Output:	  0:  right		>0:  error code
; **********************************************************************************************************************/
; uint8 SD_ReadCard_Status(uint8 len, uint8 *buffer)
; {
	.dbline 203
;     uint8 param[4] = {0,0,0,0};
	ldi R24,<L39
	ldi R25,>L39
	movw R30,R28
	adiw R30,4
	ldi R16,4
	ldi R17,0
	st -y,R31
	st -y,R30
	st -y,R25
	st -y,R24
	xcall asgncblk
	.dbline 205
; 
;     return (SD_SendCmd(CMD13, param, CMD13_R, buffer)); /* 读 Card Status 寄存器 */
	std y+3,R21
	std y+2,R20
	ldi R24,3
	std y+0,R24
	movw R18,R28
	subi R18,252  ; offset = 4
	sbci R19,255
	ldi R16,13
	xcall _SD_SendCmd
	.dbline -2
L38:
	adiw R28,8
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym l param 4 A[4:4]c
	.dbsym r buffer 20 pc
	.dbsym r len 22 c
	.dbend
	.dbfunc e SD_SetBlockLen _SD_SetBlockLen fc
;           resp -> y+8
;          param -> y+4
;            ret -> R20
;         length -> y+11
	.even
_SD_SetBlockLen::
	xcall push_arg4
	xcall push_gset1
	sbiw R28,9
	.dbline -1
	.dbline 217
;     									 	 			/* read register of Card Status */
; }
; 
; 
; /********************************************************************************************************************
; ** 函数名称: INT8U Sd_SetBlockLen()					Name:	  INT8U Sd_SetBlockLen()
; ** 功能描述: 设置一个块的长度						Function: set a block len of sd card 
; ** 输   入: INT32U length	: 块的长度值			Input:	  INT32U length	: the length of a block
; ** 输   出: 0:   正确    >0:   错误码		  		Output:	  0:  right		>0:  error code
; *********************************************************************************************************************/
; uint8 SD_SetBlockLen(uint32 length)
; {
	.dbline 220
; 	uint8 param[4],resp,ret;
;   
;     SD_PackParam(param, length);					/* 将参数转化为字节形式 change the parameter to bytes form */
	movw R30,R28
	ldd R2,z+11
	ldd R3,z+12
	ldd R4,z+13
	ldd R5,z+14
	std y+0,R4
	std y+1,R5
	movw R18,R2
	movw R16,R28
	subi R16,252  ; offset = 4
	sbci R17,255
	xcall _SD_PackParam
	.dbline 222
;           												
;     ret = SD_SendCmd(CMD16, param, CMD16_R, &resp);
	movw R24,R28
	adiw R24,8
	std y+3,R25
	std y+2,R24
	ldi R24,1
	std y+0,R24
	movw R18,R28
	subi R18,252  ; offset = 4
	sbci R19,255
	ldi R16,16
	xcall _SD_SendCmd
	mov R20,R16
	.dbline 223
;     if (ret != SD_NO_ERR)
	tst R16
	breq L41
	.dbline 224
;  		return ret;									/* 设置块的长度为length失败 set the length of block to length fail */
	xjmp L40
L41:
	.dbline 226
; 	
; 	if (resp != 0)
	ldd R2,y+8
	tst R2
	breq L43
	.dbline 227
;     	return SD_ERR_CMD_RESP;			   			/* 响应错误 response is error */
	ldi R16,18
	xjmp L40
L43:
	.dbline 229
;     
;     return SD_NO_ERR; 								/* 返回执行成功 return perform sucessfully */			
	clr R16
	.dbline -2
L40:
	adiw R28,9
	xcall pop_gset1
	adiw R28,4
	.dbline 0 ; func end
	ret
	.dbsym l resp 8 c
	.dbsym l param 4 A[4:4]c
	.dbsym r ret 20 c
	.dbsym l length 11 l
	.dbend
	.dbfunc e SD_ReadSingleBlock _SD_ReadSingleBlock fc
;      blockaddr -> y+4
	.even
_SD_ReadSingleBlock::
	xcall push_arg4
	sbiw R28,4
	.dbline -1
	.dbline 239
; }
; 
; /********************************************************************************************************************
; ** 函数名称: INT8U SD_ReadSingleBlock()				Name:	  INT8U SD_ReadSingleBlock()
; ** 功能描述: 读单块命令								Function: read single block command
; ** 输   入: INT32U blockaddr: 块地址				Input:	  INT32U blockaddr: block address
; ** 输   出: 0:   正确    >0:   错误码		  		Output:	  0:  right	>0:  error code
; *********************************************************************************************************************/
; uint8 SD_ReadSingleBlock(uint32 blockaddr)
; {
	.dbline 240
; 	return (SD_BlockCommand(CMD17, CMD17_R, blockaddr)); /* 读单块命令 command that read single block */
	movw R30,R28
	ldd R2,z+4
	ldd R3,z+5
	ldd R4,z+6
	ldd R5,z+7
	std y+0,R2
	std y+1,R3
	std y+2,R4
	std y+3,R5
	ldi R18,1
	ldi R16,17
	xcall _SD_BlockCommand
	.dbline -2
L45:

⌨️ 快捷键说明

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