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

📄 mmc.lst

📁 针对at91sam7a3为主芯片开发板开发的spi口应用程序
💻 LST
📖 第 1 页 / 共 5 页
字号:
##############################################################################
#                                                                            #
# IAR ARM ANSI C/C++ Compiler V4.30A/W32 KICKSTART     31/Jul/2006  09:41:27 #
# Copyright 1999-2005 IAR Systems. All rights reserved.                      #
#                                                                            #
#    Cpu mode        =  interwork                                            #
#    Endian          =  little                                               #
#    Stack alignment =  4                                                    #
#    Source file     =  C:\Documents and Settings\yc\桌面\AT91SAM7A3(CAN_CAN #
#                       )(10K_5K)\BasicCAN-SAM7A3\src\mmc.c                  #
#    Command line    =  "C:\Documents and Settings\yc\桌面\AT91SAM7A3(CAN_CA #
#                       N)(10K_5K)\BasicCAN-SAM7A3\src\mmc.c" -lC            #
#                       "C:\Documents and Settings\yc\桌面\AT91SAM7A3(CAN_CA #
#                       N)(10K_5K)\BasicCAN-SAM7A3\compil\RAM_Debug\List\"   #
#                       --remarks -o "C:\Documents and                       #
#                       Settings\yc\桌面\AT91SAM7A3(CAN_CAN)(10K_5K)\BasicCA #
#                       N-SAM7A3\compil\RAM_Debug\Obj\" -z2 --no_cse         #
#                       --no_unroll --no_inline --no_code_motion --no_tbaa   #
#                       --no_clustering --no_scheduling --debug --cpu_mode   #
#                       thumb --endian little --cpu ARM7TDMI --stack_align   #
#                       4 --interwork -e --fpu None --dlib_config "D:\IAR    #
#                       Systems\Embedded Workbench 4.0                       #
#                       Kickstart\arm\LIB\dl4tptinl8f.h" -I "C:\Documents    #
#                       and Settings\yc\桌面\AT91SAM7A3(CAN_CAN)(10K_5K)\Bas #
#                       icCAN-SAM7A3\compil\srcIAR\" -I "C:\Documents and    #
#                       Settings\yc\桌面\AT91SAM7A3(CAN_CAN)(10K_5K)\BasicCA #
#                       N-SAM7A3\compil\..\src\" -I "C:\Documents and        #
#                       Settings\yc\桌面\AT91SAM7A3(CAN_CAN)(10K_5K)\BasicCA #
#                       N-SAM7A3\compil\..\..\" -I "D:\IAR Systems\Embedded  #
#                       Workbench 4.0 Kickstart\arm\INC\"                    #
#    List file       =  C:\Documents and Settings\yc\桌面\AT91SAM7A3(CAN_CAN #
#                       )(10K_5K)\BasicCAN-SAM7A3\compil\RAM_Debug\List\mmc. #
#                       lst                                                  #
#    Object file     =  C:\Documents and Settings\yc\桌面\AT91SAM7A3(CAN_CAN #
#                       )(10K_5K)\BasicCAN-SAM7A3\compil\RAM_Debug\Obj\mmc.r #
#                       79                                                   #
#                                                                            #
#                                                                            #
##############################################################################

C:\Documents and Settings\yc\桌面\AT91SAM7A3(CAN_CAN)(10K_5K)\BasicCAN-SAM7A3\src\mmc.c
      1          #include "mmc.h"

   \                                 In segment CODE, align 4, keep-with-next
   \   __??Code16?? __code __interwork __atpcs void AT91F_PIO_CfgPeriph(AT91PS_PIO, unsigned int, unsigned int)
   \                     AT91F_PIO_CfgPeriph:
   \   00000000   0167               STR         R1,[R0, #+0x70]
   \   00000002   4267               STR         R2,[R0, #+0x74]
   \   00000004   131C               MOV         R3,R2
   \   00000006   0B43               ORR         R3,R1
   \   00000008   4360               STR         R3,[R0, #+0x4]
   \   0000000A   7047               BX          LR                 ;; return

   \                                 In segment CODE, align 4, keep-with-next
   \   __??Code16?? __code __interwork __atpcs unsigned int AT91F_PIO_GetInput(AT91PS_PIO)
   \                     AT91F_PIO_GetInput:
   \   00000000   C06B               LDR         R0,[R0, #+0x3C]
   \   00000002   7047               BX          LR                 ;; return

   \                                 In segment CODE, align 4, keep-with-next
   \   __??Code16?? __code __interwork __atpcs void AT91F_PIO_SetOutput(AT91PS_PIO, unsigned int)
   \                     AT91F_PIO_SetOutput:
   \   00000000   0163               STR         R1,[R0, #+0x30]
   \   00000002   7047               BX          LR                 ;; return

   \                                 In segment CODE, align 4, keep-with-next
   \   __??Code16?? __code __interwork __atpcs void AT91F_PIO_ClearOutput(AT91PS_PIO, unsigned int)
   \                     AT91F_PIO_ClearOutput:
   \   00000000   4163               STR         R1,[R0, #+0x34]
   \   00000002   7047               BX          LR                 ;; return

   \                                 In segment CODE, align 4, keep-with-next
   \   __??Code16?? __code __interwork __atpcs void AT91F_PIO_OutputEnable(AT91PS_PIO, unsigned int)
   \                     AT91F_PIO_OutputEnable:
   \   00000000   0161               STR         R1,[R0, #+0x10]
   \   00000002   7047               BX          LR                 ;; return

   \                                 In segment CODE, align 4, keep-with-next
   \   __??Code16?? __code __interwork __atpcs unsigned int AT91F_PIO_GetInterruptStatus(AT91PS_PIO)
   \                     AT91F_PIO_GetInterruptStatus:
   \   00000000   C06C               LDR         R0,[R0, #+0x4C]
   \   00000002   7047               BX          LR                 ;; return

   \                                 In segment CODE, align 4, keep-with-next
   \   __??Code16?? __code __interwork __atpcs void AT91F_PMC_EnablePeriphClock(AT91PS_PMC, unsigned int)
   \                     AT91F_PMC_EnablePeriphClock:
   \   00000000   0161               STR         R1,[R0, #+0x10]
   \   00000002   7047               BX          LR                 ;; return

    int   OID[3]         ;         //*********OEM ID ,16比特 2进制数  ,     暂未用
                                    ^
"C:\Documents and Settings\yc\桌面\AT91SAM7A3(CAN_CAN)(10K_5K)\BasicCAN-SAM7A3\src\mmc.h",47  Warning[Pe009]: 
          nested comment is not allowed

    int   PSN[5]         ;         //*********Product serial number,32 bit ,暂未用
                                    ^
"C:\Documents and Settings\yc\桌面\AT91SAM7A3(CAN_CAN)(10K_5K)\BasicCAN-SAM7A3\src\mmc.h",48  Warning[Pe009]: 
          nested comment is not allowed

   \                                 In segment DATA_Z, align 4, align-sorted
   \   BUFFER_TYPE __data sectorBuffer
   \                     sectorBuffer:
   \   00000000                      DS8 256

   \                                 In segment DATA_Z, align 4, align-sorted
   \   int __data readPos
   \                     readPos:
   \   00000000                      DS8 4

   \                                 In segment DATA_Z, align 4, align-sorted
   \   int __data sectorPos
   \                     sectorPos:
   \   00000000                      DS8 4
      2          /****************************************************************************
      3          SD卡操作的主要重点在于命令的返回,读写地址的定位
      4          这部分程序使用IO口模拟方式读写SD卡,未验证,
      5          下一部分使用SPI接口和MCI接口 ,Countinue...... ,对于本程序,这三种模式下,所
      6          不同的对于和SD卡的通讯部分,其他部分基本相同
      7          不同功能程序如下:MMC_Port_Init(...) ; MMC_Init()SPI与MCI不同;Read_Byte_MMC(...)和
      8          Write_Byte_MMC(...)三种模式下都不同;详见注释
      9          **/
     10          // Port Init

   \                                 In segment CODE, align 4, keep-with-next
     11          void MMC_Port_Init(void)                 //配置 spi 端口
     12          //****************************************************************************
     13          {
   \                     MMC_Port_Init:
   \   00000000   00B5               PUSH        {LR}
     14          
     15          #ifdef  Direct_IO              //***********    I/O口模拟SPI模式    **********
     16            AT91F_PMC_EnablePeriphClock(AT91C_BASE_PMC,1<<AT91C_ID_PIOA) ;
   \   00000002   0421               MOV         R1,#+0x4
   \   00000004   0748               LDR         R0,??MMC_Port_Init_0  ;; 0xfffffc00
   \   00000006   ........           _BLF        AT91F_PMC_EnablePeriphClock,AT91F_PMC_EnablePeriphClock??rT
     17            AT91F_PIO_CfgPeriph(AT91C_BASE_PIOA ,SPI_DI|SPI_DO|SPI_Clock|MMC_Chip_Select,0) ;
   \   0000000A   0022               MOV         R2,#+0
   \   0000000C   E421               MOV         R1,#+0xE4
   \   0000000E   C902               LSL         R1,R1,#+0xB        ;; #+0x72000
   \   00000010   ....               LDR         R0,??DataTable22   ;; 0xfffff400
   \   00000012   ........           _BLF        AT91F_PIO_CfgPeriph,AT91F_PIO_CfgPeriph??rT
     18            AT91F_PIO_OutputEnable(AT91C_BASE_PIOA,SPI_DO|SPI_Clock|MMC_Chip_Select) ;
   \   00000016   C421               MOV         R1,#+0xC4
   \   00000018   C902               LSL         R1,R1,#+0xB        ;; #+0x62000
   \   0000001A   ....               LDR         R0,??DataTable22   ;; 0xfffff400
   \   0000001C   ........           _BLF        AT91F_PIO_OutputEnable,AT91F_PIO_OutputEnable??rT
     19          #endif
     20          
     21          #ifdef  SPI_Mode               //***************** SPI 模式 ******************
     22          
     23            AT91F_PMC_EnablePeriphClock(AT91C_BASE_PMC,1<<AT91C_ID_PIOA) ;
     24            AT91F_PIO_CfgPeriph(AT91C_BASE_PIOA ,SPI_DI|SPI_DO|SPI_Clock|MMC_Chip_Select,0) ;
     25            AT91F_PIO_OutputEnable(AT91C_BASE_PIOA,SPI_DO|SPI_Clock|MMC_Chip_Select) ;
     26           // config SPI 模式
     27            AT91F_SPI_CfgMode(AT91C_BASE_SPI0,AT91C_SPI_MSTR|AT91C_SPI_PS_FIXED
     28                              |AT91C_SPI_FDIV|AT91C_SPI_DLYBCS) ;  //配置模式 master,FiX,MCK/32
     29            //拨特率=mck/64/7 ,bit width=8
     30            AT91C_BASE_SPI0->SPI_CSR[0] |=(AT91C_SPI_BITS_8|(AT91C_SPI_SCBR & 0x07)) ;
     31            AT91F_SPI_Reset(AT91C_BASE_SPI0)   ;
     32            AT91F_SPI_Enable(AT91C_BASE_SPI0)  ;
     33          #endif
     34          
     35          #ifdef  MCI_Mode               //*****************  使用MCI模式  *************
     36            ;   // in use MCI mode ,place code here ! but not support MCI in AT91SAM7X256 .
     37                // achieve the foundation in use AT91SAM7A3
     38          #endif
     39          }
   \   00000020   01BC               POP         {R0}
   \   00000022   0047               BX          R0                 ;; return
   \                     ??MMC_Port_Init_0:
   \   00000024   00FCFFFF           DC32        0xfffffc00
     40          
     41          //****************************************************************************
     42          //Init MMC/SD card(SPI-MODE)

   \                                 In segment CODE, align 4, keep-with-next
     43          unsigned char MMC_Init(void)   // 在SPI和MCI模式下 有所不同
     44          //****************************************************************************
     45          {
   \                     MMC_Init:
   \   00000000   70B5               PUSH        {R4-R6,LR}
   \   00000002   82B0               SUB         SP,#+0x8
     46             unsigned char retry,temp;
     47             unsigned char i;
     48             //CRC 校验在每个命令都需要,其生成多项式: G(x) = x7 + x3 + 1.
     49             unsigned char CMD[] = {0x40,0x00,0x00,0x00,0x00,0x95};  // Com0 复位
   \   00000004   6846               MOV         R0,SP
   \   00000006   2A49               LDR         R1,??MMC_Init_0    ;; `?<Constant {64, 0, 0, 0, 0, 149}>`
   \   00000008   0A68               LDR         R2,[R1, #0]
   \   0000000A   0260               STR         R2,[R0, #0]
   \   0000000C   4A68               LDR         R2,[R1, #+0x4]
   \   0000000E   4260               STR         R2,[R0, #+0x4]
     50          
     51             MMC_Port_Init();          //Init SPI port
   \   00000010   ........           BL          MMC_Port_Init
     52          
     53             for(i=0;i<200;i++)        //Wait MMC/SD ready...
   \   00000014   0020               MOV         R0,#+0
   \   00000016   061C               MOV         R6,R0
   \                     ??MMC_Init_1:
   \   00000018   3606               LSL         R6,R6,#+0x18       ;; ZeroExt     R6,R6,#+0x18,#+0x18
   \   0000001A   360E               LSR         R6,R6,#+0x18
   \   0000001C   C82E               CMP         R6,#+0xC8
   \   0000001E   02D2               BCS         ??MMC_Init_2
     54             {
     55                 asm("nop") ;         //__asm("nop") ; 嵌入汇编语言
   \   00000020   C046               nop            
     56             }
   \   00000022   761C               ADD         R6,#+0x1
   \   00000024   F8E7               B           ??MMC_Init_1
     57          
     58             Init_Flag=1;             //标志为卡片状态 为正在初始化
   \                     ??MMC_Init_2:
   \   00000026   ....               LDR         R0,??DataTable18   ;; Init_Flag
   \   00000028   0121               MOV         R1,#+0x1
   \   0000002A   0160               STR         R1,[R0, #+0]

⌨️ 快捷键说明

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