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

📄 sdcmd.lis

📁 mega128的串口发送文件.可以发送0X55上位机使用串口调试工具就可以接收了.
💻 LIS
📖 第 1 页 / 共 5 页
字号:
                        .module sdcmd.c
                        .area text(rom, con, rel)
 0000                   .dbfile D:\new_sd\SD\SD\sdcmd.c
 0000                   .dbfunc e SD_SendCmd _SD_SendCmd fc
 0000           ;           rlen -> y+4
 0000           ;            tmp -> R10
 0000           ;              i -> y+0
 0000           ;           resp -> R12,R13
 0000           ;       resptype -> y+22
 0000           ;          param -> y+20
 0000           ;            cmd -> y+18
                        .even
 0000           _SD_SendCmd::
 0000 0E940000          xcall push_arg4
 0004 0E940000          xcall push_gset5
 0008 2897              sbiw R28,8
 000A C88C              ldd R12,y+24
 000C D98C              ldd R13,y+25
 000E                   .dbline -1
 000E                   .dbline 17
 000E           ; /*****************************************************************************************************
 000E           ; ** Descriptions:              sd 卡驱动软件包: SD卡物理层 ---- SD卡SPI模式支持的命令 
 000E           ; ********************************************************************************************************/
 000E           ; #include    "D:\new_sd\define.h"
 000E           ; 
 000E           ; 
 000E           ; /********************************************************************************************************************
 000E           ; ** 函数名称: INT8U SD_SendCmd()                                               Name:     INT8U SD_SendCmd()
 000E           ; ** 功能描述: 向卡发送命令,并取得响应                          Function: send command to the card,and get a response
 000E           ; ** 输   入: INT8U cmd            : 命令字                            Input:    INT8U cmd         : command byte      
 000E           ;                        INT8U *param   : 命令参数,长度为4字节                    INT8U *param  : command parameter,length is 4 bytes  
 000E           ;                        INT8U resptype : 响应类型                                                INT8U resptype: response type
 000E           ;                        INT8U *resp    : 响应,长度为1-5字节                      INT8U *resp   : response,length is 1-5 bytes
 000E           ; ** 输   出: 0:   正确    >0:   错误码                                Output:   0:  right             >0:  error code
 000E           ; ********************************************************************************************************************/
 000E           ; uint8 SD_SendCmd(uint8 cmd, uint8 *param, uint8 resptype, uint8 *resp)
 000E           ; {
 000E                   .dbline 21
 000E           ;       int32 i,rlen;                                                                    //所有SD卡命令都是6字节长
 000E           ;       uint8 tmp;
 000E           ;     
 000E           ;       SPI_CS_Assert();                                                             //片选SPI从机
 000E 0E940000          xcall _SPI_CS_Assert
 0012                   .dbline 23
 0012           ;    
 0012           ;     SPI_SendByte((cmd & 0x3F) | 0x40);                                 /* 发送命令头和命令字 send command header and word */
 0012 0A89              ldd R16,y+18
 0014 0F73              andi R16,63
 0016 0064              ori R16,64
 0018 0E940000          xcall _SPI_SendByte
 001C                   .dbline 25
 001C           ;                                                                                                //起始位为0(bit47),传输位为1(bit46)
 001C           ;     for (i = 3; i >= 0; i--)
 001C 43E0              ldi R20,3
 001E 50E0              ldi R21,0
 0020 60E0              ldi R22,0
 0022 70E0              ldi R23,0
 0024 FE01              movw R30,R28
 0026 4083              std z+0,R20
 0028 5183              std z+1,R21
 002A 6283              std z+2,R22
 002C 7383              std z+3,R23
 002E           L2:
 002E                   .dbline 26
 002E FE01              movw R30,R28
 0030 AF93              push R26
 0032 BF93              push R27
 0034 A081              ldd R26,z+0
 0036 B181              ldd R27,z+1
 0038 FD01              movw R30,R26
 003A BF91              pop R27
 003C AF91              pop R26
 003E 0C88              ldd R0,y+20
 0040 1D88              ldd R1,y+21
 0042 E00D              add R30,R0
 0044 F11D              adc R31,R1
 0046 0081              ldd R16,z+0
 0048 0E940000          xcall _SPI_SendByte
 004C           L3:
 004C                   .dbline 25
 004C 41E0              ldi R20,1
 004E 50E0              ldi R21,0
 0050 60E0              ldi R22,0
 0052 70E0              ldi R23,0
 0054 FE01              movw R30,R28
 0056 2080              ldd R2,z+0
 0058 3180              ldd R3,z+1
 005A 4280              ldd R4,z+2
 005C 5380              ldd R5,z+3
 005E 241A              sub R2,R20
 0060 350A              sbc R3,R21
 0062 460A              sbc R4,R22
 0064 570A              sbc R5,R23
 0066 FE01              movw R30,R28
 0068 2082              std z+0,R2
 006A 3182              std z+1,R3
 006C 4282              std z+2,R4
 006E 5382              std z+3,R5
 0070                   .dbline 25
 0070 40E0              ldi R20,0
 0072 50E0              ldi R21,0
 0074 60E0              ldi R22,0
 0076 70E0              ldi R23,0
 0078 FE01              movw R30,R28
 007A 2080              ldd R2,z+0
 007C 3180              ldd R3,z+1
 007E 4280              ldd R4,z+2
 0080 5380              ldd R5,z+3
 0082 2416              cp R2,R20
 0084 3506              cpc R3,R21
 0086 4606              cpc R4,R22
 0088 5706              cpc R5,R23
 008A 0CF0              brlt X2
 008C D0CF              xjmp L2
 008E           X2:
 008E                   .dbline 29
 008E           ;         SPI_SendByte(param[i]);                                                /* 发送参数 send parameters */
 008E           ; 
 008E           ; #if SD_CRC_EN
 008E           ;       tmp = SD_GetCmdByte6((cmd & 0x3F) | 0x40, param);
 008E 2C89              ldd R18,y+20
 0090 3D89              ldd R19,y+21
 0092 0A89              ldd R16,y+18
 0094 0F73              andi R16,63
 0096 0064              ori R16,64
 0098 0E940000          xcall _SD_GetCmdByte6
 009C A02E              mov R10,R16
 009E                   .dbline 30
 009E           ;       SPI_SendByte(tmp);
 009E 0E940000          xcall _SPI_SendByte
 00A2                   .dbline 35
 00A2           ; #else
 00A2           ;     SPI_SendByte(0x95);                                                                /* CRC校验码,只用于第1个命令 CRC,only used for the first command */
 00A2           ; #endif 
 00A2           ;     
 00A2           ;     rlen = 0;
 00A2 40E0              ldi R20,0
 00A4 50E0              ldi R21,0
 00A6 60E0              ldi R22,0
 00A8 70E0              ldi R23,0
 00AA FE01              movw R30,R28
 00AC 4483              std z+4,R20
 00AE 5583              std z+5,R21
 00B0 6683              std z+6,R22
 00B2 7783              std z+7,R23
 00B4                   .dbline 36
 00B4           ;     switch (resptype)                                                          /* 根据不同的命令,得到不同的响应长度 */
 00B4 EE88              ldd R14,y+22
 00B6 FF24              clr R15
 00B8 C701              movw R24,R14
 00BA 8130              cpi R24,1
 00BC E0E0              ldi R30,0
 00BE 9E07              cpc R25,R30
 00C0 69F0              breq L9
 00C2 8230              cpi R24,2
 00C4 E0E0              ldi R30,0
 00C6 9E07              cpc R25,R30
 00C8 49F0              breq L9
 00CA 8330              cpi R24,3
 00CC E0E0              ldi R30,0
 00CE 9E07              cpc R25,R30
 00D0 79F0              breq L10
 00D2 8430              cpi R24,4
 00D4 E0E0              ldi R30,0
 00D6 9E07              cpc R25,R30
 00D8 A9F0              breq L11
 00DA 1EC0              xjmp L6
 00DC           X0:
 00DC                   .dbline 37
 00DC           ;     {                                                                                          /* according various command,get the various response length */
 00DC           L9:
 00DC                   .dbline 39
 00DC           ;               case R1:
 00DC           ;               case R1B: rlen = 1;  break;
 00DC 41E0              ldi R20,1
 00DE 50E0              ldi R21,0
 00E0 60E0              ldi R22,0
 00E2 70E0              ldi R23,0
 00E4 FE01              movw R30,R28
 00E6 4483              std z+4,R20
 00E8 5583              std z+5,R21
 00EA 6683              std z+6,R22
 00EC 7783              std z+7,R23
 00EE                   .dbline 39
 00EE 1BC0              xjmp L7
 00F0           L10:
 00F0                   .dbline 41
 00F0           ;                        
 00F0           ;       case R2:  rlen = 2;      break;
 00F0 42E0              ldi R20,2
 00F2 50E0              ldi R21,0
 00F4 60E0              ldi R22,0
 00F6 70E0              ldi R23,0
 00F8 FE01              movw R30,R28
 00FA 4483              std z+4,R20
 00FC 5583              std z+5,R21
 00FE 6683              std z+6,R22
 0100 7783              std z+7,R23
 0102                   .dbline 41
 0102 11C0              xjmp L7
 0104           L11:
 0104                   .dbline 43
 0104           ;                        
 0104           ;               case R3:  rlen = 5;      break;
 0104 45E0              ldi R20,5
 0106 50E0              ldi R21,0
 0108 60E0              ldi R22,0
 010A 70E0              ldi R23,0
 010C FE01              movw R30,R28
 010E 4483              std z+4,R20
 0110 5583              std z+5,R21
 0112 6683              std z+6,R22
 0114 7783              std z+7,R23
 0116                   .dbline 43
 0116 07C0              xjmp L7
 0118           L6:
 0118                   .dbline 45
 0118           ;                        
 0118           ;       default:  SPI_SendByte(0xFF);   
 0118 0FEF              ldi R16,255
 011A 0E940000          xcall _SPI_SendByte
 011E                   .dbline 46
 011E           ;                             SPI_CS_Deassert();                                                 
 011E 0E940000          xcall _SPI_CS_Deassert
 0122                   .dbline 47
 0122           ;                     return SD_ERR_CMD_RESPTYPE;                /* 返回命令响应类型错误 return error of command response type */
 0122 00E1              ldi R16,16
 0124 85C0              xjmp L1
 0126           X1:
 0126                   .dbline 48
 0126           ;                     break;
 0126           L7:
 0126                   .dbline 51
 0126           ;     }
 0126           ;     
 0126           ;     i = 0;                            
 0126 40E0              ldi R20,0
 0128 50E0              ldi R21,0
 012A 60E0              ldi R22,0
 012C 70E0              ldi R23,0
 012E FE01              movw R30,R28
 0130 4083              std z+0,R20
 0132 5183              std z+1,R21
 0134 6283              std z+2,R22
 0136 7383              std z+3,R23
 0138           L12:
 0138                   .dbline 53
 0138           ;     do                                                                                                 /* 等待响应,响应的开始位为0 */
 0138           ;     {                                                                                          /* Wait for a response,a response is a start bit(zero) */ 
 0138                   .dbline 54
 0138           ;         tmp = SPI_RecByte();
 0138 0E940000          xcall _SPI_RecByte
 013C A02E              mov R10,R16
 013E                   .dbline 55
 013E           ;         i++;
 013E 41E0              ldi R20,1
 0140 50E0              ldi R21,0
 0142 60E0              ldi R22,0
 0144 70E0              ldi R23,0

⌨️ 快捷键说明

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