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

📄 mmc.lst

📁 针对at91sam7a3为主芯片开发板开发的spi口应用程序
💻 LST
📖 第 1 页 / 共 5 页
字号:
   \   00000018   8021               MOV         R1,#+0x80
   \   0000001A   8901               LSL         R1,R1,#+0x6        ;; #+0x2000
   \   0000001C   ....               LDR         R0,??DataTable22   ;; 0xfffff400
   \   0000001E   ........           _BLF        AT91F_PIO_ClearOutput,AT91F_PIO_ClearOutput??rT
    190          
    191             //send 6 Byte Command to MMC/SD-Card
    192             for (i=0;i<0x06;i++)
   \   00000022   0020               MOV         R0,#+0
   \   00000024   071C               MOV         R7,R0
   \                     ??Write_Command_MMC_0:
   \   00000026   3F06               LSL         R7,R7,#+0x18       ;; ZeroExt     R7,R7,#+0x18,#+0x18
   \   00000028   3F0E               LSR         R7,R7,#+0x18
   \   0000002A   062F               CMP         R7,#+0x6
   \   0000002C   05D2               BCS         ??Write_Command_MMC_1
    193             {
    194                Write_Byte_MMC(*CMD++);
   \   0000002E   2078               LDRB        R0,[R4, #+0]
   \   00000030   ........           BL          Write_Byte_MMC
   \   00000034   641C               ADD         R4,#+0x1
    195             }
   \   00000036   7F1C               ADD         R7,#+0x1
   \   00000038   F5E7               B           ??Write_Command_MMC_0
    196          
    197             //get 16 bit response
    198             Read_Byte_MMC(); //read the first byte,ignore it.
   \                     ??Write_Command_MMC_1:
   \   0000003A   ........           BL          Read_Byte_MMC
    199             do
    200             {  //Only last 8 bit is used here.Read it out.
    201                tmp = Read_Byte_MMC();         // R1响应总共48bit ,后8比特为crc7+end bit
   \                     ??Write_Command_MMC_2:
   \   0000003E   ........           BL          Read_Byte_MMC
   \   00000042   051C               MOV         R5,R0
    202                retry++;
   \   00000044   761C               ADD         R6,#+0x1
    203             }
    204             while((tmp==0xff)&&(retry<100));
   \   00000046   FF2D               CMP         R5,#+0xFF
   \   00000048   03D1               BNE         ??Write_Command_MMC_3
   \   0000004A   3606               LSL         R6,R6,#+0x18       ;; ZeroExt     R6,R6,#+0x18,#+0x18
   \   0000004C   360E               LSR         R6,R6,#+0x18
   \   0000004E   642E               CMP         R6,#+0x64
   \   00000050   F5D3               BCC         ??Write_Command_MMC_2
    205             return(tmp);
   \                     ??Write_Command_MMC_3:
   \   00000052   281C               MOV         R0,R5
   \   00000054   F0BC               POP         {R4-R7}
   \   00000056   02BC               POP         {R1}
   \   00000058   0847               BX          R1                 ;; return
    206          }
    207          
    208          //****************************************************************************

   \                                 In segment CODE, align 4, keep-with-next
    209          unsigned char Read_Byte_MMC(void)                                //SPI读数据函数
    210          //****************************************************************************
    211          {
   \                     Read_Byte_MMC:
   \   00000000   30B5               PUSH        {R4,R5,LR}
    212             unsigned char temp=0;
   \   00000002   0020               MOV         R0,#+0
   \   00000004   041C               MOV         R4,R0
    213             unsigned char i;
    214          
    215             //Software SPI
    216             for (i=0; i<8; i++)                                            //MSB First
   \   00000006   0020               MOV         R0,#+0
   \   00000008   051C               MOV         R5,R0
   \                     ??Read_Byte_MMC_0:
   \   0000000A   2D06               LSL         R5,R5,#+0x18       ;; ZeroExt     R5,R5,#+0x18,#+0x18
   \   0000000C   2D0E               LSR         R5,R5,#+0x18
   \   0000000E   082D               CMP         R5,#+0x8
   \   00000010   20D2               BCS         ??Read_Byte_MMC_1
    217             {
    218                AT91F_PIO_ClearOutput(AT91C_BASE_PIOA,SPI_Clock) ;          //Clock Impuls (Low)
   \   00000012   8021               MOV         R1,#+0x80
   \   00000014   C902               LSL         R1,R1,#+0xB        ;; #+0x40000
   \   00000016   ....               LDR         R0,??DataTable22   ;; 0xfffff400
   \   00000018   ........           _BLF        AT91F_PIO_ClearOutput,AT91F_PIO_ClearOutput??rT
    219                if(Init_Flag) delay_us_8_;
   \   0000001C   ....               LDR         R0,??DataTable18   ;; Init_Flag
   \   0000001E   0068               LDR         R0,[R0, #+0]
   \   00000020   0028               CMP         R0,#+0
   \   00000022   00D0               BEQ         ??Read_Byte_MMC_2
   \   00000024   C046               nop            
    220          	  //read mmc data out pin
    221          	  if((AT91F_PIO_GetInput(AT91C_BASE_PIOA) & (SPI_DI))!=0) //读输入数据
   \                     ??Read_Byte_MMC_2:
   \   00000026   ....               LDR         R0,??DataTable22   ;; 0xfffff400
   \   00000028   ........           _BLF        AT91F_PIO_GetInput,AT91F_PIO_GetInput??rT
   \   0000002C   C003               LSL         R0,R0,#+0xF
   \   0000002E   04D5               BPL         ??Read_Byte_MMC_3
    222          		  temp = (temp << 1) + 1;
   \   00000030   2406               LSL         R4,R4,#+0x18       ;; ZeroExt     R4,R4,#+0x18,#+0x18
   \   00000032   240E               LSR         R4,R4,#+0x18
   \   00000034   6400               LSL         R4,R4,#+0x1
   \   00000036   641C               ADD         R4,#+0x1
   \   00000038   00E0               B           ??Read_Byte_MMC_4
    223          	  else
    224          		  temp = (temp << 1) + 0;
   \                     ??Read_Byte_MMC_3:
   \   0000003A   6400               LSL         R4,R4,#+0x1
    225                AT91F_PIO_SetOutput(AT91C_BASE_PIOA,SPI_Clock) ;            //set Clock Impuls High
   \                     ??Read_Byte_MMC_4:
   \   0000003C   8021               MOV         R1,#+0x80
   \   0000003E   C902               LSL         R1,R1,#+0xB        ;; #+0x40000
   \   00000040   ....               LDR         R0,??DataTable22   ;; 0xfffff400
   \   00000042   ........           _BLF        AT91F_PIO_SetOutput,AT91F_PIO_SetOutput??rT
    226                if(Init_Flag) delay_us_8_;	
   \   00000046   ....               LDR         R0,??DataTable18   ;; Init_Flag
   \   00000048   0068               LDR         R0,[R0, #+0]
   \   0000004A   0028               CMP         R0,#+0
   \   0000004C   00D0               BEQ         ??Read_Byte_MMC_5
   \   0000004E   C046               nop            
    227             }
   \                     ??Read_Byte_MMC_5:
   \   00000050   6D1C               ADD         R5,#+0x1
   \   00000052   DAE7               B           ??Read_Byte_MMC_0
    228             return (temp);
   \                     ??Read_Byte_MMC_1:
   \   00000054   201C               MOV         R0,R4
   \   00000056   0006               LSL         R0,R0,#+0x18       ;; ZeroExt     R0,R0,#+0x18,#+0x18
   \   00000058   000E               LSR         R0,R0,#+0x18
   \   0000005A   30BC               POP         {R4,R5}
   \   0000005C   02BC               POP         {R1}
   \   0000005E   0847               BX          R1                 ;; return
    229             //上面的读的方法是直接驱动总线,也可以直接接收 SPI_RDR寄存器 ,如下:
    230             //return( AT91F_SPI_GetChar (NowSD_SPI)) ;
    231          }
    232          
    233          //****************************************************************************
    234          //Routine for sending a byte to MMC/SD-Card

   \                                 In segment CODE, align 4, keep-with-next
    235          void Write_Byte_MMC(unsigned char value)
    236          //****************************************************************************
    237          {
   \                     Write_Byte_MMC:
   \   00000000   30B5               PUSH        {R4,R5,LR}
   \   00000002   041C               MOV         R4,R0
    238             unsigned char i;
    239          
    240             //Software SPI
    241             for (i=0; i<8; i++)
   \   00000004   0020               MOV         R0,#+0
   \   00000006   051C               MOV         R5,R0
   \                     ??Write_Byte_MMC_0:
   \   00000008   2D06               LSL         R5,R5,#+0x18       ;; ZeroExt     R5,R5,#+0x18,#+0x18
   \   0000000A   2D0E               LSR         R5,R5,#+0x18
   \   0000000C   082D               CMP         R5,#+0x8
   \   0000000E   28D2               BCS         ??Write_Byte_MMC_1
    242             {  //write a byte
    243                if (((value >> (7-i)) & 0x01)==0x01)
   \   00000010   2406               LSL         R4,R4,#+0x18       ;; ZeroExt     R4,R4,#+0x18,#+0x18
   \   00000012   240E               LSR         R4,R4,#+0x18
   \   00000014   0720               MOV         R0,#+0x7
   \   00000016   401B               SUB         R0,R0,R5
   \   00000018   211C               MOV         R1,R4
   \   0000001A   0141               ASR         R1,R0
   \   0000001C   C807               LSL         R0,R1,#+0x1F
   \   0000001E   05D5               BPL         ??Write_Byte_MMC_2
    244          		  AT91F_PIO_SetOutput(AT91C_BASE_PIOA,SPI_DO)  ;//Send bit by bit(MSB First)
   \   00000020   8021               MOV         R1,#+0x80
   \   00000022   8902               LSL         R1,R1,#+0xA        ;; #+0x20000
   \   00000024   ....               LDR         R0,??DataTable22   ;; 0xfffff400
   \   00000026   ........           _BLF        AT91F_PIO_SetOutput,AT91F_PIO_SetOutput??rT
   \   0000002A   04E0               B           ??Write_Byte_MMC_3
    245                else
    246          		  AT91F_PIO_ClearOutput(AT91C_BASE_PIOA,SPI_DO);
   \                     ??Write_Byte_MMC_2:
   \   0000002C   8021               MOV         R1,#+0x80
   \   0000002E   8902               LSL         R1,R1,#+0xA        ;; #+0x20000
   \   00000030   ....               LDR         R0,??DataTable22   ;; 0xfffff400
   \   00000032   ........           _BLF        AT91F_PIO_ClearOutput,AT91F_PIO_ClearOutput??rT
    247                AT91F_PIO_ClearOutput(AT91C_BASE_PIOA,SPI_Clock); //set Clock Impuls low
   \                     ??Write_Byte_MMC_3:
   \   00000036   8021               MOV         R1,#+0x80
   \   00000038   C902               LSL         R1,R1,#+0xB        ;; #+0x40000
   \   0000003A   ....               LDR         R0,??DataTable22   ;; 0xfffff400
   \   0000003C   ........           _BLF        AT91F_PIO_ClearOutput,AT91F_PIO_ClearOutput??rT
    248                if(Init_Flag) delay_us_8_;
   \   00000040   ....               LDR         R0,??DataTable18   ;; Init_Flag
   \   00000042   0068               LDR         R0,[R0, #+0]
   \   00000044   0028               CMP         R0,#+0
   \   00000046   00D0               BEQ         ??Write_Byte_MMC_4
   \   00000048   C046               nop            
    249                AT91F_PIO_SetOutput(AT91C_BASE_PIOA,SPI_Clock);   //set Clock Impuls High
   \                     ??Write_Byte_MMC_4:
   \   0000004A   8021               MOV         R1,#+0x80
   \   0000004C   C902               LSL         R1,R1,#+0xB        ;; #+0x40000
   \   0000004E   ....               LDR         R0,??DataTable22   ;; 0xfffff400
   \   00000050   ........           _BLF        AT91F_PIO_SetOutput,AT91F_PIO_SetOutput??rT
    250                if(Init_Flag) delay_us_8_;
   \   00000054   ....               LDR         R0,??DataTable18   ;; Init_Flag
   \   00000056   0068               LDR         R0,[R0, #+0]
   \   00000058   0028               CMP         R0,#+0
   \   0000005A   00D0               BEQ         ??Write_Byte_MMC_5
   \   0000005C   C046               nop            
    251             }//write a byte
   \                     ??Write_Byte_MMC_5:
   \   0000005E   6D1C               ADD         R5,#+0x1
   \   00000060   D2E7               B           ??Write_Byte_MMC_0
    252             AT91F_PIO_SetOutput(AT91C_BASE_PIOA,SPI_DO);	        //set Output High
   \                     ??Write_Byte_MMC_1:
   \   00000062   8021               MOV         R1,#+0x80
   \   00000064   8902               LSL         R1,R1,#+0xA        ;; #+0x20000
   \   00000066   ....               LDR         R0,??DataTable22   ;; 0xfffff400
   \   00000068   ........           _BLF        AT91F_PIO_SetOutput,AT91F_PIO_SetOutput??rT
    253             //使用如下的库函数来发送数据,但发送前不检测状态是否为 ready
    254             /*
    255             AT91F_SPI_PutChar (NowSD_SPI,value,0) ;
    256             */
    257          }
   \   0000006C   30BC               POP         {R4,R5}
   \   0000006E   01BC               POP         {R0}
   \   00000070   0047               BX          R0                 ;; return

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -