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

📄 mci_sd.lst

📁 针对at91sam7a3为主芯片开发板开发的spi口应用程序
💻 LST
📖 第 1 页 / 共 5 页
字号:
   \   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 + -