📄 zhw.lst
字号:
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 + -