📄 sdcrc.lis
字号:
0000 _SD_GetCRC16::
0000 0E940000 xcall push_gset4
0004 5901 movw R10,R18
0006 6801 movw R12,R16
0008 .dbline -1
0008 .dbline 52
0008 ; /*******************************************************************************************************
0008 ; ** Descriptions: sd 卡驱动软件包: SD卡相关工具函数 ---- CRC校验
0008 ; ********************************************************************************************************/
0008 ; #include "D:\new_sd\define.h"
0008 ;
0008 ;
0008 ;
0008 ; #if SD_CRC_EN
0008 ; //X16 + X12 + X5 + 1 余式表
0008 ; uint16 const CRCTable[256]={0x0000,0x1021,0x2042,0x3063,0x4084,0x50a5,0x60c6,0x70e7,
0008 ; 0x8108,0x9129,0xa14a,0xb16b,0xc18c,0xd1ad,0xe1ce,0xf1ef,
0008 ; 0x1231,0x0210,0x3273,0x2252,0x52b5,0x4294,0x72f7,0x62d6,
0008 ; 0x9339,0x8318,0xb37b,0xa35a,0xd3bd,0xc39c,0xf3ff,0xe3de,
0008 ; 0x2462,0x3443,0x0420,0x1401,0x64e6,0x74c7,0x44a4,0x5485,
0008 ; 0xa56a,0xb54b,0x8528,0x9509,0xe5ee,0xf5cf,0xc5ac,0xd58d,
0008 ; 0x3653,0x2672,0x1611,0x0630,0x76d7,0x66f6,0x5695,0x46b4,
0008 ; 0xb75b,0xa77a,0x9719,0x8738,0xf7df,0xe7fe,0xd79d,0xc7bc,
0008 ; 0x48c4,0x58e5,0x6886,0x78a7,0x0840,0x1861,0x2802,0x3823,
0008 ; 0xc9cc,0xd9ed,0xe98e,0xf9af,0x8948,0x9969,0xa90a,0xb92b,
0008 ; 0x5af5,0x4ad4,0x7ab7,0x6a96,0x1a71,0x0a50,0x3a33,0x2a12,
0008 ; 0xdbfd,0xcbdc,0xfbbf,0xeb9e,0x9b79,0x8b58,0xbb3b,0xab1a,
0008 ; 0x6ca6,0x7c87,0x4ce4,0x5cc5,0x2c22,0x3c03,0x0c60,0x1c41,
0008 ; 0xedae,0xfd8f,0xcdec,0xddcd,0xad2a,0xbd0b,0x8d68,0x9d49,
0008 ; 0x7e97,0x6eb6,0x5ed5,0x4ef4,0x3e13,0x2e32,0x1e51,0x0e70,
0008 ; 0xff9f,0xefbe,0xdfdd,0xcffc,0xbf1b,0xaf3a,0x9f59,0x8f78,
0008 ; 0x9188,0x81a9,0xb1ca,0xa1eb,0xd10c,0xc12d,0xf14e,0xe16f,
0008 ; 0x1080,0x00a1,0x30c2,0x20e3,0x5004,0x4025,0x7046,0x6067,
0008 ; 0x83b9,0x9398,0xa3fb,0xb3da,0xc33d,0xd31c,0xe37f,0xf35e,
0008 ; 0x02b1,0x1290,0x22f3,0x32d2,0x4235,0x5214,0x6277,0x7256,
0008 ; 0xb5ea,0xa5cb,0x95a8,0x8589,0xf56e,0xe54f,0xd52c,0xc50d,
0008 ; 0x34e2,0x24c3,0x14a0,0x0481,0x7466,0x6447,0x5424,0x4405,
0008 ; 0xa7db,0xb7fa,0x8799,0x97b8,0xe75f,0xf77e,0xc71d,0xd73c,
0008 ; 0x26d3,0x36f2,0x0691,0x16b0,0x6657,0x7676,0x4615,0x5634,
0008 ; 0xd94c,0xc96d,0xf90e,0xe92f,0x99c8,0x89e9,0xb98a,0xa9ab,
0008 ; 0x5844,0x4865,0x7806,0x6827,0x18c0,0x08e1,0x3882,0x28a3,
0008 ; 0xcb7d,0xdb5c,0xeb3f,0xfb1e,0x8bf9,0x9bd8,0xabbb,0xbb9a,
0008 ; 0x4a75,0x5a54,0x6a37,0x7a16,0x0af1,0x1ad0,0x2ab3,0x3a92,
0008 ; 0xfd2e,0xed0f,0xdd6c,0xcd4d,0xbdaa,0xad8b,0x9de8,0x8dc9,
0008 ; 0x7c26,0x6c07,0x5c64,0x4c45,0x3ca2,0x2c83,0x1ce0,0x0cc1,
0008 ; 0xef1f,0xff3e,0xcf5d,0xdf7c,0xaf9b,0xbfba,0x8fd9,0x9ff8,
0008 ; 0x6e17,0x7e36,0x4e55,0x5e74,0x2e93,0x3eb2,0x0ed1,0x1ef0
0008 ; };
0008 ;
0008 ; /********************************************************************************************************************
0008 ; ** 函数名称: INT8U SD_GetCRC16() Name: INT8U SD_GetCRC16()
0008 ; ** 功能描述: 计算CRC16 Function: calculate CRC16
0008 ; ** 输 入: INT8U *pSource: 数据 Input: INT8U *pSource: data
0008 ; INT16U len : 长度 INT16U len : len
0008 ; ** 输 出: CRC16码 Output: CRC16 code
0008 ; ********************************************************************************************************************/
0008 ; uint16 SD_GetCRC16(uint8 *pSource, uint16 len)
0008 ; {
0008 .dbline 54
0008 ; uint16 i;
0008 ; uint16 result = 0;
0008 6627 clr R22
000A 7727 clr R23
000C .dbline 56
000C ;
000C ; for (i = 0; i < len; i++)
000C 4427 clr R20
000E 5527 clr R21
0010 1DC0 xjmp L5
0012 L2:
0012 .dbline 57
0012 F601 movw R30,R12
0014 2190 ld R2,Z+
0016 6F01 movw R12,R30
0018 3324 clr R3
001A 9B01 movw R18,R22
001C 232F mov R18,R19
001E 3327 clr R19
0020 2225 eor R18,R2
0022 3325 eor R19,R3
0024 02E0 ldi R16,2
0026 10E0 ldi R17,0
0028 0E940000 xcall empy16s
002C F801 movw R30,R16
002E 80E0 ldi R24,<_CRCTable
0030 90E0 ldi R25,>_CRCTable
0032 E80F add R30,R24
0034 F91F adc R31,R25
0036 0590 lpm R0,Z+
0038 1490 lpm R1,Z
003A F001 movw R30,R0
003C 1B01 movw R2,R22
003E 322C mov R3,R2
0040 2224 clr R2
0042 2E26 eor R2,R30
0044 3F26 eor R3,R31
0046 B101 movw R22,R2
0048 L3:
0048 .dbline 56
0048 4F5F subi R20,255 ; offset = 1
004A 5F4F sbci R21,255
004C L5:
004C .dbline 56
004C 4A15 cp R20,R10
004E 5B05 cpc R21,R11
0050 00F3 brlo L2
0052 .dbline 59
0052 ; result = (result << 8) ^ (uint16)CRCTable[(result >> 8) ^ *pSource++];
0052 ;
0052 ; return result;
0052 8B01 movw R16,R22
0054 .dbline -2
0054 L1:
0054 0E940000 xcall pop_gset4
0058 .dbline 0 ; func end
0058 0895 ret
005A .dbsym r i 20 i
005A .dbsym r result 22 i
005A .dbsym r len 10 i
005A .dbsym r pSource 12 pc
005A .dbend
005A .dbfunc e SD_GetCmdByte6 _SD_GetCmdByte6 fc
005A ; array -> y+0
005A ; i -> R20
005A ; reg -> R22
005A ; j -> R12
005A ; param -> R10,R11
005A ; cmd -> R20
.even
005A _SD_GetCmdByte6::
005A 0E940000 xcall push_gset5
005E 5901 movw R10,R18
0060 402F mov R20,R16
0062 2597 sbiw R28,5
0064 .dbline -1
0064 .dbline 70
0064 ; }
0064 ;
0064 ; /*******************************************************************************************************************
0064 ; ** 函数名称: INT8U SD_GetCmdByte6() Name: INT8U SD_GetCmdByte6()
0064 ; ** 功能描述: 获取SD卡命令的CRC7 Function: get the CRC7 of the command of SD card
0064 ; ** 输 入: INT8U cmd : 命令 Input: INT8U cmd : command
0064 ; INT8U *param: 命令的参数,长度为4字节 INT8U *param: the param of command,length is 4 bytes
0064 ; ** 输 出: CRC7码 Output: CRC7 code
0064 ; ********************************************************************************************************************/
0064 ; uint8 SD_GetCmdByte6(uint8 cmd, uint8 *param)
0064 ; {
0064 .dbline 72
0064 ; uint8 i, j;
0064 ; uint8 reg = 0;
0064 6627 clr R22
0066 .dbline 75
0066 ; uint8 array[5];
0066 ;
0066 ; array[0] = cmd;
0066 4883 std y+0,R20
0068 .dbline 76
0068 ; for (i = 1; i < 5; i++) /* 将参数的顺序重新排列 */
0068 41E0 ldi R20,1
006A 10C0 xjmp L10
006C L7:
006C .dbline 77
006C 242E mov R2,R20
006E 3324 clr R3
0070 E4E0 ldi R30,4
0072 F0E0 ldi R31,0
0074 E219 sub R30,R2
0076 F309 sbc R31,R3
0078 EA0D add R30,R10
007A FB1D adc R31,R11
007C 2080 ldd R2,z+0
007E CE01 movw R24,R28
0080 E42F mov R30,R20
0082 FF27 clr R31
0084 E80F add R30,R24
0086 F91F adc R31,R25
0088 2082 std z+0,R2
008A L8:
008A .dbline 76
008A 4395 inc R20
008C L10:
008C .dbline 76
008C 4530 cpi R20,5
008E 70F3 brlo L7
0090 .dbline 79
0090 ; array[i] = param[4 - i];
0090 ;
0090 ; for (i = 0; i < 5; i++) /* 计算5个字节的CRC7 */
0090 4427 clr R20
0092 20C0 xjmp L14
0094 L11:
0094 .dbline 80
0094 ; {
0094 .dbline 81
0094 ; for (j = 0; j < 8; j++)
0094 CC24 clr R12
0096 1AC0 xjmp L18
0098 L15:
0098 .dbline 82
0098 ; {
0098 .dbline 83
0098 ; reg <<= 1;
0098 660F lsl R22
009A .dbline 84
009A ; reg ^= ((((array[i] << j) ^ reg) & 0x80) ? 0x9 : 0);
009A CE01 movw R24,R28
009C E42F mov R30,R20
009E FF27 clr R31
00A0 E80F add R30,R24
00A2 F91F adc R31,R25
00A4 0081 ldd R16,z+0
00A6 1C2D mov R17,R12
00A8 0E940000 xcall lsl8
00AC 802F mov R24,R16
00AE 8627 eor R24,R22
00B0 8078 andi R24,128
00B2 21F0 breq L19
00B4 89E0 ldi R24,9
00B6 90E0 ldi R25,0
00B8 7C01 movw R14,R24
00BA 02C0 xjmp L20
00BC L19:
00BC EE24 clr R14
00BE FF24 clr R15
00C0 L20:
00C0 262E mov R2,R22
00C2 3324 clr R3
00C4 2E24 eor R2,R14
00C6 3F24 eor R3,R15
00C8 622D mov R22,R2
00CA .dbline 85
00CA L16:
00CA .dbline 81
00CA C394 inc R12
00CC L18:
00CC .dbline 81
00CC 8C2D mov R24,R12
00CE 8830 cpi R24,8
00D0 18F3 brlo L15
00D2 .dbline 86
00D2 L12:
00D2 .dbline 79
00D2 4395 inc R20
00D4 L14:
00D4 .dbline 79
00D4 4530 cpi R20,5
00D6 F0F2 brlo L11
00D8 .dbline 88
00D8 ; }
00D8 ; }
00D8 ;
00D8 ; return ((reg << 1) + 0x01) ; /* 计算结果的CRC7左移一位,并将最低位置1 */
00D8 062F mov R16,R22
00DA 000F lsl R16
00DC 0F5F subi R16,255 ; addi 1
00DE .dbline -2
00DE L6:
00DE 2596 adiw R28,5
00E0 0E940000 xcall pop_gset5
00E4 .dbline 0 ; func end
00E4 0895 ret
00E6 .dbsym l array 0 A[5:5]c
00E6 .dbsym r i 20 c
00E6 .dbsym r reg 22 c
00E6 .dbsym r j 12 c
00E6 .dbsym r param 10 pc
00E6 .dbsym r cmd 20 c
00E6 .dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -