📄 sd.lis
字号:
0174 0027 clr R16
0176 .dbline -2
0176 L11:
0176 2296 adiw R28,2
0178 0E940000 xcall pop_gset5
017C .dbline 0 ; func end
017C 0895 ret
017E .dbsym r retry 10 c
017E .dbsym r r1 12 c
017E .dbsym r i 14 c
017E .dbend
017E .dbfunc e SD_ReadBlock _SD_ReadBlock fc
017E ; r1 -> R10
017E ; retry -> R22,R23
017E ; i -> R10,R11
017E ; buffer -> R20,R21
017E ; sector -> y+8
.even
017E _SD_ReadBlock::
017E 0E940000 xcall push_arg4
0182 0E940000 xcall push_gset3
0186 2297 sbiw R28,2
0188 4C85 ldd R20,y+12
018A 5D85 ldd R21,y+13
018C .dbline -1
018C .dbline 113
018C ; }
018C ;
018C ;
018C ;
018C ; //---------------------------------------------
018C ; //
018C ; // SD卡扇区读取函数
018C ; // sector:扇区号
018C ; // buffer:数据缓存
018C ; //
018C ; //---------------------------------------------
018C ; uint8 SD_ReadBlock(uint32 sector, uint8* buffer)
018C ; {
018C .dbline 116
018C ; uint8 r1;
018C ; uint16 i;
018C ; uint16 retry=0;
018C 6627 clr R22
018E 7727 clr R23
0190 .dbline 118
0190 ;
0190 ; SPI_High(); /* Use High Speed SPI*/
0190 0E940000 xcall _SPI_High
0194 .dbline 120
0194 ;
0194 ; r1 = SD_SendCommand(17, sector<<9);//读命令 //read command
0194 89E0 ldi R24,9
0196 90E0 ldi R25,0
0198 FE01 movw R30,R28
019A 2084 ldd R2,z+8
019C 3184 ldd R3,z+9
019E 4284 ldd R4,z+10
01A0 5384 ldd R5,z+11
01A2 8A93 st -y,R24
01A4 8101 movw R16,R2
01A6 9201 movw R18,R4
01A8 0E940000 xcall lsl32
01AC 2883 std y+0,R18
01AE 3983 std y+1,R19
01B0 9801 movw R18,R16
01B2 01E1 ldi R16,17
01B4 28DF xcall _SD_SendCommand
01B6 A02E mov R10,R16
01B8 .dbline 122
01B8 ;
01B8 ; if(r1 != 0x00)
01B8 0023 tst R16
01BA 09F0 breq L27
01BC .dbline 123
01BC ; return r1;
01BC 2EC0 xjmp L26
01BE L27:
01BE .dbline 125
01BE ;
01BE ; SPI_CS_Assert;
01BE D998 cbi 0x1b,1
01C0 0BC0 xjmp L30
01C2 L29:
01C2 .dbline 128
01C2 ; //等数据的开始 //wait to start recieve data
01C2 ; while(SPI_SrByte(0xff) != 0xfe)
01C2 ; if(retry++ > 0xfffe)
01C2 1B01 movw R2,R22
01C4 6F5F subi R22,255 ; offset = 1
01C6 7F4F sbci R23,255
01C8 8EEF ldi R24,65534
01CA 9FEF ldi R25,255
01CC 8215 cp R24,R2
01CE 9305 cpc R25,R3
01D0 18F4 brsh L32
01D2 .dbline 129
01D2 ; {SPI_CS_Deassert;return 1;}
01D2 .dbline 129
01D2 D99A sbi 0x1b,1
01D4 .dbline 129
01D4 01E0 ldi R16,1
01D6 21C0 xjmp L26
01D8 L32:
01D8 L30:
01D8 .dbline 127
01D8 0FEF ldi R16,255
01DA 0E940000 xcall _SPI_SrByte
01DE 0E3F cpi R16,254
01E0 81F7 brne L29
01E2 .dbline 131
01E2 ;
01E2 ; for(i=0; i<512; i++)//读512个数据 //read 512 bytes
01E2 AA24 clr R10
01E4 BB24 clr R11
01E6 09C0 xjmp L37
01E8 L34:
01E8 .dbline 132
01E8 .dbline 133
01E8 0FEF ldi R16,255
01EA 0E940000 xcall _SPI_SrByte
01EE FA01 movw R30,R20
01F0 0193 st Z+,R16
01F2 AF01 movw R20,R30
01F4 .dbline 134
01F4 L35:
01F4 .dbline 131
01F4 C501 movw R24,R10
01F6 0196 adiw R24,1
01F8 5C01 movw R10,R24
01FA L37:
01FA .dbline 131
01FA C501 movw R24,R10
01FC 8030 cpi R24,0
01FE E2E0 ldi R30,2
0200 9E07 cpc R25,R30
0202 90F3 brlo L34
0204 .dbline 136
0204 ; {
0204 ; *buffer++ = SPI_SrByte(0xff);
0204 ; }
0204 ;
0204 ; SPI_SrByte(0xff);//伪crc //dummy crc
0204 0FEF ldi R16,255
0206 0E940000 xcall _SPI_SrByte
020A .dbline 137
020A ; SPI_SrByte(0xff);
020A 0FEF ldi R16,255
020C 0E940000 xcall _SPI_SrByte
0210 .dbline 139
0210 ;
0210 ; SPI_CS_Deassert;
0210 D99A sbi 0x1b,1
0212 .dbline 140
0212 ; SPI_SrByte(0xff);// extra 8 CLK
0212 0FEF ldi R16,255
0214 0E940000 xcall _SPI_SrByte
0218 .dbline 143
0218 ;
0218 ;
0218 ; return 0;
0218 0027 clr R16
021A .dbline -2
021A L26:
021A 2296 adiw R28,2
021C 0E940000 xcall pop_gset3
0220 2496 adiw R28,4
0222 .dbline 0 ; func end
0222 0895 ret
0224 .dbsym r r1 10 c
0224 .dbsym r retry 22 i
0224 .dbsym r i 10 i
0224 .dbsym r buffer 20 pc
0224 .dbsym l sector 8 l
0224 .dbend
0224 .dbfunc e SD_WriteSingleBlock _SD_WriteSingleBlock fc
0224 ; r1 -> R20
0224 ; retry -> R22,R23
0224 ; i -> R10,R11
0224 ; buffer -> R12,R13
0224 ; sector -> y+10
.even
0224 _SD_WriteSingleBlock::
0224 0E940000 xcall push_arg4
0228 0E940000 xcall push_gset4
022C 2297 sbiw R28,2
022E CE84 ldd R12,y+14
0230 DF84 ldd R13,y+15
0232 .dbline -1
0232 .dbline 155
0232 ; }
0232 ;
0232 ;
0232 ; //---------------------------------------------
0232 ; //
0232 ; // SD卡扇区写入函数
0232 ; // sector:扇区号
0232 ; // buffer:数据缓存
0232 ; //
0232 ; //---------------------------------------------
0232 ; uint8 SD_WriteSingleBlock(uint32 sector, uint8* buffer)
0232 ; {
0232 .dbline 158
0232 ; uint8 r1;
0232 ; uint16 i;
0232 ; uint16 retry=0;
0232 6627 clr R22
0234 7727 clr R23
0236 .dbline 162
0236 ;
0236 ; //SPI_High(); /* Use High Speed SPI*/
0236 ;
0236 ; r1 = SD_SendCommand(24, sector<<9);//写命令 //send command
0236 89E0 ldi R24,9
0238 90E0 ldi R25,0
023A FE01 movw R30,R28
023C 2284 ldd R2,z+10
023E 3384 ldd R3,z+11
0240 4484 ldd R4,z+12
0242 5584 ldd R5,z+13
0244 8A93 st -y,R24
0246 8101 movw R16,R2
0248 9201 movw R18,R4
024A 0E940000 xcall lsl32
024E 2883 std y+0,R18
0250 3983 std y+1,R19
0252 9801 movw R18,R16
0254 08E1 ldi R16,24
0256 D7DE xcall _SD_SendCommand
0258 402F mov R20,R16
025A .dbline 163
025A ; if(r1 != 0x00)
025A 0023 tst R16
025C 09F0 breq L39
025E .dbline 164
025E ; return r1;
025E 40C0 xjmp L38
0260 L39:
0260 .dbline 166
0260 ;
0260 ; SPI_CS_Assert;
0260 D998 cbi 0x1b,1
0262 .dbline 168
0262 ;
0262 ; SPI_SrByte(0xff);
0262 0FEF ldi R16,255
0264 0E940000 xcall _SPI_SrByte
0268 .dbline 169
0268 ; SPI_SrByte(0xff);
0268 0FEF ldi R16,255
026A 0E940000 xcall _SPI_SrByte
026E .dbline 170
026E ; SPI_SrByte(0xff);
026E 0FEF ldi R16,255
0270 0E940000 xcall _SPI_SrByte
0274 .dbline 172
0274 ;
0274 ; SPI_SrByte(0xfe);//发开始符 //send start byte "token"
0274 0EEF ldi R16,254
0276 0E940000 xcall _SPI_SrByte
027A .dbline 174
027A ;
027A ; for(i=0; i<512; i++)//送512字节数据 //send 512 bytes data
027A AA24 clr R10
027C BB24 clr R11
027E 09C0 xjmp L44
0280 L41:
0280 .dbline 175
0280 .dbline 176
0280 F501 movw R30,R10
0282 EC0D add R30,R12
0284 FD1D adc R31,R13
0286 0081 ldd R16,z+0
0288 0E940000 xcall _SPI_SrByte
028C .dbline 177
028C L42:
028C .dbline 174
028C C501 movw R24,R10
028E 0196 adiw R24,1
0290 5C01 movw R10,R24
0292 L44:
0292 .dbline 174
0292 C501 movw R24,R10
0294 8030 cpi R24,0
0296 E2E0 ldi R30,2
0298 9E07 cpc R25,R30
029A 90F3 brlo L41
029C .dbline 179
029C ; {
029C ; SPI_SrByte(buffer[i]);
029C ; }
029C ;
029C ; SPI_SrByte(0xff); //dummy crc
029C 0FEF ldi R16,255
029E 0E940000 xcall _SPI_SrByte
02A2 .dbline 180
02A2 ; SPI_SrByte(0xff);
02A2 0FEF ldi R16,255
02A4 0E940000 xcall _SPI_SrByte
02A8 .dbline 182
02A8 ;
02A8 ; r1 = SPI_SrByte(0xff);
02A8 0FEF ldi R16,255
02AA 0E940000 xcall _SPI_SrByte
02AE 402F mov R20,R16
02B0 .dbline 184
02B0 ;
02B0 ; if( (r1&0x1f) != 0x05)//等待是否成功 //judge if it successful
02B0 842F mov R24,R20
02B2 8F71 andi R24,31
02B4 8530 cpi R24,5
02B6 69F0 breq L48
02B8 .dbline 185
02B8 ; {
02B8 .dbline 186
02B8 ; SPI_CS_Deassert;
02B8 D99A sbi 0x1b,1
02BA .dbline 187
02BA ; return r1;
02BA 12C0 xjmp L38
02BC L47:
02BC .dbline 190
02BC ; }
02BC ; //等待操作完 //wait no busy
02BC ; while(!SPI_SrByte(0xff))if(retry++ > 0xfffe){SPI_CS_Deassert;return 1;}
02BC 1B01 movw R2,R22
02BE 6F5F subi R22,255 ; offset = 1
02C0 7F4F sbci R23,255
02C2 8EEF ldi R24,65534
02C4 9FEF ldi R25,255
02C6 8215 cp R24,R2
02C8 9305 cpc R25,R3
02CA 18F4 brsh L50
02CC .dbline 190
02CC .dbline 190
02CC D99A sbi 0x1b,1
02CE .dbline 190
02CE 01E0 ldi R16,1
02D0 07C0 xjmp L38
02D2 L50:
02D2 L48:
02D2 .dbline 190
02D2 0FEF ldi R16,255
02D4 0E940000 xcall _SPI_SrByte
02D8 0023 tst R16
02DA 81F3 breq L47
02DC .dbline 192
02DC ;
02DC ; SPI_CS_Deassert;
02DC D99A sbi 0x1b,1
02DE .dbline 195
02DE ; //SPI_SrByte(0xff);// extra 8 CLK
02DE ;
02DE ; return 0;
02DE 0027 clr R16
02E0 .dbline -2
02E0 L38:
02E0 2296 adiw R28,2
02E2 0E940000 xcall pop_gset4
02E6 2496 adiw R28,4
02E8 .dbline 0 ; func end
02E8 0895 ret
02EA .dbsym r r1 20 c
02EA .dbsym r retry 22 i
02EA .dbsym r i 10 i
02EA .dbsym r buffer 12 pc
02EA .dbsym l sector 10 l
02EA .dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -