📄 mci_sd.lst
字号:
\ 00000158 34C0FAFF DC32 0xfffac034
295 }
296 //*****************************************读单块或多块数据**********************************************
\ In segment CODE, align 4, keep-with-next
297 int MCI_ReadData (char *ReadBuff ,unsigned long int ReadFrom_Addr,long int Block_Len, unsigned int UsePDC)
298 {
\ MCI_ReadData:
\ 00000000 F9B5 PUSH {R0,R3-R7,LR}
\ 00000002 81B0 SUB SP,#+0x4
\ 00000004 0C1C MOV R4,R1
\ 00000006 151C MOV R5,R2
299 int State ;
300 int TXcnt =0 ;
\ 00000008 0026 MOV R6,#+0
301 unsigned int Multiply_Block_RD = 0 ;
\ 0000000A 0027 MOV R7,#+0
\ 0000000C FF20 MOV R0,#+0xFF
\ 0000000E 801C ADD R0,R0,#+0x2 ;; #+0x101
\ 00000010 8242 CMP R2,R0
\ 00000012 00DB BLT ??MCI_ReadData_0
302 if(Block_Len > Max_BlockSize)
303 Multiply_Block_RD =0x1 ; //读多块
\ 00000014 0127 MOV R7,#+0x1
304 State =MCI_SendCommand(0x07,RCA_Addr,Respond_Len_48,0) ; // Send command SEL_DESEL_CARD to select the card
\ ??MCI_ReadData_0:
\ 00000016 0023 MOV R3,#+0
\ 00000018 0122 MOV R2,#+0x1
\ 0000001A .... LDR R0,??DataTable21 ;; RCA_Addr
\ 0000001C 0168 LDR R1,[R0, #+0]
\ 0000001E 0720 MOV R0,#+0x7
\ 00000020 ........ BL MCI_SendCommand
305 while(State !=0)
\ 00000024 0028 CMP R0,#+0
\ 00000026 08D0 BEQ ??MCI_ReadData_1
306 {
307 delay() ;
\ ??MCI_ReadData_2:
\ 00000028 ........ BL delay
308 if(TXcnt++ >10)
\ 0000002C 301C MOV R0,R6
\ 0000002E 761C ADD R6,R6,#+0x1
\ 00000030 0B28 CMP R0,#+0xB
\ 00000032 F9DB BLT ??MCI_ReadData_2
309 return -1;
\ ??MCI_ReadData_3:
\ 00000034 0020 MOV R0,#+0
\ 00000036 C043 MVN R0,R0 ;; #-1
\ 00000038 87E0 B ??MCI_ReadData_4
310 }
311 State =MCI_SendCommand(0x10,Block_Len,Respond_Len_48,0) ; // SET_BLOCKLEN
\ ??MCI_ReadData_1:
\ 0000003A 0023 MOV R3,#+0
\ 0000003C 0122 MOV R2,#+0x1
\ 0000003E 291C MOV R1,R5
\ 00000040 1020 MOV R0,#+0x10
\ 00000042 ........ BL MCI_SendCommand
312 while(State !=0)
\ 00000046 0028 CMP R0,#+0
\ 00000048 06D0 BEQ ??MCI_ReadData_5
313 {
314 delay() ;
\ ??MCI_ReadData_6:
\ 0000004A ........ BL delay
315 if(TXcnt++ >10)
\ 0000004E 301C MOV R0,R6
\ 00000050 761C ADD R6,R6,#+0x1
\ 00000052 0B28 CMP R0,#+0xB
\ 00000054 F9DB BLT ??MCI_ReadData_6
\ 00000056 EDE7 B ??MCI_ReadData_3
316 return -1;
317 }
318 if(UsePDC==0x1) //使用PDC通道方式处理时
\ ??MCI_ReadData_5:
\ 00000058 6810 ASR R0,R5,#+0x1
\ 0000005A 800F LSR R0,R0,#+0x1E
\ 0000005C 4019 ADD R0,R0,R5
\ 0000005E 8010 ASR R0,R0,#+0x2
\ 00000060 0090 STR R0,[SP, #+0]
\ 00000062 .... LDR R1,??DataTable22 ;; 0x3ffc0100
\ 00000064 .... LDR R0,??DataTable23 ;; 0xfffac004
\ 00000066 029A LDR R2,[SP, #+0x8]
\ 00000068 012A CMP R2,#+0x1
\ 0000006A 0268 LDR R2,[R0, #+0]
\ 0000006C 30D1 BNE ??MCI_ReadData_7
319 {
320 AT91C_BASE_MCI->MCI_MR |=AT91C_MCI_PDCMODE ; //使用 PDC 模式
\ 0000006E 8023 MOV R3,#+0x80
\ 00000070 1B02 LSL R3,R3,#+0x8 ;; #+0x8000
\ 00000072 1343 ORR R3,R2
\ 00000074 0360 STR R3,[R0, #+0]
321 if(Block_Len > Max_BlockSize)
\ 00000076 FF22 MOV R2,#+0xFF
\ 00000078 921C ADD R2,R2,#+0x2 ;; #+0x101
\ 0000007A 9542 CMP R5,R2
\ 0000007C 03DB BLT ??MCI_ReadData_8
322 AT91C_BASE_MCI->MCI_MR |=(AT91C_MCI_BLKLEN | Max_BlockSize) ; //设置block长度=Max_BlockSize
\ 0000007E 0268 LDR R2,[R0, #+0]
\ 00000080 1143 ORR R1,R2
\ 00000082 0160 STR R1,[R0, #+0]
\ 00000084 04E0 B ??MCI_ReadData_9
323 else
324 AT91C_BASE_MCI->MCI_MR |=(AT91C_MCI_BLKLEN | Block_Len) ; //设置block长度
\ ??MCI_ReadData_8:
\ 00000086 0168 LDR R1,[R0, #+0]
\ 00000088 .... LDR R2,??DataTable28 ;; 0x3ffc0000
\ 0000008A 2A43 ORR R2,R5
\ 0000008C 0A43 ORR R2,R1
\ 0000008E 0260 STR R2,[R0, #+0]
325 /*
326 Configure the PDC channel
327 PDC_RPR = Data Buffer Address
328 PDC_RCR = BlockLength/4
329 PDC_PTCR = PDC_RXTEN
330 */
331 AT91C_BASE_PDC_MCI->PDC_RPR=*ReadBuff ;
\ ??MCI_ReadData_9:
\ 00000090 .... LDR R0,??DataTable25 ;; 0xfffac100
\ 00000092 0199 LDR R1,[SP, #+0x4]
\ 00000094 0978 LDRB R1,[R1, #+0]
\ 00000096 0160 STR R1,[R0, #+0]
332 AT91C_BASE_PDC_MCI->PDC_RCR=Block_Len/4 ; //是由于发送寄存器为4字节(32bit)
\ 00000098 2D48 LDR R0,??MCI_ReadData_10 ;; 0xfffac104
\ 0000009A 0099 LDR R1,[SP, #+0]
\ 0000009C 0160 STR R1,[R0, #+0]
333 AT91C_BASE_PDC_MCI->PDC_PTCR =AT91C_PDC_RXTEN ; //允许发送数据
\ 0000009E .... LDR R0,??DataTable26 ;; 0xfffac120
\ 000000A0 0121 MOV R1,#+0x1
\ 000000A2 0160 STR R1,[R0, #+0]
334
335 //**Send commaned : Read_SINGLE_BLOCK ,are Command17 ,respond_type are R1 ,参数:地址[31:0]
336 if(Multiply_Block_RD==0)
\ 000000A4 002F CMP R7,#+0
\ 000000A6 04D1 BNE ??MCI_ReadData_11
337 State =MCI_SendCommand(0x11 ,ReadFrom_Addr,Respond_Len_48,0) ; // Read a single block ,CMD17
\ 000000A8 0023 MOV R3,#+0
\ 000000AA 0A1C MOV R2,R1
\ 000000AC 211C MOV R1,R4
\ 000000AE 1120 MOV R0,#+0x11
\ 000000B0 03E0 B ??MCI_ReadData_12
338 else
339 State =MCI_SendCommand(0x12 ,ReadFrom_Addr,Respond_Len_48,0) ; // Read a single block ,CMD18
\ ??MCI_ReadData_11:
\ 000000B2 0023 MOV R3,#+0
\ 000000B4 0A1C MOV R2,R1
\ 000000B6 211C MOV R1,R4
\ 000000B8 1220 MOV R0,#+0x12
\ ??MCI_ReadData_12:
\ 000000BA ........ BL MCI_SendCommand
340 //Read status register MCI_SR ,检查发送是否成功,如成功,检测是否发送完成:ENDTX = 0?
341 while(State !=0)
\ 000000BE 0028 CMP R0,#+0
\ 000000C0 42D0 BEQ ??MCI_ReadData_13
342 {
343 delay() ;
\ ??MCI_ReadData_14:
\ 000000C2 ........ BL delay
344 if(TXcnt++ >10)
\ 000000C6 301C MOV R0,R6
\ 000000C8 761C ADD R6,R6,#+0x1
\ 000000CA 0B28 CMP R0,#+0xB
\ 000000CC F9DB BLT ??MCI_ReadData_14
\ 000000CE B1E7 B ??MCI_ReadData_3
345 return -1;
346 }
347 if((State & AT91C_MCI_ENDRX)!=0) //发送完成
348 {
349 return 0 ;
350 }
351 }
352 else //不用PDC方式传诵数据
353 {
354 AT91C_BASE_MCI->MCI_MR |=~AT91C_MCI_PDCMODE ; //使用 PDC 模式
\ ??MCI_ReadData_7:
\ 000000D0 .... LDR R3,??DataTable27 ;; 0xffff7fff
\ 000000D2 1343 ORR R3,R2
\ 000000D4 0360 STR R3,[R0, #+0]
355 if(Block_Len > Max_BlockSize)
\ 000000D6 FF22 MOV R2,#+0xFF
\ 000000D8 921C ADD R2,R2,#+0x2 ;; #+0x101
\ 000000DA 9542 CMP R5,R2
\ 000000DC 03DB BLT ??MCI_ReadData_15
356 AT91C_BASE_MCI->MCI_MR |=(AT91C_MCI_BLKLEN | Max_BlockSize) ; //设置block长度=Max_BlockSize
\ 000000DE 0268 LDR R2,[R0, #+0]
\ 000000E0 1143 ORR R1,R2
\ 000000E2 0160 STR R1,[R0, #+0]
\ 000000E4 04E0 B ??MCI_ReadData_16
357 else
358 AT91C_BASE_MCI->MCI_MR |=(AT91C_MCI_BLKLEN | Block_Len) ; //设置block长度
\ ??MCI_ReadData_15:
\ 000000E6 0168 LDR R1,[R0, #+0]
\ 000000E8 .... LDR R2,??DataTable28 ;; 0x3ffc0000
\ 000000EA 2A43 ORR R2,R5
\ 000000EC 0A43 ORR R2,R1
\ 000000EE 0260 STR R2,[R0, #+0]
359 //发送读块命令
360 if(Multiply_Block_RD==0)
\ ??MCI_ReadData_16:
\ 000000F0 002F CMP R7,#+0
\ 000000F2 04D1 BNE ??MCI_ReadData_17
361 State =MCI_SendCommand(0x11 ,ReadFrom_Addr,Respond_Len_48,0) ; // Read a single block ,CMD17
\ 000000F4 0023 MOV R3,#+0
\ 000000F6 0122 MOV R2,#+0x1
\ 000000F8 211C MOV R1,R4
\ 000000FA 1120 MOV R0,#+0x11
\ 000000FC 03E0 B ??MCI_ReadData_18
362 else
363 State =MCI_SendCommand(0x12 ,ReadFrom_Addr,Respond_Len_48,0) ; // Read a single block ,CMD18
\ ??MCI_ReadData_17:
\ 000000FE 002
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -