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

📄 eprom.txt

📁 一个电力系统谐波检测的程序
💻 TXT
📖 第 1 页 / 共 3 页
字号:
0002f4  e59f1504          LDR      r1,|L1.2048|
0002f8  e5c10018          STRB     r0,[r1,#0x18]
0002fc  ea000002          B        |L1.780|
;;;325           		}
;;;326           		else
;;;327           		{ 	I2C0CONSET = 1 << 2;						/* 下次发送应答信号 		*/
                  |L1.768|
000300  e3a00004          MOV      r0,#4
000304  e59f14f4          LDR      r1,|L1.2048|
000308  e5c10000          STRB     r0,[r1,#0]
;;;328           		}
;;;329           		I2C0CONCLR = 0x28;							/* 清零SI,STA 				*/
                  |L1.780|
00030c  e3a00028          MOV      r0,#0x28
000310  e59f14e8          LDR      r1,|L1.2048|
000314  e5c10018          STRB     r0,[r1,#0x18]
;;;330           		break;
000318  ea00003e          B        |L1.1048|
;;;331    
;;;332           	case 0x20:	/* 已发送SLA+W,已接收非应答              */
                  |L1.796|
00031c  e1a00000          MOV      r0,r0
;;;333           	case 0x30:	/* 已发送I2DAT中的数据,已接收非应答     */
000320  e1a00000          MOV      r0,r0
;;;334           	case 0x38:	/* 在SLA+R/W或数据字节中丢失仲裁         */
                  |L1.804|
000324  e1a00000          MOV      r0,r0
;;;335       		case 0x48:	/* 已发送SLA+R,已接收非应答              */
                  |L1.808|
000328  e1a00000          MOV      r0,r0
;;;336             	I2C0CONCLR = 0x28;
                  |L1.812|
00032c  e3a00028          MOV      r0,#0x28
000330  e59f14c8          LDR      r1,|L1.2048|
000334  e5c10018          STRB     r0,[r1,#0x18]
;;;337                I2C_end = 0xFF; 
000338  e3a000ff          MOV      r0,#0xff
00033c  e59f14d0          LDR      r1,|L1.2068|
000340  e5c10000          STRB     r0,[r1,#0]  ; I2C_end
;;;338           		break;   				
000344  ea000033          B        |L1.1048|
;;;339    	
;;;340    		case 0x50:	/* 已接收数据字节,已返回ACK */
                  |L1.840|
000348  e1a00000          MOV      r0,r0
;;;341    			*I2C_buf++ = I2C0DAT;
00034c  e59f04ac          LDR      r0,|L1.2048|
000350  e5d00008          LDRB     r0,[r0,#8]
000354  e59f14b4          LDR      r1,|L1.2064|
000358  e5911000          LDR      r1,[r1,#0]  ; I2C_buf
00035c  e5c10000          STRB     r0,[r1,#0]
000360  e59f04a8          LDR      r0,|L1.2064|
000364  e5900000          LDR      r0,[r0,#0]  ; I2C_buf
000368  e2800001          ADD      r0,r0,#1
00036c  e59f149c          LDR      r1,|L1.2064|
000370  e5810000          STR      r0,[r1,#0]  ; I2C_buf
;;;342    			I2C_num--;
000374  e59f0490          LDR      r0,|L1.2060|
000378  e5900000          LDR      r0,[r0,#0]  ; I2C_num
00037c  e2400001          SUB      r0,r0,#1
000380  e59f1484          LDR      r1,|L1.2060|
000384  e5810000          STR      r0,[r1,#0]  ; I2C_num
;;;343    			if (I2C_num == 1)/* 接收最后一个字节 */
000388  e2810000          ADD      r0,r1,#0
00038c  e5900000          LDR      r0,[r0,#0]  ; I2C_num
000390  e3500001          CMP      r0,#1
000394  1a000003          BNE      |L1.936|
;;;344    			{  	I2C0CONCLR = 0x2C;						/* STA,SI,AA = 0 			*/
000398  e3a0002c          MOV      r0,#0x2c
00039c  e59f145c          LDR      r1,|L1.2048|
0003a0  e5c10018          STRB     r0,[r1,#0x18]
0003a4  ea000004          B        |L1.956|
;;;345    			}
;;;346    			else
;;;347    			{  	I2C0CONSET = 0x04;						/* AA=1 					*/
                  |L1.936|
0003a8  e3a00004          MOV      r0,#4
0003ac  e59f144c          LDR      r1,|L1.2048|
0003b0  e5c10000          STRB     r0,[r1,#0]
;;;348    			  	I2C0CONCLR = 0x28;
0003b4  e3a00028          MOV      r0,#0x28
0003b8  e5c10018          STRB     r0,[r1,#0x18]
;;;349    			}
;;;350    			break;
                  |L1.956|
0003bc  ea000015          B        |L1.1048|
;;;351    		
;;;352    		case 0x58:	/* 已接收数据字节,已返回非应答 */
                  |L1.960|
0003c0  e1a00000          MOV      r0,r0
;;;353    			*I2C_buf++ = I2C0DAT;     					/* 读取最后一字节数据 		*/
0003c4  e59f0434          LDR      r0,|L1.2048|
0003c8  e5d00008          LDRB     r0,[r0,#8]
0003cc  e59f143c          LDR      r1,|L1.2064|
0003d0  e5911000          LDR      r1,[r1,#0]  ; I2C_buf
0003d4  e5c10000          STRB     r0,[r1,#0]
0003d8  e59f0430          LDR      r0,|L1.2064|
0003dc  e5900000          LDR      r0,[r0,#0]  ; I2C_buf
0003e0  e2800001          ADD      r0,r0,#1
0003e4  e59f1424          LDR      r1,|L1.2064|
0003e8  e5810000          STR      r0,[r1,#0]  ; I2C_buf
;;;354                I2C0CONSET = 0x10;        					/* 结束总线 				*/
0003ec  e3a00010          MOV      r0,#0x10
0003f0  e59f1408          LDR      r1,|L1.2048|
0003f4  e5c10000          STRB     r0,[r1,#0]
;;;355                I2C0CONCLR = 0x28;
0003f8  e3a00028          MOV      r0,#0x28
0003fc  e5c10018          STRB     r0,[r1,#0x18]
;;;356                I2C_end = 1; 
000400  e3a00001          MOV      r0,#1
000404  e59f1408          LDR      r1,|L1.2068|
000408  e5c10000          STRB     r0,[r1,#0]  ; I2C_end
;;;357                break;
00040c  ea000001          B        |L1.1048|
;;;358                
;;;359          	default:
                  |L1.1040|
000410  e1a00000          MOV      r0,r0
;;;360          		break;
000414  e1a00000          MOV      r0,r0
                  |L1.1048|
000418  e1a00000          MOV      r0,r0                 ;253
;;;361    	}
;;;362       VICVectAddr = 0x00;              					/* 中断处理结束 			*/
00041c  e3a00000          MOV      r0,#0
000420  e5000fd0          STR      r0,[r0,#-0xfd0]
;;;363    }
000424  e8bd0003          POP      {r0,r1}
000428  e25ef004          SUBS     pc,lr,#4
                          ENDP

                  I2cInit PROC
;;;34     void I2cInit(uint32 Fi2c)
;;;35     {
00042c  e92d4010          PUSH     {r4,lr}
000430  e1a04000          MOV      r4,r0
;;;36     	if (Fi2c > 400000)
000434  e59f03e4          LDR      r0,|L1.2080|
000438  e1540000          CMP      r4,r0
00043c  9a000000          BLS      |L1.1092|
;;;37     		Fi2c = 400000;
000440  e1a04000          MOV      r4,r0
;;;38     		
;;;39        	//PINSEL0 = (PINSEL0 & 0xFFFFFF0F) | 0x50; 			/* 设置I2C控制口有效 				*/
;;;40     	PINSEL0 = (PINSEL0 & (~0xF0)) | 0x50; 	// 不影响其它管脚连接
                  |L1.1092|
000444  e59f03d8          LDR      r0,|L1.2084|
000448  e5900000          LDR      r0,[r0,#0]
00044c  e3c000f0          BIC      r0,r0,#0xf0
000450  e3800050          ORR      r0,r0,#0x50
000454  e59f13c8          LDR      r1,|L1.2084|
000458  e5810000          STR      r0,[r1,#0]
;;;41     	I2C0SCLH = (Fpclk/Fi2c + 1) / 2;						/* 设定I2C时钟 						*/
00045c  e1a01004          MOV      r1,r4
000460  e59f03c0          LDR      r0,|L1.2088|
000464  ebfffffe          BL       __aeabi_uidivmod
000468  e2800001          ADD      r0,r0,#1
00046c  e59f13b8          LDR      r1,|L1.2092|
000470  e00100a0          AND      r0,r1,r0,LSR #1
000474  e59f1384          LDR      r1,|L1.2048|
000478  e1c101b0          STRH     r0,[r1,#0x10]
;;;42     	I2C0SCLL = (Fpclk/Fi2c)/2;
00047c  e1a01004          MOV      r1,r4
000480  e59f03a0          LDR      r0,|L1.2088|
000484  ebfffffe          BL       __aeabi_uidivmod
000488  e59f139c          LDR      r1,|L1.2092|
00048c  e00100a0          AND      r0,r1,r0,LSR #1
000490  e59f1368          LDR      r1,|L1.2048|
000494  e1c101b4          STRH     r0,[r1,#0x14]
;;;43     	I2C0CONCLR = 0x2C;
000498  e3a0002c          MOV      r0,#0x2c
00049c  e5c10018          STRB     r0,[r1,#0x18]
;;;44     	I2C0CONSET = 0x40;									/* 使能主I2C 						*/
0004a0  e3a00040          MOV      r0,#0x40
0004a4  e5c10000          STRB     r0,[r1,#0]
;;;45     	
;;;46     	/* 设置I2C中断允许 */
;;;47     	VICIntSelect = 0x00000000;							/* 设置所有通道为IRQ中断 			*/
0004a8  e3a00000          MOV      r0,#0
0004ac  e5000ff4          STR      r0,[r0,#-0xff4]
;;;48     	VICVectCntl6 = (0x20 | 0x09);						/* I2C通道分配到IRQ slot0,最高优先级 */
0004b0  e3a00029          MOV      r0,#0x29
0004b4  e3a01000          MOV      r1,#0
0004b8  e5010de8          STR      r0,[r1,#-0xde8]
;;;49     	VICVectAddr6 = (int32)IRQ_I2C;						/* 设置I2C中断向量 					*/
0004bc  e59f036c          LDR      r0,|L1.2096|
0004c0  e5010ee8          STR      r0,[r1,#-0xee8]
;;;50     	VICIntEnable = (1 << 9);							/* 使能I2C中断 						*/
0004c4  e3a00c02          MOV      r0,#0x200
0004c8  e5010ff0          STR      r0,[r1,#-0xff0]
;;;51     }
0004cc  e8bd4010          POP      {r4,lr}
0004d0  e12fff1e          BX       lr
                          ENDP

                  ISendByte PROC
;;;62     uint8  ISendByte(uint8 sla, uint8 dat)
;;;63     {  /* 参数设置 */
0004d4  e92d0003          PUSH     {r0,r1}
0004d8  e1a02000          MOV      r2,r0
;;;64        I2C_sla     = sla;		// 写操作的器件地址
0004dc  e59f0324          LDR      r0,|L1.2056|
0004e0  e5c02000          STRB     r2,[r0,#0]  ; I2C_sla
;;;65        I2C_buf     = &dat;		// 待发送的数据
0004e4  e28d0004          ADD      r0,sp,#4
0004e8  e59f1320          LDR      r1,|L1.2064|
0004ec  e5810000          STR      r0,[r1,#0]  ; I2C_buf
;;;66        I2C_num     = 1;			// 发送1字节数据
0004f0  e3a00001          MOV      r0,#1
0004f4  e59f1310          LDR      r1,|L1.2060|
0004f8  e5810000          STR      r0,[r1,#0]  ; I2C_num
;;;67        I2C_suba_en = 0;		 	// 无子地址
0004fc  e3a00000          MOV      r0,#0
000500  e59f12fc          LDR      r1,|L1.2052|
000504  e5c10000          STRB     r0,[r1,#0]  ; I2C_suba_en
;;;68        I2C_end     = 0;
000508  e59f1304          LDR      r1,|L1.2068|
00050c  e5c10000          STRB     r0,[r1,#0]  ; I2C_end
;;;69        
;;;70        I2C0CONCLR = 0x2C;
000510  e3a0002c          MOV      r0,#0x2c
000514  e59f12e4          LDR      r1,|L1.2048|
000518  e5c10018          STRB     r0,[r1,#0x18]
;;;71        I2C0CONSET = 0x60;             // 设置为主机,并启动总线
00051c  e3a00060          MOV      r0,#0x60
000520  e5c10000          STRB     r0,[r1,#0]
;;;72        
;;;73        while(0==I2C_end);
000524  e1a00000          MOV      r0,r0
                  |L1.1320|
000528  e59f02e4          LDR      r0,|L1.2068|
00052c  e5d00000          LDRB     r0,[r0,#0]  ; I2C_end
000530  e3500000          CMP      r0,#0
000534  0afffffb          BEQ      |L1.1320|
;;;74        if(1==I2C_end) return(1);
000538  e59f02d4          LDR      r0,|L1.2068|
00053c  e5d00000          LDRB     r0,[r0,#0]  ; I2C_end
000540  e3500001          CMP      r0,#1
000544  1a000002          BNE      |L1.1364|
000548  e3a00001          MOV      r0,#1
                  |L1.1356|
00054c  e28dd008          ADD      sp,sp,#8
;;;75          else return(0);
;;;76     }
000550  e12fff1e          BX       lr
                  |L1.1364|
000554  e3a00000          MOV      r0,#0                 ;75
000558  eafffffb          B        |L1.1356|             ;75
                          ENDP

                  IRcvByte PROC
;;;88     uint8  IRcvByte(uint8 sla, uint8 *dat)
;;;89     {  /* 参数设置 */
00055c  e1a02000          MOV      r2,r0
;;;90        I2C_sla     = sla+1;		// 读操作的器件地址
000560  e2820001          ADD      r0,r2,#1
000564  e59f329c          LDR      r3,|L1.2056|
000568  e5c30000          STRB     r0,[r3,#0]  ; I2C_sla
;;;91        I2C_buf     = dat;
00056c  e59f029c          LDR      r0,|L1.2064|
000570  e5801000          STR      r1,[r0,#0]  ; I2C_buf
;;;92        I2C_num     = 1;
000574  e3a00001          MOV      r0,#1
000578  e59f328c          LDR      r3,|L1.2060|
00057c  e5830000          STR      r0,[r3,#0]  ; I2C_num
;;;93        I2C_suba_en = 0;			// 无子地址
000580  e3a00000          MOV      r0,#0
000584  e59f3278          LDR      r3,|L1.2052|
000588  e5c30000          STRB     r0,[r3,#0]  ; I2C_suba_en
;;;94        I2C_end     = 0;
00058c  e59f3280          LDR      r3,|L1.2068|
000590  e5c30000          STRB     r0,[r3,#0]  ; I2C_end
;;;95        
;;;96        I2C0CONCLR = 0x2C;
000594  e3a0002c          MOV      r0,#0x2c
000598  e59f3260          LDR      r3,|L1.2048|
00059c  e5c30018          STRB     r0,[r3,#0x18]
;;;97        I2C0CONSET = 0x60;         // 设置为主机,并启动总线
0005a0  e3a00060          MOV      r0,#0x60
0005a4  e5c30000          STRB     r0,[r3,#0]
;;;98        
;;;99        while(0==I2C_end);
0005a8  e1a00000          MOV      r0,r0
                  |L1.1452|
0005ac  e59f0260          LDR      r0,|L1.2068|
0005b0  e5d00000          LDRB     r0,[r0,#0]  ; I2C_end
0005b4  e3500000          CMP      r0,#0
0005b8  0afffffb          BEQ      |L1.1452|
;;;100       if(1==I2C_end) return(1);
0005bc  e59f0250          LDR      r0,|L1.2068|
0005c0  e5d00000          LDRB     r0,[r0,#0]  ; I2C_end
0005c4  e3500001          CMP      r0,#1
0005c8  1a000001          BNE      |L1.1492|
0005cc  e3a00001          MOV      r0,#1
;;;101         else return(0);
;;;102    }
                  |L1.1488|
0005d0  e12fff1e          BX       lr
                  |L1.1492|
0005d4  e3a00000          MOV      r0,#0                 ;101
0005d8  eafffffc          B        |L1.1488|             ;101

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -