📄 sdmmc.lis
字号:
01C0 ; uint8 retry=0;
01C0 6627 clr R22
01C2 .dbline 249
01C2 ; uint8 i;
01C2 ;
01C2 ; //set MMC_Chip_Select to high (MMC/SD-Card disable)
01C2 ; MMC_Disable();
01C2 C49A sbi 0x18,4
01C4 .dbline 249
01C4 .dbline 251
01C4 ; //send 8 Clock Impulse
01C4 ; Write_Byte_MMC(0xFF);
01C4 0FEF ldi R16,255
01C6 49D0 xcall _Write_Byte_MMC
01C8 .dbline 253
01C8 ; //set MMC_Chip_Select to low (MMC/SD-Card active)
01C8 ; MMC_Enable();
01C8 C498 cbi 0x18,4
01CA .dbline 253
01CA .dbline 256
01CA ;
01CA ; //send 6 Byte Command to MMC/SD-Card
01CA ; for (i=0;i<0x06;i++)
01CA 4427 clr R20
01CC 05C0 xjmp L44
01CE L41:
01CE .dbline 257
01CE .dbline 258
01CE F601 movw R30,R12
01D0 0191 ld R16,Z+
01D2 6F01 movw R12,R30
01D4 42D0 xcall _Write_Byte_MMC
01D6 .dbline 259
01D6 L42:
01D6 .dbline 256
01D6 4395 inc R20
01D8 L44:
01D8 .dbline 256
01D8 4630 cpi R20,6
01DA C8F3 brlo L41
01DC .dbline 262
01DC ; {
01DC ; Write_Byte_MMC(*CMD++);
01DC ; }
01DC ;
01DC ; //get 16 bit response
01DC ; Read_Byte_MMC(); //read the first byte,ignore it.
01DC 0CD0 xcall _Read_Byte_MMC
01DE L45:
01DE .dbline 264
01DE ; do
01DE ; { //Only last 8 bit is used here.Read it out.
01DE .dbline 265
01DE ; tmp = Read_Byte_MMC();
01DE 0BD0 xcall _Read_Byte_MMC
01E0 A02E mov R10,R16
01E2 .dbline 266
01E2 ; retry++;
01E2 6395 inc R22
01E4 .dbline 267
01E4 ; }
01E4 L46:
01E4 .dbline 268
01E4 ; while((tmp==0xff)&&(retry<100));
01E4 8A2D mov R24,R10
01E6 8F3F cpi R24,255
01E8 11F4 brne L48
01EA 6436 cpi R22,100
01EC C0F3 brlo L45
01EE L48:
01EE .dbline 269
01EE ; return(tmp);
01EE 0A2D mov R16,R10
01F0 .dbline -2
01F0 L40:
01F0 0E940000 xcall pop_gset4
01F4 .dbline 0 ; func end
01F4 0895 ret
01F6 .dbsym r i 20 c
01F6 .dbsym r retry 22 c
01F6 .dbsym r tmp 10 c
01F6 .dbsym r CMD 12 pc
01F6 .dbend
01F6 .dbfunc e Read_Byte_MMC _Read_Byte_MMC fc
01F6 ; i -> R22
01F6 ; temp -> R20
.even
01F6 _Read_Byte_MMC::
01F6 0E940000 xcall push_gset2
01FA .dbline -1
01FA .dbline 276
01FA ; }
01FA ;
01FA ; //****************************************************************************
01FA ; //Routine for reading a byte from MMC/SD-Card
01FA ; uint8 Read_Byte_MMC(void)
01FA ; //****************************************************************************
01FA ; {
01FA .dbline 277
01FA ; uint8 temp=0;
01FA 4427 clr R20
01FC .dbline 279
01FC ; uint8 i;
01FC ; MMC_PORT&=~(1<<SPI_Busy);
01FC C098 cbi 0x18,0
01FE .dbline 281
01FE ; //Software SPI
01FE ; if(Init_Flag)
01FE 20900000 lds R2,_Init_Flag
0202 2220 tst R2
0204 01F1 breq L50
0206 .dbline 282
0206 ; {
0206 .dbline 283
0206 ; for (i=0; i<8; i++) //MSB First
0206 6627 clr R22
0208 1BC0 xjmp L55
020A L52:
020A .dbline 284
020A ; {
020A .dbline 285
020A ; MMC_PORT&=~(1<<SPI_CLK); //Clock Impuls (Low)
020A C798 cbi 0x18,7
020C .dbline 286
020C ; if(Init_Flag)
020C 20900000 lds R2,_Init_Flag
0210 2220 tst R2
0212 11F0 breq L56
0214 .dbline 287
0214 ; delay_us(200);
0214 08EC ldi R16,200
0216 02D3 xcall _delay_us
0218 L56:
0218 .dbline 288
0218 ; temp = (temp << 1) + ((MMC_PIN&(1<<SPI_MISO))>>SPI_MISO); //read mmc data out pin
0218 86B3 in R24,0x16
021A 8074 andi R24,64
021C 8695 lsr R24
021E 8695 lsr R24
0220 8695 lsr R24
0222 8695 lsr R24
0224 8695 lsr R24
0226 8695 lsr R24
0228 242E mov R2,R20
022A 220C lsl R2
022C 280E add R2,R24
022E 422D mov R20,R2
0230 .dbline 289
0230 ; MMC_PORT|=(1<<SPI_CLK); //set Clock Impuls High
0230 C79A sbi 0x18,7
0232 .dbline 290
0232 ; if(Init_Flag)
0232 20900000 lds R2,_Init_Flag
0236 2220 tst R2
0238 11F0 breq L58
023A .dbline 291
023A ; delay_us(200);
023A 08EC ldi R16,200
023C EFD2 xcall _delay_us
023E L58:
023E .dbline 292
023E L53:
023E .dbline 283
023E 6395 inc R22
0240 L55:
0240 .dbline 283
0240 6830 cpi R22,8
0242 18F3 brlo L52
0244 .dbline 294
0244 ; }
0244 ;
0244 ; }
0244 05C0 xjmp L51
0246 L50:
0246 .dbline 296
0246 ; else
0246 ; {
0246 .dbline 298
0246 ; #if !(HW_SPI_Mode)
0246 ; SPDR=0xFF;
0246 8FEF ldi R24,255
0248 8FB9 out 0xf,R24
024A L60:
024A .dbline 299
024A .dbline 299
024A L61:
024A .dbline 299
024A ; while(!(SPSR & 0x80)){};
024A 779B sbis 0xe,7
024C FECF rjmp L60
024E .dbline 299
024E .dbline 300
024E ; temp=SPDR;
024E 4FB1 in R20,0xf
0250 .dbline 304
0250 ; #else
0250 ; Spi_SendReceive(&temp,1,1);
0250 ; #endif
0250 ; }
0250 L51:
0250 .dbline 305
0250 ; MMC_PORT|=(1<<SPI_Busy);
0250 C09A sbi 0x18,0
0252 .dbline 306
0252 ; return (temp);
0252 042F mov R16,R20
0254 .dbline -2
0254 L49:
0254 0E940000 xcall pop_gset2
0258 .dbline 0 ; func end
0258 0895 ret
025A .dbsym r i 22 c
025A .dbsym r temp 20 c
025A .dbend
025A .dbfunc e Write_Byte_MMC _Write_Byte_MMC fV
025A ; i -> R20
025A ; value -> R22
.even
025A _Write_Byte_MMC::
025A 0E940000 xcall push_gset2
025E 602F mov R22,R16
0260 .dbline -1
0260 .dbline 313
0260 ; }
0260 ;
0260 ; //****************************************************************************
0260 ; //Routine for sending a byte to MMC/SD-Card
0260 ; void Write_Byte_MMC(uint8 value)
0260 ; //****************************************************************************
0260 ; {
0260 .dbline 315
0260 ; uint8 i;
0260 ; MMC_PORT&=~(1<<SPI_Busy);
0260 C098 cbi 0x18,0
0262 .dbline 317
0262 ; //Software SPI
0262 ; if(Init_Flag){
0262 20900000 lds R2,_Init_Flag
0266 2220 tst R2
0268 09F1 breq L64
026A .dbline 317
026A .dbline 318
026A ; for (i=0; i<8; i++)
026A 4427 clr R20
026C 1BC0 xjmp L69
026E L66:
026E .dbline 319
026E ; { //write a byte
026E .dbline 320
026E ; if (((value >> (7-i)) & 0x01)==0x01)
026E 17E0 ldi R17,7
0270 141B sub R17,R20
0272 062F mov R16,R22
0274 0E940000 xcall lsr8
0278 802F mov R24,R16
027A 8170 andi R24,1
027C 8130 cpi R24,1
027E 11F4 brne L70
0280 .dbline 321
0280 ; MMC_PORT|=(1<<SPI_MOSI); //Send bit by bit(MSB First)
0280 C59A sbi 0x18,5
0282 01C0 xjmp L71
0284 L70:
0284 .dbline 323
0284 ; else
0284 ; MMC_PORT&=~(1<<SPI_MOSI);
0284 C598 cbi 0x18,5
0286 L71:
0286 .dbline 324
0286 ; MMC_PORT&=~(1<<SPI_CLK); //set Clock Impuls low
0286 C798 cbi 0x18,7
0288 .dbline 325
0288 ; if(Init_Flag)
0288 20900000 lds R2,_Init_Flag
028C 2220 tst R2
028E 11F0 breq L72
0290 .dbline 326
0290 ; delay_us(200);
0290 08EC ldi R16,200
0292 C4D2 xcall _delay_us
0294 L72:
0294 .dbline 327
0294 ; MMC_PORT|=(1<<SPI_CLK); //set Clock Impuls High
0294 C79A sbi 0x18,7
0296 .dbline 328
0296 ; if(Init_Flag)
0296 20900000 lds R2,_Init_Flag
029A 2220 tst R2
029C 11F0 breq L74
029E .dbline 329
029E ; delay_us(200);
029E 08EC ldi R16,200
02A0 BDD2 xcall _delay_us
02A2 L74:
02A2 .dbline 330
02A2 L67:
02A2 .dbline 318
02A2 4395 inc R20
02A4 L69:
02A4 .dbline 318
02A4 4830 cpi R20,8
02A6 18F3 brlo L66
02A8 .dbline 331
02A8 ; }//write a byte
02A8 ; MMC_PORT|=(1<<SPI_MOSI); //set Output High
02A8 C59A sbi 0x18,5
02AA .dbline 333
02AA ;
02AA ; }
02AA 03C0 xjmp L65
02AC L64:
02AC .dbline 335
02AC ; else
02AC ; {
02AC .dbline 337
02AC ; #if !(HW_SPI_Mode)
02AC ; SPDR=value;
02AC 6FB9 out 0xf,R22
02AE L76:
02AE .dbline 338
02AE .dbline 338
02AE L77:
02AE .dbline 338
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -