📄 mci_sd.lst
字号:
\ ??MCI_SendCommand_9:
\ 00000176 0020 MOV R0,#+0
\ 00000178 03B0 ADD SP,#+0xC
\ 0000017A F0BC POP {R4-R7}
\ 0000017C 02BC POP {R1}
\ 0000017E 0847 BX R1 ;; return
\ ??MCI_SendCommand_0:
\ 00000180 10C0FAFF DC32 0xfffac010
\ 00000184 ........ DC32 `?<Constant "____48 Responed0 DATA...">`
\ 00000188 ........ DC32 `?<Constant "____48 Responed1 DATA...">`
\ 0000018C ........ DC32 `?<Constant "____Responed0 DATA____">`
\ 00000190 ........ DC32 `?<Constant "____Responed1 DATA____">`
\ 00000194 ........ DC32 `?<Constant "____Responed2 DATA____">`
\ 00000198 ........ DC32 `?<Constant "____Responed3 DATA____">`
207 }
208 //******************************************************************************************************
209 //********读取 返回值 ,RCA=Respond[ 39:24]
\ In segment CODE, align 4, keep-with-next
210 void Get_SD_RCA( void )
211 {
\ Get_SD_RCA:
\ 00000000 10B5 PUSH {R4,LR}
212 unsigned int ch ;
213 MCI_SendCommand(0x03 ,0,Respond_Len_48,0) ; //RCA =Respond[ 39:24]
\ 00000002 0023 MOV R3,#+0
\ 00000004 0122 MOV R2,#+0x1
\ 00000006 0021 MOV R1,#+0
\ 00000008 0320 MOV R0,#+0x3
\ 0000000A ........ BL MCI_SendCommand
214 //***得到 RCA 的值,如需要检测状态 ,可以读[23:8] 的状态
215 ch=Get_Respond_Buffer.data[4] ;
\ 0000000E .... LDR R0,??DataTable55 ;; Get_Respond_Buffer + 4
\ 00000010 0078 LDRB R0,[R0, #+0]
\ 00000012 041C MOV R4,R0
216 RCA_Addr=0x00000000 ;
\ 00000014 .... LDR R0,??DataTable61 ;; RCA_Addr
\ 00000016 0021 MOV R1,#+0
\ 00000018 0160 STR R1,[R0, #+0]
217 RCA_Addr += (unsigned int)ch <<24 ;
\ 0000001A .... LDR R0,??DataTable61 ;; RCA_Addr
\ 0000001C .... LDR R1,??DataTable61 ;; RCA_Addr
\ 0000001E 0968 LDR R1,[R1, #+0]
\ 00000020 2206 LSL R2,R4,#+0x18
\ 00000022 8918 ADD R1,R1,R2
\ 00000024 0160 STR R1,[R0, #+0]
218 ch=Get_Respond_Buffer.data[3] ;
\ 00000026 .... LDR R0,??DataTable59 ;; Get_Respond_Buffer + 3
\ 00000028 0078 LDRB R0,[R0, #+0]
\ 0000002A 041C MOV R4,R0
219 RCA_Addr += (unsigned int)ch <<16 ;
\ 0000002C .... LDR R0,??DataTable61 ;; RCA_Addr
\ 0000002E .... LDR R1,??DataTable61 ;; RCA_Addr
\ 00000030 0968 LDR R1,[R1, #+0]
\ 00000032 2204 LSL R2,R4,#+0x10
\ 00000034 8918 ADD R1,R1,R2
\ 00000036 0160 STR R1,[R0, #+0]
220
221 }
\ 00000038 10BC POP {R4}
\ 0000003A 01BC POP {R0}
\ 0000003C 0047 BX R0 ;; return
222
223 /******************************************************************************************************
224 写卡的步骤为:1:选择要写的目标卡 (发送基本命令 CMD7 ,参数为RCA ,响应类型为R1b)
225 2: 设置写块的长度:SET_BLOCKLEN ,命令CMD16 ,参数32bit块长度,响应类型 R1 .
226 (SET_BLOCKLEN为每次要写入的数据长度)
227 3: 是否用PDC通道传送,设置传送方式和块长度
228 4:发写数据块命令 ,
229 5:等待标志 ,如果是通道发送的话,ENDTX = 0标志着数据发送结束,非通道,循环发送
230 本列采用通道和非通道两种发送方式:
231 ******************************************************************************************************/
232 //注意 ,在调用程序的时候 ,Block_Len =StrLen(SendData) ,即为发送数据的长度
\ In segment CODE, align 4, keep-with-next
233 int MCI_SendData (char *SendData ,unsigned long int WriteTo_Addr,unsigned int UsePDC)
234 {
\ MCI_SendData:
\ 00000000 F7B5 PUSH {R0-R2,R4-R7,LR}
\ 00000002 82B0 SUB SP,#+0x8
235 int State ;
236 int TXcnt =0 ;
\ 00000004 0020 MOV R0,#+0
\ 00000006 051C MOV R5,R0
237 unsigned int Multiply_Block=0 ; //数据是写入单块还是多块 ,0:single ,1: Multiply
\ 00000008 0020 MOV R0,#+0
\ 0000000A 0190 STR R0,[SP, #+0x4]
238 unsigned long int Block_Len ;
239 Block_Len=strlen(SendData) ; //得到写入数据的总长度
\ 0000000C 0298 LDR R0,[SP, #+0x8]
\ 0000000E 0022 MOV R2,#+0
\ ??MCI_SendData_0:
\ 00000010 815C LDRB R1,[R0, R2]
\ 00000012 521C ADD R2,#+0x1
\ 00000014 0029 CMP R1,#+0
\ 00000016 FBD1 BNE ??MCI_SendData_0
\ 00000018 521E SUB R2,#+0x1
\ 0000001A 0092 STR R2,[SP, #+0]
240 if( Block_Len > Max_BlockSize ) //数据大于块容量,多块写入 *****
\ 0000001C 0098 LDR R0,[SP, #+0]
\ 0000001E FF21 MOV R1,#+0xFF
\ 00000020 891C ADD R1,#+0x2 ;; #+0x101
\ 00000022 8842 CMP R0,R1
\ 00000024 01D3 BCC ??MCI_SendData_1
241 Multiply_Block=0x1 ;
\ 00000026 0120 MOV R0,#+0x1
\ 00000028 0190 STR R0,[SP, #+0x4]
242 State =MCI_SendCommand(0x07,0,Respond_Len_48,0) ; // Send command SEL_DESEL_CARD to select the card
\ ??MCI_SendData_1:
\ 0000002A 0023 MOV R3,#+0
\ 0000002C 0122 MOV R2,#+0x1
\ 0000002E 0021 MOV R1,#+0
\ 00000030 0720 MOV R0,#+0x7
\ 00000032 ........ BL MCI_SendCommand
\ 00000036 041C MOV R4,R0
243 while(State !=0)
\ ??MCI_SendData_2:
\ 00000038 002C CMP R4,#+0
\ 0000003A 10D0 BEQ ??MCI_SendData_3
244 {
245 delay() ;
\ 0000003C ........ BL delay
246 State =MCI_SendCommand(0x07,0,Respond_Len_48,0) ;
\ 00000040 0023 MOV R3,#+0
\ 00000042 0122 MOV R2,#+0x1
\ 00000044 0021 MOV R1,#+0
\ 00000046 0720 MOV R0,#+0x7
\ 00000048 ........ BL MCI_SendCommand
\ 0000004C 041C MOV R4,R0
247 if(TXcnt++ >10)
\ 0000004E 281C MOV R0,R5
\ 00000050 051C MOV R5,R0
\ 00000052 6D1C ADD R5,#+0x1
\ 00000054 0B28 CMP R0,#+0xB
\ 00000056 EFDB BLT ??MCI_SendData_2
248 return -1;
\ 00000058 0020 MOV R0,#+0
\ 0000005A C043 MVN R0,R0 ;; #-1
\ 0000005C E5E0 B ??MCI_SendData_4
249 }
250
251 State =MCI_SendCommand(0x10,Block_Len,Respond_Len_48,0) ; // SET_BLOCKLEN
\ ??MCI_SendData_3:
\ 0000005E 0023 MOV R3,#+0
\ 00000060 0122 MOV R2,#+0x1
\ 00000062 0099 LDR R1,[SP, #+0]
\ 00000064 1020 MOV R0,#+0x10
\ 00000066 ........ BL MCI_SendCommand
\ 0000006A 041C MOV R4,R0
252 TXcnt=0 ;
\ 0000006C 0020 MOV R0,#+0
\ 0000006E 051C MOV R5,R0
253 while(State !=0)
\ ??MCI_SendData_5:
\ 00000070 002C CMP R4,#+0
\ 00000072 10D0 BEQ ??MCI_SendData_6
254 {
255 delay() ;
\ 00000074 ........ BL delay
256 State =MCI_SendCommand(0x10,Block_Len,Respond_Len_48,0) ;
\ 00000078 0023 MOV R3,#+0
\ 0000007A 0122 MOV R2,#+0x1
\ 0000007C 0099 LDR R1,[SP, #+0]
\ 0000007E 1020 MOV R0,#+0x10
\ 00000080 ........ BL MCI_SendCommand
\ 00000084 041C MOV R4,R0
257 if(TXcnt++ > 10)
\ 00000086 281C MOV R0,R5
\ 00000088 051C MOV R5,R0
\ 0000008A 6D1C ADD R5,#+0x1
\ 0000008C 0B28 CMP R0,#+0xB
\ 0000008E EFDB BLT ??MCI_SendData_5
258 return -1;
\ 00000090 0020 MOV R0,#+0
\ 00000092 C043 MVN R0,R0 ;; #-1
\ 00000094 C9E0 B ??MCI_SendData_4
259 }
260
261 if(UsePDC==0x1) //使用PDC通道方式处理时
\ ??MCI_SendData_6:
\ 00000096 0498 LDR R0,[SP, #+0x10]
\ 00000098 0128 CMP R0,#+0x1
\ 0000009A 5DD1 BNE ??MCI_SendData_7
262 {
263 AT91C_BASE_MCI->MCI_MR |=AT91C_MCI_PDCMODE ; //使用 PDC 模式
\ 0000009C .... LDR R0,??DataTable75 ;; 0xfffac004
\ 0000009E .... LDR R1,??DataTable75 ;; 0xfffac004
\ 000000A0 0968 LDR R1,[R1, #+0]
\ 000000A2 8022 MOV R2,#+0x80
\ 000000A4 1202 LSL R2,R2,#+0x8 ;; #+0x8000
\ 000000A6 0A43 ORR R2,R1
\ 000000A8 0260 STR R2,[R0, #+0]
264 if(Block_Len > Max_BlockSize)
\ 000000AA 0098 LDR R0,[SP, #+0]
\ 000000AC FF21 MOV R1,#+0xFF
\ 000000AE 891C ADD R1,#+0x2 ;; #+0x101
\ 000000B0 8842 CMP R0,R1
\ 000000B2 07D3 BCC ??MCI_SendData_8
265 AT91C_BASE_MCI->MCI_MR |=(Max_BlockSize << 18) ; //设置block长度=Max_BlockSize
\ 000000B4 .... LDR R0,??DataTable75 ;; 0xfffac004
\ 000000B6 .... LDR R1,??DataTable75 ;; 0xfffac004
\ 000000B8 0968 LDR R1,[R1, #+0]
\ 000000BA 8022 MOV R2,#+0x80
\ 000000BC D204 LSL R2,R2,#+0x13 ;; #+0x4000000
\ 000000
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -