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

📄 spi.lst

📁 ARM仿真案例
💻 LST
📖 第 1 页 / 共 2 页
字号:
##############################################################################
#                                                                            #
# IAR ARM ANSI C/C++ Compiler V4.40A/W32 EVALUATION    20/Jul/2006  16:29:01 #
# Copyright 1999-2005 IAR Systems. All rights reserved.                      #
# Time limited license: 23 days left                                         #
#                                                                            #
#    Cpu mode        =  interwork                                            #
#    Endian          =  little                                               #
#    Stack alignment =  4                                                    #
#    Source file     =  E:\Project\examples\IAR\ucos-ii\spi\App\spi.c        #
#    Command line    =  E:\Project\examples\IAR\ucos-ii\spi\App\spi.c -lCN   #
#                       E:\Project\examples\IAR\ucos-ii\leddisp\Debug\List\  #
#                       -lA E:\Project\examples\IAR\ucos-ii\leddisp\Debug\Li #
#                       st\ -o E:\Project\examples\IAR\ucos-ii\leddisp\Debug #
#                       \Obj\ -s9 --no_cse --no_unroll --no_inline           #
#                       --no_code_motion --no_tbaa --no_clustering           #
#                       --no_scheduling --debug --cpu_mode thumb --endian    #
#                       little --cpu ARM7TDMI-S --stack_align 4 --interwork  #
#                       -e --fpu None --dlib_config "E:\Program Files\IAR    #
#                       Systems\Embedded Workbench 4.0                       #
#                       Evaluation\ARM\LIB\dl4tptinl8n.h" -I                 #
#                       E:\Project\examples\IAR\ucos-ii\leddisp\ -I          #
#                       E:\Project\examples\IAR\ucos-ii\leddisp\BSP\ -I      #
#                       E:\Project\examples\IAR\ucos-ii\leddisp\ARM\ -I      #
#                       E:\Project\examples\IAR\ucos-ii\leddisp\APP\ -I      #
#                       E:\Project\examples\IAR\ucos-ii\leddisp\uCOS-II\ -I  #
#                       "E:\Program Files\IAR Systems\Embedded Workbench     #
#                       4.0 Evaluation\ARM\INC\"                             #
#    List file       =  E:\Project\examples\IAR\ucos-ii\leddisp\Debug\List\s #
#                       pi.lst                                               #
#    Object file     =  E:\Project\examples\IAR\ucos-ii\leddisp\Debug\Obj\sp #
#                       i.r79                                                #
#                                                                            #
#                                                                            #
##############################################################################

