📄 mmc.lst
字号:
00F4 C00A RJMP 0x00FF
(0075) while(MMCWrCmd(cmd)!=0X00)
(0076) {
(0077) if(timeout++>0XFFFE) /* 等待初始化完成 */
00F5 011A MOVW R2,R20
00F6 5F4F SUBI R20,0xFF
00F7 4F5F SBCI R21,0xFF
00F8 EF8E LDI R24,0xFE
00F9 EF9F LDI R25,0xFF
00FA 1582 CP R24,R2
00FB 0593 CPC R25,R3
00FC F410 BCC 0x00FF
(0078) return 0; /* 容量大的MMC卡需要用比较长时间 */
00FD 2700 CLR R16
00FE C006 RJMP 0x0105
00FF 018E MOVW R16,R28
0100 DFAE RCALL _MMCWrCmd
0101 2300 TST R16
0102 F791 BNE 0x00F5
(0079) }
(0080) SPIHiSPD(); /* 提高MCU SPI速度 */
0103 D0E7 RCALL _SPIHiSPD
(0081) return 1;
0104 E001 LDI R16,1
0105 9626 ADIW R28,6
0106 D0F5 RCALL pop_gset2
0107 9508 RET
_MMCCID:
cmd --> Y+0
i --> R20
0108 D0FF RCALL push_gset1
0109 9726 SBIW R28,6
(0082) }
(0083)
(0084) /*******************************
(0085) * 读取MMC-CID寄存器
(0086) *******************************/
(0087) unsigned char MMCCID(void)
(0088) {
(0089) unsigned char i;
(0090) unsigned char cmd[]={0x40,0x00,0x00,0x00,0x00,0xff};
010A E786 LDI R24,0x76
010B 940E027C CALL <created procedures>
010D D155 RCALL asgncblk
(0091) cmd[0]=0X40+10;
010E E48A LDI R24,0x4A
010F 8388 STD Y+0,R24
(0092) if(MMCWrCmd(cmd)!=0X00) /* 发送CMD9 */
0110 018E MOVW R16,R28
0111 DF9D RCALL _MMCWrCmd
0112 2300 TST R16
0113 F011 BEQ 0x0116
(0093) return 0; /* 读取失败 */
0114 2700 CLR R16
0115 C009 RJMP 0x011F
(0094) for(i=0;i<16;i++)
0116 2744 CLR R20
0117 C004 RJMP 0x011C
(0095) //uart1_send(spi_send(0XFF));
(0096) spi_send(0XFF);
0118 EF0F LDI R16,0xFF
0119 E010 LDI R17,0
011A D0D4 RCALL _spi_send
011B 9543 INC R20
011C 3140 CPI R20,0x10
011D F3D0 BCS 0x0118
(0097) return 1;
011E E001 LDI R16,1
011F 9626 ADIW R28,6
0120 D0EA RCALL pop_gset1
0121 9508 RET
_MMCRdBolck1:
temp --> Y+1
cmd --> Y+0
i --> R20
address --> Y+8
0122 D0D6 RCALL push_arg4
0123 D0E4 RCALL push_gset1
0124 9726 SBIW R28,6
(0098) }
(0099)
(0100) /*******************************
(0101) * 读取ONE BLOCK数据
(0102) * address-扇区地址
(0103) *******************************/
(0104) unsigned char MMCRdBolck1(unsigned long address)
(0105) {
(0106) unsigned int i;
(0107) unsigned char temp;
(0108) unsigned char cmd[]={0x40,0x00,0x00,0x00,0x00,0xff};
0125 E78C LDI R24,0x7C
0126 940E027C CALL <created procedures>
0128 D13A RCALL asgncblk
(0109) cmd[0]=0X40+17; /* READ SINGLE BLOCK */
0129 E581 LDI R24,0x51
012A 8388 STD Y+0,R24
(0110) address=address<<9; /* address*512,取512的整数倍 */
012B E089 LDI R24,0x9
012C 940E0285 CALL 0x285
012E D11C RCALL lsl32
012F 01FE MOVW R30,R28
0130 8700 STD Z+8,R16
0131 8711 STD Z+9,R17
0132 8722 STD Z+10,R18
0133 8733 STD Z+11,R19
(0111) cmd[1]=(address>>24);
0134 E188 LDI R24,0x18
0135 940E0285 CALL 0x285
0137 D11F RCALL lsr32
0138 8309 STD Y+1,R16
0139 940E029F CALL 0x29F
(0112) cmd[2]=(address>>16);
013B 0112 MOVW R2,R4
013C 2444 CLR R4
013D 2455 CLR R5
013E 822A STD Y+2,R2
(0113) cmd[3]=(address>>8);
013F E088 LDI R24,0x8
0140 940E0285 CALL 0x285
0142 D114 RCALL lsr32
0143 830B STD Y+3,R16
0144 940E029F CALL 0x29F
(0114) cmd[4]=(address>>0);
0146 822C STD Y+4,R2
(0115) if(MMCWrCmd(cmd)!=0X00) /* 发送CMD17 */
0147 018E MOVW R16,R28
0148 DF66 RCALL _MMCWrCmd
0149 2300 TST R16
014A F019 BEQ 0x014E
(0116) return 0; /* 读取失败 */
014B 2700 CLR R16
014C C01E RJMP 0x016B
(0117) while(spi_send(0XFF)!=0XFE)
(0118) {
(0119) asm("nop"); /* 等待数据接受开始,受到0XFE表示开始 */
014D 0000 NOP
014E EF0F LDI R16,0xFF
014F E010 LDI R17,0
0150 D09E RCALL _spi_send
0151 3F0E CPI R16,0xFE
0152 E0E0 LDI R30,0
0153 071E CPC R17,R30
0154 F7C1 BNE 0x014D
(0120) }
(0121) for(i=0;i<512;i++) /* 读取数据 */
0155 2744 CLR R20
0156 2755 CLR R21
0157 C008 RJMP 0x0160
(0122) {
(0123) sector[i]=spi_send(0XFF);
0158 EF0F LDI R16,0xFF
0159 E010 LDI R17,0
015A D094 RCALL _spi_send
015B 940E02A5 CALL 0x2A5
015D 8300 STD Z+0,R16
015E 5F4F SUBI R20,0xFF
015F 4F5F SBCI R21,0xFF
0160 3040 CPI R20,0
0161 E0E2 LDI R30,2
0162 075E CPC R21,R30
0163 F3A0 BCS 0x0158
(0124) }
(0125) spi_send(0XFF); /* 取走CRC字节 */
0164 EF0F LDI R16,0xFF
0165 E010 LDI R17,0
0166 D088 RCALL _spi_send
(0126) spi_send(0XFF);
0167 EF0F LDI R16,0xFF
0168 E010 LDI R17,0
0169 D085 RCALL _spi_send
(0127) return 1;
016A E001 LDI R16,1
016B 9626 ADIW R28,6
016C D09E RCALL pop_gset1
016D 9624 ADIW R28,4
016E 9508 RET
_MMCWrBlock1:
temp --> R22
cmd --> Y+0
i --> R20
buffer --> Y+14
address --> Y+10
016F D089 RCALL push_arg4
0170 D095 RCALL push_gset2
0171 9726 SBIW R28,6
(0128) }
(0129)
(0130) /*******************************
(0131) * 写ONE BLOCK数据
(0132) * address-扇区地址
(0133) *******************************/
(0134) unsigned char MMCWrBlock1(unsigned long address,unsigned char *buffer)
(0135) {
(0136) unsigned int i;
(0137) unsigned char temp;
(0138) unsigned char cmd[]={0x40,0x00,0x00,0x00,0x00,0xff};
0172 E882 LDI R24,0x82
0173 940E027C CALL <created procedures>
0175 D0ED RCALL asgncblk
(0139) cmd[0]=0x40+24; /* WRITE SINGLE BLOCK */
0176 E588 LDI R24,0x58
0177 8388 STD Y+0,R24
(0140) address=address<<9; /* address*512,取512的整数倍 */
0178 E089 LDI R24,0x9
0179 940E028F CALL 0x28F
017B D0CF RCALL lsl32
017C 01FE MOVW R30,R28
017D 8702 STD Z+10,R16
017E 8713 STD Z+11,R17
017F 8724 STD Z+12,R18
0180 8735 STD Z+13,R19
(0141) cmd[1]=(address>>24);
0181 E188 LDI R24,0x18
0182 940E028F CALL 0x28F
0184 D0D2 RCALL lsr32
0185 8309 STD Y+1,R16
0186 940E0299 CALL 0x299
(0142) cmd[2]=(address>>16);
0188 0112 MOVW R2,R4
0189 2444 CLR R4
018A 2455 CLR R5
018B 822A STD Y+2,R2
(0143) cmd[3]=(address>>8);
018C E088 LDI R24,0x8
018D 940E028F CALL 0x28F
018F D0C7 RCALL lsr32
0190 830B STD Y+3,R16
0191 940E0299 CALL 0x299
(0144) cmd[4]=(address>>0);
0193 822C STD Y+4,R2
(0145) if(MMCWrCmd(cmd)!=0X00) /* 发送CMD24 */
0194 018E MOVW R16,R28
0195 DF19 RCALL _MMCWrCmd
0196 2300 TST R16
0197 F011 BEQ 0x019A
(0146) return 0; /* 写入失败 */
0198 2700 CLR R16
0199 C02B RJMP 0x01C5
(0147) spi_send(0XFF); /* 发送填冲字节 */
019A EF0F LDI R16,0xFF
019B E010 LDI R17,0
019C D052 RCALL _spi_send
(0148) spi_send(0XFE); /* 发送数据开始标志0XFE */
019D EF0E LDI R16,0xFE
019E E010 LDI R17,0
019F D04F RCALL _spi_send
(0149) for(i=0;i<512;i++) /* 写入数据 */
01A0 2744 CLR R20
01A1 2755 CLR R21
01A2 C007 RJMP 0x01AA
(0150) {
(0151) spi_send(sector[i]);
01A3 940E02A5 CALL 0x2A5
01A5 8100 LDD R16,Z+0
01A6 2711 CLR R17
01A7 D047 RCALL _spi_send
01A8 5F4F SUBI R20,0xFF
01A9 4F5F SBCI R21,0xFF
01AA 3040 CPI R20,0
01AB E0E2 LDI R30,2
01AC 075E CPC R21,R30
01AD F3A8 BCS 0x01A3
(0152) }
(0153) spi_send(0XFF); /* 写入CRC字节 */
01AE EF0F LDI R16,0xFF
01AF E010 LDI R17,0
01B0 D03E RCALL _spi_send
(0154) spi_send(0XFF);
01B1 EF0F LDI R16,0xFF
01B2 E010 LDI R17,0
01B3 D03B RCALL _spi_send
(0155) temp=spi_send(0XFF); /* 读取XXX0 0101字节 */
01B4 EF0F LDI R16,0xFF
01B5 E010 LDI R17,0
01B6 D038 RCALL _spi_send
01B7 2F60 MOV R22,R16
(0156) temp=temp&0X1F;
01B8 716F ANDI R22,0x1F
(0157) if(temp!=0X05)
01B9 3065 CPI R22,5
01BA F019 BEQ 0x01BE
(0158) return 0; /* 写入失败 */
01BB 2700 CLR R16
01BC C008 RJMP 0x01C5
(0159) while(spi_send(0XFF)==0X00)
(0160) {
(0161) asm("nop"); /* BUSY等待 */
01BD 0000 NOP
01BE EF0F LDI R16,0xFF
01BF E010 LDI R17,0
01C0 D02E RCALL _spi_send
01C1 3000 CPI R16,0
01C2 0701 CPC R16,R17
01C3 F3C9 BEQ 0x01BD
(0162) }
(0163) return 1;
01C4 E001 LDI R16,1
01C5 9626 ADIW R28,6
01C6 D035 RCALL pop_gset2
01C7 9624 ADIW R28,4
01C8 9508 RET
FILE: E:\SOUCER~1\M162MMC\usb.c
(0001) #include<iom162v.h>
(0002)
(0003) // 函 数 原 形 说 明
(0004) void uart1_init(void);
(0005) void uart1_send(unsigned char);
(0006) unsigned char uart1_rev(void);
(0007)
(0008) //串口通信初始化设置
(0009) //1. 波特率设定
(0010) //2. 帧结构设定
(0011) //3. 接收和发送允许控制
(0012)
(0013) //******************************************
(0014) //*名称: uart1_init
(0015) //*功能: 串口1初始化
(0016) //******************************************
(0017) void uart1_init(void)
(0018) {
(0019) // Fosc频率为16.0000Mhz
(0020) // 波特率设定为19200bps +/-0.2%
(0021) UBRR1H=0x00;
_uart1_init:
01C9 2422 CLR R2
01CA BE2C OUT 0x3C,R2
(0022) UBRR1L=0x33;
01CB E383 LDI R24,0x33
01CC B980 OUT 0x00,R24
(0023) // 8位数据+无奇偶校验+1位STOP
(0024) UCSR1C=(1<<URSEL1)|(1<<UCSZ11)|(1<<UCSZ10);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -