📄 mmc.lst
字号:
__text_start:
__start:
0044 EFCF LDI R28,0xFF
0045 E0D4 LDI R29,4
0046 BFCD OUT 0x3D,R28
0047 BFDE OUT 0x3E,R29
0048 51C0 SUBI R28,0x10
0049 40D0 SBCI R29,0
004A EA0A LDI R16,0xAA
004B 8308 STD Y+0,R16
004C 2400 CLR R0
004D E0E0 LDI R30,0
004E E0F1 LDI R31,1
004F E013 LDI R17,3
0050 30E0 CPI R30,0
0051 07F1 CPC R31,R17
0052 F011 BEQ 0x0055
0053 9201 ST R0,Z+
0054 CFFB RJMP 0x0050
0055 8300 STD Z+0,R16
0056 E8E8 LDI R30,0x88
0057 E0F0 LDI R31,0
0058 E0A0 LDI R26,0
0059 E0B1 LDI R27,1
005A E010 LDI R17,0
005B 38E8 CPI R30,0x88
005C 07F1 CPC R31,R17
005D F021 BEQ 0x0062
005E 95C8 LPM
005F 9631 ADIW R30,1
0060 920D ST R0,X+
0061 CFF9 RJMP 0x005B
0062 D001 RCALL _main
_exit:
0063 CFFF RJMP _exit
FILE: E:\SOUCER~1\M162MMC\main.c
(0001) /******************************************
(0002) * 程序名称: MMC(SD)卡读写程序
(0003) * 程序功能: 主函数
(0004) * 目标硬件: AVR MCU "ATMEGA162" 16.0000MHz
(0005) * 创建日期: 2007-12
(0006) * 原创作者: XuGuoHong
(0007) * kk20y@yahoo.com.cn
(0008) * 修改记录: 无
(0009) ******************************************/
(0010)
(0011) /* INCLUDE参数 */
(0012) #include <iom162v.h>
(0013)
(0014) /* 全局变量 */
(0015) unsigned char sector[512];
(0016)
(0017) /*******************************
(0018) * 主 函 数
(0019) *******************************/
(0020) void main(void)
(0021) {
(0022) unsigned int i;
(0023) SPL = 0XFF; /* 堆栈初始化 */
_main:
i --> R20
0064 EF8F LDI R24,0xFF
0065 BF8D OUT 0x3D,R24
(0024) SPH = 0X04;
0066 E084 LDI R24,4
0067 BF8E OUT 0x3E,R24
(0025) uart1_init();
0068 D160 RCALL _uart1_init
(0026) spi_init();
0069 D178 RCALL _spi_init
(0027) DelayMs(100);
006A E604 LDI R16,0x64
006B E010 LDI R17,0
006C D026 RCALL _DelayMs
(0028) MMCInit();
006D D06A RCALL _MMCInit
(0029) //asm("sei"); /* 系统总中断开 */
(0030)
(0031)
(0032) // 测试1:将数据写入第255个扇区
(0033) for(i=0; i<512; i++)
006E 2744 CLR R20
006F 2755 CLR R21
0070 C006 RJMP 0x0077
(0034) sector[i]=0X88;
0071 940E02A5 CALL 0x2A5
0073 E888 LDI R24,0x88
0074 8380 STD Z+0,R24
0075 5F4F SUBI R20,0xFF
0076 4F5F SBCI R21,0xFF
0077 3040 CPI R20,0
0078 E0E2 LDI R30,2
0079 075E CPC R21,R30
007A F3B0 BCS 0x0071
(0035) MMCWrBlock1(255);
007B EF0F LDI R16,0xFF
007C E010 LDI R17,0
007D D0F1 RCALL _MMCWrBlock1
(0036)
(0037) // 测试2:将第1个扇区的数据读出
(0038) MMCRdBolck1(0);
007E 2700 CLR R16
007F 2711 CLR R17
0080 D0A1 RCALL _MMCRdBolck1
(0039) for(i=0; i<512; i++)
0081 2744 CLR R20
0082 2755 CLR R21
0083 C007 RJMP 0x008B
(0040) uart1_send(sector[i]);
0084 940E02A5 CALL 0x2A5
0086 8100 LDD R16,Z+0
0087 2711 CLR R17
0088 D14A RCALL _uart1_send
0089 5F4F SUBI R20,0xFF
008A 4F5F SBCI R21,0xFF
008B 3040 CPI R20,0
008C E0E2 LDI R30,2
008D 075E CPC R21,R30
008E F3A8 BCS 0x0084
008F C001 RJMP 0x0091
(0041)
(0042) while(1)
(0043) {
(0044) asm("nop");
0090 0000 NOP
0091 CFFE RJMP 0x0090
0092 9508 RET
_DelayMs:
count --> R20
temp --> R22
time --> R16
0093 D172 RCALL push_gset2
(0045) }
(0046) }
(0047)
(0048) /******************************************
(0049) * 名称: DelayMs
(0050) * 描述: 软件延时函数,单位ms
(0051) ******************************************/
(0052) void DelayMs(unsigned int time)
(0053) {
(0054) unsigned int temp;
(0055) unsigned int count;
(0056) count = 2663;
0094 E647 LDI R20,0x67
0095 E05A LDI R21,0xA
0096 C009 RJMP 0x00A0
(0057) while(count--)
(0058) {
(0059) for (temp=0; temp<time; temp++);
0097 2766 CLR R22
0098 2777 CLR R23
0099 C002 RJMP 0x009C
009A 5F6F SUBI R22,0xFF
009B 4F7F SBCI R23,0xFF
009C 1760 CP R22,R16
009D 0771 CPC R23,R17
009E F3D8 BCS 0x009A
(0060) {
(0061) asm("nop");
009F 0000 NOP
00A0 011A MOVW R2,R20
00A1 5041 SUBI R20,1
00A2 4050 SBCI R21,0
00A3 2022 TST R2
00A4 F791 BNE 0x0097
00A5 2033 TST R3
00A6 F781 BNE 0x0097
00A7 D154 RCALL pop_gset2
00A8 9508 RET
FILE: E:\SOUCER~1\M162MMC\mmc.c
(0001) /******************************************
(0002) * 程序名称: MMC(SD)卡读写程序
(0003) * 程序功能: MMC(SD)卡接口操作
(0004) * 目标硬件: AVR MCU "ATMEGA162" 16.0000MHz
(0005) * 创建日期: 2007-12
(0006) * 原创作者: XuGuoHong
(0007) * kk20y@yahoo.com.cn
(0008) * 修改记录: 无
(0009) ******************************************/
(0010)
(0011) /* INCLUDE参数 */
(0012) #include <iom162v.h>
(0013)
(0014) /* 全局变量 */
(0015) extern unsigned char sector[512];
(0016)
(0017) /************************************
(0018) * MMC卡片选-1选中/0不选中
(0019) ************************************/
(0020) void MMCCS(unsigned char cs)
(0021) {
(0022) if(cs==0)
_MMCCS:
cs --> R16
00A9 2300 TST R16
00AA F411 BNE 0x00AD
(0023) PORTB|=(1<<PB4); /* SS=1 */
00AB 9AC4 SBI 0x18,4
00AC C001 RJMP 0x00AE
(0024) else
(0025) PORTB&=~(1<<PB4); /* SS=0 */
00AD 98C4 CBI 0x18,4
00AE 9508 RET
_MMCWrCmd:
k --> R20
i --> R22
temp --> R10
cmd --> R12
00AF D152 RCALL push_gset4
00B0 0168 MOVW R12,R16
(0026) }
(0027)
(0028) /*******************************
(0029) * MMC命令发送
(0030) *******************************/
(0031) unsigned char MMCWrCmd(unsigned char *cmd)
(0032) {
(0033) unsigned char i=0,k=0;
00B1 2766 CLR R22
00B2 2744 CLR R20
(0034) unsigned char temp=0XFF;
00B3 EF8F LDI R24,0xFF
00B4 2EA8 MOV R10,R24
(0035) MMCCS(0); /* 片选无效 */
00B5 2700 CLR R16
00B6 DFF2 RCALL _MMCCS
(0036) spi_send(0XFF); /* 发送8个时钟 */
00B7 EF0F LDI R16,0xFF
00B8 E010 LDI R17,0
00B9 D135 RCALL _spi_send
(0037) MMCCS(1); /* 片选有效 */
00BA E001 LDI R16,1
00BB DFED RCALL _MMCCS
(0038) asm("nop");
00BC 0000 NOP
(0039) for(i=0; i<6; i++)
00BD C006 RJMP 0x00C4
(0040) {
(0041) spi_send(*(cmd++)); /* 发送命令 */
00BE 01F6 MOVW R30,R12
00BF 9101 LD R16,Z+
00C0 016F MOVW R12,R30
00C1 2711 CLR R17
00C2 D12C RCALL _spi_send
00C3 9563 INC R22
00C4 3066 CPI R22,6
00C5 F3C0 BCS 0x00BE
00C6 C00B RJMP 0x00D2
(0042) }
(0043) while(temp==0XFF)
(0044) {
(0045) temp = spi_send(0XFF); /* 等待回复 */
00C7 EF0F LDI R16,0xFF
00C8 E010 LDI R17,0
00C9 D125 RCALL _spi_send
00CA 2EA0 MOV R10,R16
(0046) if(k++>200) /* 超时返回 */
00CB 2E24 MOV R2,R20
00CC 2433 CLR R3
00CD 5F4F SUBI R20,0xFF
00CE EC88 LDI R24,0xC8
00CF 1582 CP R24,R2
00D0 F408 BCC 0x00D2
(0047) {
(0048) return temp;
00D1 C004 RJMP 0x00D6
00D2 2D8A MOV R24,R10
00D3 3F8F CPI R24,0xFF
00D4 F391 BEQ 0x00C7
(0049) }
(0050) }
(0051) return temp;
00D5 2F08 MOV R16,R24
00D6 D127 RCALL pop_gset4
00D7 9508 RET
_MMCInit:
temp --> R22
timeout --> R20
cmd --> Y+0
i --> R20
00D8 D12D RCALL push_gset2
00D9 9726 SBIW R28,6
(0052) }
(0053)
(0054)
(0055) /*******************************
(0056) * MMC初始化
(0057) *******************************/
(0058) unsigned char MMCInit(void)
(0059) {
(0060) unsigned int timeout;
(0061) unsigned char i=0,temp=0;
00DA 2744 CLR R20
00DB 2766 CLR R22
(0062) unsigned char cmd[]={0x40,0x00,0x00,0x00,0x00,0x95};
00DC E780 LDI R24,0x70
00DD 940E027C CALL <created procedures>
00DF D183 RCALL asgncblk
(0063) DelayMs(500);
00E0 EF04 LDI R16,0xF4
00E1 E011 LDI R17,1
00E2 DFB0 RCALL _DelayMs
(0064) /* 发送一定数量的时钟脉冲 */
(0065) for(i=0;i<0x10;i++)
00E3 C004 RJMP 0x00E8
(0066) {
(0067) spi_send(0XFF);
00E4 EF0F LDI R16,0xFF
00E5 E010 LDI R17,0
00E6 D108 RCALL _spi_send
00E7 9543 INC R20
00E8 3140 CPI R20,0x10
00E9 F3D0 BCS 0x00E4
(0068) }
(0069) /* 发送CMD0 */
(0070) if(MMCWrCmd(cmd)!=0X01)
00EA 018E MOVW R16,R28
00EB DFC3 RCALL _MMCWrCmd
00EC 3001 CPI R16,1
00ED F011 BEQ 0x00F0
(0071) return 0;
00EE 2700 CLR R16
00EF C015 RJMP 0x0105
(0072) /* 发送CMD1 */
(0073) cmd[0]=0X41;
00F0 E481 LDI R24,0x41
00F1 8388 STD Y+0,R24
(0074) cmd[5]=0XFF;
00F2 EF8F LDI R24,0xFF
00F3 838D STD Y+5,R24
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -