📄 spi.lst
字号:
##############################################################################
# #
# 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 + -