E:\Project\examples\IAR\ucos-ii\spi\App\spi.c
      1          
      2          /********************************************************************************************************/
      3          
      4          #define IN_SPI
      5          #include "config.h"

   \                                 In segment DATA_AN, at 0xfffff030
   \   unsigned long volatile __data VICVectAddr
   \                     VICVectAddr:
   \   00000000                      DS8 4

   \                                 In segment DATA_AN, at 0xe002c000
   \   union <unnamed> volatile __data _A_PINSEL0
   \                     _A_PINSEL0:
   \   00000000                      DS8 4
      6          #ifndef  SPI_MOD
      7          #define SPI_MOD     0
      8          #endif 
      9          
     10          /* SPI总线接口的特殊寄存器 */
     11          #define SPI_SPCR        (*((volatile unsigned char *) 0xE0020000))
     12          #define SPI_SPSR        (*((volatile unsigned char *) 0xE0020004))
     13          #define SPI_SPDR        (*((volatile unsigned char *) 0xE0020008))
     14          #define SPI_SPCCR       (*((volatile unsigned char *) 0xE002000C))
     15          #define SPI_SPINT       (*((volatile unsigned char *) 0xE002001C))

   \                                 In segment DATA_Z, align 4, align-sorted
     16          static OS_EVENT *SPIReviceMbox;
   \                     SPIReviceMbox:
   \   00000000                      DS8 4

   \                                 In segment DATA_Z, align 4, align-sorted
     17          static OS_EVENT *SPISem;
   \                     SPISem:
   \   00000000                      DS8 4

   \                                 In segment DATA_Z, align 1, align-sorted
     18          static uint8 UseSPITaskPro;
   \                     UseSPITaskPro:
   \   00000000                      DS8 1
     19          /*********************************************************************************************************
     20          ** 函数名称: SPIInit
     21          ** 功能描述: 初始化SPI总线为主模式
     22          ********************************************************************************************************/

   \                                 In segment CODE, align 4, keep-with-next
     23                  uint8 SPIInit(uint8 Fdiv)
     24          {
   \                     SPIInit:
   \   00000000   00B5               PUSH     {LR}
     25              PINSEL0 = (PINSEL0 & 0xffff00ff) | 0x5500;  /* 选择管脚为UART0 */
   \   00000002   1349               LDR      R1,??SPIInit_0   ;; 0xe002c000
   \   00000004   0A68               LDR      R2,[R1, #+0]
   \   00000006   134B               LDR      R3,??SPIInit_0+0x4  ;; 0xffff00ff
   \   00000008   1340               ANDS     R3,R3,R2
   \   0000000A   AA22               MOVS     R2,#+170
   \   0000000C   D201               LSLS     R2,R2,#+7        ;; #+21760
   \   0000000E   1A43               ORRS     R2,R2,R3
   \   00000010   0A60               STR      R2,[R1, #+0]
     26          
     27              SPI_SPCCR = Fdiv & 0xfe;                    /* 分频值 */
   \   00000012   1149               LDR      R1,??SPIInit_0+0x8  ;; 0xe002000c
   \   00000014   FE22               MOVS     R2,#+254
   \   00000016   0240               ANDS     R2,R2,R0
   \   00000018   0A70               STRB     R2,[R1, #+0]
     28              SPI_SPCR = 0xa0 | SPI_MOD;                  /* 主机、允许中断 */
   \   0000001A   ....               LDR      R0,??DataTable17  ;; 0xe0020000
   \   0000001C   A021               MOVS     R1,#+160
   \   0000001E   0170               STRB     R1,[R0, #+0]
     29          
     30              UseSPITaskPro = OS_PRIO_SELF;               /* 避免任务不按照规范编写程序而使访问SPI混乱 */
   \   00000020   ....               LDR      R0,??DataTable13  ;; UseSPITaskPro
   \   00000022   FF21               MOVS     R1,#+255
   \   00000024   0170               STRB     R1,[R0, #+0]
     31              SPIReviceMbox = OSMboxCreate(NULL);         /* 用于中断返回收到的数据 */
   \   00000026   0020               MOVS     R0,#+0
   \   00000028   ........           _BLF     OSMboxCreate,??OSMboxCreate??rT
   \   0000002C   ....               LDR      R1,??DataTable16  ;; SPIReviceMbox
   \   0000002E   0860               STR      R0,[R1, #+0]
     32              if (SPIReviceMbox == NULL)
   \   00000030   ....               LDR      R0,??DataTable16  ;; SPIReviceMbox
   \   00000032   0068               LDR      R0,[R0, #+0]
   \   00000034   0028               CMP      R0,#+0
   \   00000036   09D0               BEQ      ??SPIInit_1
     33              {
     34                  return FALSE;
     35              }
     36              SPISem = OSSemCreate(1);                    /* 用于互斥访问SPI总线 */
   \   00000038   0120               MOVS     R0,#+1
   \   0000003A   ........           _BLF     OSSemCreate,??OSSemCreate??rT
   \   0000003E   ....               LDR      R1,??DataTable14  ;; SPISem
   \   00000040   0860               STR      R0,[R1, #+0]
     37              if (SPISem != NULL)
   \   00000042   ....               LDR      R0,??DataTable14  ;; SPISem
   \   00000044   0068               LDR      R0,[R0, #+0]
   \   00000046   0028               CMP      R0,#+0
   \   00000048   00D0               BEQ      ??SPIInit_1
     38              {
     39                  return TRUE;
   \   0000004A   0120               MOVS     R0,#+1
     40              }
     41              else
     42              {
     43                  return FALSE;
   \                     ??SPIInit_1:
   \   0000004C   02BC               POP      {R1}
   \   0000004E   0847               BX       R1               ;; return
   \                     ??SPIInit_0:
   \   00000050   00C002E0           DC32     0xe002c000
   \   00000054   FF00FFFF           DC32     0xffff00ff
   \   00000058   0C0002E0           DC32     0xe002000c
     44              }
     45          }
     46          
     47          /*********************************************************************************************************
     48          ** 函数名称: GetSPIFlag
     49          ** 功能描述: 获取SPI状态 
     50          ********************************************************************************************************/

   \                                 In segment CODE, align 4, keep-with-next
     51                 uint8 GetSPIFlag(void)
     52          {
   \                     GetSPIFlag:
   \   00000000   00B5               PUSH     {LR}
   \   00000002   83B0               SUB      SP,SP,#+12
     53              OS_SEM_DATA SemData;
     54              
     55              if (OSSemQuery(SPISem, &SemData) == OS_NO_ERR)
   \   00000004   6946               MOV      R1,SP
   \   00000006   ....               LDR      R0,??DataTable14  ;; SPISem
   \   00000008   0068               LDR      R0,[R0, #+0]
   \   0000000A   ........           _BLF     OSSemQuery,??OSSemQuery??rT
   \   0000000E   0028               CMP      R0,#+0
   \   00000010   05D1               BNE      ??GetSPIFlag_0
     56              {
     57                  if (SemData.OSCnt != 0)
   \   00000012   6846               MOV      R0,SP
   \   00000014   0088               LDRH     R0,[R0, #+0]
   \   00000016   0028               CMP      R0,#+0
   \   00000018   01D0               BEQ      ??GetSPIFlag_0
     58                  {
     59                      return 0;
   \   0000001A   0020               MOVS     R0,#+0
   \   0000001C   00E0               B        ??GetSPIFlag_1
     60                  }
     61              }
     62              return 1;
   \                     ??GetSPIFlag_0:
   \   0000001E   0120               MOVS     R0,#+1
   \                     ??GetSPIFlag_1:
   \   00000020   03B0               ADD      SP,SP,#+12
   \   00000022   02BC               POP      {R1}
   \   00000024   0847               BX       R1               ;; return
     63          }
     64          
     65          /*********************************************************************************************************
     66          ** 函数名称: SPIStart
     67          ** 功能描述: 开始访问SPI 
     68          ********************************************************************************************************/

   \                                 In segment CODE, align 4, keep-with-next
     69           uint32 GetOSPrioCur(void)
     70          {
     71              return OSPrioCur;
   \                     GetOSPrioCur:
   \   00000000   0148               LDR      R0,??GetOSPrioCur_0  ;; OSPrioCur
   \   00000002   0078               LDRB     R0,[R0, #+0]
   \   00000004   7047               BX       LR               ;; return
   \   00000006   C046               Nop      
   \                     ??GetOSPrioCur_0:
   \   00000008   ........           DC32     OSPrioCur
     72          }

   \                                 In segment CODE, align 4, keep-with-next
     73           uint8 SPIStart(void)
     74          {
   \                     SPIStart:
   \   00000000   00B5               PUSH     {LR}
   \   00000002   81B0               SUB      SP,SP,#+4
     75              uint8 err;
     76              
     77              OSSemPend(SPISem, 0, &err);
   \   00000004   6A46               MOV      R2,SP
   \   00000006   0021               MOVS     R1,#+0
   \   00000008   ....               LDR      R0,??DataTable14  ;; SPISem
   \   0000000A   0068               LDR      R0,[R0, #+0]
   \   0000000C   ........           _BLF     OSSemPend,??OSSemPend??rT
     78              UseSPITaskPro = GetOSPrioCur();
   \   00000010   ........           BL       GetOSPrioCur
   \   00000014   ....               LDR      R1,??DataTable13  ;; UseSPITaskPro
   \   00000016   0870               STRB     R0,[R1, #+0]
     79              return TRUE;
   \   00000018   0120               MOVS     R0,#+1
   \   0000001A   01B0               ADD      SP,SP,#+4
   \   0000001C   02BC               POP      {R1}
   \   0000001E   0847               BX       R1               ;; return
     80          }
     81          
     82          /*********************************************************************************************************
     83          ** 函数名称: SPIRW
     84          ** 功能描述: 读写SPI 
     85          ********************************************************************************************************/

   \                                 In segment CODE, align 4, keep-with-next

⌨️ 快捷键说明

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