📄 i2c.lst
字号:
274 2 I2CStop();
275 2 return ( FALSE );
276 2 }
277 1 while ( 1 )
278 1 {
279 2 if ( I2CMasterState == DATA_NACK )
280 2 {
281 3 I2CStop();
282 3 break;
283 3 }
284 2 }
285 1 return ( TRUE );
286 1 }
287
288 /******************************************************************************
289 ** End Of File
290 ******************************************************************************/
291
ARM COMPILER V2.54a, i2c 14/04/07 14:23:40 PAGE 6
ASSEMBLY LISTING OF GENERATED OBJECT CODE
*** EXTERNALS:
EXTERN CODE16 (install_irq?T)
*** PUBLICS:
PUBLIC I2C0MasterHandler?A
PUBLIC I2CInit?T
PUBLIC I2CStart?T
PUBLIC I2CStop?T
PUBLIC I2CEngine?T
PUBLIC I2CMasterState
PUBLIC I2CSlaveState
PUBLIC I2CCmd
PUBLIC I2CMode
PUBLIC I2CMasterBuffer
PUBLIC I2CSlaveBuffer
PUBLIC I2CCount
PUBLIC I2CReadLength
PUBLIC I2CWriteLength
PUBLIC RdIndex
PUBLIC WrIndex
*** DATA SEGMENT '?DT0?i2c':
00000000 I2CMasterState:
00000000 BEGIN_INIT
00000000 00000000 DD 0x0
00000004 END_INIT
00000004 I2CSlaveState:
00000004 BEGIN_INIT
00000004 00000000 DD 0x0
00000008 END_INIT
00000008 I2CCmd:
00000008 DS 4
0000000C I2CMode:
0000000C DS 4
00000010 I2CCount:
00000010 BEGIN_INIT
00000010 00000000 DD 0x0
00000014 END_INIT
00000014 I2CReadLength:
00000014 DS 4
00000018 I2CWriteLength:
00000018 DS 4
0000001C RdIndex:
0000001C BEGIN_INIT
0000001C 00000000 DD 0x0
00000020 END_INIT
00000020 WrIndex:
00000020 BEGIN_INIT
00000020 00000000 DD 0x0
00000024 END_INIT
00000024 I2CMasterBuffer:
00000024 DS 32
00000044 I2CSlaveBuffer:
00000044 DS 32
*** CODE SEGMENT '?PR?I2C0MasterHandler?A?i2c':
51: void I2C0MasterHandler (void) __irq
00000000 E92D400F STMDB R13!,{R0-R3,LR}
52: {
00000004 ; SCOPE-START
56: StatValue = I20STAT;
00000004 E5100000 LDR R0,=0xE001C004
00000008 E5901000 LDR R1,[R0,#0x0]
ARM COMPILER V2.54a, i2c 14/04/07 14:23:40 PAGE 7
0000000C E1A01C01 MOV R1,R1,LSL #24
00000010 E1A01C21 MOV R1,R1,LSR #24
00000014 ---- Variable 'StatValue' assigned to Register 'R1' ----
57: IENABLE; /* handles nested interrupt */
00000014 E14FE000 MRS R14,SPSR
00000018 E92D4000 STMFD R13!,{LR}
0000001C E321F01F MSR CPSR_c,#0x1F
00000020 E92D4000 STMFD R13!,{LR}
58: switch ( StatValue )
00000024 E1A00001 MOV R0,R1 ; StatValue
00000028 E3500010 CMP R0,#0x0010 ; StatValue
0000002C 0A00001F BEQ L_4 ; Targ=0xB0
00000030 E3500018 CMP R0,#0x0018 ; StatValue
00000034 0A00002F BEQ L_5 ; Targ=0xF8
00000038 E3500020 CMP R0,#0x0020 ; StatValue
0000003C 0A0000A1 BEQ L_11 ; Targ=0x2C8
00000040 E3500028 CMP R0,#0x0028 ; StatValue
00000044 0A000041 BEQ L_8 ; Targ=0x150
00000048 E3500030 CMP R0,#0x0030 ; StatValue
0000004C 0A00003F BEQ L_8 ; Targ=0x150
00000050 E3500038 CMP R0,#0x0038 ; StatValue
00000054 0A0000A2 BEQ L_3 ; Targ=0x2E4
00000058 E3500040 CMP R0,#0x0040 ; StatValue
0000005C 0A000072 BEQ L_10 ; Targ=0x22C
00000060 E3500048 CMP R0,#0x0048 ; StatValue
00000064 0A000097 BEQ L_11 ; Targ=0x2C8
00000068 E3500050 CMP R0,#0x0050 ; StatValue
0000006C 0A000072 BEQ L_13 ; Targ=0x23C
00000070 E3500058 CMP R0,#0x0058 ; StatValue
00000074 0A000070 BEQ L_13 ; Targ=0x23C
00000078 E3500008 CMP R0,#0x0008 ; StatValue
0000007C 1A000098 BNE L_3 ; Targ=0x2E4
60: case 0x08: /* A Start condition is issued. */
00000080 L_2:
61: I20DAT = I2CMasterBuffer[0];
00000080 E5100000 LDR R0,=I2CMasterBuffer ; I2CMasterBuffer
00000084 E5D00000 LDRB R0,[R0,#0x0] ; I2CMasterBuffer
00000088 E1A01000 MOV R1,R0
0000008C E5100000 LDR R0,=0xE001C008
00000090 E5801000 STR R1,[R0,#0x0]
62: I20CONCLR = (I2CONCLR_SIC | I2CONCLR_STAC);
00000094 E3A01028 MOV R1,#0x28
00000098 E5100000 LDR R0,=0xE001C018
0000009C E5801000 STR R1,[R0,#0x0]
63: I2CMasterState = I2C_STARTED;
000000A0 E3A01001 MOV R1,#0x1
000000A4 E5100000 LDR R0,=I2CMasterState ; I2CMasterState
000000A8 E5801000 STR R1,[R0,#0x0] ; I2CMasterState
64: break;
000000AC EA00008F B L_1 ; Targ=0x2F0
66: case 0x10: /* A repeated started is issued */
000000B0 L_4:
67: if ( I2CCmd == GET_DEVICE_ID || I2CCmd == GET_TEMPERATURE )
000000B0 E5100000 LDR R0,=I2CCmd ; I2CCmd
000000B4 E5900000 LDR R0,[R0,#0x0] ; I2CCmd
000000B8 E3500001 CMP R0,#0x0001
000000BC 0A000001 BEQ L_15 ; Targ=0xC8
000000C0 E3500002 CMP R0,#0x0002
000000C4 1A000004 BNE L_14 ; Targ=0xDC
000000C8 L_15:
69: I20DAT = I2CMasterBuffer[2];
000000C8 E5100000 LDR R0,=I2CMasterBuffer + 0x2 ; I2CMasterBuffer+2
000000CC E5D00000 LDRB R0,[R0,#0x0] ; I2CMasterBuffer+2
000000D0 E1A01000 MOV R1,R0
000000D4 E5100000 LDR R0,=0xE001C008
000000D8 E5801000 STR R1,[R0,#0x0]
ARM COMPILER V2.54a, i2c 14/04/07 14:23:40 PAGE 8
70: }
000000DC L_14:
71: I20CONCLR = (I2CONCLR_SIC | I2CONCLR_STAC);
000000DC E3A01028 MOV R1,#0x28
000000E0 E5100000 LDR R0,=0xE001C018
000000E4 E5801000 STR R1,[R0,#0x0]
72: I2CMasterState = I2C_RESTARTED;
000000E8 E3A01002 MOV R1,#0x2
000000EC E5100000 LDR R0,=I2CMasterState ; I2CMasterState
000000F0 E5801000 STR R1,[R0,#0x0] ; I2CMasterState
73: break;
000000F4 EA00007D B L_1 ; Targ=0x2F0
75: case 0x18: /* Regardless, it's a ACK */
000000F8 L_5:
76: if ( I2CMasterState == I2C_STARTED )
000000F8 E5100000 LDR R0,=I2CMasterState ; I2CMasterState
000000FC E5900000 LDR R0,[R0,#0x0] ; I2CMasterState
00000100 E3500001 CMP R0,#0x0001
00000104 1A00000D BNE L_16 ; Targ=0x140
78: I20DAT = I2CMasterBuffer[1+WrIndex];
00000108 E5100000 LDR R0,=WrIndex ; WrIndex
0000010C E5901000 LDR R1,[R0,#0x0] ; WrIndex
00000110 E2812001 ADD R2,R1,#0x0001
00000114 E5100000 LDR R0,=I2CMasterBuffer ; I2CMasterBuffer
00000118 E7D00002 LDRB R0,[R0,+R2]
0000011C E1A02000 MOV R2,R0
00000120 E5100000 LDR R0,=0xE001C008
00000124 E5802000 STR R2,[R0,#0x0]
79: WrIndex++;
00000128 E5100000 LDR R0,=WrIndex ; WrIndex
0000012C E2811001 ADD R1,R1,#0x0001
00000130 E5801000 STR R1,[R0,#0x0] ; WrIndex
80: I2CMasterState = DATA_ACK;
00000134 E3A01004 MOV R1,#0x4
00000138 E5100000 LDR R0,=I2CMasterState ; I2CMasterState
0000013C E5801000 STR R1,[R0,#0x0] ; I2CMasterState
81: }
00000140 L_16:
82: I20CONCLR = I2CONCLR_SIC;
00000140 E3A01008 MOV R1,#0x8
00000144 E5100000 LDR R0,=0xE001C018
00000148 E5801000 STR R1,[R0,#0x0]
83: break;
0000014C EA000067 B L_1 ; Targ=0x2F0
86: case 0x30:
00000150 L_8:
87: if ( WrIndex != I2CWriteLength )
00000150 E5100000 LDR R0,=I2CWriteLength ; I2CWriteLength
00000154 E5901000 LDR R1,[R0,#0x0] ; I2CWriteLength
00000158 E5100000 LDR R0,=WrIndex ; WrIndex
0000015C E5902000 LDR R2,[R0,#0x0] ; WrIndex
00000160 E1520001 CMP R2,R1
00000164 0A00001E BEQ L_17 ; Targ=0x1E4
89: I20DAT = I2CMasterBuffer[1+WrIndex]; /* this should be the last one */
00000168 E2823001 ADD R3,R2,#0x0001
0000016C E5100000 LDR R0,=I2CMasterBuffer ; I2CMasterBuffer
00000170 E7D00003 LDRB R0,[R0,+R3]
00000174 E1A03000 MOV R3,R0
00000178 E5100000 LDR R0,=0xE001C008
0000017C E5803000 STR R3,[R0,#0x0]
90: WrIndex++;
00000180 E5100000 LDR R0,=WrIndex ; WrIndex
00000184 E2822001 ADD R2,R2,#0x0001
00000188 E5802000 STR R2,[R0,#0x0] ; WrIndex
91: if ( WrIndex != I2CWriteLength )
0000018C E5100000 LDR R0,=WrIndex ; WrIndex
ARM COMPILER V2.54a, i2c 14/04/07 14:23:40 PAGE 9
00000190 E5900000 LDR R0,[R0,#0x0] ; WrIndex
00000194 E1500001 CMP R0,R1
00000198 0A000003 BEQ L_18 ; Targ=0x1AC
93: I2CMasterState = DATA_ACK;
0000019C E3A01004 MOV R1,#0x4
000001A0 E5100000 LDR R0,=I2CMasterState ; I2CMasterState
000001A4 E5801000 STR R1,[R0,#0x0] ; I2CMasterState
94: }
000001A8 EA00001B B L_21 ; Targ=0x21C
000001AC L_18:
97: I2CMasterState = DATA_NACK;
000001AC E3A01005 MOV R1,#0x5
000001B0 E5100000 LDR R0,=I2CMasterState ; I2CMasterState
000001B4 E5801000 STR R1,[R0,#0x0] ; I2CMasterState
98: if ( I2CReadLength != 0 )
000001B8 E5100000 LDR R0,=I2CReadLength ; I2CReadLength
000001BC E5900000 LDR R0,[R0,#0x0] ; I2CReadLength
000001C0 E3500000 CMP R0,#0x0000
000001C4 0A000014 BEQ L_21 ; Targ=0x21C
100: I20CONSET = I2CONSET_STA; /* Set Repeated-start flag */
000001C8 E3A01020 MOV R1,#0x20
000001CC E5100000 LDR R0,=0xE001C000
000001D0 E5801000 STR R1,[R0,#0x0]
101: I2CMasterState = I2C_REPEATED_START;
000001D4 E3A01003 MOV R1,#0x3
000001D8 E5100000 LDR R0,=I2CMasterState ; I2CMasterState
000001DC E5801000 STR R1,[R0,#0x0] ; I2CMasterState
104: }
000001E0 EA00000D B L_21 ; Targ=0x21C
000001E4 L_17:
107: if ( I2CReadLength != 0 )
000001E4 E5100000 LDR R0,=I2CReadLength ; I2CReadLength
000001E8 E5900000 LDR R0,[R0,#0x0] ; I2CReadLength
000001EC E3500000 CMP R0,#0x0000
000001F0 0A000006 BEQ L_22 ; Targ=0x210
109: I20CONSET = I2CONSET_STA; /* Set Repeated-start flag */
000001F4 E3A01020 MOV R1,#0x20
000001F8 E5100000 LDR R0,=0xE001C000
000001FC E5801000 STR R1,[R0,#0x0]
110: I2CMasterState = I2C_REPEATED_START;
00000200 E3A01003 MOV R1,#0x3
00000204 E5100000 LDR R0,=I2CMasterState ; I2CMasterState
00000208 E5801000 STR R1,[R0,#0x0] ; I2CMasterState
111: }
0000020C EA000002 B L_21 ; Targ=0x21C
00000210 L_22:
114: I2CMasterState = DATA_NACK;
00000210 E3A01005 MOV R1,#0x5
00000214 E5100000 LDR R0,=I2CMasterState ; I2CMasterState
00000218 E5801000 STR R1,[R0,#0x0] ; I2CMasterState
116: }
0000021C L_21:
117: I20CONCLR = I2CONCLR_SIC;
0000021C E3A01008 MOV R1,#0x8
00000220 E5100000 LDR R0,=0xE001C018
00000224 E5801000 STR R1,[R0,#0x0]
118: break;
00000228 EA000030 B L_1 ; Targ=0x2F0
120: case 0x40: /* Master Receive, SLA_R has been sent */
0000022C L_10:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -