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

📄 zhw.lst

📁 mega128的串口发送文件.可以发送0X55上位机使用串口调试工具就可以接收了.
💻 LST
📖 第 1 页 / 共 5 页
字号:
    0432 2EA0      MOV	R10,R16
(0064) 	if (ret != SD_NO_ERR)  
    0433 2300      TST	R16
    0434 F009      BEQ	0x0436
(0065) 	  	return ret;
    0435 C00B      RJMP	0x0441
(0066) #endif
(0067) 
(0068)     ret = SD_SetBlockLen(SD_BLOCKSIZE);				/* 9. 设置块的长度: 512Bytes Set the block length: 512Bytes */
    0436 E000      LDI	R16,0
    0437 E012      LDI	R17,2
    0438 E020      LDI	R18,0
    0439 E030      LDI	R19,0
    043A 940E0887  CALL	_SD_SetBlockLen
    043C 2EA0      MOV	R10,R16
(0069)     if (ret != SD_NO_ERR)  
    043D 2300      TST	R16
    043E F009      BEQ	0x0440
(0070)         return ret;
    043F C001      RJMP	0x0441
(0071)         
(0072) 	return (SD_GetCardInfo());						/* 10. 读CSD寄存器,获取SD卡信息 read CSD register, get the information of SD card */
    0440 D004      RCALL	_SD_GetCardInfo
    0441 9624      ADIW	R28,4
    0442 940E0CEF  CALL	pop_gset3
    0444 9508      RET
_SD_GetCardInfo:
  tmp                  --> Y+16
  ret                  --> R20
  csdbuf               --> Y+0
    0445 940E0D00  CALL	push_gset1
    0447 9764      SBIW	R28,0x14
(0073) }
(0074) 
(0075) /*******************************************************************************************************************
(0076) ** 函数名称: INT8U SD_GetCardInfo()				Name:	  INT8U SD_GetCardInfo()
(0077) ** 功能描述: 获得SD卡的信息						Function: get the information of SD card
(0078) ** 输   入: INT8U cardtype: 卡类型				Input:    INT8U cardtype: card type	
(0079) ** 输   出: 0:   正确    >0:   错误码		  	Output:	  0:  right		>0:  error code
(0080) *******************************************************************************************************************/
(0081) uint8 SD_GetCardInfo()
(0082) {
(0083) 	uint32 tmp;
(0084) 	uint8 csdbuf[16],ret;
(0085) 		
(0086) 	ret = SD_ReadCSD(16,csdbuf);	 								    		/* 读CSD寄存器    read CSD register */
    0448 019E      MOVW	R18,R28
    0449 E100      LDI	R16,0x10
    044A 940E081D  CALL	_SD_ReadCSD
    044C 2F40      MOV	R20,R16
(0087) 	if (ret != SD_NO_ERR)	
    044D 2300      TST	R16
    044E F009      BEQ	0x0450
(0088) 		return ret;	
    044F C05D      RJMP	0x04AD
(0089) 		
(0090) 	SD_CalTimeout(csdbuf);														/* 计算超时时间值 calculate timeout value */
    0450 018E      MOVW	R16,R28
    0451 D05F      RCALL	_SD_CalTimeout
(0091) 		
(0092) 	/* 计算块的最大长度  */														/* calculate the size of a sector */
(0093) 	sds.block_len = 1 << (csdbuf[READ_BL_LEN_POS] & READ_BL_LEN_MSK);  			/* (2 ^ READ_BL_LEN) */
    0452 811D      LDD	R17,Y+5
    0453 701F      ANDI	R17,0xF
    0454 E001      LDI	R16,1
    0455 940E0D63  CALL	lsl8
    0457 9300010C  STS	sds+1,R16
(0094) 	
(0095) 	/* 计算卡中块的个数 */														/* calculate the sector numbers of the SD Card */
(0096) 	sds.block_num = ((csdbuf[C_SIZE_POS1] & C_SIZE_MSK1) << 10) +
    0459 E01A      LDI	R17,0xA
    045A 810E      LDD	R16,Y+6
    045B 7003      ANDI	R16,3
    045C 940E0D63  CALL	lsl8
    045E 2E20      MOV	R2,R16
    045F 803F      LDD	R3,Y+7
    0460 0C33      LSL	R3
    0461 0C33      LSL	R3
    0462 0C23      ADD	R2,R3
    0463 8588      LDD	R24,Y+8
    0464 7C80      ANDI	R24,0xC0
    0465 9586      LSR	R24
    0466 9586      LSR	R24
    0467 9586      LSR	R24
    0468 9586      LSR	R24
    0469 9586      LSR	R24
    046A 9586      LSR	R24
    046B 0E28      ADD	R2,R24
    046C 2D82      MOV	R24,R2
    046D 5F8F      SUBI	R24,0xFF
    046E 9380010B  STS	sds,R24
(0097) 	      			 (csdbuf[C_SIZE_POS2] << 2) +
(0098) 	 	 			((csdbuf[C_SIZE_POS3] & C_SIZE_MSK3) >> 6) + 1;				/* (C_SIZE + 1)*/
(0099) 		 	  															
(0100) 	tmp = ((csdbuf[C_SIZE_MULT_POS1] & C_SIZE_MULT_MSK1) << 1) +   
    0470 E027      LDI	R18,7
    0471 E030      LDI	R19,0
    0472 850A      LDD	R16,Y+10
    0473 2711      CLR	R17
    0474 7800      ANDI	R16,0x80
    0475 7010      ANDI	R17,0
    0476 940E0BFA  CALL	asr16
    0478 8589      LDD	R24,Y+9
    0479 2799      CLR	R25
    047A 7083      ANDI	R24,3
    047B 7090      ANDI	R25,0
    047C 0F88      LSL	R24
    047D 1F99      ROL	R25
    047E 0F80      ADD	R24,R16
    047F 1F91      ADC	R25,R17
    0480 9602      ADIW	R24,2
    0481 011C      MOVW	R2,R24
    0482 2444      CLR	R4
    0483 FC37      SBRC	R3,7
    0484 9440      COM	R4
    0485 2455      CLR	R5
    0486 FC47      SBRC	R4,7
    0487 9450      COM	R5
    0488 01FE      MOVW	R30,R28
    0489 8A20      STD	Z+16,R2
    048A 8A31      STD	Z+17,R3
    048B 8A42      STD	Z+18,R4
    048C 8A53      STD	Z+19,R5
(0101) 	      ((csdbuf[C_SIZE_MULT_POS2] & C_SIZE_MULT_MSK2) >> 7) + 2;				/* (C_SIZE_MULT + 2) */
(0102)     	
(0103)     /* 获得卡中块的数量 */														/* get the block numbers in card */
(0104) 	sds.block_num = sds.block_num * (1 << tmp);									/* (C_SIZE + 1) * 2 ^ (C_SIZE_MULT + 2) */
    048D 01FE      MOVW	R30,R28
    048E 8920      LDD	R18,Z+16
    048F 8931      LDD	R19,Z+17
    0490 E001      LDI	R16,1
    0491 E010      LDI	R17,0
    0492 940E0D50  CALL	lsl16
    0494 0198      MOVW	R18,R16
    0495 9100010B  LDS	R16,sds
    0497 2711      CLR	R17
    0498 940E0CAC  CALL	empy16s
    049A 9300010B  STS	sds,R16
(0105) 																			
(0106) 	/* 计算扇区大小 */															/*calculate the size of sector */
(0107) 	sds.erase_unit = ((csdbuf[SECTOR_SIZE_POS1] & SECTOR_SIZE_MSK1) << 1) +  			
    049C 858B      LDD	R24,Y+11
    049D 7880      ANDI	R24,0x80
    049E 9586      LSR	R24
    049F 9586      LSR	R24
    04A0 9586      LSR	R24
    04A1 9586      LSR	R24
    04A2 9586      LSR	R24
    04A3 9586      LSR	R24
    04A4 9586      LSR	R24
    04A5 859A      LDD	R25,Y+10
    04A6 739F      ANDI	R25,0x3F
    04A7 0F99      LSL	R25
    04A8 0F98      ADD	R25,R24
    04A9 5F9F      SUBI	R25,0xFF
    04AA 9390010D  STS	sds+2,R25
(0108) 	                 ((csdbuf[SECTOR_SIZE_POS2] & SECTOR_SIZE_MSK2) >> 7) + 1; /* SD (SECTOR_SIZE + 1) */
(0109) 	    			
(0110) 	return SD_NO_ERR;															/* 返回执行成功 return perform sucessfully */
    04AC 2700      CLR	R16
    04AD 9664      ADIW	R28,0x14
    04AE 940E0D03  CALL	pop_gset1
    04B0 9508      RET
_SD_CalTimeout:
  time_u               --> R14
  fator                --> R10
  time_v               --> R12
  tmp                  --> Y+0
  csdbuf               --> Y+14
    04B1 931A      ST	R17,-Y
    04B2 930A      ST	R16,-Y
    04B3 940E0CF8  CALL	push_gset5
    04B5 9724      SBIW	R28,4
(0111) }
(0112) 
(0113) 
(0114) /*******************************************************************************************************************
(0115) ** 函数名称: INT8U SD_CalTimeout()				Name:	  INT8U SD_CalTimeout()
(0116) ** 功能描述: 计算读/写/擦超时时间				Function: get the information of SD card
(0117) ** 输   入: INT8U cardtype: 卡类型				Input:    INT8U cardtype: card type	
(0118) 			 INT8U *csdbuf : CSD寄存器内容		 	      INT8U *csdbuf : CSD register content
(0119) ** 输   出: 0:   正确    >0:   错误码		  	Output:	  0:  right		>0:  error code
(0120) *******************************************************************************************************************/
(0121) void SD_CalTimeout(uint8 *csdbuf)
(0122) {
(0123) 	uint32 tmp;
(0124) 	uint8 time_u,time_v,fator;
(0125) 	
(0126) 	sds.timeout_read = READ_TIMEOUT_100MS;								/* 默认读超时为100ms */
    04B6 E040      LDI	R20,0
    04B7 E05E      LDI	R21,0xE
    04B8 E061      LDI	R22,1
    04B9 E070      LDI	R23,0
    04BA 011A      MOVW	R2,R20
    04BB 9220010E  STS	sds+3,R2
(0127) 	sds.timeout_write = WRITE_TIMEOUT_250MS;							/* 默认写超时为250ms */
    04BD E040      LDI	R20,0
    04BE EA53      LDI	R21,0xA3
    04BF E062      LDI	R22,2
    04C0 E070      LDI	R23,0
    04C1 011A      MOVW	R2,R20
    04C2 9220010F  STS	0x10F,R2
(0128) 	sds.timeout_erase = WRITE_TIMEOUT_250MS;
    04C4 E040      LDI	R20,0
    04C5 EA53      LDI	R21,0xA3
    04C6 E062      LDI	R22,2
    04C7 E070      LDI	R23,0
    04C8 011A      MOVW	R2,R20
    04C9 92200110  STS	0x110,R2
(0129) 		
(0130) 	time_u = (csdbuf[TAAC_POS] & TAAC_MSK);								/* 读超时时间单位 read timeout unit */
    04CB 85EE      LDD	R30,Y+14
    04CC 85FF      LDD	R31,Y+15
    04CD 8181      LDD	R24,Z+1
    04CE 7087      ANDI	R24,7
    04CF 2EE8      MOV	R14,R24
(0131) 	time_v = (csdbuf[TAAC_POS] & NSAC_MSK) >> 3;						/* 读超时时间值   read timeout value */
    04D0 85EE      LDD	R30,Y+14
    04D1 85FF      LDD	R31,Y+15
    04D2 8181      LDD	R24,Z+1
    04D3 7788      ANDI	R24,0x78
    04D4 2EC8      MOV	R12,R24
    04D5 94C6      LSR	R12
    04D6 94C6      LSR	R12
    04D7 94C6      LSR	R12
(0132) 	fator = (csdbuf[R2WFACTOR_POS] & R2WFACTOR_MSK) >> 2;				/* 写超时时间因数 write timeout factor */
    04D8 85EE      LDD	R30,Y+14
    04D9 85FF      LDD	R31,Y+15
    04DA 8584      LDD	R24,Z+12
    04DB 718C      ANDI	R24,0x1C
    04DC 2EA8      MOV	R10,R24
    04DD 94A6      LSR	R10
    04DE 94A6      LSR	R10
(0133) 	
(0134) 	if(time_v == 0)	return;
    04DF 20CC      TST	R12
    04E0 F409      BNE	0x04E2
    04E1 C0BA      RJMP	0x059C
(0135) 	if(fator >= 6) return;
    04E2 2D8A      MOV	R24,R10
    04E3 3086      CPI	R24,6
    04E4 F008      BCS	0x04E6
    04E5 C0B6      RJMP	0x059C
(0136) 	
(0137) 	tmp = SPI_CLOCK * time_value[time_v] / 10 / time_unit[time_u];		/* TACC * f (单位 unit: clock) */
    04E6 E88C      LDI	R24,0x8C
    04E7 E091      LDI	R25,1
    04E8 2DEC      MOV	R30,R12
    04E9 27FF      CLR	R31
    04EA 0FE8      ADD	R30,R24
    04EB 1FF9      ADC	R31,R25
    04EC 9024      LPM	R2,0(Z)
    04ED 2433      CLR	R3
    04EE 2444      CLR	R4
    04EF 2455      CLR	R5
    04F0 E040      LDI	R20,0
    04F1 E650      LDI	R21,0x60
    04F2 E564      LDI	R22,0x54
    04F3 E070      LDI	R23,0
    04F4 925A      ST	R5,-Y
    04F5 924A      ST	R4,-Y
    04F6 923A      ST	R3,-Y
    04F7 922A      ST	R2,-Y
    04F8 018A      MOVW	R16,R20
    04F9 019B      MOVW	R18,R22
    04FA 940E0CBC  CALL	empy32u
    04FC E04A      LDI	R20,0xA
    04FD E050      LDI	R21,0
    04FE E060      LDI	R22,0
    04FF E070      LDI	R23,0
    0500 937A      ST	R23,-Y
    0501 936A      ST	R22,-Y
    0502 935A      ST	R21,-Y
    0503 934A      ST	R20,-Y
    0504 940E0C41  CALL	div32s
    0506 0118      MOVW	R2,R16
    0507 0129      MOVW	R4,R18
    0508 E084      LDI	R24,4
    0509 9D8E      MUL	R24,R14
    050A 0180      MOVW	R16,R0
    050B E68C      LDI	R24,0x6C
    050C E091      LDI	R25,1
    050D 0F08      ADD	R16,R24
    050E 1F19      ADC	R17,R25
    050F 940E0D3C  CALL	lpm32
    0511 933A      ST	R19,-Y
    0512 932A      ST	R18,-Y
    0513 931A      ST	R17,-Y
    0514 930A      ST	R16,-Y
    0515 0181      MOVW	R16,R2
    0516 0192      MOVW	R18,R4
    0517 940E0C3B  CALL	div32u
    0519 01FE      MOVW	R30,R28
    051A 8300      STD	Z+0,R16
    051B 8311      STD	Z+1,R17
    051C 8322      STD	Z+2,R18
    051D 8333      STD	Z+3,R19
(0138) 	tmp = tmp + csdbuf[NSAC_POS] * 100;									/* TACC * f + NSAC * 100 (单位 unit: clock) */
    051E 85EE      LDD	R30,Y+14
    051F 85FF      LDD	R31,Y+15
    0520 8022      LDD	R2,Z+2
    0521 E684      LDI	R24,0x64
    0522 9D82      MUL	R24,R2
    0523 0110      MOVW	R2,R0
    0524 2444      CLR	R4
    0525 FC37      SBRC	R3,7
    0526 9440      COM	R4
    0527 2455      CLR	R5
    0528 FC47      SBRC	R4,7
    0529 9450      COM	R5
    052A 01FE      MOVW	R30,R28
    052B 8060      LDD	R6,Z+0
    052C 8071      LDD	R7,Z+1
    052D 8082      LDD	R8,Z+2
    052E 8093      LDD	R9,Z+3
    052F 0C62      ADD	R6,R2
    0530 1C73      ADC	R7,R3
    0531 1C84      ADC	R8,R4
    0532 1C95      ADC	R9,R5
    0533 01FE      MOVW	R30,R28
    0534 8260      STD	Z+0,R6
    0535 8271      STD	Z+1,R7
    0536 8282      STD	Z+2,R8
    0537 8293      STD	Z+3,R9
(0139) 	
(0140) 	/* 计算得到的超时值 the timeout value of being calculated */
(0141) 	sds.timeout_read = tmp;
    0538 01FE      MOVW	R30,R28
    0539 8020      LDD	R2,Z+0
    053A 8031      LDD	R3,Z+1
    053B 8042      LDD	R4,Z+2
    053C 8053      LDD	R5,Z+3
    053D 9220010E  STS	sds+3,R2
(0142) 	sds.timeout_write = tmp * r2w_fator[fator];							/* (TACC * f + NSAC * 100) * R2WFACTOR (单位 unit:clock)*/
    053F E98C      LDI	R24,0x9C
    0540 E091      LDI	R25,1
    0541 2DEA      MOV	R30,R10
    0542 27FF      CLR	R31
    0543 0FE8      ADD	R30,R24
    0544 1FF9      ADC	R31,R25
    0545 9024      LPM	R2,0(Z)
    0546 2433      CLR	R3
    0547 2444      CLR	R4
    0548 2455      CLR	R5
    0549 01FE      MOVW	R30,R28
    054A 8060      LDD	R6,Z+0
    054B 8071      LDD	R7,Z+1
    054C 8082      LDD	R8,Z+2
    054D 8093      LDD	R9,Z+3
    054E 925A      ST	R5,-Y
    054F 924A      ST	R4,-Y
    0550 923A      ST	R3,-Y
    0551 922A      ST	R2,-Y
    0552 0183      MOVW	R16,R6
    0553 0194      MOVW	R18,R8
    0554 940E0CBC  CALL	empy32u
    0556 9300010F  STS	0x10F,R16

⌨️ 快捷键说明

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