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

📄 sdcmd.s

📁 mega128的串口发送文件.可以发送0X55上位机使用串口调试工具就可以接收了.
💻 S
📖 第 1 页 / 共 5 页
字号:
	brsh X5
	xjmp L94
X5:
	.dbline 618
;    		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 619
;     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 622
; 
; #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 L98
	.dbline 623
;    	{												/* CRC校验错误 CRC check is error */
	.dbline 624
;    		SPI_SendByte(0xFF); 
	ldi R16,255
	xcall _SPI_SendByte
	.dbline 625
;    		SPI_CS_Deassert();  						
	xcall _SPI_CS_Deassert
	.dbline 626
;   		return SD_ERR_DATA_CRC16;					/* 返回CRC16错误  return error of CRC16 */				
	ldi R16,32
	xjmp L83
L98:
	.dbline 630
;   	}    
; #endif   
; 
; 	SPI_SendByte(0xFF); 
	ldi R16,255
	xcall _SPI_SendByte
	.dbline 631
; 	SPI_CS_Deassert();
	xcall _SPI_CS_Deassert
	.dbline 633
; 
;   	return SD_NO_ERR;								/* 返回函数执行成功 return function perform sucessfully */
	clr R16
	.dbline -2
L83:
	adiw R28,4
	xcall pop_gset4
	adiw R28,4
	.dbline 0 ; func end
	ret
	.dbsym r tmp 12 c
	.dbsym l i 0 l
	.dbsym r recbuf 10 pc
	.dbsym l len 12 l
	.dbend
	.dbfunc e SD_WriteBlockData _SD_WriteBlockData fc
;            tmp -> R14
;              i -> R10,R11
;        sendbuf -> R12,R13
;            len -> y+10
;         bmulti -> R10
	.even
_SD_WriteBlockData::
	st -y,r19
	st -y,r18
	xcall push_gset5
	mov R10,R16
	ldd R12,y+14
	ldd R13,y+15
	.dbline -1
	.dbline 645
