📄 mmc.lis
字号:
.module mmc.c
.area text(rom, con, rel)
0000 .dbfile E:\SOUCER~1\M162MMC\mmc.c
0000 .dbfunc e MMCCS _MMCCS fV
0000 ; cs -> R16
.even
0000 _MMCCS::
0000 .dbline -1
0000 .dbline 21
0000 ; /******************************************
0000 ; * 程序名称: MMC(SD)卡读写程序
0000 ; * 程序功能: MMC(SD)卡接口操作
0000 ; * 目标硬件: AVR MCU "ATMEGA162" 16.0000MHz
0000 ; * 创建日期: 2007-12
0000 ; * 原创作者: XuGuoHong
0000 ; * kk20y@yahoo.com.cn
0000 ; * 修改记录: 无
0000 ; ******************************************/
0000 ;
0000 ; /* INCLUDE参数 */
0000 ; #include <iom162v.h>
0000 ;
0000 ; /* 全局变量 */
0000 ; extern unsigned char sector[512];
0000 ;
0000 ; /************************************
0000 ; * MMC卡片选-1选中/0不选中
0000 ; ************************************/
0000 ; void MMCCS(unsigned char cs)
0000 ; {
0000 .dbline 22
0000 ; if(cs==0)
0000 0023 tst R16
0002 11F4 brne L2
0004 .dbline 23
0004 ; PORTB|=(1<<PB4); /* SS=1 */
0004 C49A sbi 0x18,4
0006 01C0 xjmp L3
0008 L2:
0008 .dbline 25
0008 C498 cbi 0x18,4
000A L3:
000A .dbline -2
000A L1:
000A .dbline 0 ; func end
000A 0895 ret
000C .dbsym r cs 16 c
000C .dbend
000C .dbfunc e MMCWrCmd _MMCWrCmd fc
000C ; k -> R20
000C ; i -> R22
000C ; temp -> R10
000C ; cmd -> R12,R13
.even
000C _MMCWrCmd::
000C 0E940000 xcall push_gset4
0010 6801 movw R12,R16
0012 .dbline -1
0012 .dbline 32
0012 ; else
0012 ; PORTB&=~(1<<PB4); /* SS=0 */
0012 ; }
0012 ;
0012 ; /*******************************
0012 ; * MMC命令发送
0012 ; *******************************/
0012 ; unsigned char MMCWrCmd(unsigned char *cmd)
0012 ; {
0012 .dbline 33
0012 ; unsigned char i=0,k=0;
0012 6627 clr R22
0014 .dbline 33
0014 4427 clr R20
0016 .dbline 34
0016 ; unsigned char temp=0XFF;
0016 8FEF ldi R24,255
0018 A82E mov R10,R24
001A .dbline 35
001A ; MMCCS(0); /* 片选无效 */
001A 0027 clr R16
001C F1DF xcall _MMCCS
001E .dbline 36
001E ; spi_send(0XFF); /* 发送8个时钟 */
001E 0FEF ldi R16,255
0020 10E0 ldi R17,0
0022 0E940000 xcall _spi_send
0026 .dbline 37
0026 ; MMCCS(1); /* 片选有效 */
0026 01E0 ldi R16,1
0028 EBDF xcall _MMCCS
002A .dbline 38
002A ; asm("nop");
002A 0000 nop
002C .dbline 39
002C ; for(i=0; i<6; i++)
002C 07C0 xjmp L8
002E L5:
002E .dbline 40
002E .dbline 41
002E F601 movw R30,R12
0030 0191 ld R16,Z+
0032 6F01 movw R12,R30
0034 1127 clr R17
0036 0E940000 xcall _spi_send
003A .dbline 42
003A L6:
003A .dbline 39
003A 6395 inc R22
003C L8:
003C .dbline 39
003C 6630 cpi R22,6
003E B8F3 brlo L5
0040 0CC0 xjmp L10
0042 L9:
0042 .dbline 44
0042 ; {
0042 ; spi_send(*(cmd++)); /* 发送命令 */
0042 ; }
0042 ; while(temp==0XFF)
0042 ; {
0042 .dbline 45
0042 ; temp = spi_send(0XFF); /* 等待回复 */
0042 0FEF ldi R16,255
0044 10E0 ldi R17,0
0046 0E940000 xcall _spi_send
004A A02E mov R10,R16
004C .dbline 46
004C ; if(k++>200) /* 超时返回 */
004C 242E mov R2,R20
004E 3324 clr R3
0050 4F5F subi R20,255 ; addi 1
0052 88EC ldi R24,200
0054 8215 cp R24,R2
0056 08F4 brsh L12
0058 .dbline 47
0058 ; {
0058 .dbline 48
0058 ; return temp;
0058 04C0 xjmp L4
005A L12:
005A .dbline 50
005A L10:
005A .dbline 43
005A 8A2D mov R24,R10
005C 8F3F cpi R24,255
005E 89F3 breq L9
0060 .dbline 51
0060 ; }
0060 ; }
0060 ; return temp;
0060 082F mov R16,R24
0062 .dbline -2
0062 L4:
0062 0E940000 xcall pop_gset4
0066 .dbline 0 ; func end
0066 0895 ret
0068 .dbsym r k 20 c
0068 .dbsym r i 22 c
0068 .dbsym r temp 10 c
0068 .dbsym r cmd 12 pc
0068 .dbend
.area lit(rom, con, rel)
0000 L15:
0000 4000 .byte 64,0
0002 0000 .byte 0,0
0004 0095 .byte 0,149
.area text(rom, con, rel)
0068 .dbfile E:\SOUCER~1\M162MMC\mmc.c
0068 .dbfunc e MMCInit _MMCInit fc
0068 ; temp -> R22
0068 ; timeout -> R20,R21
0068 ; cmd -> y+0
0068 ; i -> R20
.even
0068 _MMCInit::
0068 0E940000 xcall push_gset2
006C 2697 sbiw R28,6
006E .dbline -1
006E .dbline 59
006E ; }
006E ;
006E ;
006E ; /*******************************
006E ; * MMC初始化
006E ; *******************************/
006E ; unsigned char MMCInit(void)
006E ; {
006E .dbline 61
006E ; unsigned int timeout;
006E ; unsigned char i=0,temp=0;
006E 4427 clr R20
0070 .dbline 61
0070 6627 clr R22
0072 .dbline 62
0072 ; unsigned char cmd[]={0x40,0x00,0x00,0x00,0x00,0x95};
0072 80E0 ldi R24,<L15
0074 90E0 ldi R25,>L15
0076 FE01 movw R30,R28
0078 06E0 ldi R16,6
007A 10E0 ldi R17,0
007C FA93 st -y,R31
007E EA93 st -y,R30
0080 9A93 st -y,R25
0082 8A93 st -y,R24
0084 0E940000 xcall asgncblk
0088 .dbline 63
0088 ; DelayMs(500);
0088 04EF ldi R16,500
008A 11E0 ldi R17,1
008C 0E940000 xcall _DelayMs
0090 .dbline 65
0090 ; /* 发送一定数量的时钟脉冲 */
0090 ; for(i=0;i<0x10;i++)
0090 05C0 xjmp L19
0092 L16:
0092 .dbline 66
0092 .dbline 67
0092 0FEF ldi R16,255
0094 10E0 ldi R17,0
0096 0E940000 xcall _spi_send
009A .dbline 68
009A L17:
009A .dbline 65
009A 4395 inc R20
009C L19:
009C .dbline 65
009C 4031 cpi R20,16
009E C8F3 brlo L16
00A0 .dbline 70
00A0 ; {
00A0 ; spi_send(0XFF);
00A0 ; }
00A0 ; /* 发送CMD0 */
00A0 ; if(MMCWrCmd(cmd)!=0X01)
00A0 8E01 movw R16,R28
00A2 B4DF xcall _MMCWrCmd
00A4 0130 cpi R16,1
00A6 11F0 breq L20
00A8 .dbline 71
00A8 ; return 0;
00A8 0027 clr R16
00AA 16C0 xjmp L14
00AC L20:
00AC .dbline 73
00AC ; /* 发送CMD1 */
00AC ; cmd[0]=0X41;
00AC 81E4 ldi R24,65
00AE 8883 std y+0,R24
00B0 .dbline 74
00B0 ; cmd[5]=0XFF;
00B0 8FEF ldi R24,255
00B2 8D83 std y+5,R24
00B4 0AC0 xjmp L24
00B6 L23:
00B6 .dbline 76
00B6 ; while(MMCWrCmd(cmd)!=0X00)
00B6 ; {
00B6 .dbline 77
00B6 ; if(timeout++>0XFFFE) /* 等待初始化完成 */
00B6 1A01 movw R2,R20
00B8 4F5F subi R20,255 ; offset = 1
00BA 5F4F sbci R21,255
00BC 8EEF ldi R24,65534
00BE 9FEF ldi R25,255
00C0 8215 cp R24,R2
00C2 9305 cpc R25,R3
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -