📄 mci_sd.lst
字号:
Remark[Pe181]: argument is incompatible with corresponding format string
conversion
\ ??MCI_SendCommand_22:
\ 00000164 .... LDR R0,??DataTable54 ;; _Stdout
\ 00000166 0028 CMP R0,#+0
\ 00000168 05D0 BEQ ??MCI_SendCommand_9
\ 0000016A .... LDR R0,??DataTable52 ;; 0xfffac02c
\ 0000016C 0268 LDR R2,[R0, #+0]
\ 0000016E .... LDR R1,??DataTable53 ;; `?<Constant "\\r\\n %d \\r\\n ">`
\ 00000170 .... LDR R0,??DataTable54 ;; _Stdout
\ 00000172 ........ _BLF fprintf,fprintf??rT
200 break ;
201 }
202 default : ;
203
204 }
205
206 }
207 return 0 ; //正确返回
\ ??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____">`
208 }
209 //******************************************************************************************************
210 //********读取 返回值 ,RCA=Respond[ 39:24]
\ In segment CODE, align 4, keep-with-next
211 void Get_SD_RCA( void )
212 {
\ Get_SD_RCA:
\ 00000000 10B5 PUSH {R4,LR}
213 unsigned int ch ;
214 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
215 //***得到 RCA 的值,如需要检测状态 ,可以读[23:8] 的状态
216 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
217 RCA_Addr=0x00000000 ;
\ 00000014 .... LDR R0,??DataTable61 ;; RCA_Addr
\ 00000016 0021 MOV R1,#+0
\ 00000018 0160 STR R1,[R0, #+0]
218 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]
219 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
220 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]
221
222 }
\ 00000038 10BC POP {R4}
\ 0000003A 01BC POP {R0}
\ 0000003C 0047 BX R0 ;; return
223
224 /******************************************************************************************************
225 写卡的步骤为:1:选择要写的目标卡 (发送基本命令 CMD7 ,参数为RCA ,响应类型为R1b)
226 2: 设置写块的长度:SET_BLOCKLEN ,命令CMD16 ,参数32bit块长度,响应类型 R1 .
227 (SET_BLOCKLEN为每次要写入的数据长度)
228 3: 是否用PDC通道传送,设置传送方式和块长度
229 4:发写数据块命令 ,
230 5:等待标志 ,如果是通道发送的话,ENDTX = 0标志着数据发送结束,非通道,循环发送
231 本列采用通道和非通道两种发送方式:
232 ******************************************************************************************************/
233 //注意 ,在调用程序的时候 ,Block_Len =StrLen(SendData) ,即为发送数据的长度
\ In segment CODE, align 4, keep-with-next
234 int MCI_SendData (char *SendData ,unsigned long int WriteTo_Addr,unsigned int UsePDC)
235 {
\ MCI_SendData:
\ 00000000 F7B5 PUSH {R0-R2,R4-R7,LR}
\ 00000002 82B0 SUB SP,#+0x8
236 int State ;
237 int TXcnt =0 ;
\ 00000004 0020 MOV R0,#+0
\ 00000006 051C MOV R5,R0
238 unsigned int Multiply_Block=0 ; //数据是写入单块还是多块 ,0:single ,1: Multiply
\ 00000008 0020 MOV R0,#+0
\ 0000000A 0190 STR R0,[SP, #+0x4]
239 unsigned long int Block_Len ;
240 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]
241 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
242 Multiply_Block=0x1 ;
\ 00000026 0120 MOV R0,#+0x1
\ 00000028 0190 STR R0,[SP, #+0x4]
243 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
244 while(State !=0)
\ ??MCI_SendData_2:
\ 00000038 002C CMP R4,#+0
\ 0000003A 10D0 BEQ ??MCI_SendData_3
245 {
246 delay() ;
\ 0000003C ........ BL delay
247 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
248 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
249 return -1;
\ 00000058 0020 MOV R0,#+0
\ 0000005A C043 MVN R0,R0 ;; #-1
\ 0000005C E5E0 B ??MCI_SendData_4
250 }
251
252 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
253 TXcnt=0 ;
\ 0000006C 0020 MOV R0,#+0
\ 0000006E 051C MOV R5,R0
254 while(State !=0)
\ ??MCI_SendData_5:
\ 00000070 002C CMP R4,#+0
\ 00000072 10D0 BEQ ??MCI_SendData_6
255 {
256 delay() ;
\ 00000074 ........ BL delay
257 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
258 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
259 return -1;
\ 00000090 0020 MOV R0,#+0
\ 00000092 C043 MVN R0,R0 ;; #-1
\ 00000094 C9E0 B ??MCI_SendData_4
260 }
261
262 if(UsePDC==0x1) //使用PDC通道方式处理时
\ ??MCI_SendData_6:
\ 00000096 0498 LDR R0,[SP, #+0x10]
\ 00000098 0128 CMP R0,#+0x1
\ 0000009A 5DD1 BNE ??MCI_SendData_7
263 {
264 AT91C_BASE_MCI->MCI_MR |=AT91C_MCI_PDCMODE ;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -