?? main.lst
字號:
00000040 F7FF BL I2CTransferByte?T ; T=0x0001 (1)
00000042 FFDE BL I2CTransferByte?T ; T=0x0001 (2)
59: I2CTransferByte(0x41,0,4,messageIn); //read back data
00000046 4800 LDR R3,=messageIn ; messageIn
00000048 2041 MOV R0,#0x41
0000004A 2100 MOV R1,#0x0
0000004C 2204 MOV R2,#0x4
0000004E F7FF BL I2CTransferByte?T ; T=0x0001 (1)
00000050 FFD7 BL I2CTransferByte?T ; T=0x0001 (2)
64: }
00000054 L_1:
00000054 E7FE B L_1 ; T=0x00000054
00000056 BC08 POP {R3}
00000058 4718 BX R3
0000005A ENDP ; 'main'
*** CODE SEGMENT '?PR?I2CTransferByte?T?main':
68: void I2CTransferByte(unsigned int I2CAddr,unsigned char MemAddr,unsigned char count,...)
00000000 B408 PUSH {R3}
00000002 B430 PUSH {R4-R5}
00000004 ---- Variable 'count' assigned to Register 'R2' ----
00000004 ---- Variable 'MemAddr' assigned to Register 'R1' ----
00000004 1C04 MOV R4,R0 ; I2CAddr
00000006 ---- Variable 'I2CAddr' assigned to Register 'R4' ----
69: {
00000006 ; SCOPE-START
71: va_start(ap,count);
00000006 A800 ADD R0,R13,#0x0
00000008 ---- Variable 'ap' assigned to Register 'R0' ----
76: }
00000008 L_5:
00000008 4800 LDR R3,=lock ; lock
0000000A 781B LDRB R3,[R3,#0x0] ; lock
0000000C 2B01 CMP R3,#0x1
0000000E D0FB BEQ L_5 ; T=0x00000008
77: lock = 1; //Set I2C bus as active
00000010 2501 MOV R5,#0x1
00000012 4800 LDR R3,=lock ; lock
00000014 701D STRB R5,[R3,#0x0] ; lock
79: I2CAddress = I2CAddr; //Place address and data in Globals to be used by the interrupt
00000016 4800 LDR R3,=I2CAddress ; I2CAddress
00000018 701C STRB R4,[R3,#0x0] ; I2CAddress
80: if(count >0)
0000001A 0613 LSL R3,R2,#0x18 ; count
0000001C 0E1B LSR R3,R3,#0x18 ; count
0000001E 2B00 CMP R3,#0x0 ; count
00000020 DD04 BLE L_9 ; T=0x0000002C
82: I2CData = va_arg(ap,unsigned char *);
00000022 3004 ADD R0,#0x4
00000024 3804 SUB R0,#0x4
00000026 6803 LDR R3,[R0,#0x0] ; ap
00000028 4800 LDR R0,=I2CData ; I2CData
ARM COMPILER V2.00f, main 20/02/05 12:41:59 PAGE 6
0000002A 6003 STR R3,[R0,#0x0] ; I2CData
83: }
0000002C L_9:
84: I2Counter = count;
0000002C 4800 LDR R0,=I2Counter ; I2Counter
0000002E 7002 STRB R2,[R0,#0x0] ; count
85: MemAddress = MemAddr;
00000030 4800 LDR R0,=MemAddress ; MemAddress
00000032 7001 STRB R1,[R0,#0x0] ; MemAddr
86: I2CONCLR = 0x000000FF; //Clear all I2C settings
00000034 21FF MOV R1,#0xFF
00000036 4800 LDR R0,=0xE001C018
00000038 7001 STRB R1,[R0,#0x0]
87: I2CONSET = 0x00000040; //Enable the I2C interface
0000003A 2140 MOV R1,#0x40
0000003C 4800 LDR R0,=0xE001C000
0000003E 7001 STRB R1,[R0,#0x0]
88: I2CONSET = 0x00000020; //Start condition
00000040 2120 MOV R1,#0x20
00000042 4800 LDR R0,=0xE001C000
00000044 7001 STRB R1,[R0,#0x0]
89: va_end(ap);
00000046 ; SCOPE-END
90: }
00000046 BC30 POP {R4-R5}
00000048 B001 ADD R13,#0x4
0000004A 4770 BX R14
0000004C ENDP ; 'I2CTransferByte?T'
*** CODE SEGMENT '?PR?I2CISR?A?main':
93: void I2CISR (void) __irq //I2C interrupt routine
00000000 E92D0007 STMDB R13!,{R0-R2}
96: switch (I2STAT) //Read result code and switch to next action
00000004 E5100000 LDR R0,=0xE001C004
00000008 E5D00000 LDRB R0,[R0,#0x0]
0000000C E1A01000 MOV R1,R0
00000010 E2511018 SUBS R1,R1,#0x0018
00000014 0A000017 BEQ L_13 ; Targ=0x78
00000018 E2511008 SUBS R1,R1,#0x0008
0000001C 0A00001A BEQ L_14 ; Targ=0x8C
00000020 E2511008 SUBS R1,R1,#0x0008
00000024 0A00001D BEQ L_15 ; Targ=0xA0
00000028 E2511008 SUBS R1,R1,#0x0008
0000002C 0A000031 BEQ L_16 ; Targ=0xF8
00000030 E2511010 SUBS R1,R1,#0x0010
00000034 0A000035 BEQ L_17 ; Targ=0x110
00000038 E2511008 SUBS R1,R1,#0x0008
0000003C 0A000037 BEQ L_18 ; Targ=0x120
00000040 E2511008 SUBS R1,R1,#0x0008
00000044 0A000039 BEQ L_19 ; Targ=0x130
00000048 E2511008 SUBS R1,R1,#0x0008
0000004C 0A00004E BEQ L_20 ; Targ=0x18C
00000050 E2911050 ADDS R1,R1,#0x0050
00000054 1A00004F BNE L_10 ; Targ=0x198
100: case ( 0x08): //Start bit
00000058 L_11:
101: I2CONCLR = 0x20; //Clear start bit
00000058 E3A01020 MOV R1,#0x20
0000005C E5100000 LDR R0,=0xE001C018
00000060 E5C01000 STRB R1,[R0,#0x0]
102: I2DAT = I2CAddress; //Send address and write bit
00000064 E5100000 LDR R0,=I2CAddress ; I2CAddress
00000068 E5D01000 LDRB R1,[R0,#0x0] ; I2CAddress
0000006C E5100000 LDR R0,=0xE001C008
00000070 E5C01000 STRB R1,[R0,#0x0]
103: break;
00000074 EA000047 B L_10 ; Targ=0x198
ARM COMPILER V2.00f, main 20/02/05 12:41:59 PAGE 7
105: case (0x18): //Slave address+W, ACK
00000078 L_13:
106: I2DAT = MemAddress; //Write Mem,ory start address to tx register
00000078 E5100000 LDR R0,=MemAddress ; MemAddress
0000007C E5D01000 LDRB R1,[R0,#0x0] ; MemAddress
00000080 E5100000 LDR R0,=0xE001C008
00000084 E5C01000 STRB R1,[R0,#0x0]
107: break;
00000088 EA000042 B L_10 ; Targ=0x198
109: case (0x20): //Salve address +W, Not ACK
0000008C L_14:
110: I2DAT = I2CAddress; //Resend address and write bi
0000008C E5100000 LDR R0,=I2CAddress ; I2CAddress
00000090 E5D01000 LDRB R1,[R0,#0x0] ; I2CAddress
00000094 E5100000 LDR R0,=0xE001C008
00000098 E5C01000 STRB R1,[R0,#0x0]
111: break;
0000009C EA00003D B L_10 ; Targ=0x198
113: case (0x28):
000000A0 L_15:
114: if(I2Counter-->0) //Data sent, Ack
000000A0 E5101000 LDR R1,=I2Counter ; I2Counter
000000A4 E5D10000 LDRB R0,[R1,#0x0] ; I2Counter
000000A8 E2402001 SUB R2,R0,#0x0001
000000AC E5C12000 STRB R2,[R1,#0x0] ; I2Counter
000000B0 E3500000 CMP R0,#0x0000
000000B4 DA000008 BLE L_21 ; Targ=0xDC
116: I2DAT = *I2CData; //Write data to tx register
000000B8 E5100000 LDR R0,=I2CData ; I2CData
000000BC E5901000 LDR R1,[R0,#0x0] ; I2CData
000000C0 E5D12000 LDRB R2,[R1,#0x0]
000000C4 E5100000 LDR R0,=0xE001C008
000000C8 E5C02000 STRB R2,[R0,#0x0]
117: I2CData++;
000000CC E5100000 LDR R0,=I2CData ; I2CData
000000D0 E2811001 ADD R1,R1,#0x0001
000000D4 E5801000 STR R1,[R0,#0x0] ; I2CData
118: }
000000D8 EA00002E B L_10 ; Targ=0x198
000000DC L_21:
121: I2CONSET = 0x10; //Stop condition
000000DC E3A01010 MOV R1,#0x10
000000E0 E5100000 LDR R0,=0xE001C000
000000E4 E5C01000 STRB R1,[R0,#0x0]
122: lock = 0; //Signal end of I2C activity
000000E8 E3A01000 MOV R1,#0x0
000000EC E5100000 LDR R0,=lock ; lock
000000F0 E5C01000 STRB R1,[R0,#0x0] ; lock
124: break;
000000F4 EA000027 B L_10 ; Targ=0x198
126: case (0x30) : //Data sent, NOT Ack
000000F8 L_16:
127: I2DAT = *I2CData; //Write data to tx register
000000F8 E5100000 LDR R0,=I2CData ; I2CData
000000FC E5900000 LDR R0,[R0,#0x0] ; I2CData
00000100 E5D01000 LDRB R1,[R0,#0x0]
00000104 E5100000 LDR R0,=0xE001C008
00000108 E5C01000 STRB R1,[R0,#0x0]
128: break;
0000010C EA000021 B L_10 ; Targ=0x198
133: case (0x40) : //Slave Address +R, ACK
00000110 L_17:
134: I2CONSET = 0x04; //Enable ACK for data byte
00000110 E3A01004 MOV R1,#0x4
00000114 E5100000 LDR R0,=0xE001C000
00000118 E5C01000 STRB R1,[R0,#0x0]
ARM COMPILER V2.00f, main 20/02/05 12:41:59 PAGE 8
135: break;
0000011C EA00001D B L_10 ; Targ=0x198
137: case (0x48) : //Slave Address +R, Not Ack
00000120 L_18:
138: I2CONSET = 0x20; //Resend Start condition
00000120 E3A01020 MOV R1,#0x20
00000124 E5100000 LDR R0,=0xE001C000
00000128 E5C01000 STRB R1,[R0,#0x0]
139: break;
0000012C EA000019 B L_10 ; Targ=0x198
141: case (0x50) : //Data Received, ACK
00000130 L_19:
142: if(--I2Counter>0)
00000130 E5101000 LDR R1,=I2Counter ; I2Counter
00000134 E5D10000 LDRB R0,[R1,#0x0] ; I2Counter
00000138 E2400001 SUB R0,R0,#0x0001
0000013C E5C10000 STRB R0,[R1,#0x0] ; I2Counter
00000140 E3500000 CMP R0,#0x0000
00000144 DA000009 BLE L_23 ; Targ=0x170
144: *I2CData = I2DAT;
00000148 E5100000 LDR R0,=0xE001C008
0000014C E5D01000 LDRB R1,[R0,#0x0]
00000150 E5100000 LDR R0,=I2CData ; I2CData
00000154 E5900000 LDR R0,[R0,#0x0] ; I2CData
00000158 E5C01000 STRB R1,[R0,#0x0]
145: I2CData++;
0000015C E5100000 LDR R0,=I2CData ; I2CData
00000160 E5901000 LDR R1,[R0,#0x0] ; I2CData
00000164 E2811001 ADD R1,R1,#0x0001
00000168 E5801000 STR R1,[R0,#0x0] ; I2CData
146: }
0000016C EA000009 B L_10 ; Targ=0x198
00000170 L_23:
149: I2CONSET = 0x10; //Stop condition
00000170 E3A01010 MOV R1,#0x10
00000174 E5100000 LDR R0,=0xE001C000
00000178 E5C01000 STRB R1,[R0,#0x0]
150: lock = 0; //Signal end of I2C activity
0000017C E3A01000 MOV R1,#0x0
00000180 E5100000 LDR R0,=lock ; lock
00000184 E5C01000 STRB R1,[R0,#0x0] ; lock
152: break;
00000188 EA000002 B L_10 ; Targ=0x198
154: case (0x58): //Data Received, Not Ack
0000018C L_20:
155: I2CONSET = 0x20; // Resend Start condition
0000018C E3A01020 MOV R1,#0x20
00000190 E5100000 LDR R0,=0xE001C000
00000194 E5C01000 STRB R1,[R0,#0x0]
161: }
00000198 L_10:
163: I2CONCLR = 0x08; //Clear I2C interrupt flag
00000198 E3A01008 MOV R1,#0x8
0000019C E5100000 LDR R0,=0xE001C018
000001A0 E5C01000 STRB R1,[R0,#0x0]
164: VICVectAddr = 0x00000000; //Clear interrupt in
000001A4 E3A01000 MOV R1,#0x0
000001A8 E5100000 LDR R0,=0xFFFFF030
000001AC E5801000 STR R1,[R0,#0x0]
166: }
000001B0 E8BD0007 LDMIA R13!,{R0-R2}
000001B4 E25EF004 SUBS R15,R14,#0x0004
000001B8 ENDP ; 'I2CISR?A'
Module Information Static
----------------------------------
ARM COMPILER V2.00f, main 20/02/05 12:41:59 PAGE 9
code size = ------
data size = 16
const size = ------
End of Module Information.
ARM COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -