📄 bsp_i2c.txt
字号:
; generated by ARM/Thumb C/C++ Compiler with , RVCT3.1 [Build 903] for uVision
; commandline ArmCC [--debug -c --asm --interleave -obsp_i2c.o --depend=bsp_i2c.d --device=DARMP --apcs=interwork -I. -I..\BSP -I..\..\..\..\..\uCOS-II\Ports\ARM\Generic\RVMDK -I..\..\..\..\..\uCOS-II\Source -I..\..\..\..\..\uC-CPU -I..\..\..\..\..\uC-CPU\ARM\RVMDK -I..\..\..\..\..\uC-LIB -I..\..\..\..\..\uCOSView\Source -I..\..\..\..\..\uCOSView\Ports\ARM7\LPC2468\IAR -Id:\Keil\ARM\INC\Philips ..\BSP\bsp_i2c.c]
ARM
AREA ||.text||, CODE, READONLY, ALIGN=2
I2C_ISR_Handler PROC
;;;306 void I2C_ISR_Handler (void)
;;;307 {
000000 e92d4070 PUSH {r4-r6,lr}
;;;308 CPU_INT32U status;
;;;309 CPU_INT32U temp;
;;;310
;;;311
;;;312 status = I20STAT;
000004 e59f0570 LDR r0,|L1.1404|
000008 e5904004 LDR r4,[r0,#4]
;;;313 temp = 0;
00000c e3a05000 MOV r5,#0
;;;314
;;;315 switch (status & 0xF8) {
000010 e20400f8 AND r0,r4,#0xf8
000014 e3100007 TST r0,#7
000018 1a0000ac BNE |L1.720|
00001c e1a001c0 ASR r0,r0,#3
000020 e350000c CMP r0,#0xc
000024 308ff100 ADDCC pc,pc,r0,LSL #2
000028 ea0000a8 B |L1.720|
00002c ea0000a7 B |L1.720|
000030 ea000009 B |L1.92|
000034 ea00000a B |L1.100|
000038 ea000010 B |L1.128|
00003c ea000047 B |L1.352|
000040 ea000022 B |L1.208|
000044 ea000047 B |L1.360|
000048 ea000053 B |L1.412|
00004c ea00005d B |L1.456|
000050 ea000045 B |L1.364|
000054 ea00006b B |L1.520|
000058 ea000085 B |L1.628|
|L1.92|
;;;316
;;;317 case I2STAT_START:
00005c e1a00000 MOV r0,r0
;;;318 case I2STAT_REPEATED_START:
000060 e1a00000 MOV r0,r0
|L1.100|
;;;319 I20DAT = I2C_Address;
000064 e59f0514 LDR r0,|L1.1408|
000068 e5d00000 LDRB r0,[r0,#0] ; I2C_Address
00006c e59f1508 LDR r1,|L1.1404|
000070 e5810008 STR r0,[r1,#8]
;;;320 I20CONCLR = I2CON_STA | I2CON_SI;
000074 e3a00028 MOV r0,#0x28
000078 e5810018 STR r0,[r1,#0x18]
;;;321 break;
00007c ea000098 B |L1.740|
|L1.128|
;;;322
;;;323 case I2STAT_SLA_W_ACK:
000080 e1a00000 MOV r0,r0
;;;324 temp = *I2C_BufPtr;
000084 e59f04f8 LDR r0,|L1.1412|
000088 e5900000 LDR r0,[r0,#0] ; I2C_BufPtr
00008c e5d05000 LDRB r5,[r0,#0]
;;;325 I20DAT = temp;
000090 e59f04e4 LDR r0,|L1.1404|
000094 e5805008 STR r5,[r0,#8]
;;;326 I2C_BufPtr += 1;
000098 e59f04e4 LDR r0,|L1.1412|
00009c e5900000 LDR r0,[r0,#0] ; I2C_BufPtr
0000a0 e2800001 ADD r0,r0,#1
0000a4 e59f14d8 LDR r1,|L1.1412|
0000a8 e5810000 STR r0,[r1,#0] ; I2C_BufPtr
;;;327 I2C_Count -= 1;
0000ac e2810004 ADD r0,r1,#4
0000b0 e5d00000 LDRB r0,[r0,#0] ; I2C_Count
0000b4 e2400001 SUB r0,r0,#1
0000b8 e2811004 ADD r1,r1,#4
0000bc e5c10000 STRB r0,[r1,#0] ; I2C_Count
;;;328 I20CONCLR = I2CON_STA | I2CON_SI;
0000c0 e3a00028 MOV r0,#0x28
0000c4 e59f14b0 LDR r1,|L1.1404|
0000c8 e5810018 STR r0,[r1,#0x18]
;;;329 break;
0000cc ea000084 B |L1.740|
|L1.208|
;;;330
;;;331 case I2STAT_DAT_T_ACK:
0000d0 e1a00000 MOV r0,r0
;;;332 if (I2C_Count > 0) {
0000d4 e59f04ac LDR r0,|L1.1416|
0000d8 e5d00000 LDRB r0,[r0,#0] ; I2C_Count
0000dc e3500000 CMP r0,#0
0000e0 da000012 BLE |L1.304|
;;;333 temp = *I2C_BufPtr;
0000e4 e59f0498 LDR r0,|L1.1412|
0000e8 e5900000 LDR r0,[r0,#0] ; I2C_BufPtr
0000ec e5d05000 LDRB r5,[r0,#0]
;;;334 I20DAT = temp;
0000f0 e59f0484 LDR r0,|L1.1404|
0000f4 e5805008 STR r5,[r0,#8]
;;;335 I2C_BufPtr += 1;
0000f8 e59f0484 LDR r0,|L1.1412|
0000fc e5900000 LDR r0,[r0,#0] ; I2C_BufPtr
000100 e2800001 ADD r0,r0,#1
000104 e59f1478 LDR r1,|L1.1412|
000108 e5810000 STR r0,[r1,#0] ; I2C_BufPtr
;;;336 I2C_Count -= 1;
00010c e2810004 ADD r0,r1,#4
000110 e5d00000 LDRB r0,[r0,#0] ; I2C_Count
000114 e2400001 SUB r0,r0,#1
000118 e2811004 ADD r1,r1,#4
00011c e5c10000 STRB r0,[r1,#0] ; I2C_Count
;;;337 I20CONCLR = I2CON_STA | I2CON_SI;
000120 e3a00028 MOV r0,#0x28
000124 e59f1450 LDR r1,|L1.1404|
000128 e5810018 STR r0,[r1,#0x18]
00012c ea00000a B |L1.348|
|L1.304|
;;;338 } else {
;;;339 I20CONCLR = I2CON_STA | I2CON_SI;
000130 e3a00028 MOV r0,#0x28
000134 e59f1440 LDR r1,|L1.1404|
000138 e5810018 STR r0,[r1,#0x18]
;;;340 I20CONSET = I2CON_STO;
00013c e3a00010 MOV r0,#0x10
000140 e5810000 STR r0,[r1,#0]
;;;341 OSSemPost(I2C_SemWait);
000144 e59f0440 LDR r0,|L1.1420|
000148 e5900000 LDR r0,[r0,#0] ; I2C_SemWait
00014c ebfffffe BL OSSemPost
;;;342 VICIntEnClear = (1 << VIC_I2C0);
000150 e3a00c02 MOV r0,#0x200
000154 e3a01000 MOV r1,#0
000158 e5010fec STR r0,[r1,#-0xfec]
|L1.348|
;;;343 }
;;;344 break;
00015c ea000060 B |L1.740|
|L1.352|
;;;345
;;;346 case I2STAT_SLA_W_NOACK:
000160 e1a00000 MOV r0,r0
;;;347 case I2STAT_DAT_T_NOACK:
000164 e1a00000 MOV r0,r0
|L1.360|
;;;348 case I2STAT_SLA_R_NOACK:
000168 e1a00000 MOV r0,r0
|L1.364|
;;;349 I20CONSET = I2CON_STO;
00016c e3a00010 MOV r0,#0x10
000170 e59f1404 LDR r1,|L1.1404|
000174 e5810000 STR r0,[r1,#0]
;;;350 I20CONCLR = I2CON_STA | I2CON_SI;
000178 e3a00028 MOV r0,#0x28
00017c e5810018 STR r0,[r1,#0x18]
;;;351 OSSemPost(I2C_SemWait);
000180 e59f0404 LDR r0,|L1.1420|
000184 e5900000 LDR r0,[r0,#0] ; I2C_SemWait
000188 ebfffffe BL OSSemPost
;;;352 VICIntEnClear = (1 << VIC_I2C0);
00018c e3a00c02 MOV r0,#0x200
000190 e3a01000 MOV r1,#0
000194 e5010fec STR r0,[r1,#-0xfec]
;;;353 break;
000198 ea000051 B |L1.740|
|L1.412|
;;;354
;;;355 case I2STAT_ARB_LOST:
00019c e1a00000 MOV r0,r0
;;;356 I20CONCLR = I2CON_STA | I2CON_SI;
0001a0 e3a00028 MOV r0,#0x28
0001a4 e59f13d0 LDR r1,|L1.1404|
0001a8 e5810018 STR r0,[r1,#0x18]
;;;357 OSSemPost(I2C_SemWait);
0001ac e59f03d8 LDR r0,|L1.1420|
0001b0 e5900000 LDR r0,[r0,#0] ; I2C_SemWait
0001b4 ebfffffe BL OSSemPost
;;;358 VICIntEnClear = (1 << VIC_I2C0);
0001b8 e3a00c02 MOV r0,#0x200
0001bc e3a01000 MOV r1,#0
0001c0 e5010fec STR r0,[r1,#-0xfec]
;;;359 break;
0001c4 ea000046 B |L1.740|
|L1.456|
;;;360
;;;361
;;;362 case I2STAT_SLA_R_ACK:
0001c8 e1a00000 MOV r0,r0
;;;363 if (I2C_Count <= 1) {
0001cc e59f03b4 LDR r0,|L1.1416|
0001d0 e5d00000 LDRB r0,[r0,#0] ; I2C_Count
0001d4 e3500001 CMP r0,#1
0001d8 ca000003 BGT |L1.492|
;;;364 I20CONSET = I2CON_AA;
0001dc e3a00004 MOV r0,#4
0001e0 e59f1394 LDR r1,|L1.1404|
0001e4 e5810000 STR r0,[r1,#0]
0001e8 ea000002 B |L1.504|
|L1.492|
;;;365 } else {
;;;366 I20CONCLR = I2CON_AA;
0001ec e3a00004 MOV r0,#4
0001f0 e59f1384 LDR r1,|L1.1404|
0001f4 e5810018 STR r0,[r1,#0x18]
|L1.504|
;;;367 }
;;;368 I20CONCLR = I2CON_STA | I2CON_SI;
0001f8 e3a00028 MOV r0,#0x28
0001fc e59f1378 LDR r1,|L1.1404|
000200 e5810018 STR r0,[r1,#0x18]
;;;369 break;
000204 ea000036 B |L1.740|
|L1.520|
;;;370
;;;371 case I2STAT_DAT_R_ACK:
000208 e1a00000 MOV r0,r0
;;;372 temp = I20DAT;
00020c e59f0368 LDR r0,|L1.1404|
000210 e5905008 LDR r5,[r0,#8]
;;;373 *I2C_BufPtr = temp;
000214 e59f1368 LDR r1,|L1.1412|
000218 e5911000 LDR r1,[r1,#0] ; I2C_BufPtr
00021c e5c15000 STRB r5,[r1,#0]
;;;374 I2C_BufPtr += 1;
000220 e59f035c LDR r0,|L1.1412|
000224 e5900000 LDR r0,[r0,#0] ; I2C_BufPtr
000228 e2800001 ADD r0,r0,#1
00022c e59f1350 LDR r1,|L1.1412|
000230 e5810000 STR r0,[r1,#0] ; I2C_BufPtr
;;;375 I2C_Count -= 1;
000234 e2810004 ADD r0,r1,#4
000238 e5d00000 LDRB r0,[r0,#0] ; I2C_Count
00023c e2400001 SUB r0,r0,#1
000240 e2811004 ADD r1,r1,#4
000244 e5c10000 STRB r0,[r1,#0] ; I2C_Count
;;;376 if (I2C_Count <= 1) {
000248 e2810000 ADD r0,r1,#0
00024c e5d00000 LDRB r0,[r0,#0] ; I2C_Count
000250 e3500001 CMP r0,#1
000254 ca000002 BGT |L1.612|
;;;377 I20CONCLR = I2CON_AA;
000258 e3a00004 MOV r0,#4
00025c e59f1318 LDR r1,|L1.1404|
000260 e5810018 STR r0,[r1,#0x18]
|L1.612|
;;;378 }
;;;379 I20CONCLR = I2CON_STA | I2CON_SI;
000264 e3a00028 MOV r0,#0x28
000268 e59f130c LDR r1,|L1.1404|
00026c e5810018 STR r0,[r1,#0x18]
;;;380 break;
000270 ea00001b B |L1.740|
|L1.628|
;;;381
;;;382 case I2STAT_DAT_R_NOACK:
000274 e1a00000 MOV r0,r0
;;;383 temp = I20DAT;
000278 e59f02fc LDR r0,|L1.1404|
00027c e5905008 LDR r5,[r0,#8]
;;;384 *I2C_BufPtr = temp;
000280 e59f12fc LDR r1,|L1.1412|
000284 e5911000 LDR r1,[r1,#0] ; I2C_BufPtr
000288 e5c15000 STRB r5,[r1,#0]
;;;385 I2C_Count -= 1;
00028c e59f02f4 LDR r0,|L1.1416|
000290 e5d00000 LDRB r0,[r0,#0] ; I2C_Count
000294 e2400001 SUB r0,r0,#1
000298 e59f12e8 LDR r1,|L1.1416|
00029c e5c10000 STRB r0,[r1,#0] ; I2C_Count
;;;386 I20CONSET = I2CON_STO;
0002a0 e3a00010 MOV r0,#0x10
0002a4 e59f12d0 LDR r1,|L1.1404|
0002a8 e5810000 STR r0,[r1,#0]
;;;387 I20CONCLR = I2CON_STA | I2CON_SI;
0002ac e3a00028 MOV r0,#0x28
0002b0 e5810018 STR r0,[r1,#0x18]
;;;388 OSSemPost(I2C_SemWait);
0002b4 e59f02d0 LDR r0,|L1.1420|
0002b8 e5900000 LDR r0,[r0,#0] ; I2C_SemWait
0002bc ebfffffe BL OSSemPost
;;;389 VICIntEnClear = (1 << VIC_I2C0);
0002c0 e3a00c02 MOV r0,#0x200
0002c4 e3a01000 MOV r1,#0
0002c8 e5010fec STR r0,[r1,#-0xfec]
;;;390 break;
0002cc ea000004 B |L1.740|
|L1.720|
;;;391
;;;392 default:
0002d0 e1a00000 MOV r0,r0
;;;393 I20CONCLR = I2CON_STA | I2CON_SI;
0002d4 e3a00028 MOV r0,#0x28
0002d8 e59f129c LDR r1,|L1.1404|
0002dc e5810018 STR r0,[r1,#0x18]
;;;394 break;
0002e0 e1a00000 MOV r0,r0
|L1.740|
0002e4 e1a00000 MOV r0,r0
;;;395 }
;;;396 }
0002e8 e8bd4070 POP {r4-r6,lr}
0002ec e12fff1e BX lr
ENDP
I2C_Init PROC
;;;126 void I2C_Init (void)
;;;127 {
0002f0 e92d4010 PUSH {r4,lr}
;;;128 CPU_INT32U pinsel;
;;;129
;;;130
;;;131 VICIntSelect &= ~(1 << VIC_I2C0); /* Configure the I2C interrupt as an IRQ source */
0002f4 e3a00000 MOV r0,#0
0002f8 e5100ff4 LDR r0,[r0,#-0xff4]
0002fc e3c00c02 BIC r0,r0,#0x200
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -