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

📄 sddriver.s

📁 mega128的串口发送文件.可以发送0X55上位机使用串口调试工具就可以接收了.
💻 S
📖 第 1 页 / 共 2 页
字号:
	ldd R30,y+14
	ldd R31,y+15
	ldd R24,z+1
	andi R24,120
	mov R12,R24
	lsr R12
	lsr R12
	lsr R12
	.dbline 132
; 	fator = (csdbuf[R2WFACTOR_POS] & R2WFACTOR_MSK) >> 2;				/* 写超时时间因数 write timeout factor */
	ldd R30,y+14
	ldd R31,y+15
	ldd R24,z+12
	andi R24,28
	mov R10,R24
	lsr R10
	lsr R10
	.dbline 134
; 	
; 	if(time_v == 0)	return;
	tst R12
	brne L32
	.dbline 134
	xjmp L28
L32:
	.dbline 135
; 	if(fator >= 6) return;
	mov R24,R10
	cpi R24,6
	brlo L34
	.dbline 135
	xjmp L28
L34:
	.dbline 137
; 	
; 	tmp = SPI_CLOCK * time_value[time_v] / 10 / time_unit[time_u];		/* TACC * f (单位 unit: clock) */
	ldi R24,<_time_value
	ldi R25,>_time_value
	mov R30,R12
	clr R31
	add R30,R24
	adc R31,R25
	lpm R2,Z
	clr R3
	clr R4
	clr R5
	ldi R20,0
	ldi R21,96
	ldi R22,84
	ldi R23,0
	st -y,R5
	st -y,R4
	st -y,R3
	st -y,R2
	movw R16,R20
	movw R18,R22
	xcall empy32s
	ldi R20,10
	ldi R21,0
	ldi R22,0
	ldi R23,0
	st -y,R23
	st -y,R22
	st -y,R21
	st -y,R20
	xcall div32s
	movw R2,R16
	movw R4,R18
	ldi R24,4
	mul R24,R14
	movw R16,R0
	ldi R24,<_time_unit
	ldi R25,>_time_unit
	add R16,R24
	adc R17,R25
	xcall lpm32
	st -y,R19
	st -y,R18
	st -y,R17
	st -y,R16
	movw R16,R2
	movw R18,R4
	xcall div32u
	movw R30,R28
	std z+0,R16
	std z+1,R17
	std z+2,R18
	std z+3,R19
	.dbline 138
; 	tmp = tmp + csdbuf[NSAC_POS] * 100;									/* TACC * f + NSAC * 100 (单位 unit: clock) */
	ldd R30,y+14
	ldd R31,y+15
	ldd R2,z+2
	ldi R24,100
	mul R24,R2
	movw R2,R0
	clr R4
	sbrc R3,7
	com R4
	clr R5
	sbrc R4,7
	com R5
	movw R30,R28
	ldd R6,z+0
	ldd R7,z+1
	ldd R8,z+2
	ldd R9,z+3
	add R6,R2
	adc R7,R3
	adc R8,R4
	adc R9,R5
	movw R30,R28
	std z+0,R6
	std z+1,R7
	std z+2,R8
	std z+3,R9
	.dbline 141
; 	
; 	/* 计算得到的超时值 the timeout value of being calculated */
; 	sds.timeout_read = tmp;
	movw R30,R28
	ldd R2,z+0
	ldd R3,z+1
	ldd R4,z+2
	ldd R5,z+3
	sts _sds+3,R2
	.dbline 142
; 	sds.timeout_write = tmp * r2w_fator[fator];							/* (TACC * f + NSAC * 100) * R2WFACTOR (单位 unit:clock)*/
	ldi R24,<_r2w_fator
	ldi R25,>_r2w_fator
	mov R30,R10
	clr R31
	add R30,R24
	adc R31,R25
	lpm R2,Z
	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
	st -y,R5
	st -y,R4
	st -y,R3
	st -y,R2
	movw R16,R6
	movw R18,R8
	xcall empy32u
	sts _sds+4,R16
	.dbline 144
; 	
; 	sds.timeout_read  = sds.timeout_read * 100 / 8;						/* 实际值为计算值的100倍 */
	lds R2,_sds+3
	ldi R24,100
	mul R24,R2
	movw R16,R0
	ldi R18,8
	ldi R19,0
	xcall div16s
	sts _sds+3,R16
	.dbline 145
; 	sds.timeout_write = sds.timeout_write * 100 / 8;
	lds R2,_sds+4
	ldi R24,100
	mul R24,R2
	movw R16,R0
	ldi R18,8
	ldi R19,0
	xcall div16s
	sts _sds+4,R16
	.dbline 147
; 	
; 	if (sds.timeout_read > READ_TIMEOUT_100MS)							/* 取计算值与默认值中的最小值 */
	ldi R20,0
	ldi R21,14
	ldi R22,1
	ldi R23,0
	lds R2,_sds+3
	clr R3
	clr R4
	clr R5
	cp R20,R2
	cpc R21,R3
	cpc R22,R4
	cpc R23,R5
	brge L42
	.dbline 148
; 		sds.timeout_read = READ_TIMEOUT_100MS;
	ldi R20,0
	ldi R21,14
	ldi R22,1
	ldi R23,0
	movw R2,R20
	sts _sds+3,R2
L42:
	.dbline 150
; 	
; 	if (sds.timeout_write > WRITE_TIMEOUT_250MS)
	ldi R20,0
	ldi R21,163
	ldi R22,2
	ldi R23,0
	lds R2,_sds+4
	clr R3
	clr R4
	clr R5
	cp R20,R2
	cpc R21,R3
	cpc R22,R4
	cpc R23,R5
	brge L46
	.dbline 151
; 		sds.timeout_write = WRITE_TIMEOUT_250MS;
	ldi R20,0
	ldi R21,163
	ldi R22,2
	ldi R23,0
	movw R2,R20
	sts _sds+4,R2
L46:
	.dbline 153
; 
; 	sds.timeout_erase = sds.timeout_write;
	lds R2,_sds+4
	sts _sds+5,R2
	.dbline -2
L28:
	adiw R28,4
	xcall pop_gset5
	adiw R28,2
	.dbline 0 ; func end
	ret
	.dbsym r time_u 14 c
	.dbsym r fator 10 c
	.dbsym r time_v 12 c
	.dbsym l tmp 0 l
	.dbsym l csdbuf 14 pc
	.dbend
	.area lit(rom, con, rel)
L53:
	.byte 0,0
	.byte 0,0
	.area text(rom, con, rel)
	.dbfile D:\new_sd\SD\SD\sddriver.c
	.dbfunc e SD_ActiveInit _SD_ActiveInit fc
;          param -> y+13
;           resp -> y+8
;              i -> y+4
;            ret -> R10
	.even
_SD_ActiveInit::
	xcall push_gset3
	sbiw R28,17
	.dbline -1
	.dbline 165
; }
; /*******************************************************************************************************************
; ** 函数名称: INT8U SD_CalTimeout()				Name:	  INT8U SD_CalTimeout()
; ** 功能描述: 计算读/写/擦超时时间				Function: get the information of SD card
; ** 输   入: INT8U *cardtype: 卡类型接收缓冲 	Input:    INT8U *cardtype: card type receive buff
; ** 输   出: 0:   正确    >0:   错误码		  	Output:	  0:  right		>0:  error code
; ** 函数说明: 该命令不断重复发送到SD卡,直到响应R1的Bit0(Idle)位为0,表示SD卡内部初始化处理完成。
; 		     当响应的Idle位为0时,SD卡就完全进入SPI模式了。当然重复发送命令CMD1是有次数限制的,
; 		     最大次数为宏定义SD_IDLE_WAIT_MAX.
; *******************************************************************************************************************/
; uint8 SD_ActiveInit(void)
; {
	.dbline 166
; 	uint8 param[4] = {0,0,0,0},resp[5],ret;
	ldi R24,<L53
	ldi R25,>L53
	movw R30,R28
	adiw R30,13
	ldi R16,4
	ldi R17,0
	st -y,R31
	st -y,R30
	st -y,R25
	st -y,R24
	xcall asgncblk
	.dbline 167
; 	uint32 i = 0;
	ldi R20,0
	ldi R21,0
	ldi R22,0
	ldi R23,0
	movw R30,R28
	std z+4,R20
	std z+5,R21
	std z+6,R22
	std z+7,R23
L54:
	.dbline 170
; 
;  	do 
;     {													/* 发出CMD1, 查询卡的状态, send CMD1 to poll card status */
	.dbline 171
;         ret = SD_SendCmd(CMD1, param, CMD1_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,243  ; offset = 13
	sbci R19,255
	ldi R16,1
	xcall _SD_SendCmd
	mov R10,R16
	.dbline 172
;         if (ret != SD_NO_ERR)
	tst R16
	breq L57
	.dbline 173
;        		return ret;
	xjmp L52
L57:
	.dbline 175
;   
;         i++;
	ldi R20,1
	ldi R21,0
	ldi R22,0
	ldi R23,0
	movw R30,R28
	ldd R2,z+4
	ldd R3,z+5
	ldd R4,z+6
	ldd R5,z+7
	add R2,R20
	adc R3,R21
	adc R4,R22
	adc R5,R23
	movw R30,R28
	std z+4,R2
	std z+5,R3
	std z+6,R4
	std z+7,R5
	.dbline 176
;     }
L55:
	.dbline 177
; 	while (((resp[0] & MSK_IDLE) == MSK_IDLE) && (i < SD_IDLE_WAIT_MAX));
	ldd R24,y+8
	andi R24,1
	cpi R24,1
	brne L59
	ldi R20,232
	ldi R21,3
	ldi R22,0
	ldi R23,0
	movw R30,R28
	ldd R2,z+4
	ldd R3,z+5
	ldd R4,z+6
	ldd R5,z+7
	cp R2,R20
	cpc R3,R21
	cpc R4,R22
	cpc R5,R23
	brsh X0
	xjmp L54
X0:
L59:
	.dbline 180
; 														/* 如果响应R1的最低位Idle位为1,则继续循环 */
; 														
;     if (i >= SD_IDLE_WAIT_MAX)
	ldi R20,232
	ldi R21,3
	ldi R22,0
	ldi R23,0
	movw R30,R28
	ldd R2,z+4
	ldd R3,z+5
	ldd R4,z+6
	ldd R5,z+7
	cp R2,R20
	cpc R3,R21
	cpc R4,R22
	cpc R5,R23
	brlo L60
	.dbline 181
;         return SD_ERR_TIMEOUT_WAITIDLE;					/* 超时,返回错误 time out,return error */
	ldi R16,52
	xjmp L52
L60:
	.dbline 183
; 
; 	return SD_NO_ERR;
	clr R16
	.dbline -2
L52:
	adiw R28,17
	xcall pop_gset3
	.dbline 0 ; func end
	ret
	.dbsym l param 13 A[4:4]c
	.dbsym l resp 8 A[5:5]c
	.dbsym l i 4 l
	.dbsym r ret 10 c
	.dbend
	.area bss(ram, con, rel)
	.dbfile D:\new_sd\SD\SD\sddriver.c
_sds::
	.blkb 6
	.dbstruct 0 6 SD_STRUCT
	.dbfield 0 block_num c
	.dbfield 1 block_len c
	.dbfield 2 erase_unit c
	.dbfield 3 timeout_read c
	.dbfield 4 timeout_write c
	.dbfield 5 timeout_erase c
	.dbend
	.dbsym e sds _sds S[SD_STRUCT]

⌨️ 快捷键说明

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