📄 sd.lis
字号:
0162 4A2D mov R20,R10
0164 .dbline 107
0164 ; return 0;//正常返回 //normal return
0164 0027 clr R16
0166 .dbline -2
0166 L11:
0166 .dbline 0 ; func end
0166 2296 adiw R28,2
0168 0C940000 xjmp pop_xgsetF00C
016C .dbsym r retry 10 c
016C .dbsym r r1 20 c
016C .dbsym r i 22 c
016C .dbend
016C .dbfunc e SD_ReadBlock _SD_ReadBlock fc
016C ; r1 -> R12
016C ; retry -> R20,R21
016C ; i -> R20,R21
016C ; buffer -> R10,R11
016C ; sector -> y+10
.even
016C _SD_ReadBlock::
016C 0E940000 xcall push_arg4
0170 0E940000 xcall push_xgsetF03C
0174 2297 sbiw R28,2
0176 AE84 ldd R10,y+14
0178 BF84 ldd R11,y+15
017A .dbline -1
017A .dbline 120
017A ; }
017A ;
017A ;
017A ;
017A ; //---------------------------------------------
017A ; //
017A ; // SD卡扇区读取函数
017A ; // sector:扇区号
017A ; // buffer:数据缓存
017A ; //
017A ; //---------------------------------------------
017A ; uint8 SD_ReadBlock(uint32 sector, uint8* buffer)
017A ; {
017A .dbline 123
017A ; uint8 r1;
017A ; uint16 i;
017A ; uint16 retry=0;
017A 4427 clr R20
017C 5527 clr R21
017E .dbline 125
017E ;
017E ; SPI_High(); /* Use High Speed SPI*/
017E 0E940000 xcall _SPI_High
0182 .dbline 127
0182 ;
0182 ; r1 = SD_SendCommand(17, sector<<9);//读命令 //read command
0182 89E0 ldi R24,9
0184 90E0 ldi R25,0
0186 0A85 ldd R16,y+10
0188 1B85 ldd R17,y+11
018A 2C85 ldd R18,y+12
018C 3D85 ldd R19,y+13
018E 8A93 st -y,R24
0190 0E940000 xcall lsl32
0194 2883 std y+0,R18
0196 3983 std y+1,R19
0198 9801 movw R18,R16
019A 01E1 ldi R16,17
019C 34DF xcall _SD_SendCommand
019E C02E mov R12,R16
01A0 .dbline 129
01A0 ;
01A0 ; if(r1 != 0x00)
01A0 0023 tst R16
01A2 09F0 breq L27
01A4 X8:
01A4 .dbline 130
01A4 ; return r1;
01A4 2EC0 xjmp L26
01A6 L27:
01A6 .dbline 132
01A6 ;
01A6 ; SPI_CS_Assert;
01A6 D998 cbi 0x1b,1
01A8 0BC0 xjmp L30
01AA L29:
01AA .dbline 135
01AA ; //等数据的开始 //wait to start recieve data
01AA ; while(SPI_SrByte(0xff) != 0xfe)
01AA ; if(retry++ > 0xfffe)
01AA 1A01 movw R2,R20
01AC 4F5F subi R20,255 ; offset = 1
01AE 5F4F sbci R21,255
01B0 8EEF ldi R24,65534
01B2 9FEF ldi R25,255
01B4 8215 cp R24,R2
01B6 9305 cpc R25,R3
01B8 18F4 brsh L32
01BA X9:
01BA .dbline 136
01BA ; {SPI_CS_Deassert;return 1;}
01BA .dbline 136
01BA D99A sbi 0x1b,1
01BC .dbline 136
01BC 01E0 ldi R16,1
01BE 21C0 xjmp L26
01C0 L32:
01C0 L30:
01C0 .dbline 134
01C0 0FEF ldi R16,255
01C2 0E940000 xcall _SPI_SrByte
01C6 602F mov R22,R16
01C8 0E3F cpi R16,254
01CA 79F7 brne L29
01CC X10:
01CC .dbline 138
01CC ;
01CC ; for(i=0; i<512; i++)//读512个数据 //read 512 bytes
01CC 4427 clr R20
01CE 5527 clr R21
01D0 09C0 xjmp L37
01D2 L34:
01D2 .dbline 139
01D2 ; {
01D2 .dbline 140
01D2 ; *buffer++ = SPI_SrByte(0xff);
01D2 0FEF ldi R16,255
01D4 0E940000 xcall _SPI_SrByte
01D8 C02E mov R12,R16
01DA F501 movw R30,R10
01DC C192 st Z+,R12
01DE 5F01 movw R10,R30
01E0 .dbline 141
01E0 ; }
01E0 L35:
01E0 .dbline 138
01E0 4F5F subi R20,255 ; offset = 1
01E2 5F4F sbci R21,255
01E4 L37:
01E4 .dbline 138
01E4 4030 cpi R20,0
01E6 E2E0 ldi R30,2
01E8 5E07 cpc R21,R30
01EA 98F3 brlo L34
01EC X11:
01EC .dbline 143
01EC ;
01EC ; SPI_SrByte(0xff);//伪crc //dummy crc
01EC 0FEF ldi R16,255
01EE 0E940000 xcall _SPI_SrByte
01F2 .dbline 144
01F2 ; SPI_SrByte(0xff);
01F2 0FEF ldi R16,255
01F4 0E940000 xcall _SPI_SrByte
01F8 .dbline 146
01F8 ;
01F8 ; SPI_CS_Deassert;
01F8 D99A sbi 0x1b,1
01FA .dbline 147
01FA ; SPI_SrByte(0xff);// extra 8 CLK
01FA 0FEF ldi R16,255
01FC 0E940000 xcall _SPI_SrByte
0200 .dbline 149
0200 ;
0200 ; return 0;
0200 0027 clr R16
0202 .dbline -2
0202 L26:
0202 .dbline 0 ; func end
0202 2296 adiw R28,2
0204 0E940000 xcall pop_xgsetF03C
0208 2496 adiw R28,4
020A 0895 ret
020C .dbsym r r1 12 c
020C .dbsym r retry 20 i
020C .dbsym r i 20 i
020C .dbsym r buffer 10 pc
020C .dbsym l sector 10 l
020C .dbend
020C .dbfunc e SD_WriteSingleBlock _SD_WriteSingleBlock fc
020C ; r1 -> R22
020C ; retry -> R20,R21
020C ; i -> R10,R11
020C ; buffer -> y+12
020C ; sector -> y+8
.even
020C _SD_WriteSingleBlock::
020C 0E940000 xcall push_arg4
0210 0E940000 xcall push_xgsetF00C
0214 2297 sbiw R28,2
0216 .dbline -1
0216 .dbline 161
0216 ; }
0216 ;
0216 ;
0216 ; //---------------------------------------------
0216 ; //
0216 ; // SD卡扇区写入函数
0216 ; // sector:扇区号
0216 ; // buffer:数据缓存
0216 ; //
0216 ; //---------------------------------------------
0216 ; uint8 SD_WriteSingleBlock(uint32 sector, uint8* buffer)
0216 ; {
0216 .dbline 164
0216 ; uint8 r1;
0216 ; uint16 i;
0216 ; uint16 retry=0;
0216 4427 clr R20
0218 5527 clr R21
021A .dbline 168
021A ;
021A ; //SPI_High(); /* Use High Speed SPI*/
021A ;
021A ; r1 = SD_SendCommand(24, sector<<9);//写命令 //send command
021A 89E0 ldi R24,9
021C 90E0 ldi R25,0
021E 0885 ldd R16,y+8
0220 1985 ldd R17,y+9
0222 2A85 ldd R18,y+10
0224 3B85 ldd R19,y+11
0226 8A93 st -y,R24
0228 0E940000 xcall lsl32
022C 2883 std y+0,R18
022E 3983 std y+1,R19
0230 9801 movw R18,R16
0232 08E1 ldi R16,24
0234 E8DE xcall _SD_SendCommand
0236 602F mov R22,R16
0238 .dbline 169
0238 ; if(r1 != 0x00)
0238 0023 tst R16
023A 09F0 breq L39
023C X12:
023C .dbline 170
023C ; return r1;
023C 43C0 xjmp L38
023E L39:
023E .dbline 172
023E ;
023E ; SPI_CS_Assert;
023E D998 cbi 0x1b,1
0240 .dbline 174
0240 ;
0240 ; SPI_SrByte(0xff);
0240 0FEF ldi R16,255
0242 0E940000 xcall _SPI_SrByte
0246 .dbline 175
0246 ; SPI_SrByte(0xff);
0246 0FEF ldi R16,255
0248 0E940000 xcall _SPI_SrByte
024C .dbline 176
024C ; SPI_SrByte(0xff);
024C 0FEF ldi R16,255
024E 0E940000 xcall _SPI_SrByte
0252 .dbline 178
0252 ;
0252 ; SPI_SrByte(0xfe);//发开始符 //send start byte "token"
0252 0EEF ldi R16,254
0254 0E940000 xcall _SPI_SrByte
0258 .dbline 180
0258 ;
0258 ; for(i=0; i<512; i++)//送512字节数据 //send 512 bytes data
0258 AA24 clr R10
025A BB24 clr R11
025C 0BC0 xjmp L44
025E L41:
025E .dbline 181
025E ; {
025E .dbline 182
025E ; SPI_SrByte(buffer[i]);
025E F501 movw R30,R10
0260 0C84 ldd R0,y+12
0262 1D84 ldd R1,y+13
0264 E00D add R30,R0
0266 F11D adc R31,R1
0268 0081 ldd R16,z+0
026A 0E940000 xcall _SPI_SrByte
026E .dbline 183
026E ; }
026E L42:
026E .dbline 180
026E C501 movw R24,R10
0270 0196 adiw R24,1
0272 5C01 movw R10,R24
0274 L44:
0274 .dbline 180
0274 C501 movw R24,R10
0276 8030 cpi R24,0
0278 E2E0 ldi R30,2
027A 9E07 cpc R25,R30
027C 80F3 brlo L41
027E X13:
027E .dbline 185
027E ;
027E ; SPI_SrByte(0xff); //dummy crc
027E 0FEF ldi R16,255
0280 0E940000 xcall _SPI_SrByte
0284 .dbline 186
0284 ; SPI_SrByte(0xff);
0284 0FEF ldi R16,255
0286 0E940000 xcall _SPI_SrByte
028A .dbline 188
028A ;
028A ; r1 = SPI_SrByte(0xff);
028A 0FEF ldi R16,255
028C 0E940000 xcall _SPI_SrByte
0290 602F mov R22,R16
0292 .dbline 190
0292 ;
0292 ; if( (r1&0x1f) != 0x05)//等待是否成功 //judge if it successful
0292 862F mov R24,R22
0294 8F71 andi R24,31
0296 8530 cpi R24,5
0298 69F0 breq L48
029A X14:
029A .dbline 191
029A ; {
029A .dbline 192
029A ; SPI_CS_Deassert;
029A D99A sbi 0x1b,1
029C .dbline 193
029C ; return r1;
029C 13C0 xjmp L38
029E L47:
029E .dbline 196
029E ; }
029E ; //等待操作完 //wait no busy
029E ; while(!SPI_SrByte(0xff))if(retry++ > 0xfffe){SPI_CS_Deassert;return 1;}
029E BA01 movw R22,R20
02A0 4F5F subi R20,255 ; offset = 1
02A2 5F4F sbci R21,255
02A4 8EEF ldi R24,65534
02A6 9FEF ldi R25,255
02A8 8617 cp R24,R22
02AA 9707 cpc R25,R23
02AC 18F4 brsh L50
02AE X15:
02AE .dbline 196
02AE .dbline 196
02AE D99A sbi 0x1b,1
02B0 .dbline 196
02B0 01E0 ldi R16,1
02B2 08C0 xjmp L38
02B4 L50:
02B4 L48:
02B4 .dbline 196
02B4 0FEF ldi R16,255
02B6 0E940000 xcall _SPI_SrByte
02BA A02E mov R10,R16
02BC 0023 tst R16
02BE 79F3 breq L47
02C0 X16:
02C0 .dbline 198
02C0 ;
02C0 ; SPI_CS_Deassert;
02C0 D99A sbi 0x1b,1
02C2 .dbline 201
02C2 ; //SPI_SrByte(0xff);// extra 8 CLK
02C2 ;
02C2 ; return 0;
02C2 0027 clr R16
02C4 .dbline -2
02C4 L38:
02C4 .dbline 0 ; func end
02C4 2296 adiw R28,2
02C6 0E940000 xcall pop_xgsetF00C
02CA 2496 adiw R28,4
02CC 0895 ret
02CE .dbsym r r1 22 c
02CE .dbsym r retry 20 i
02CE .dbsym r i 10 i
02CE .dbsym l buffer 12 pc
02CE .dbsym l sector 8 l
02CE .dbend
02CE ; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -