📄 mci_sd.lst
字号:
\ In segment CODE, align 4, keep-with-next
\ __??Code16?? __code __interwork __atpcs unsigned int AT91F_MCI_GetRSP1Reg(AT91PS_MCI)
\ AT91F_MCI_GetRSP1Reg:
\ 00000000 006A LDR R0,[R0, #+0x20]
\ 00000002 7047 BX LR ;; return
\ In segment CODE, align 4, keep-with-next
\ __??Code16?? __code __interwork __atpcs void AT91F_MCI_CfgPMC(void)
\ AT91F_MCI_CfgPMC:
\ 00000000 00B5 PUSH {LR}
\ 00000002 8021 MOV R1,#+0x80
\ 00000004 8900 LSL R1,R1,#+0x2 ;; #+0x200
\ 00000006 0248 LDR R0,??AT91F_MCI_CfgPMC_0 ;; 0xfffffc00
\ 00000008 ........ _BLF AT91F_PMC_EnablePeriphClock,AT91F_PMC_EnablePeriphClock??rT
\ 0000000C 01BC POP {R0}
\ 0000000E 0047 BX R0 ;; return
\ ??AT91F_MCI_CfgPMC_0:
\ 00000010 00FCFFFF DC32 0xfffffc00
\ In segment CODE, align 4, keep-with-next
\ __??Code16?? __code __interwork __atpcs void AT91F_MCI_CfgPIO(void)
\ AT91F_MCI_CfgPIO:
\ 00000000 00B5 PUSH {LR}
\ 00000002 FC22 MOV R2,#+0xFC
\ 00000004 9202 LSL R2,R2,#+0xA ;; #+0x3F000
\ 00000006 0021 MOV R1,#+0
\ 00000008 0248 LDR R0,??AT91F_MCI_CfgPIO_0 ;; 0xfffff400
\ 0000000A ........ _BLF AT91F_PIO_CfgPeriph,AT91F_PIO_CfgPeriph??rT
\ 0000000E 01BC POP {R0}
\ 00000010 0047 BX R0 ;; return
\ 00000012 C046 NOP
\ ??AT91F_MCI_CfgPIO_0:
\ 00000014 00F4FFFF DC32 0xfffff400
5 #include "trace.h"
6
7 //unsigned int *getresData ;
8 //*****************************************************************************************
\ In segment CODE, align 4, keep-with-next
9 void MCI_Int_Handler(void) //检查状态已决定执行相应的操作
10 {
\ MCI_Int_Handler:
\ 00000000 10B5 PUSH {R4,LR}
11 unsigned long int Status ;
12 Status=AT91F_MCI_GetStatus(AT91C_BASE_MCI) ; //place interrupt code here
\ 00000002 .... LDR R0,??DataTable9 ;; 0xfffac000
\ 00000004 ........ _BLF AT91F_MCI_GetStatus,AT91F_MCI_GetStatus??rT
\ 00000008 041C MOV R4,R0
13 if((Status & AT91C_MCI_CMDRDY)==AT91C_MCI_CMDRDY)
\ 0000000A E007 LSL R0,R4,#+0x1F
\ 0000000C 03D5 BPL ??MCI_Int_Handler_0
14 {
15 Read_CMD_Respond(ResponedType) ;
\ 0000000E .... LDR R0,??DataTable1 ;; ResponedType
\ 00000010 0068 LDR R0,[R0, #+0]
\ 00000012 ........ BL Read_CMD_Respond
16 }
17 AT91F_MCI_DisableIt(AT91C_BASE_MCI ,AT91C_MCI_ENDRX) ;
\ ??MCI_Int_Handler_0:
\ 00000016 4021 MOV R1,#+0x40
\ 00000018 .... LDR R0,??DataTable9 ;; 0xfffac000
\ 0000001A ........ _BLF AT91F_MCI_DisableIt,AT91F_MCI_DisableIt??rT
18
19 AT91F_MCI_EnableIt(AT91C_BASE_MCI ,AT91C_MCI_ENDRX) ;
\ 0000001E 4021 MOV R1,#+0x40
\ 00000020 .... LDR R0,??DataTable9 ;; 0xfffac000
\ 00000022 ........ _BLF AT91F_MCI_EnableIt,AT91F_MCI_EnableIt??rT
20 }
\ 00000026 10BC POP {R4}
\ 00000028 01BC POP {R0}
\ 0000002A 0047 BX R0 ;; return
21 //*******************************************************************************************
\ In segment CODE, align 4, keep-with-next
22 void delay(void)
23 {
\ delay:
\ 00000000 00B5 PUSH {LR}
24 for(int n=0 ;n<10000;)
\ 00000002 0020 MOV R0,#+0
\ ??delay_0:
\ 00000004 0349 LDR R1,??delay_1 ;; 0x2710
\ 00000006 8842 CMP R0,R1
\ 00000008 01DA BGE ??delay_2
25 n++ ;
\ 0000000A 401C ADD R0,#+0x1
\ 0000000C FAE7 B ??delay_0
26 }
\ ??delay_2:
\ 0000000E 01BC POP {R0}
\ 00000010 0047 BX R0 ;; return
\ 00000012 C046 NOP
\ ??delay_1:
\ 00000014 10270000 DC32 0x2710
27
28 //*******************************************************************************************
\ In segment CODE, align 4, keep-with-next
29 void MCI_Port_Init(void)
30 {
\ MCI_Port_Init:
\ 00000000 10B5 PUSH {R4,LR}
31 AT91F_PMC_EnablePeriphClock ( AT91C_BASE_PMC, 1 << AT91C_ID_PIOA ) ;
\ 00000002 0421 MOV R1,#+0x4
\ 00000004 1648 LDR R0,??MCI_Port_Init_0 ;; 0xfffffc00
\ 00000006 ........ _BLF AT91F_PMC_EnablePeriphClock,AT91F_PMC_EnablePeriphClock??rT
32 AT91F_PIO_OutputEnable(AT91C_BASE_PIOA ,SD_CLK | AT91C_PA14_MCDA3|AT91C_PA16_MCCDA |AT91C_PA15_MCDA0 |
33 AT91C_PA17_MCCK |AT91C_PA12_MCDA1 |AT91C_PA13_MCDA2 ) ;
\ 0000000A FC21 MOV R1,#+0xFC
\ 0000000C 8902 LSL R1,R1,#+0xA ;; #+0x3F000
\ 0000000E 1548 LDR R0,??MCI_Port_Init_0+0x4 ;; 0xfffff400
\ 00000010 ........ _BLF AT91F_PIO_OutputEnable,AT91F_PIO_OutputEnable??rT
34
35 AT91F_PIO_CfgOutput(AT91C_BASE_PIOA,AT91C_PA14_MCDA3) ;
\ 00000014 8021 MOV R1,#+0x80
\ 00000016 C901 LSL R1,R1,#+0x7 ;; #+0x4000
\ 00000018 1248 LDR R0,??MCI_Port_Init_0+0x4 ;; 0xfffff400
\ 0000001A ........ _BLF AT91F_PIO_CfgOutput,AT91F_PIO_CfgOutput??rT
36
37 AT91F_PIO_CfgPullup(AT91C_BASE_PIOA,AT91C_PA14_MCDA3) ; //PULL_Up to 50 ohm resistor
\ 0000001E 8021 MOV R1,#+0x80
\ 00000020 C901 LSL R1,R1,#+0x7 ;; #+0x4000
\ 00000022 1048 LDR R0,??MCI_Port_Init_0+0x4 ;; 0xfffff400
\ 00000024 ........ _BLF AT91F_PIO_CfgPullup,AT91F_PIO_CfgPullup??rT
38 AT91F_PIO_SetOutput(AT91C_BASE_PIOA,AT91C_PA14_MCDA3) ; //set it to high,delay 74 clock at least
\ 00000028 8021 MOV R1,#+0x80
\ 0000002A C901 LSL R1,R1,#+0x7 ;; #+0x4000
\ 0000002C 0D48 LDR R0,??MCI_Port_Init_0+0x4 ;; 0xfffff400
\ 0000002E ........ _BLF AT91F_PIO_SetOutput,AT91F_PIO_SetOutput??rT
39 for(int n=0 ;n<=30;n++)
\ 00000032 0024 MOV R4,#+0
\ ??MCI_Port_Init_1:
\ 00000034 1F2C CMP R4,#+0x1F
\ 00000036 03DA BGE ??MCI_Port_Init_2
40 delay() ;
\ 00000038 ........ BL delay
\ 0000003C 641C ADD R4,#+0x1
\ 0000003E F9E7 B ??MCI_Port_Init_1
41 AT91F_PIO_ClearOutput(AT91C_BASE_PIOA,AT91C_PA14_MCDA3) ;
\ ??MCI_Port_Init_2:
\ 00000040 8021 MOV R1,#+0x80
\ 00000042 C901 LSL R1,R1,#+0x7 ;; #+0x4000
\ 00000044 0748 LDR R0,??MCI_Port_Init_0+0x4 ;; 0xfffff400
\ 00000046 ........ _BLF AT91F_PIO_ClearOutput,AT91F_PIO_ClearOutput??rT
42 delay() ;
\ 0000004A ........ BL delay
43 delay() ;
\ 0000004E ........ BL delay
44 AT91F_MCI_CfgPIO () ;
\ 00000052 ........ _BLF AT91F_MCI_CfgPIO,AT91F_MCI_CfgPIO??rT
45 AT91F_MCI_CfgPMC() ;
\ 00000056 ........ _BLF AT91F_MCI_CfgPMC,AT91F_MCI_CfgPMC??rT
46 }
\ 0000005A 10BC POP {R4}
\ 0000005C 01BC POP {R0}
\ 0000005E 0047 BX R0 ;; return
\ ??MCI_Port_Init_0:
\ 00000060 00FCFFFF DC32 0xfffffc00
\ 00000064 00F4FFFF DC32 0xfffff400
47 //*******************************************************************************************
\ In segment CODE, align 4, keep-with-next
48 void MCI_Init(void)
49
50 {
\ MCI_Init:
\ 00000000 10B5 PUSH {R4,LR}
51 AT91PS_MCI pMCI ;
52 pMCI=AT91C_BASE_MCI ;
\ 00000002 .... LDR R0,??DataTable9 ;; 0xfffac000
\ 00000004 041C MOV R4,R0
53
54 pMCI->MCI_CR = ~AT91C_MCI_MCIEN;
\ 00000006 0120 MOV R0,#+0x1
\ 00000008 C043 MVN R0,R0 ;; #-2
\ 0000000A 2060 STR R0,[R4, #+0]
55 AT91F_MCI_SW_Reset(pMCI) ;
\ 0000000C 201C MOV R0,R4
\ 0000000E ........ _BLF AT91F_MCI_SW_Reset,AT91F_MCI_SW_Reset??rT
56 //配置工作模式
57
58 AT91F_MCI_Configure(pMCI,
59 (AT91C_MCI_DTOCYC & 0x1 )|(AT91C_MCI_DTOMUL & AT91C_MCI_DTOMUL_256), //数据暂停乘数=16
60 (AT91C_MCI_CLKDIV & 0x03)| //时钟4分频 |当填充数据到写传输时,使用0x00
61 (AT91C_MCI_PDCMODE)|(AT91C_MCI_BLKLEN & (Max_BlockSize <<18)) //使能PDC 传输 ,块长度为最大
62 ,(AT91C_MCI_SCDSEL & 0x00 ) //选择SD 卡A , 1 位数据总线(运行后可调)
63 ) ;
\ 00000012 0023 MOV R3,#+0
\ 00000014 0E4A LDR R2,??MCI_Init_0 ;; 0x4008003
\ 00000016 3121 MOV R1,#+0x31
\ 00000018 201C MOV R0,R4
\ 0000001A ........ _BLF AT91F_MCI_Configure,AT91F_MCI_Configure??rT
64 AT91F_MCI_CfgFrequency(AT91C_BASE_MCI,48,12) ;
\ 0000001E 0C22 MOV R2,#+0xC
\ 00000020 3021 MOV R1,#+0x30
\ 00000022 .... LDR R0,??DataTable9 ;; 0xfffac000
\ 00000024 ........ _BLF AT91F_MCI_CfgFrequency,AT91F_MCI_CfgFrequency??rT
65 AT91F_AIC_ConfigureIt(AT91C_BASE_AIC,AT91C_ID_MCI,7,0,MCI_Int_Handler) ;
\ 00000028 0A48 LDR R0,??MCI_Init_0+0x4 ;; MCI_Int_Handler
\ 0000002A 01B4 PUSH {R0}
\ 0000002C 0023 MOV R3,#+0
\ 0000002E 0722 MOV R2,#+0x7
\ 00000030 0921 MOV R1,#+0x9
\ 00000032 0948 LDR R0,??MCI_Init_0+0x8 ;; 0xfffff000
\ 00000034 ........ _BLF AT91F_AIC_ConfigureIt,AT91F_AIC_ConfigureIt??rT
\ 00000038 01B0 ADD SP,#+0x4
66 AT91F_MCI_EnableIt(pMCI,//AT91C_MCI_CMDRDY|AT91C_MCI_RXRDY|AT91C_MCI_TXRDY |AT91C_MCI_ENDTX
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -