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

📄 mci_lpc23xx.txt

📁 工厂环境污染控制数据采集器
💻 TXT
📖 第 1 页 / 共 5 页
字号:
000504  e59f0834          LDR      r0,|L1.3392|
000508  e59000c4          LDR      r0,[r0,#0xc4]
00050c  e3800203          ORR      r0,r0,#0x30000000
000510  e59f1828          LDR      r1,|L1.3392|
000514  e58100c4          STR      r0,[r1,#0xc4]
;;;64     
;;;65        /* MCIPWR pin is active high. */
;;;66        /* Required for the silicon rev. 'B' and later. */
;;;67        SCS |= 0x08;
000518  e1a00001          MOV      r0,r1
00051c  e59001a0          LDR      r0,[r0,#0x1a0]
000520  e3800008          ORR      r0,r0,#8
000524  e58101a0          STR      r0,[r1,#0x1a0]
;;;68     
;;;69        /* Enable MCI Pins on P0,P2. */
;;;70        PINSEL1 &= ~0x00003FC0;
000528  e241081d          SUB      r0,r1,#0x1d0000
00052c  e5900004          LDR      r0,[r0,#4]
000530  e3c00dff          BIC      r0,r0,#0x3fc0
000534  e241181d          SUB      r1,r1,#0x1d0000
000538  e5810004          STR      r0,[r1,#4]
;;;71        PINSEL1 |=  0x00002A80;
00053c  e1a00001          MOV      r0,r1
000540  e5900004          LDR      r0,[r0,#4]
000544  e3800daa          ORR      r0,r0,#0x2a80
000548  e5810004          STR      r0,[r1,#4]
;;;72        PINSEL4 &= ~0x0FC00000;
00054c  e1a00001          MOV      r0,r1
000550  e5900010          LDR      r0,[r0,#0x10]
000554  e3c0053f          BIC      r0,r0,#0xfc00000
000558  e5810010          STR      r0,[r1,#0x10]
;;;73        PINSEL4 |=  0x0A800000;
00055c  e1a00001          MOV      r0,r1
000560  e5900010          LDR      r0,[r0,#0x10]
000564  e380052a          ORR      r0,r0,#0xa800000
000568  e5810010          STR      r0,[r1,#0x10]
;;;74     
;;;75        /* Clear all pending interrupts. */
;;;76        MCI_COMMAND   = 0;
00056c  e3a00000          MOV      r0,#0
000570  e2811806          ADD      r1,r1,#0x60000
000574  e581000c          STR      r0,[r1,#0xc]
;;;77        MCI_DATA_CTRL = 0;
000578  e581002c          STR      r0,[r1,#0x2c]
;;;78        MCI_CLEAR     = 0x7FF;
00057c  e59f07a8          LDR      r0,|L1.3372|
000580  e5810038          STR      r0,[r1,#0x38]
;;;79     
;;;80        /* Power up, switch on VCC for the Flash Card. */
;;;81        MCI_POWER  = 0x02;
000584  e3a00002          MOV      r0,#2
000588  e5810000          STR      r0,[r1,#0]
;;;82        for (i = 0; i < 50000; i++);
00058c  e3a05000          MOV      r5,#0
000590  ea000000          B        |L1.1432|
                  |L1.1428|
000594  e2855001          ADD      r5,r5,#1
                  |L1.1432|
000598  e59f07a4          LDR      r0,|L1.3396|
00059c  e1550000          CMP      r5,r0
0005a0  3afffffb          BCC      |L1.1428|
;;;83     
;;;84        mci_set_speed (LOW_SPEED);
0005a4  e3a00000          MOV      r0,#0
0005a8  ebfffffe          BL       mci_set_speed
;;;85     
;;;86        /* Power on the Flash Card. */
;;;87        MCI_POWER |= 0x01;
0005ac  e59f0774          LDR      r0,|L1.3368|
0005b0  e5900000          LDR      r0,[r0,#0]
0005b4  e3800001          ORR      r0,r0,#1
0005b8  e59f1768          LDR      r1,|L1.3368|
0005bc  e5810000          STR      r0,[r1,#0]
;;;88        for (i = 0; i < 50000; i++);
0005c0  e3a05000          MOV      r5,#0
0005c4  ea000000          B        |L1.1484|
                  |L1.1480|
0005c8  e2855001          ADD      r5,r5,#1
                  |L1.1484|
0005cc  e59f0770          LDR      r0,|L1.3396|
0005d0  e1550000          CMP      r5,r0
0005d4  3afffffb          BCC      |L1.1480|
;;;89     
;;;90        /* Reset the card, send CMD0. */
;;;91        mci_command (GO_IDLE_STATE, 0, RESP_NONE, NULL);
0005d8  e3a03000          MOV      r3,#0
0005dc  e1a02003          MOV      r2,r3
0005e0  e1a01003          MOV      r1,r3
0005e4  e1a00003          MOV      r0,r3
0005e8  ebfffffe          BL       mci_command
;;;92     
;;;93        /* Set Open Drain output control for MMC */
;;;94        mci_bus_mode (OPEN_DRAIN_MODE);
0005ec  e3a00000          MOV      r0,#0
0005f0  ebfffffe          BL       mci_bus_mode
;;;95     
;;;96        CardType = CARD_NONE;
0005f4  e3a00000          MOV      r0,#0
0005f8  e59f1730          LDR      r1,|L1.3376|
0005fc  e5c10000          STRB     r0,[r1,#0]  ; CardType
;;;97        /* First try MMC, send CMD1. */
;;;98        for (i = 0; i < 100; i++) {
000600  e3a05000          MOV      r5,#0
000604  ea00000f          B        |L1.1608|
                  |L1.1544|
;;;99           rstat = mci_command (SEND_OP_COND, OCR_INDEX, RESP_SHORT, &rval[0]);
000608  e28d3000          ADD      r3,sp,#0
00060c  e3a02001          MOV      r2,#1
000610  e59f1730          LDR      r1,|L1.3400|
000614  e1a00002          MOV      r0,r2
000618  ebfffffe          BL       mci_command
00061c  e1a04000          MOV      r4,r0
;;;100          if (!(rstat & MCI_CMD_TIMEOUT) && rval[0] & 0x80000000) {
000620  e3140004          TST      r4,#4
000624  1a000006          BNE      |L1.1604|
000628  e59d0000          LDR      r0,[sp,#0]
00062c  e3100102          TST      r0,#0x80000000
000630  0a000003          BEQ      |L1.1604|
;;;101             CardType = CARD_MMC;
000634  e3a00001          MOV      r0,#1
000638  e59f16f0          LDR      r1,|L1.3376|
00063c  e5c10000          STRB     r0,[r1,#0]  ; CardType
;;;102             break;
000640  ea000002          B        |L1.1616|
                  |L1.1604|
000644  e2855001          ADD      r5,r5,#1              ;98
                  |L1.1608|
000648  e3550064          CMP      r5,#0x64              ;98
00064c  3affffed          BCC      |L1.1544|
                  |L1.1616|
000650  e1a00000          MOV      r0,r0
;;;103          }
;;;104       }
;;;105    
;;;106       if (CardType == CARD_NONE) {
000654  e59f06d4          LDR      r0,|L1.3376|
000658  e5d00000          LDRB     r0,[r0,#0]  ; CardType
00065c  e3500000          CMP      r0,#0
000660  1a000019          BNE      |L1.1740|
;;;107          /* Check for SD card, clear Open Drain output control. */
;;;108          mci_bus_mode (PUSH_PULL_MODE);
000664  e3a00001          MOV      r0,#1
000668  ebfffffe          BL       mci_bus_mode
;;;109          for (i = 0; i < 500; i++) {
00066c  e3a05000          MOV      r5,#0
000670  ea000012          B        |L1.1728|
                  |L1.1652|
;;;110             if (mci_send_acmd () == __TRUE) {
000674  ebfffffe          BL       mci_send_acmd
000678  e3500001          CMP      r0,#1
00067c  1a00000e          BNE      |L1.1724|
;;;111                rstat = mci_command (SEND_APP_OP_COND, 
000680  e28d3000          ADD      r3,sp,#0
000684  e3a02001          MOV      r2,#1
000688  e59f16b8          LDR      r1,|L1.3400|
00068c  e3a00029          MOV      r0,#0x29
000690  ebfffffe          BL       mci_command
000694  e1a04000          MOV      r4,r0
;;;112                                     OCR_INDEX, RESP_SHORT, &rval[0]);
;;;113                if (!(rstat & MCI_CMD_TIMEOUT) && rval[0] & 0x80000000) {
000698  e3140004          TST      r4,#4
00069c  1a000006          BNE      |L1.1724|
0006a0  e59d0000          LDR      r0,[sp,#0]
0006a4  e3100102          TST      r0,#0x80000000
0006a8  0a000003          BEQ      |L1.1724|
;;;114                   /* OK, SD card initialized. */
;;;115                   CardType = CARD_SD;
0006ac  e3a00002          MOV      r0,#2
0006b0  e59f1678          LDR      r1,|L1.3376|
0006b4  e5c10000          STRB     r0,[r1,#0]  ; CardType
;;;116                   break;
0006b8  ea000002          B        |L1.1736|
                  |L1.1724|
0006bc  e2855001          ADD      r5,r5,#1              ;109
                  |L1.1728|
0006c0  e3550f7d          CMP      r5,#0x1f4             ;109
0006c4  3affffea          BCC      |L1.1652|
                  |L1.1736|
0006c8  e1a00000          MOV      r0,r0
                  |L1.1740|
;;;117                }
;;;118             }
;;;119          }
;;;120       }
;;;121       if (CardType == CARD_NONE) {
0006cc  e59f065c          LDR      r0,|L1.3376|
0006d0  e5d00000          LDRB     r0,[r0,#0]  ; CardType
0006d4  e3500000          CMP      r0,#0
0006d8  1a000000          BNE      |L1.1760|
;;;122          /* Failed, no card found. */
;;;123          goto fail;
0006dc  ea000029          B        |L1.1928|
                  |L1.1760|
;;;124       }
;;;125    
;;;126       /* Initialize the Card to SD/MMC mode. */
;;;127       if (mci_read_cid () == __FALSE) {
0006e0  ebfffffe          BL       mci_read_cid
0006e4  e3500000          CMP      r0,#0
0006e8  1a000000          BNE      |L1.1776|
;;;128          goto fail;
0006ec  ea000025          B        |L1.1928|
                  |L1.1776|
;;;129       }
;;;130       if (mci_set_address () == __FALSE) {
0006f0  ebfffffe          BL       mci_set_address
0006f4  e3500000          CMP      r0,#0
0006f8  1a000000          BNE      |L1.1792|
;;;131          goto fail;
0006fc  ea000021          B        |L1.1928|
                  |L1.1792|
;;;132       }
;;;133    
;;;134       /* Disable Open Drain mode for MMC. */
;;;135       if (CardType == CARD_MMC) {
000700  e59f0628          LDR      r0,|L1.3376|
000704  e5d00000          LDRB     r0,[r0,#0]  ; CardType
000708  e3500001          CMP      r0,#1
00070c  1a000001          BNE      |L1.1816|
;;;136          mci_bus_mode (PUSH_PULL_MODE);
000710  e3a00001          MOV      r0,#1
000714  ebfffffe          BL       mci_bus_mode
                  |L1.1816|
;;;137       }
;;;138    
;;;139       /* Data Transfer Mode, end of Card-Identification Mode. */
;;;140       mci_set_speed (HIGH_SPEED);
000718  e3a00001          MOV      r0,#1
00071c  ebfffffe          BL       mci_set_speed
;;;141    
;;;142       if (mci_select_card () == __FALSE) {
000720  ebfffffe          BL       mci_select_card
000724  e3500000          CMP      r0,#0
000728  1a000000          BNE      |L1.1840|
;;;143          goto fail;
00072c  ea000015          B        |L1.1928|
                  |L1.1840|
;;;144       }
;;;145    
;;;146       if (CardType == CARD_SD) {
000730  e59f05f8          LDR      r0,|L1.3376|
000734  e5d00000          LDRB     r0,[r0,#0]  ; CardType
000738  e3500002          CMP      r0,#2
00073c  1a00000d          BNE      |L1.1912|
;;;147          /* Use wide 4-bit bus for SD */
;;;148          MCI_CLOCK |= 0x0800;
000740  e59f05e0          LDR      r0,|L1.3368|
000744  e5900004          LDR      r0,[r0,#4]
000748  e3800b02          ORR      r0,r0,#0x800
00074c  e59f15d4          LDR      r1,|L1.3368|
000750  e5810004          STR      r0,[r1,#4]
;;;149          for (i = 0; i < 100; i++);
000754  e3a05000          MOV      r5,#0
000758  ea000000          B        |L1.1888|
                  |L1.1884|
00075c  e2855001          ADD      r5,r5,#1
                  |L1.1888|
000760  e3550064          CMP      r5,#0x64
000764  3afffffc          BCC      |L1.1884|
;;;150          if (mci_set_bus_4bit () == __FALSE) {
000768  ebfffffe          BL       mci_set_bus_4bit
00076c  e3500000          CMP      r0,#0
000770  1a000000          BNE      |L1.1912|
;;;151             /* Failed to enable 4-bit bus. */
;;;152             goto fail;
000774  ea000003          B        |L1.1928|
                  |L1.1912|
;;;153          }
;;;154       }
;;;155       /* Set block length to 512 bytes. */
;;;156       if (mci_set_block_len () == __FALSE) {
000778  ebfffffe          BL       mci_set_block_len
00077c  e3500000          CMP      r0,#0
000780  1a000006          BNE      |L1.1952|
;;;157    fail: MCI_POWER = 0x00;
000784  e1a00000          MOV      r0,r0
                  |L1.1928|
000788  e3a00000          MOV      r0,#0
00078c  e59f1594          LDR      r1,|L1.3368|
000790  e5810000          STR      r0,[r1,#0]
                  |L1.1940|
;;;158          return (__FALSE);
000794  e28dd010          ADD      sp,sp,#0x10
000798  e8bd4030          POP      {r4,r5,lr}
;;;159       }
;;;160    
;;;161       /* Success, card initialized. */
;;;162       return (__TRUE);
;;;163    }
00079c  e12fff1e          BX       lr
                  |L1.1952|
0007a0  e3a00001          MOV      r0,#1                 ;162
0007a4  eafffffa          B        |L1.1940|
;;;164    
                          ENDP

                  mci_cmd_read_block PROC
;;;336    
;;;337    static BOOL mci_cmd_read_block (U32 block, U32 cnt) {
0007a8  e92d41f8          PUSH     {r3-r8,lr}
0007ac  e1a04000          MOV      r4,r0
0007b0  e1a05001          MOV      r5,r1
;;;338       /* Send a command to Read Single/Multiple blocks. */
;;;339       U32 i,rstat,rval;
;;;340       U8  cmd;
;;;341    
;;;342       cmd = READ_BLOCK;
0007b4  e3a08011          MOV      r8,#0x11
;;;343       if (cnt > 1) {
0007b8  e3550001          CMP      r5,#1
0007bc  9a000000          BLS      |L1.1988|
;;;344          cmd = READ_MULT_BLOCK;
0007c0  e3a08012          MOV      r8,#0x12
                  |L1.1988|

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -