sd_cmd.lis
来自「Atmega64单片机程序(完整工程)」· LIS 代码 · 共 1,454 行 · 第 1/5 页
LIS
1,454 行
0192 24F0 brlt L16
0194 ; {
0194 ; SPI_CS_Deassert();
0194 0E940000 xcall _SPI_CS_Deassert
0198 ; return SD_ERR_CMD_TIMEOUT ;
0198 01E1 ldi R16,17
019A 45C0 xjmp L1
019C L16:
019C ; /* 返回命令超时 return response timeout of command */
019C ; }
019C ;
019C ; for(i=rlen-1;i>=0;i--)
019C 41E0 ldi R20,1
019E 50E0 ldi R21,0
01A0 60E0 ldi R22,0
01A2 70E0 ldi R23,0
01A4 FE01 movw R30,R28
01A6 2480 ldd R2,z+4
01A8 3580 ldd R3,z+5
01AA 4680 ldd R4,z+6
01AC 5780 ldd R5,z+7
01AE 241A sub R2,R20
01B0 350A sbc R3,R21
01B2 460A sbc R4,R22
01B4 570A sbc R5,R23
01B6 FE01 movw R30,R28
01B8 2082 std z+0,R2
01BA 3182 std z+1,R3
01BC 4282 std z+2,R4
01BE 5382 std z+3,R5
01C0 20C0 xjmp L21
01C2 L18:
01C2 FE01 movw R30,R28
01C4 AF93 push R26
01C6 BF93 push R27
01C8 A081 ldd R26,z+0
01CA B181 ldd R27,z+1
01CC FD01 movw R30,R26
01CE BF91 pop R27
01D0 AF91 pop R26
01D2 EA0D add R30,R10
01D4 FB1D adc R31,R11
01D6 C082 std z+0,R12
01D8 0E940000 xcall _SPI_RecByte
01DC C02E mov R12,R16
01DE L19:
01DE 41E0 ldi R20,1
01E0 50E0 ldi R21,0
01E2 60E0 ldi R22,0
01E4 70E0 ldi R23,0
01E6 FE01 movw R30,R28
01E8 2080 ldd R2,z+0
01EA 3180 ldd R3,z+1
01EC 4280 ldd R4,z+2
01EE 5380 ldd R5,z+3
01F0 241A sub R2,R20
01F2 350A sbc R3,R21
01F4 460A sbc R4,R22
01F6 570A sbc R5,R23
01F8 FE01 movw R30,R28
01FA 2082 std z+0,R2
01FC 3182 std z+1,R3
01FE 4282 std z+2,R4
0200 5382 std z+3,R5
0202 L21:
0202 40E0 ldi R20,0
0204 50E0 ldi R21,0
0206 60E0 ldi R22,0
0208 70E0 ldi R23,0
020A FE01 movw R30,R28
020C 2080 ldd R2,z+0
020E 3180 ldd R3,z+1
0210 4280 ldd R4,z+2
0212 5380 ldd R5,z+3
0214 2416 cp R2,R20
0216 3506 cpc R3,R21
0218 4606 cpc R4,R22
021A 5706 cpc R5,R23
021C 0CF0 brlt X3
021E D1CF xjmp L18
0220 X3:
0220 ; {
0220 ; resp[i]=tmp ;
0220 ; tmp=SPI_RecByte();
0220 ; /* 循环的最后发送8clock at the last recycle,clock out 8 clock */
0220 ; }
0220 ;
0220 ; SPI_CS_Deassert();
0220 0E940000 xcall _SPI_CS_Deassert
0224 ; return SD_NO_ERR ;
0224 0027 clr R16
0226 L1:
0226 2896 adiw R28,8
0228 0E940000 xcall pop_gset5
022C 2296 adiw R28,2
022E .dbline 0 ; func end
022E 0895 ret
0230 ; value -> y+2
0230 ; parameter -> R20,R21
.even
0230 _SD_PackParam::
0230 3A93 st -y,r19
0232 2A93 st -y,r18
0234 0E940000 xcall push_gset1
0238 A801 movw R20,R16
023A ; /* 返回执行成功 return perform sucessfully */
023A ; }
023A ;
023A ; /*******************************************************************************
023A ; ** 函数名称: void SD_PackParam()
023A ; ** 功能描述: 将32位的参数转为字节形式
023A ; ** 输 入: INT8U *parameter: 字节参数缓冲区
023A ; INT32U value : 32位参数
023A ; ** 输 出: 无
023A ; *******************************************************************************/
023A ; void SD_PackParam(INT8U *parameter,INT32U value)
023A ; {
023A ; parameter[3]=(INT8U)(value>>24);
023A 88E1 ldi R24,24
023C 90E0 ldi R25,0
023E FE01 movw R30,R28
0240 2280 ldd R2,z+2
0242 3380 ldd R3,z+3
0244 4480 ldd R4,z+4
0246 5580 ldd R5,z+5
0248 8A93 st -y,R24
024A 8101 movw R16,R2
024C 9201 movw R18,R4
024E 0E940000 xcall lsr32
0252 FA01 movw R30,R20
0254 0383 std z+3,R16
0256 ; parameter[2]=(INT8U)(value>>16);
0256 FE01 movw R30,R28
0258 2280 ldd R2,z+2
025A 3380 ldd R3,z+3
025C 4480 ldd R4,z+4
025E 5580 ldd R5,z+5
0260 1201 movw R2,R4
0262 4424 clr R4
0264 5524 clr R5
0266 FA01 movw R30,R20
0268 2282 std z+2,R2
026A ; parameter[1]=(INT8U)(value>>8);
026A 88E0 ldi R24,8
026C 90E0 ldi R25,0
026E FE01 movw R30,R28
0270 2280 ldd R2,z+2
0272 3380 ldd R3,z+3
0274 4480 ldd R4,z+4
0276 5580 ldd R5,z+5
0278 8A93 st -y,R24
027A 8101 movw R16,R2
027C 9201 movw R18,R4
027E 0E940000 xcall lsr32
0282 FA01 movw R30,R20
0284 0183 std z+1,R16
0286 ; parameter[0]=(INT8U)(value);
0286 FE01 movw R30,R28
0288 2280 ldd R2,z+2
028A 3380 ldd R3,z+3
028C 4480 ldd R4,z+4
028E 5580 ldd R5,z+5
0290 FA01 movw R30,R20
0292 2082 std z+0,R2
0294 L22:
0294 0E940000 xcall pop_gset1
0298 2296 adiw R28,2
029A .dbline 0 ; func end
029A 0895 ret
029C ; resp -> y+8
029C ; param -> y+4
029C ; ret -> R20
029C ; parameter -> y+13
029C ; resptype -> R22
029C ; cmd -> R20
.even
029C _SD_BlockCommand::
029C 0E940000 xcall push_gset2
02A0 622F mov R22,R18
02A2 402F mov R20,R16
02A4 2997 sbiw R28,9
02A6 ; }
02A6 ;
02A6 ; /*******************************************************************************
02A6 ; ** 函数名称: INT8U SD_BlockCommand()
02A6 ; ** 功能描述: 块命令
02A6 ; ** 输 入: INT8U cmd : 命令字
02A6 ; INT8U resptype : 响应类型
02A6 ; INT32U parameter: 块操作参数
02A6 ; ** 输 出: 0: 正确 >0: 错误码
02A6 ; *******************************************************************************/
02A6 ; INT8U SD_BlockCommand(INT8U cmd,INT8U resptype,INT32U parameter)
02A6 ; {
02A6 ; INT8U param[4],resp,ret ;
02A6 ;
02A6 ; parameter<<=SD_BLOCKSIZE_NBITS ;
02A6 89E0 ldi R24,9
02A8 90E0 ldi R25,0
02AA FE01 movw R30,R28
02AC 2584 ldd R2,z+13
02AE 3684 ldd R3,z+14
02B0 4784 ldd R4,z+15
02B2 5088 ldd R5,z+16
02B4 8A93 st -y,R24
02B6 8101 movw R16,R2
02B8 9201 movw R18,R4
02BA 0E940000 xcall lsl32
02BE FE01 movw R30,R28
02C0 0587 std z+13,R16
02C2 1687 std z+14,R17
02C4 2787 std z+15,R18
02C6 308B std z+16,R19
02C8 ; /* 调整地址:左移9位 adjust address: move 9 bits left */
02C8 ;
02C8 ; SD_PackParam(param,parameter);
02C8 FE01 movw R30,R28
02CA 2584 ldd R2,z+13
02CC 3684 ldd R3,z+14
02CE 4784 ldd R4,z+15
02D0 5088 ldd R5,z+16
02D2 4882 std y+0,R4
02D4 5982 std y+1,R5
02D6 9101 movw R18,R2
02D8 8E01 movw R16,R28
02DA 0C5F subi R16,252 ; offset = 4
02DC 1F4F sbci R17,255
02DE A8DF xcall _SD_PackParam
02E0 ; /* 将参数转化为字节形式 change the parameter to bytes form */
02E0 ;
02E0 ; ret=SD_SendCmd(cmd,param,resptype,&resp);
02E0 CE01 movw R24,R28
02E2 0896 adiw R24,8
02E4 9B83 std y+3,R25
02E6 8A83 std y+2,R24
02E8 6883 std y+0,R22
02EA 9E01 movw R18,R28
02EC 2C5F subi R18,252 ; offset = 4
02EE 3F4F sbci R19,255
02F0 042F mov R16,R20
02F2 86DE xcall _SD_SendCmd
02F4 402F mov R20,R16
02F6 ; if(ret!=SD_NO_ERR)
02F6 0023 tst R16
02F8 09F0 breq L24
02FA ; return ret ;
02FA 06C0 xjmp L23
02FC L24:
02FC ; /* 结束数据传输失败 stop transmission operation fail */
02FC ;
02FC ; if(resp!=0)
02FC 2884 ldd R2,y+8
02FE 2220 tst R2
0300 11F0 breq L26
0302 ; return SD_ERR_CMD_RESP ;
0302 02E1 ldi R16,18
0304 01C0 xjmp L23
0306 L26:
0306 ; /* 响应错误 response is error */
0306 ;
0306 ; return SD_NO_ERR ;
0306 0027 clr R16
0308 L23:
0308 2996 adiw R28,9
030A 0E940000 xcall pop_gset2
030E .dbline 0 ; func end
030E 0895 ret
.area lit(rom, con, rel)
0000 L29:
0000 0000 .byte 0,0
0002 0000 .byte 0,0
.area text(rom, con, rel)
; resp -> y+8
; param -> y+4
.even
0310 _SD_ResetSD::
0310 2997 sbiw R28,9
0312 ; }
0312 ;
0312 ; /*************************************************
0312 ;
0312 ; 下面为SD卡SPI命令
0312 ;
0312 ; /*******************************************************************************
0312 ; ** 函数名称: INT8U SD_ResetSD()
0312 ; ** 功能描述: 复位SD卡
0312 ; ** 输 入: 无
0312 ; ** 输 出: 0: 正确 >0: 错误码
0312 ; *******************************************************************************/
0312 ; INT8U SD_ResetSD(void)
0312 ; {
0312 ; INT8U param[4]={0,0,0,0},resp ;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?