; }
; 
; /*******************************************************************************************************************
; ** 函数名称: INT8U SD_WriteBlockData()				Name:	  INT8U SD_WriteBlockData()
; ** 功能描述: 向sd卡写数据块							Function: write block data to sd card
; ** 输   入: INT8U bmulti  : 是否为多块操作1:是0:否 Input:	  INT8U bmulti   : multi blocks operate 1:Y 0:N 
; 			 INT32U len    : 长度						  	  INT32U len     : length
; 			 INT8U *sendbuf: 发送缓冲区					 	  INT8U *sendbuf : the buffer of send
; ** 输   出: 0:   正确    >0:   错误码		  		Output:	  0:  right		>0:  error code
; ********************************************************************************************************************/
; uint8 SD_WriteBlockData(uint8 bmulti, uint32 len, uint8 *sendbuf)
; {
	.dbline 649
; 	uint16 i;
; 	uint8 tmp;
; 
; 	SPI_CS_Assert();
	xcall _SPI_CS_Assert
	.dbline 651
; 		
;     SPI_SendByte(0xFF);								/* 开始发送数据之前发送8个clock clock out 8 clk before start */
	ldi R16,255
	xcall _SPI_SendByte
	.dbline 653
;     
;     if (bmulti == 1)
	mov R24,R10
	cpi R24,1
	brne L101
	.dbline 654
;         SPI_SendByte(SD_TOK_WRITE_STARTBLOCK_M);	/* 写多块开始令牌 start token of write multi blocks */
	ldi R16,252
	xcall _SPI_SendByte
	xjmp L102
L101:
	.dbline 656
; 	else
; 		SPI_SendByte(SD_TOK_WRITE_STARTBLOCK);		/* 写单块开始令牌 start token of write single block */
	ldi R16,254
	xcall _SPI_SendByte
L102:
	.dbline 658
; 
; 	for (i = 0; i < len; i++)
	clr R10
	clr R11
	xjmp L106
L103:
	.dbline 659
	movw R30,R10
	add R30,R12
	adc R31,R13
	ldd R16,z+0
	xcall _SPI_SendByte
L104:
	.dbline 658
	movw R24,R10
	adiw R24,1
	movw R10,R24
L106:
	.dbline 658
	movw R30,R28
	ldd R2,z+10
	ldd R3,z+11
	ldd R4,z+12
	ldd R5,z+13
	movw R6,R10
	clr R8
	clr R9
	cp R6,R2
	cpc R7,R3
	cpc R8,R4
	cpc R9,R5
	brlo L103
	.dbline 662
;         SPI_SendByte(sendbuf[i]);					/* 发送数据 send data */
; 
; #if SD_CRC_EN	
; 	i = SD_GetCRC16(sendbuf,len);					/* 计算CRC16 calculate CRC16 */
	movw R30,R28
	ldd R18,z+10
	ldd R19,z+11
	movw R16,R12
	xcall _SD_GetCRC16
	movw R10,R16
	.dbline 665
; #endif
; 
; 	SPI_SendByte((i >> 8) & 0xFF);
	mov R16,R17
	clr R17
	andi R17,0
	xcall _SPI_SendByte
	.dbline 666
; 	SPI_SendByte(i & 0xFF); 						/* 发送CRC16校验码 send CRC16 check code */
	mov R16,R10
	andi R17,0
	xcall _SPI_SendByte
	.dbline 668
; 			    
; 	tmp = SPI_RecByte();
	xcall _SPI_RecByte
	mov R14,R16
	.dbline 669
;   	if ((tmp & SD_RESP_DATA_MSK) != SD_RESP_DATA_ACCETPTED)	
	mov R24,R14
	andi R24,15
	cpi R24,5
	breq L107
	.dbline 670
;   	{		
	.dbline 671
;    		SPI_SendByte(0xFF);							/* 返回之前发送8个clock  clock out 8 clk before return */
	ldi R16,255
	xcall _SPI_SendByte
	.dbline 672
;    		SPI_CS_Deassert();
	xcall _SPI_CS_Deassert
	.dbline 673
;    		return SD_ERR_DATA_RESP;					/* 数据响应错误 data response error */
	ldi R16,34
	xjmp L100
L107:
	.dbline 676
;     }
;         
;     SPI_CS_Deassert();
	xcall _SPI_CS_Deassert
	.dbline 678
;      		
;     if (SD_WaitBusy(SD_WAIT_WRITE) != SD_NO_ERR)			
	ldi R16,1
	xcall _SD_WaitBusy
	tst R16
	breq L109
	.dbline 679
;     	return SD_ERR_TIMEOUT_WRITE;				/* 写入超时 write time out */
	ldi R16,50
	xjmp L100
L109:
	.dbline 681
;     else
;     	return SD_NO_ERR; 							/* 写入正确 write right */
	clr R16
	.dbline -2
L100:
	xcall pop_gset5
	adiw R28,2
	.dbline 0 ; func end
	ret
	.dbsym r tmp 14 c
	.dbsym r i 10 i
	.dbsym r sendbuf 12 pc
	.dbsym l len 10 l
	.dbsym r bmulti 10 c
	.dbend
	.dbfunc e SD_StopMultiToken _SD_StopMultiToken fV
	.even
_SD_StopMultiToken::
	.dbline -1
	.dbline 691
;  }
; 
; /*******************************************************************************************************************
; ** 函数名称: void SD_StopMultiToken()				Name:	  void SD_StopMultiToken(void)
; ** 功能描述: 发送多块写停止令牌						Function: send the token that stop multiple block write
; ** 输   入: 无									    Input:	  NULL
; ** 输   出: 无										Output:	  NULL
; ********************************************************************************************************************/
; void SD_StopMultiToken(void)
; {
	.dbline 692
; 	SPI_CS_Assert();
	xcall _SPI_CS_Assert
	.dbline 694
; 	
; 	SPI_SendByte(0xFF);								/* 先发送8个clock send 8 clock first */
	ldi R16,255
	xcall _SPI_SendByte
	.dbline 695
; 	SPI_SendByte(SD_TOK_STOP_MULTI);				/* 发送停止数据传输令牌 send stop transmission token */
	ldi R16,253
	xcall _SPI_SendByte
	.dbline 696
; 	SPI_RecByte();
	xcall _SPI_RecByte
	.dbline 698
; 	
;     SPI_CS_Deassert();
	xcall _SPI_CS_Deassert
	.dbline -2
L111:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e SD_WaitBusy _SD_WaitBusy fc
;        timeout -> y+4
;            tmp -> R10
;              i -> y+0
;       waittype -> R10
	.even
_SD_WaitBusy::
	xcall push_gset3
	mov R10,R16
	sbiw R28,8
	.dbline -1
	.dbline 709
; }
; 
; 
; /********************************************************************************************************************
; ** 函数名称: void SD_WaitBusy()						Name:	  void SD_WaitBusy()
; ** 功能描述: 查询SD卡是否处于忙状态					Function: poll SD Card wheather it is busy
; ** 输   入: INT32U waittype: 超时类型				Input:	  INT32U timeout: time out type
; ** 输   出: 0: 未超时  >0: 错误码					Output:	  0: not time out   > 0: error code
; *********************************************************************************************************************/
; uint8 SD_WaitBusy(uint8 waittype)
; {
	.dbline 710
;     uint32 timeout, 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 713
;     uint8 tmp;
;     
;     if (waittype == SD_WAIT_WRITE)
	mov R24,R10
	cpi R24,1
	brne L113
	.dbline 714
;     	timeout = sds.timeout_write;
	lds R2,_sds+4
	clr R3
	clr R4
	clr R5
	movw R30,R28
	std z+4,R2
	std z+5,R3
	std z+6,R4
	std z+7,R5
	xjmp L114
L113:
	.dbline 716
;     else
;     	timeout = sds.timeout_erase;
	lds R2,_sds+5
	clr R3
	clr R4
	clr R5
	movw R30,R28
	std z+4,R2
	std z+5,R3
	std z+6,R4
	std z+7,R5
L114:
	.dbline 718
; 
; 	SPI_CS_Assert();
	xcall _SPI_CS_Assert
L117:
	.dbline 720
;    	do
;    	{ 												/* 等待忙结束 wait for being busy end */
	.dbline 721
;         tmp = SPI_RecByte();
	xcall _SPI_RecByte
	mov R10,R16
	.dbline 722
;         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 723
L118:
	.dbline 723
;     }while ((tmp != 0xFF) && (i < timeout));		/* 忙时收到的值为0xFF always receive 0xFF when card is busy */    
	mov R24,R10
	cpi R24,255
	breq L120
	movw R30,R28
	ldd R2,z+4
	ldd R3,z+5
	ldd R4,z+6
	ldd R5,z+7
	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 L117
L120:
	.dbline 724
; 	SPI_CS_Deassert();								/* 有错 */
	xcall _SPI_CS_Deassert
	.dbline 726
; 	
; 	if(i < timeout) 
	movw R30,R28
	ldd R2,z+4
	ldd R3,z+5
	ldd R4,z+6
	ldd R5,z+7
	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 L121
	.dbline 727
; 		return SD_NO_ERR;							/* 返回0,表示没超时 return 0 indicate that operation is not time out */
	clr R16
	xjmp L112
L121:
	.dbline 729
; 	else 
; 		return SD_ERR_TIMEOUT_WAIT;					/* 返回错误码,表示超时 return error code indicate that operation is time out */
	ldi R16,48
	.dbline -2
L112:
	adiw R28,8
	xcall pop_gset3
	.dbline 0 ; func end
	ret
	.dbsym l timeout 4 l
	.dbsym r tmp 10 c
	.dbsym l i 0 l
	.dbsym r waittype 10 c
	.dbend
	.dbfunc e SD_SPIDelay _SD_SPIDelay fV
;              i -> R20
;          value -> R22
	.even
_SD_SPIDelay::
	xcall push_gset2
	mov R22,R16
	.dbline -1
	.dbline 739
; }
; 
; /********************************************************************************************************************
; ** 函数名称: void SD_SPIDelay()						Name:	  void SD_SPIDelay()
; ** 功能描述: SPI总线延时							Function: SPI Bus delay 
; ** 输   入: INT8U value: 延时值,不超过255		    Input:	  INT8U value : delay value,do not beyond 255
; ** 输   出: 无										Output:	  NULL
; *********************************************************************************************************************/
; void SD_SPIDelay(uint8 value)
; {
	.dbline 742
;     uint8 i;
; 
;     for (i = 0; i < value; i++)
	clr R20
	xjmp L127
L124:
	.dbline 743
	ldi R16,255
	xcall _SPI_SendByte
L125:
	.dbline 742
	inc R20
L127:
	.dbline 742
	cp R20,R22
	brlo L124
	.dbline -2
L123:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r i 20 c
	.dbsym r value 22 c
	.dbend

⌨️ 快捷键说明

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