📄 zhw.lst
字号:
(0143)
(0144) sds.timeout_read = sds.timeout_read * 100 / 8; /* 实际值为计算值的100倍 */
0558 9020010E LDS R2,sds+3
055A E684 LDI R24,0x64
055B 9D82 MUL R24,R2
055C 0180 MOVW R16,R0
055D E028 LDI R18,0x8
055E E030 LDI R19,0
055F 940E0C05 CALL div16s
0561 9300010E STS sds+3,R16
(0145) sds.timeout_write = sds.timeout_write * 100 / 8;
0563 9020010F LDS R2,0x10F
0565 E684 LDI R24,0x64
0566 9D82 MUL R24,R2
0567 0180 MOVW R16,R0
0568 E028 LDI R18,0x8
0569 E030 LDI R19,0
056A 940E0C05 CALL div16s
056C 9300010F STS 0x10F,R16
(0146)
(0147) if (sds.timeout_read > READ_TIMEOUT_100MS) /* 取计算值与默认值中的最小值 */
056E E040 LDI R20,0
056F E05E LDI R21,0xE
0570 E061 LDI R22,1
0571 E070 LDI R23,0
0572 9020010E LDS R2,sds+3
0574 2433 CLR R3
0575 2444 CLR R4
0576 2455 CLR R5
0577 1542 CP R20,R2
0578 0553 CPC R21,R3
0579 0564 CPC R22,R4
057A 0575 CPC R23,R5
057B F43C BGE 0x0583
(0148) sds.timeout_read = READ_TIMEOUT_100MS;
057C E040 LDI R20,0
057D E05E LDI R21,0xE
057E E061 LDI R22,1
057F E070 LDI R23,0
0580 011A MOVW R2,R20
0581 9220010E STS sds+3,R2
(0149)
(0150) if (sds.timeout_write > WRITE_TIMEOUT_250MS)
0583 E040 LDI R20,0
0584 EA53 LDI R21,0xA3
0585 E062 LDI R22,2
0586 E070 LDI R23,0
0587 9020010F LDS R2,0x10F
0589 2433 CLR R3
058A 2444 CLR R4
058B 2455 CLR R5
058C 1542 CP R20,R2
058D 0553 CPC R21,R3
058E 0564 CPC R22,R4
058F 0575 CPC R23,R5
0590 F43C BGE 0x0598
(0151) sds.timeout_write = WRITE_TIMEOUT_250MS;
0591 E040 LDI R20,0
0592 EA53 LDI R21,0xA3
0593 E062 LDI R22,2
0594 E070 LDI R23,0
0595 011A MOVW R2,R20
0596 9220010F STS 0x10F,R2
(0152)
(0153) sds.timeout_erase = sds.timeout_write;
0598 9020010F LDS R2,0x10F
059A 92200110 STS 0x110,R2
059C 9624 ADIW R28,4
059D 940E0CF5 CALL pop_gset5
059F 9622 ADIW R28,2
05A0 9508 RET
_SD_ActiveInit:
param --> Y+13
resp --> Y+8
i --> Y+4
ret --> R10
05A1 940E0CFC CALL push_gset3
05A3 9761 SBIW R28,0x11
(0154) }
(0155) /*******************************************************************************************************************
(0156) ** 函数名称: INT8U SD_CalTimeout() Name: INT8U SD_CalTimeout()
(0157) ** 功能描述: 计算读/写/擦超时时间 Function: get the information of SD card
(0158) ** 输 入: INT8U *cardtype: 卡类型接收缓冲 Input: INT8U *cardtype: card type receive buff
(0159) ** 输 出: 0: 正确 >0: 错误码 Output: 0: right >0: error code
(0160) ** 函数说明: 该命令不断重复发送到SD卡,直到响应R1的Bit0(Idle)位为0,表示SD卡内部初始化处理完成。
(0161) 当响应的Idle位为0时,SD卡就完全进入SPI模式了。当然重复发送命令CMD1是有次数限制的,
(0162) 最大次数为宏定义SD_IDLE_WAIT_MAX.
(0163) *******************************************************************************************************************/
(0164) uint8 SD_ActiveInit(void)
(0165) {
(0166) uint8 param[4] = {0,0,0,0},resp[5],ret;
05A4 EA82 LDI R24,0xA2
05A5 E091 LDI R25,1
05A6 01FE MOVW R30,R28
05A7 963D ADIW R30,0xD
05A8 E004 LDI R16,4
05A9 E010 LDI R17,0
05AA 93FA ST R31,-Y
05AB 93EA ST R30,-Y
05AC 939A ST R25,-Y
05AD 938A ST R24,-Y
05AE 940E0D75 CALL asgncblk
(0167) uint32 i = 0;
05B0 E040 LDI R20,0
05B1 E050 LDI R21,0
05B2 E060 LDI R22,0
05B3 E070 LDI R23,0
05B4 01FE MOVW R30,R28
05B5 8344 STD Z+4,R20
05B6 8355 STD Z+5,R21
05B7 8366 STD Z+6,R22
05B8 8377 STD Z+7,R23
(0168)
(0169) do
(0170) { /* 发出CMD1, 查询卡的状态, send CMD1 to poll card status */
(0171) ret = SD_SendCmd(CMD1, param, CMD1_R, resp);
05B9 01CE MOVW R24,R28
05BA 9608 ADIW R24,0x8
05BB 839B STD Y+3,R25
05BC 838A STD Y+2,R24
05BD E081 LDI R24,1
05BE 8388 STD Y+0,R24
05BF 019E MOVW R18,R28
05C0 5F23 SUBI R18,0xF3
05C1 4F3F SBCI R19,0xFF
05C2 E001 LDI R16,1
05C3 940E0676 CALL _SD_SendCmd
05C5 2EA0 MOV R10,R16
(0172) if (ret != SD_NO_ERR)
05C6 2300 TST R16
05C7 F009 BEQ 0x05C9
(0173) return ret;
05C8 C036 RJMP 0x05FF
(0174)
(0175) i++;
05C9 E041 LDI R20,1
05CA E050 LDI R21,0
05CB E060 LDI R22,0
05CC E070 LDI R23,0
05CD 01FE MOVW R30,R28
05CE 8024 LDD R2,Z+4
05CF 8035 LDD R3,Z+5
05D0 8046 LDD R4,Z+6
05D1 8057 LDD R5,Z+7
05D2 0E24 ADD R2,R20
05D3 1E35 ADC R3,R21
05D4 1E46 ADC R4,R22
05D5 1E57 ADC R5,R23
05D6 01FE MOVW R30,R28
05D7 8224 STD Z+4,R2
05D8 8235 STD Z+5,R3
05D9 8246 STD Z+6,R4
05DA 8257 STD Z+7,R5
(0176) }
(0177) while (((resp[0] & MSK_IDLE) == MSK_IDLE) && (i < SD_IDLE_WAIT_MAX));
05DB 8588 LDD R24,Y+8
05DC 7081 ANDI R24,1
05DD 3081 CPI R24,1
05DE F479 BNE 0x05EE
05DF EE48 LDI R20,0xE8
05E0 E053 LDI R21,3
05E1 E060 LDI R22,0
05E2 E070 LDI R23,0
05E3 01FE MOVW R30,R28
05E4 8024 LDD R2,Z+4
05E5 8035 LDD R3,Z+5
05E6 8046 LDD R4,Z+6
05E7 8057 LDD R5,Z+7
05E8 1624 CP R2,R20
05E9 0635 CPC R3,R21
05EA 0646 CPC R4,R22
05EB 0657 CPC R5,R23
05EC F408 BCC 0x05EE
05ED CFCB RJMP 0x05B9
(0178) /* 如果响应R1的最低位Idle位为1,则继续循环 */
(0179)
(0180) if (i >= SD_IDLE_WAIT_MAX)
05EE EE48 LDI R20,0xE8
05EF E053 LDI R21,3
05F0 E060 LDI R22,0
05F1 E070 LDI R23,0
05F2 01FE MOVW R30,R28
05F3 8024 LDD R2,Z+4
05F4 8035 LDD R3,Z+5
05F5 8046 LDD R4,Z+6
05F6 8057 LDD R5,Z+7
05F7 1624 CP R2,R20
05F8 0635 CPC R3,R21
05F9 0646 CPC R4,R22
05FA 0657 CPC R5,R23
05FB F010 BCS 0x05FE
(0181) return SD_ERR_TIMEOUT_WAITIDLE; /* 超时,返回错误 time out,return error */
05FC E304 LDI R16,0x34
05FD C001 RJMP 0x05FF
(0182)
(0183) return SD_NO_ERR;
05FE 2700 CLR R16
05FF 9661 ADIW R28,0x11
0600 940E0CEF CALL pop_gset3
0602 9508 RET
_SD_GetCRC16:
i --> R20
result --> R22
len --> R10
pSource --> R12
0603 940E0CFA CALL push_gset4
0605 0159 MOVW R10,R18
0606 0168 MOVW R12,R16
FILE: D:\new_sd\SD\SD\sdcrc.c
(0001) /*******************************************************************************************************
(0002) ** Descriptions: sd 卡驱动软件包: SD卡相关工具函数 ---- CRC校验
(0003) ********************************************************************************************************/
(0004) #include "D:\new_sd\define.h"
(0005)
(0006)
(0007)
(0008) #if SD_CRC_EN
(0009) //X16 + X12 + X5 + 1 余式表
(0010) uint16 const CRCTable[256]={0x0000,0x1021,0x2042,0x3063,0x4084,0x50a5,0x60c6,0x70e7,
(0011) 0x8108,0x9129,0xa14a,0xb16b,0xc18c,0xd1ad,0xe1ce,0xf1ef,
(0012) 0x1231,0x0210,0x3273,0x2252,0x52b5,0x4294,0x72f7,0x62d6,
(0013) 0x9339,0x8318,0xb37b,0xa35a,0xd3bd,0xc39c,0xf3ff,0xe3de,
(0014) 0x2462,0x3443,0x0420,0x1401,0x64e6,0x74c7,0x44a4,0x5485,
(0015) 0xa56a,0xb54b,0x8528,0x9509,0xe5ee,0xf5cf,0xc5ac,0xd58d,
(0016) 0x3653,0x2672,0x1611,0x0630,0x76d7,0x66f6,0x5695,0x46b4,
(0017) 0xb75b,0xa77a,0x9719,0x8738,0xf7df,0xe7fe,0xd79d,0xc7bc,
(0018) 0x48c4,0x58e5,0x6886,0x78a7,0x0840,0x1861,0x2802,0x3823,
(0019) 0xc9cc,0xd9ed,0xe98e,0xf9af,0x8948,0x9969,0xa90a,0xb92b,
(0020) 0x5af5,0x4ad4,0x7ab7,0x6a96,0x1a71,0x0a50,0x3a33,0x2a12,
(0021) 0xdbfd,0xcbdc,0xfbbf,0xeb9e,0x9b79,0x8b58,0xbb3b,0xab1a,
(0022) 0x6ca6,0x7c87,0x4ce4,0x5cc5,0x2c22,0x3c03,0x0c60,0x1c41,
(0023) 0xedae,0xfd8f,0xcdec,0xddcd,0xad2a,0xbd0b,0x8d68,0x9d49,
(0024) 0x7e97,0x6eb6,0x5ed5,0x4ef4,0x3e13,0x2e32,0x1e51,0x0e70,
(0025) 0xff9f,0xefbe,0xdfdd,0xcffc,0xbf1b,0xaf3a,0x9f59,0x8f78,
(0026) 0x9188,0x81a9,0xb1ca,0xa1eb,0xd10c,0xc12d,0xf14e,0xe16f,
(0027) 0x1080,0x00a1,0x30c2,0x20e3,0x5004,0x4025,0x7046,0x6067,
(0028) 0x83b9,0x9398,0xa3fb,0xb3da,0xc33d,0xd31c,0xe37f,0xf35e,
(0029) 0x02b1,0x1290,0x22f3,0x32d2,0x4235,0x5214,0x6277,0x7256,
(0030) 0xb5ea,0xa5cb,0x95a8,0x8589,0xf56e,0xe54f,0xd52c,0xc50d,
(0031) 0x34e2,0x24c3,0x14a0,0x0481,0x7466,0x6447,0x5424,0x4405,
(0032) 0xa7db,0xb7fa,0x8799,0x97b8,0xe75f,0xf77e,0xc71d,0xd73c,
(0033) 0x26d3,0x36f2,0x0691,0x16b0,0x6657,0x7676,0x4615,0x5634,
(0034) 0xd94c,0xc96d,0xf90e,0xe92f,0x99c8,0x89e9,0xb98a,0xa9ab,
(0035) 0x5844,0x4865,0x7806,0x6827,0x18c0,0x08e1,0x3882,0x28a3,
(0036) 0xcb7d,0xdb5c,0xeb3f,0xfb1e,0x8bf9,0x9bd8,0xabbb,0xbb9a,
(0037) 0x4a75,0x5a54,0x6a37,0x7a16,0x0af1,0x1ad0,0x2ab3,0x3a92,
(0038) 0xfd2e,0xed0f,0xdd6c,0xcd4d,0xbdaa,0xad8b,0x9de8,0x8dc9,
(0039) 0x7c26,0x6c07,0x5c64,0x4c45,0x3ca2,0x2c83,0x1ce0,0x0cc1,
(0040) 0xef1f,0xff3e,0xcf5d,0xdf7c,0xaf9b,0xbfba,0x8fd9,0x9ff8,
(0041) 0x6e17,0x7e36,0x4e55,0x5e74,0x2e93,0x3eb2,0x0ed1,0x1ef0
(0042) };
(0043)
(0044) /********************************************************************************************************************
(0045) ** 函数名称: INT8U SD_GetCRC16() Name: INT8U SD_GetCRC16()
(0046) ** 功能描述: 计算CRC16 Function: calculate CRC16
(0047) ** 输 入: INT8U *pSource: 数据 Input: INT8U *pSource: data
(0048) INT16U len : 长度 INT16U len : len
(0049) ** 输 出: CRC16码 Output: CRC16 code
(0050) ********************************************************************************************************************/
(0051) uint16 SD_GetCRC16(uint8 *pSource, uint16 len)
(0052) {
(0053) uint16 i;
(0054) uint16 result = 0;
0607 2766 CLR R22
0608 2777 CLR R23
(0055)
(0056) for (i = 0; i < len; i++)
0609 2744 CLR R20
060A 2755 CLR R21
060B C01D RJMP 0x0629
(0057) result = (result << 8) ^ (uint16)CRCTable[(result >> 8) ^ *pSource++];
060C 01F6 MOVW R30,R12
060D 9021 LD R2,Z+
060E 016F MOVW R12,R30
060F 2433 CLR R3
0610 019B MOVW R18,R22
0611 2F23 MOV R18,R19
0612 2733 CLR R19
0613 2522 EOR R18,R2
0614 2533 EOR R19,R3
0615 E002 LDI R16,2
0616 E010 LDI R17,0
0617 940E0CAC CALL empy16s
0619 01F8 MOVW R30,R16
061A EA86 LDI R24,0xA6
061B E091 LDI R25,1
061C 0FE8 ADD R30,R24
061D 1FF9 ADC R31,R25
061E 9005 LPM R0,Z+
061F 9014 LPM R1,0(Z)
0620 01F0 MOVW R30,R0
0621 011B MOVW R2,R22
0622 2C32 MOV R3,R2
0623 2422 CLR R2
0624 262E EOR R2,R30
0625 263F EOR R3,R31
0626 01B1 MOVW R22,R2
0627 5F4F SUBI R20,0xFF
0628 4F5F SBCI R21,0xFF
0629 154A CP R20,R10
062A 055B CPC R21,R11
062B F300 BCS 0x060C
(0058)
(0059) return result;
062C 018B MOVW R16,R22
062D 940E0CF2 CALL pop_gset4
062F 9508 RET
_SD_GetCmdByte6:
array --> Y+0
i --> R20
reg --> R22
j --> R12
param --> R10
cmd --> R20
0630 940E0CF8 CALL push_gset5
0632 0159 MOVW R10,R18
0633 2F40 MOV R20,R16
0634 9725 SBIW R28,5
(0060) }
(0061)
(0062) /*******************************************************************************************************************
(0063) ** 函数名称: INT8U SD_GetCmdByte6() Name: INT8U SD_GetCmdByte6()
(0064) ** 功能描述: 获取SD卡命令的CRC7 Function: get the CRC7 of the command of SD card
(0065) ** 输 入: INT8U cmd : 命令 Input: INT8U cmd : command
(0066) INT8U *param: 命令的参数,长度为4字节 INT8U *param: the param of command,length is 4 bytes
(0067) ** 输 出: CRC7码 Output: CRC7 code
(0068) ********************************************************************************************************************/
(0069) uint8 SD_GetCmdByte6(uint8 cmd, uint8 *param)
(0070) {
(0071) uint8 i, j;
(0072) uint8 reg = 0;
0635 2766 CLR R22
(0073) uint8 array[5];
(0074)
(0075) array[0] = cmd;
0636 8348 STD Y+0,R20
(0076) for (i = 1; i < 5; i++) /* 将参数的顺序重新排列 */
0637 E041 LDI R20,1
0638 C010 RJMP 0x0649
(0077) array[i] = param[4 - i];
0639 2E24 MOV R2,R20
063A 2433 CLR R3
063B E0E4 LDI R30,4
063C E0F0 LDI R31,0
063D 19E2 SUB R30,R2
063E 09F3 SBC R31,R3
063F 0DEA ADD R30,R10
0640 1DFB ADC R31,R11
0641 8020 LDD R2,Z+0
0642 01CE MOVW R24,R28
0643 2FE4 MOV R30,R20
0644 27FF CLR R31
0645 0FE8 ADD R30,R24
0646 1FF9 ADC
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -