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

📄 mci_sd.lst

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