📄 eprom.txt
字号:
; generated by ARM/Thumb C/C++ Compiler with , RVCT3.0 [Build 951] for uVision
; commandline ArmCC [--debug -c --asm --interleave -oeprom.o --device=DARMP --apcs=interwork -O0 -IC:\Keil\ARM\INC\Philips EPROM\EPROM.c]
ARM
AREA ||.text.7||, CODE, READONLY, ALIGN=2
IRQ_I2C PROC
;;;235 void __irq IRQ_I2C(void)
;;;236 { /* 读取I2C状态寄存器I2DAT */
000000 e92d0003 PUSH {r0,r1}
;;;237 /* 按照全局变量的设置进行操作及设置软件标志 */
;;;238 /* 清除中断逻辑,中断返回 */
;;;239
;;;240 switch (I2C0STAT & 0xF8)
000004 e59f07f4 LDR r0,|L1.2048|
000008 e5d00004 LDRB r0,[r0,#4]
00000c e20000f8 AND r0,r0,#0xf8
000010 e3100007 TST r0,#7
000014 1a0000fd BNE |L1.1040|
000018 e1a001c0 ASR r0,r0,#3
00001c e350000c CMP r0,#0xc
000020 308ff100 ADDCC pc,pc,r0,LSL #2
000024 ea0000f9 B |L1.1040|
000028 ea0000f8 B |L1.1040|
00002c ea000009 B |L1.88|
000030 ea00001b B |L1.164|
000034 ea000022 B |L1.196|
000038 ea0000b7 B |L1.796|
00003c ea000022 B |L1.204|
000040 ea0000b7 B |L1.804|
000044 ea0000b7 B |L1.808|
000048 ea0000a3 B |L1.732|
00004c ea0000b6 B |L1.812|
000050 ea0000bc B |L1.840|
000054 ea0000d9 B |L1.960|
;;;241 { /* 根据状态码进行相应的处理 */
;;;242 case 0x08: /* 已发送起始条件 */ /* 主发送和主接收都有 */
|L1.88|
000058 e1a00000 MOV r0,r0
;;;243 /* 装入SLA+W或者SLA+R */
;;;244 if(I2C_suba_en == 1)/* SLA+R */ /* 指定子地址读 */
00005c e59f07a0 LDR r0,|L1.2052|
000060 e5d00000 LDRB r0,[r0,#0] ; I2C_suba_en
000064 e3500001 CMP r0,#1
000068 1a000005 BNE |L1.132|
;;;245 { I2C0DAT = I2C_sla & 0xFE; /* 先写入地址 */
00006c e59f0794 LDR r0,|L1.2056|
000070 e5d00000 LDRB r0,[r0,#0] ; I2C_sla
000074 e20000fe AND r0,r0,#0xfe
000078 e59f1780 LDR r1,|L1.2048|
00007c e5c10008 STRB r0,[r1,#8]
000080 ea000003 B |L1.148|
;;;246 }
;;;247 else /* SLA+W */
;;;248 { I2C0DAT = I2C_sla; /* 否则直接发送从机地址 */
|L1.132|
000084 e59f077c LDR r0,|L1.2056|
000088 e5d00000 LDRB r0,[r0,#0] ; I2C_sla
00008c e59f176c LDR r1,|L1.2048|
000090 e5c10008 STRB r0,[r1,#8]
;;;249 }
;;;250 /* 清零SI位 */
;;;251 I2C0CONCLR = (1 << 3)| /* SI */
|L1.148|
000094 e3a00028 MOV r0,#0x28
000098 e59f1760 LDR r1,|L1.2048|
00009c e5c10018 STRB r0,[r1,#0x18]
;;;252 (1 << 5); /* STA */
;;;253 break;
0000a0 ea0000dc B |L1.1048|
;;;254
;;;255 case 0x10: /*已发送重复起始条件 */ /* 主发送和主接收都有 */
|L1.164|
0000a4 e1a00000 MOV r0,r0
;;;256 /* 装入SLA+W或者SLA+R */
;;;257 I2C0DAT = I2C_sla; /* 重起总线后,重发从地址 */
0000a8 e59f0758 LDR r0,|L1.2056|
0000ac e5d00000 LDRB r0,[r0,#0] ; I2C_sla
0000b0 e59f1748 LDR r1,|L1.2048|
0000b4 e5c10008 STRB r0,[r1,#8]
;;;258 I2C0CONCLR = 0x28; /* 清零SI,STA */
0000b8 e3a00028 MOV r0,#0x28
0000bc e5c10018 STRB r0,[r1,#0x18]
;;;259 break;
0000c0 ea0000d4 B |L1.1048|
;;;260
;;;261 case 0x18:
|L1.196|
0000c4 e1a00000 MOV r0,r0
;;;262 case 0x28: /* 已发送I2DAT中的数据,已接收ACK */
0000c8 e1a00000 MOV r0,r0
;;;263 if (I2C_suba_en == 0)
|L1.204|
0000cc e59f0730 LDR r0,|L1.2052|
0000d0 e5d00000 LDRB r0,[r0,#0] ; I2C_suba_en
0000d4 e3500000 CMP r0,#0
0000d8 1a00001e BNE |L1.344|
;;;264 {
;;;265 if (I2C_num > 0)
0000dc e59f0728 LDR r0,|L1.2060|
0000e0 e5900000 LDR r0,[r0,#0] ; I2C_num
0000e4 e3500000 CMP r0,#0
0000e8 0a000012 BEQ |L1.312|
;;;266 { I2C0DAT = *I2C_buf++;
0000ec e59f071c LDR r0,|L1.2064|
0000f0 e5900000 LDR r0,[r0,#0] ; I2C_buf
0000f4 e5d00000 LDRB r0,[r0,#0]
0000f8 e59f1700 LDR r1,|L1.2048|
0000fc e5c10008 STRB r0,[r1,#8]
000100 e59f0708 LDR r0,|L1.2064|
000104 e5900000 LDR r0,[r0,#0] ; I2C_buf
000108 e2800001 ADD r0,r0,#1
00010c e59f16fc LDR r1,|L1.2064|
000110 e5810000 STR r0,[r1,#0] ; I2C_buf
;;;267 I2C0CONCLR = 0x28; /* 清零SI,STA */
000114 e3a00028 MOV r0,#0x28
000118 e59f16e0 LDR r1,|L1.2048|
00011c e5c10018 STRB r0,[r1,#0x18]
;;;268 I2C_num--;
000120 e59f06e4 LDR r0,|L1.2060|
000124 e5900000 LDR r0,[r0,#0] ; I2C_num
000128 e2400001 SUB r0,r0,#1
00012c e59f16d8 LDR r1,|L1.2060|
000130 e5810000 STR r0,[r1,#0] ; I2C_num
000134 ea000007 B |L1.344|
;;;269 }
;;;270 else /* 没有数据发送了 */
;;;271 { /* 停止总线 */
;;;272 I2C0CONSET = (1 << 4); /* STO */
|L1.312|
000138 e3a00010 MOV r0,#0x10
00013c e59f16bc LDR r1,|L1.2048|
000140 e5c10000 STRB r0,[r1,#0]
;;;273 I2C0CONCLR = 0x28; /* 清零SI,STA */
000144 e3a00028 MOV r0,#0x28
000148 e5c10018 STRB r0,[r1,#0x18]
;;;274 I2C_end = 1; /* 总线已经停止 */
00014c e3a00001 MOV r0,#1
000150 e59f16bc LDR r1,|L1.2068|
000154 e5c10000 STRB r0,[r1,#0] ; I2C_end
;;;275 }
;;;276 }
;;;277
;;;278 if(I2C_suba_en == 1) /* 若是指定地址读,则重新启动总线 */
|L1.344|
000158 e59f06a4 LDR r0,|L1.2052|
00015c e5d00000 LDRB r0,[r0,#0] ; I2C_suba_en
000160 e3500001 CMP r0,#1
000164 1a00002e BNE |L1.548|
;;;279 {
;;;280 if (I2C_suba_num == 2)
000168 e59f06a8 LDR r0,|L1.2072|
00016c e5d00000 LDRB r0,[r0,#0] ; I2C_suba_num
000170 e3500002 CMP r0,#2
000174 1a00000d BNE |L1.432|
;;;281 { I2C0DAT = ((I2C_suba >> 8) & 0xff);
000178 e59f069c LDR r0,|L1.2076|
00017c e5900000 LDR r0,[r0,#0] ; I2C_suba
000180 e1a00800 LSL r0,r0,#16
000184 e1a00c20 LSR r0,r0,#24
000188 e59f1670 LDR r1,|L1.2048|
00018c e5c10008 STRB r0,[r1,#8]
;;;282 I2C0CONCLR = 0x28; /* 清零SI,STA */
000190 e3a00028 MOV r0,#0x28
000194 e5c10018 STRB r0,[r1,#0x18]
;;;283 I2C_suba_num--;
000198 e59f0678 LDR r0,|L1.2072|
00019c e5d00000 LDRB r0,[r0,#0] ; I2C_suba_num
0001a0 e2400001 SUB r0,r0,#1
0001a4 e59f166c LDR r1,|L1.2072|
0001a8 e5c10000 STRB r0,[r1,#0] ; I2C_suba_num
;;;284 break;
0001ac ea000099 B |L1.1048|
;;;285 }
;;;286
;;;287 if(I2C_suba_num == 1)
|L1.432|
0001b0 e59f0660 LDR r0,|L1.2072|
0001b4 e5d00000 LDRB r0,[r0,#0] ; I2C_suba_num
0001b8 e3500001 CMP r0,#1
0001bc 1a00000b BNE |L1.496|
;;;288 { I2C0DAT = (I2C_suba & 0xff);
0001c0 e59f0654 LDR r0,|L1.2076|
0001c4 e5900000 LDR r0,[r0,#0] ; I2C_suba
0001c8 e59f1630 LDR r1,|L1.2048|
0001cc e5c10008 STRB r0,[r1,#8]
;;;289 I2C0CONCLR = 0x28; /* 清零SI,STA */
0001d0 e3a00028 MOV r0,#0x28
0001d4 e5c10018 STRB r0,[r1,#0x18]
;;;290 I2C_suba_num--;
0001d8 e59f0638 LDR r0,|L1.2072|
0001dc e5d00000 LDRB r0,[r0,#0] ; I2C_suba_num
0001e0 e2400001 SUB r0,r0,#1
0001e4 e59f162c LDR r1,|L1.2072|
0001e8 e5c10000 STRB r0,[r1,#0] ; I2C_suba_num
;;;291 break;
0001ec ea000089 B |L1.1048|
;;;292 }
;;;293
;;;294 if (I2C_suba_num == 0)
|L1.496|
0001f0 e59f0620 LDR r0,|L1.2072|
0001f4 e5d00000 LDRB r0,[r0,#0] ; I2C_suba_num
0001f8 e3500000 CMP r0,#0
0001fc 1a000008 BNE |L1.548|
;;;295 { I2C0CONSET = 0x20;
000200 e3a00020 MOV r0,#0x20
000204 e59f15f4 LDR r1,|L1.2048|
000208 e5c10000 STRB r0,[r1,#0]
;;;296 I2C0CONCLR = 0x08;
00020c e3a00008 MOV r0,#8
000210 e5c10018 STRB r0,[r1,#0x18]
;;;297 I2C_suba_en = 0; /* 子地址己处理 */
000214 e3a00000 MOV r0,#0
000218 e59f15e4 LDR r1,|L1.2052|
00021c e5c10000 STRB r0,[r1,#0] ; I2C_suba_en
;;;298 break;
000220 ea00007c B |L1.1048|
;;;299 }
;;;300 }
;;;301
;;;302 if (I2C_suba_en == 2)/* 指定子地址写,子地址尚未指定,则发送子地址 */
|L1.548|
000224 e59f05d8 LDR r0,|L1.2052|
000228 e5d00000 LDRB r0,[r0,#0] ; I2C_suba_en
00022c e3500002 CMP r0,#2
000230 1a000028 BNE |L1.728|
;;;303 {
;;;304 if (I2C_suba_num > 0)
000234 e59f05dc LDR r0,|L1.2072|
000238 e5d00000 LDRB r0,[r0,#0] ; I2C_suba_num
00023c e3500000 CMP r0,#0
000240 da000024 BLE |L1.728|
;;;305 { if (I2C_suba_num == 2)
000244 e59f05cc LDR r0,|L1.2072|
000248 e5d00000 LDRB r0,[r0,#0] ; I2C_suba_num
00024c e3500002 CMP r0,#2
000250 1a00000d BNE |L1.652|
;;;306 { I2C0DAT = ((I2C_suba >> 8) & 0xff);
000254 e59f05c0 LDR r0,|L1.2076|
000258 e5900000 LDR r0,[r0,#0] ; I2C_suba
00025c e1a00800 LSL r0,r0,#16
000260 e1a00c20 LSR r0,r0,#24
000264 e59f1594 LDR r1,|L1.2048|
000268 e5c10008 STRB r0,[r1,#8]
;;;307 I2C0CONCLR = 0x28;
00026c e3a00028 MOV r0,#0x28
000270 e5c10018 STRB r0,[r1,#0x18]
;;;308 I2C_suba_num--;
000274 e59f059c LDR r0,|L1.2072|
000278 e5d00000 LDRB r0,[r0,#0] ; I2C_suba_num
00027c e2400001 SUB r0,r0,#1
000280 e59f1590 LDR r1,|L1.2072|
000284 e5c10000 STRB r0,[r1,#0] ; I2C_suba_num
;;;309 break;
000288 ea000062 B |L1.1048|
;;;310 }
;;;311 if (I2C_suba_num == 1)
|L1.652|
00028c e59f0584 LDR r0,|L1.2072|
000290 e5d00000 LDRB r0,[r0,#0] ; I2C_suba_num
000294 e3500001 CMP r0,#1
000298 1a00000e BNE |L1.728|
;;;312 { I2C0DAT = (I2C_suba & 0xff);
00029c e59f0578 LDR r0,|L1.2076|
0002a0 e5900000 LDR r0,[r0,#0] ; I2C_suba
0002a4 e59f1554 LDR r1,|L1.2048|
0002a8 e5c10008 STRB r0,[r1,#8]
;;;313 I2C0CONCLR = 0x28;
0002ac e3a00028 MOV r0,#0x28
0002b0 e5c10018 STRB r0,[r1,#0x18]
;;;314 I2C_suba_num--;
0002b4 e59f055c LDR r0,|L1.2072|
0002b8 e5d00000 LDRB r0,[r0,#0] ; I2C_suba_num
0002bc e2400001 SUB r0,r0,#1
0002c0 e59f1550 LDR r1,|L1.2072|
0002c4 e5c10000 STRB r0,[r1,#0] ; I2C_suba_num
;;;315 I2C_suba_en = 0;
0002c8 e3a00000 MOV r0,#0
0002cc e59f1530 LDR r1,|L1.2052|
0002d0 e5c10000 STRB r0,[r1,#0] ; I2C_suba_en
;;;316 break;
0002d4 ea00004f B |L1.1048|
;;;317 }
;;;318 }
;;;319 }
;;;320 break;
|L1.728|
0002d8 ea00004e B |L1.1048|
;;;321
;;;322 case 0x40: /* 已发送SLA+R,已接收ACK */
|L1.732|
0002dc e1a00000 MOV r0,r0
;;;323 if (I2C_num <= 1) /* 如果是最后一个字节 */
0002e0 e59f0524 LDR r0,|L1.2060|
0002e4 e5900000 LDR r0,[r0,#0] ; I2C_num
0002e8 e3500001 CMP r0,#1
0002ec 8a000003 BHI |L1.768|
;;;324 { I2C0CONCLR = 1 << 2; /* 下次发送非应答信号 */
0002f0 e3a00004 MOV r0,#4
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -