⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mmc.lis

📁 ARM单片机控制SD卡的读写
💻 LIS
📖 第 1 页 / 共 3 页
字号:
                        .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 + -