⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 eprom.txt

📁 一个电力系统谐波检测的程序
💻 TXT
📖 第 1 页 / 共 3 页
字号:
; 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 + -