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

📄 sdcmd.s

📁 mega128的串口发送文件.可以发送0X55上位机使用串口调试工具就可以接收了.
💻 S
📖 第 1 页 / 共 5 页
字号:
;    	if (ret != SD_NO_ERR)										/* command that read the numbers of block written correctly */
;    		return ret;											    
;    		 														
; 	if (resp != 0)
;     	return SD_ERR_CMD_RESP;									/* 响应错误 response is error */
;     		
;     ret = SD_ReadBlockData(4, tmp);								/* 读块数 read the numbvers of block */
;     if (ret != SD_NO_ERR)
;     	return ret;
;     	
;     *blocknum = (tmp[0] << 24) + (tmp[1] << 16) + (tmp[2] << 8) + tmp[3];	
;     															/* 转换为32位 change to 32 bits */
; 
; 	return SD_NO_ERR;    										/* 返回执行成功 return perform sucessfully */		
; }
; #endif
; 
; 		/*********************************************************
; 		
; 		    			下面为一些数据传输函数
; 		
; 		**********************************************************/
; 
; /********************************************************************************************************************
; ** 函数名称: INT8U SD_ReadRegister()				Name:	  INT8U SD_ReadRegister()
; ** 功能描述: 从SD卡读取数据							Function: read data from SD card
; ** 输   入: INT32U len	  : 长度					Input:	  INT32U len   : length
; 			 INT8U *recbuf: 接收缓冲区					 	  INT8U *recbuf: receive buffer
; ** 输   出: 0:   正确    >0:   错误码		  		Output:	  0:  right		>0:  error code
; *********************************************************************************************************************/
; uint8 SD_ReadRegister(uint32 len, uint8 *recbuf)
; {	
	.dbline 539
; 	uint32 i = 0;
	ldi R20,0
	ldi R21,0
	ldi R22,0
	ldi R23,0
	movw R30,R28
	std z+0,R20
	std z+1,R21
	std z+2,R22
	std z+3,R23
	.dbline 542
; 	uint8 resp;
; 
;     SPI_CS_Assert();
	xcall _SPI_CS_Assert
L69:
	.dbline 543
;     do{    											/* 等待数据起始令牌 wait for data start token */
	.dbline 544
;         resp = SPI_RecByte();
	xcall _SPI_RecByte
	mov R12,R16
	.dbline 545
;     	i++;
	ldi R20,1
	ldi R21,0
	ldi R22,0
	ldi R23,0
	movw R30,R28
	ldd R2,z+0
	ldd R3,z+1
	ldd R4,z+2
	ldd R5,z+3
	add R2,R20
	adc R3,R21
	adc R4,R22
	adc R5,R23
	movw R30,R28
	std z+0,R2
	std z+1,R3
	std z+2,R4
	std z+3,R5
	.dbline 546
L70:
	.dbline 546
;     }while((resp == 0xFF) && (i < SD_READREG_TIMEOUT));    
	mov R24,R12
	cpi R24,255
	brne L72
	ldi R20,8
	ldi R21,0
	ldi R22,0
	ldi R23,0
	movw R30,R28
	ldd R2,z+0
	ldd R3,z+1
	ldd R4,z+2
	ldd R5,z+3
	cp R2,R20
	cpc R3,R21
	cpc R4,R22
	cpc R5,R23
	brlo L69
L72:
	.dbline 548
;     
;     if (i >= SD_READREG_TIMEOUT)
	ldi R20,8
	ldi R21,0
	ldi R22,0
	ldi R23,0
	movw R30,R28
	ldd R2,z+0
	ldd R3,z+1
	ldd R4,z+2
	ldd R5,z+3
	cp R2,R20
	cpc R3,R21
	cpc R4,R22
	cpc R5,R23
	brlo L73
	.dbline 549
;     {
	.dbline 550
;     	SPI_CS_Deassert();
	xcall _SPI_CS_Deassert
	.dbline 551
;     	return SD_ERR_TIMEOUT_READ;					/* 超时, 返回错误 timeout, return error */
	ldi R16,49
	xjmp L68
L73:
	.dbline 554
;   	}
;   	
;    	if (resp != SD_TOK_READ_STARTBLOCK)				
	mov R24,R12
	cpi R24,254
	breq L75
	.dbline 555
;    	{												/* 不是收到数据起始令牌 not receive data start token */
	.dbline 556
; 		recbuf[0] = resp;							
	movw R30,R10
	std z+0,R12
	.dbline 557
; 		i = 1;										/* 还有len - 1个字节要接收 still len - 1 bytes will be received */
	ldi R20,1
	ldi R21,0
	ldi R22,0
	ldi R23,0
	movw R30,R28
	std z+0,R20
	std z+1,R21
	std z+2,R22
	std z+3,R23
	.dbline 558
;    	}
	xjmp L80
L75:
	.dbline 560
;    	else
;    		i = 0;										/* 收到数据起始令牌,还有len个字节要接收 received data start token,still len bytes will be received */
	ldi R20,0
	ldi R21,0
	ldi R22,0
	ldi R23,0
	movw R30,R28
	std z+0,R20
	std z+1,R21
	std z+2,R22
	std z+3,R23
	.dbline 562
;    	  	
;     for (; i < len; i++)
	xjmp L80
L77:
	.dbline 563
	xcall _SPI_RecByte
	movw R30,R28
	push R26
	push R27
	ldd R26,z+0
	ldd R27,z+1
	movw R30,R26
	pop R27
	pop R26
	add R30,R10
	adc R31,R11
	std z+0,R16
L78:
	.dbline 562
	ldi R20,1
	ldi R21,0
	ldi R22,0
	ldi R23,0
	movw R30,R28
	ldd R2,z+0
	ldd R3,z+1
	ldd R4,z+2
	ldd R5,z+3
	add R2,R20
	adc R3,R21
	adc R4,R22
	adc R5,R23
	movw R30,R28
	std z+0,R2
	std z+1,R3
	std z+2,R4
	std z+3,R5
L80:
	.dbline 562
	movw R30,R28
	ldd R2,z+12
	ldd R3,z+13
	ldd R4,z+14
	ldd R5,z+15
	movw R30,R28
	ldd R6,z+0
	ldd R7,z+1
	ldd R8,z+2
	ldd R9,z+3
	cp R6,R2
	cpc R7,R3
	cpc R8,R4
	cpc R9,R5
	brsh X4
	xjmp L77
X4:
	.dbline 565
;    		recbuf[i] = SPI_RecByte();					/* 接收数据 receive data */
;    		
;     i = SPI_RecByte();								
	xcall _SPI_RecByte
	mov R2,R16
	clr R3
	clr R4
	clr R5
	movw R30,R28
	std z+0,R2
	std z+1,R3
	std z+2,R4
	std z+3,R5
	.dbline 566
;     i = (i << 8) + SPI_RecByte();    				/* 读取16位CRC get 16-bit CRC */	
	xcall _SPI_RecByte
	mov R2,R16
	ldi R24,8
	ldi R25,0
	movw R30,R28
	ldd R4,z+0
	ldd R5,z+1
	ldd R6,z+2
	ldd R7,z+3
	st -y,R24
	movw R16,R4
	movw R18,R6
	xcall lsl32
	movw R4,R16
	movw R6,R18
	mov R20,R2
	clr R21
	clr R22
	clr R23
	add R4,R20
	adc R5,R21
	adc R6,R22
	adc R7,R23
	movw R30,R28
	std z+0,R4
	std z+1,R5
	std z+2,R6
	std z+3,R7
	.dbline 569
; 
; #if SD_CRC_EN 
;    	if (i != SD_GetCRC16(recbuf, len))
	movw R30,R28
	ldd R18,z+12
	ldd R19,z+13
	movw R16,R10
	xcall _SD_GetCRC16
	movw R2,R16
	clr R4
	clr R5
	movw R30,R28
	ldd R6,z+0
	ldd R7,z+1
	ldd R8,z+2
	ldd R9,z+3
	cp R6,R2
	cpc R7,R3
	cpc R8,R4
	cpc R9,R5
	breq L81
	.dbline 570
;    	{												/* CRC校验错误 CRC check is error */
	.dbline 571
;    		SPI_CS_Deassert();
	xcall _SPI_CS_Deassert
	.dbline 572
;    		SPI_SendByte(0xFF);    						
	ldi R16,255
	xcall _SPI_SendByte
	.dbline 573
;   		return SD_ERR_DATA_CRC16;					/* 返回RCR16错误  return error of CRC16 */				
	ldi R16,32
	xjmp L68
L81:
	.dbline 577
;   	}    
; #endif   
;   
;     SPI_SendByte(0xFF);								/* 返回之前发送8个clock  clock out 8 clk before return */
	ldi R16,255
	xcall _SPI_SendByte
	.dbline 578
;     SPI_CS_Deassert();	
	xcall _SPI_CS_Deassert
	.dbline 580
;     	
; 	return SD_NO_ERR;
	clr R16
	.dbline -2
L68:
	adiw R28,4
	xcall pop_gset4
	adiw R28,4
	.dbline 0 ; func end
	ret
	.dbsym r resp 12 c
	.dbsym l i 0 l
	.dbsym r recbuf 10 pc
	.dbsym l len 12 l
	.dbend
	.dbfunc e SD_ReadBlockData _SD_ReadBlockData fc
;            tmp -> R12
;              i -> y+0
;         recbuf -> R10,R11
;            len -> y+12
	.even
_SD_ReadBlockData::
	xcall push_arg4
	xcall push_gset4
	sbiw R28,4
	ldd R10,y+16
	ldd R11,y+17
	.dbline -1
	.dbline 591
; }	
; 
; /*******************************************************************************************************************
; ** 函数名称: INT8U SD_ReadBlockData()			Name:	  INT8U SD_ReadBlockData()
; ** 功能描述: 从SD卡中读取数据块					Function: read block data from sd card
; ** 输   入: INT32U len    : 长度				Input:	  INT32U len    : length
; 			 INT8U *recbuf : 接收缓冲区					  INT8U *recbuf : the buffer of receive
; ** 输   出: 0:   正确    >0:   错误码		  	Output:	  0:  right		>0:  error code
; *******************************************************************************************************************/
; uint8 SD_ReadBlockData(uint32 len, uint8 *recbuf)
; {
	.dbline 593
;     uint8 tmp;
;     uint32 i = 0;
	ldi R20,0
	ldi R21,0
	ldi R22,0
	ldi R23,0
	movw R30,R28
	std z+0,R20
	std z+1,R21
	std z+2,R22
	std z+3,R23
	.dbline 595
; 
;     SPI_CS_Assert();    
	xcall _SPI_CS_Assert
L84:
	.dbline 597
;     do
;     { 											    /* 等待接收数据开始令牌0xFE  wait for receiving data start token 0xFE */
	.dbline 598
;         tmp = SPI_RecByte();
	xcall _SPI_RecByte
	mov R12,R16
	.dbline 599
;         i++;
	ldi R20,1
	ldi R21,0
	ldi R22,0
	ldi R23,0
	movw R30,R28
	ldd R2,z+0
	ldd R3,z+1
	ldd R4,z+2
	ldd R5,z+3
	add R2,R20
	adc R3,R21
	adc R4,R22
	adc R5,R23
	movw R30,R28
	std z+0,R2
	std z+1,R3
	std z+2,R4
	std z+3,R5
	.dbline 600
L85:
	.dbline 600
;      }while((tmp == 0xFF) && (i < sds.timeout_read));
	mov R24,R12
	cpi R24,255
	brne L88
	lds R2,_sds+3
	clr R3
	clr R4
	clr R5
	movw R30,R28
	ldd R6,z+0
	ldd R7,z+1
	ldd R8,z+2
	ldd R9,z+3
	cp R6,R2
	cpc R7,R3
	cpc R8,R4
	cpc R9,R5
	brlo L84
L88:
	.dbline 602
; 	
; 	if (i >= sds.timeout_read)
	lds R2,_sds+3
	clr R3
	clr R4
	clr R5
	movw R30,R28
	ldd R6,z+0
	ldd R7,z+1
	ldd R8,z+2
	ldd R9,z+3
	cp R6,R2
	cpc R7,R3
	cpc R8,R4
	cpc R9,R5
	brlo L89
	.dbline 603
; 	{
	.dbline 604
; 		SPI_CS_Deassert();
	xcall _SPI_CS_Deassert
	.dbline 605
;        	return SD_ERR_TIMEOUT_READ;					/* 返回读超时错误码  return error timeout error code of reading */
	ldi R16,49
	xjmp L83
L89:
	.dbline 608
; 	}
; 		
; 	if (tmp != SD_TOK_READ_STARTBLOCK)				/* 块读开始令牌错误 read start block token is error */
	mov R24,R12
	cpi R24,254
	breq L92
	.dbline 609
; 	{
	.dbline 610
; 		SPI_SendByte(0xFF);
	ldi R16,255
	xcall _SPI_SendByte
	.dbline 611
; 		SPI_CS_Deassert();
	xcall _SPI_CS_Deassert
	.dbline 612
; 		return SD_ERR_DATA_START_TOK;
	ldi R16,33
	xjmp L83
L92:
	.dbline 615
; 	}
; 	
; 	for (i = 0; i < len; i++)
	ldi R20,0
	ldi R21,0
	ldi R22,0
	ldi R23,0
	movw R30,R28
	std z+0,R20
	std z+1,R21
	std z+2,R22
	std z+3,R23
	xjmp L97
L94:
	.dbline 616
	xcall _SPI_RecByte
	movw R30,R28
	push R26
	push R27
	ldd R26,z+0
	ldd R27,z+1
	movw R30,R26
	pop R27
	pop R26
	add R30,R10
	adc R31,R11
	std z+0,R16
L95:
	.dbline 615
	ldi R20,1
	ldi R21,0
	ldi R22,0
	ldi R23,0
	movw R30,R28
	ldd R2,z+0
	ldd R3,z+1
	ldd R4,z+2
	ldd R5,z+3
	add R2,R20
	adc R3,R21
	adc R4,R22
	adc R5,R23
	movw R30,R28
	std z+0,R2
	std z+1,R3
	std z+2,R4
	std z+3,R5
L97:
	.dbline 615
	movw R30,R28
	ldd R2,z+12
	ldd R3,z+13
	ldd R4,z+14
	ldd R5,z+15
	movw R30,R28
	ldd R6,z+0
	ldd R7,z+1
	ldd R8,z+2
	ldd R9,z+3
	cp R6,R2
	cpc R7,R3
	cpc R8,R4
	cpc R9,R5

⌨️ 快捷键说明

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