📄 mmc.lis
字号:
01F6 0083 std z+0,R16
01F8 .dbline 124
01F8 L48:
01F8 .dbline 121
01F8 4F5F subi R20,255 ; offset = 1
01FA 5F4F sbci R21,255
01FC L50:
01FC .dbline 121
01FC 4030 cpi R20,0
01FE E2E0 ldi R30,2
0200 5E07 cpc R21,R30
0202 80F3 brlo L47
0204 .dbline 125
0204 ; {
0204 ; sector[i]=spi_send(0XFF);
0204 ; }
0204 ; spi_send(0XFF); /* 取走CRC字节 */
0204 0FEF ldi R16,255
0206 10E0 ldi R17,0
0208 0E940000 xcall _spi_send
020C .dbline 126
020C ; spi_send(0XFF);
020C 0FEF ldi R16,255
020E 10E0 ldi R17,0
0210 0E940000 xcall _spi_send
0214 .dbline 127
0214 ; return 1;
0214 01E0 ldi R16,1
0216 .dbline -2
0216 L36:
0216 2696 adiw R28,6
0218 0E940000 xcall pop_gset1
021C 2496 adiw R28,4
021E .dbline 0 ; func end
021E 0895 ret
0220 .dbsym l temp 1 c
0220 .dbsym l cmd 0 A[6:6]c
0220 .dbsym r i 20 i
0220 .dbsym l address 8 l
0220 .dbend
.area lit(rom, con, rel)
0012 L52:
0012 4000 .byte 64,0
0014 0000 .byte 0,0
0016 00FF .byte 0,255
.area text(rom, con, rel)
0220 .dbfile E:\SOUCER~1\M162MMC\mmc.c
0220 .dbfunc e MMCWrBlock1 _MMCWrBlock1 fc
0220 ; temp -> R22
0220 ; cmd -> y+0
0220 ; i -> R20,R21
0220 ; buffer -> y+14
0220 ; address -> y+10
.even
0220 _MMCWrBlock1::
0220 0E940000 xcall push_arg4
0224 0E940000 xcall push_gset2
0228 2697 sbiw R28,6
022A .dbline -1
022A .dbline 135
022A ; }
022A ;
022A ; /*******************************
022A ; * 写ONE BLOCK数据
022A ; * address-扇区地址
022A ; *******************************/
022A ; unsigned char MMCWrBlock1(unsigned long address,unsigned char *buffer)
022A ; {
022A .dbline 138
022A ; unsigned int i;
022A ; unsigned char temp;
022A ; unsigned char cmd[]={0x40,0x00,0x00,0x00,0x00,0xff};
022A 80E0 ldi R24,<L52
022C 90E0 ldi R25,>L52
022E FE01 movw R30,R28
0230 06E0 ldi R16,6
0232 10E0 ldi R17,0
0234 FA93 st -y,R31
0236 EA93 st -y,R30
0238 9A93 st -y,R25
023A 8A93 st -y,R24
023C 0E940000 xcall asgncblk
0240 .dbline 139
0240 ; cmd[0]=0x40+24; /* WRITE SINGLE BLOCK */
0240 88E5 ldi R24,88
0242 8883 std y+0,R24
0244 .dbline 140
0244 ; address=address<<9; /* address*512,取512的整数倍 */
0244 89E0 ldi R24,9
0246 90E0 ldi R25,0
0248 FE01 movw R30,R28
024A 2284 ldd R2,z+10
024C 3384 ldd R3,z+11
024E 4484 ldd R4,z+12
0250 5584 ldd R5,z+13
0252 8A93 st -y,R24
0254 8101 movw R16,R2
0256 9201 movw R18,R4
0258 0E940000 xcall lsl32
025C FE01 movw R30,R28
025E 0287 std z+10,R16
0260 1387 std z+11,R17
0262 2487 std z+12,R18
0264 3587 std z+13,R19
0266 .dbline 141
0266 ; cmd[1]=(address>>24);
0266 88E1 ldi R24,24
0268 90E0 ldi R25,0
026A FE01 movw R30,R28
026C 2284 ldd R2,z+10
026E 3384 ldd R3,z+11
0270 4484 ldd R4,z+12
0272 5584 ldd R5,z+13
0274 8A93 st -y,R24
0276 8101 movw R16,R2
0278 9201 movw R18,R4
027A 0E940000 xcall lsr32
027E 0983 std y+1,R16
0280 .dbline 142
0280 ; cmd[2]=(address>>16);
0280 FE01 movw R30,R28
0282 2284 ldd R2,z+10
0284 3384 ldd R3,z+11
0286 4484 ldd R4,z+12
0288 5584 ldd R5,z+13
028A 1201 movw R2,R4
028C 4424 clr R4
028E 5524 clr R5
0290 2A82 std y+2,R2
0292 .dbline 143
0292 ; cmd[3]=(address>>8);
0292 88E0 ldi R24,8
0294 90E0 ldi R25,0
0296 FE01 movw R30,R28
0298 2284 ldd R2,z+10
029A 3384 ldd R3,z+11
029C 4484 ldd R4,z+12
029E 5584 ldd R5,z+13
02A0 8A93 st -y,R24
02A2 8101 movw R16,R2
02A4 9201 movw R18,R4
02A6 0E940000 xcall lsr32
02AA 0B83 std y+3,R16
02AC .dbline 144
02AC ; cmd[4]=(address>>0);
02AC FE01 movw R30,R28
02AE 2284 ldd R2,z+10
02B0 3384 ldd R3,z+11
02B2 4484 ldd R4,z+12
02B4 5584 ldd R5,z+13
02B6 2C82 std y+4,R2
02B8 .dbline 145
02B8 ; if(MMCWrCmd(cmd)!=0X00) /* 发送CMD24 */
02B8 8E01 movw R16,R28
02BA A8DE xcall _MMCWrCmd
02BC 0023 tst R16
02BE 11F0 breq L57
02C0 .dbline 146
02C0 ; return 0; /* 写入失败 */
02C0 0027 clr R16
02C2 35C0 xjmp L51
02C4 L57:
02C4 .dbline 147
02C4 ; spi_send(0XFF); /* 发送填冲字节 */
02C4 0FEF ldi R16,255
02C6 10E0 ldi R17,0
02C8 0E940000 xcall _spi_send
02CC .dbline 148
02CC ; spi_send(0XFE); /* 发送数据开始标志0XFE */
02CC 0EEF ldi R16,254
02CE 10E0 ldi R17,0
02D0 0E940000 xcall _spi_send
02D4 .dbline 149
02D4 ; for(i=0;i<512;i++) /* 写入数据 */
02D4 4427 clr R20
02D6 5527 clr R21
02D8 0BC0 xjmp L62
02DA L59:
02DA .dbline 150
02DA .dbline 151
02DA 80E0 ldi R24,<_sector
02DC 90E0 ldi R25,>_sector
02DE FA01 movw R30,R20
02E0 E80F add R30,R24
02E2 F91F adc R31,R25
02E4 0081 ldd R16,z+0
02E6 1127 clr R17
02E8 0E940000 xcall _spi_send
02EC .dbline 152
02EC L60:
02EC .dbline 149
02EC 4F5F subi R20,255 ; offset = 1
02EE 5F4F sbci R21,255
02F0 L62:
02F0 .dbline 149
02F0 4030 cpi R20,0
02F2 E2E0 ldi R30,2
02F4 5E07 cpc R21,R30
02F6 88F3 brlo L59
02F8 .dbline 153
02F8 ; {
02F8 ; spi_send(sector[i]);
02F8 ; }
02F8 ; spi_send(0XFF); /* 写入CRC字节 */
02F8 0FEF ldi R16,255
02FA 10E0 ldi R17,0
02FC 0E940000 xcall _spi_send
0300 .dbline 154
0300 ; spi_send(0XFF);
0300 0FEF ldi R16,255
0302 10E0 ldi R17,0
0304 0E940000 xcall _spi_send
0308 .dbline 155
0308 ; temp=spi_send(0XFF); /* 读取XXX0 0101字节 */
0308 0FEF ldi R16,255
030A 10E0 ldi R17,0
030C 0E940000 xcall _spi_send
0310 602F mov R22,R16
0312 .dbline 156
0312 ; temp=temp&0X1F;
0312 6F71 andi R22,31
0314 .dbline 157
0314 ; if(temp!=0X05)
0314 6530 cpi R22,5
0316 19F0 breq L66
0318 .dbline 158
0318 ; return 0; /* 写入失败 */
0318 0027 clr R16
031A 09C0 xjmp L51
031C L65:
031C .dbline 160
031C .dbline 161
031C 0000 nop
031E .dbline 162
031E L66:
031E .dbline 159
031E ; while(spi_send(0XFF)==0X00)
031E 0FEF ldi R16,255
0320 10E0 ldi R17,0
0322 0E940000 xcall _spi_send
0326 0030 cpi R16,0
0328 0107 cpc R16,R17
032A C1F3 breq L65
032C X0:
032C .dbline 163
032C ; {
032C ; asm("nop"); /* BUSY等待 */
032C ; }
032C ; return 1;
032C 01E0 ldi R16,1
032E .dbline -2
032E L51:
032E 2696 adiw R28,6
0330 0E940000 xcall pop_gset2
0334 2496 adiw R28,4
0336 .dbline 0 ; func end
0336 0895 ret
0338 .dbsym r temp 22 c
0338 .dbsym l cmd 0 A[6:6]c
0338 .dbsym r i 20 i
0338 .dbsym l buffer 14 pc
0338 .dbsym l address 10 l
0338 .dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -