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

📄 eprom.txt

📁 一个电力系统谐波检测的程序
💻 TXT
📖 第 1 页 / 共 3 页
字号:
                          ENDP

                  I2C_ReadNByte PROC
;;;118    uint8 I2C_ReadNByte (uint8 sla, uint32 suba_type, uint32 suba, uint8 *s, uint32 num)
;;;119    {
0005dc  e92d4010          PUSH     {r4,lr}
0005e0  e1a0c000          MOV      r12,r0
0005e4  e59de008          LDR      lr,[sp,#8]
;;;120    	if (num > 0)	/* 判断num个数的合法性 */
0005e8  e35e0000          CMP      lr,#0
0005ec  0a00003e          BEQ      |L1.1772|
;;;121    	{	/* 参数设置 */
;;;122    		if (suba_type == 1)
0005f0  e3510001          CMP      r1,#1
0005f4  1a000007          BNE      |L1.1560|
;;;123    		{	/* 子地址为单字节 */
;;;124    			I2C_sla     	= sla + 1;							/* 读器件的从地址,R=1 	*/
0005f8  e28c0001          ADD      r0,r12,#1
0005fc  e59f4204          LDR      r4,|L1.2056|
000600  e5c40000          STRB     r0,[r4,#0]  ; I2C_sla
;;;125    			I2C_suba    	= suba;								/* 器件子地址 			*/
000604  e59f0210          LDR      r0,|L1.2076|
000608  e5802000          STR      r2,[r0,#0]  ; I2C_suba
;;;126    			I2C_suba_num	= 1;								/* 器件子地址为1字节 	*/
00060c  e3a00001          MOV      r0,#1
000610  e59f4200          LDR      r4,|L1.2072|
000614  e5c40000          STRB     r0,[r4,#0]  ; I2C_suba_num
;;;127    		}
;;;128    		if (suba_type == 2)
                  |L1.1560|
000618  e3510002          CMP      r1,#2
00061c  1a000007          BNE      |L1.1600|
;;;129    		{	/* 子地址为2字节 */
;;;130    			I2C_sla     	= sla + 1;							/* 读器件的从地址,R=1 	*/
000620  e28c0001          ADD      r0,r12,#1
000624  e59f41dc          LDR      r4,|L1.2056|
000628  e5c40000          STRB     r0,[r4,#0]  ; I2C_sla
;;;131    			I2C_suba   	 	= suba;								/* 器件子地址 			*/
00062c  e59f01e8          LDR      r0,|L1.2076|
000630  e5802000          STR      r2,[r0,#0]  ; I2C_suba
;;;132    			I2C_suba_num	= 2;								/* 器件子地址为2字节 	*/
000634  e3a00002          MOV      r0,#2
000638  e59f41d8          LDR      r4,|L1.2072|
00063c  e5c40000          STRB     r0,[r4,#0]  ; I2C_suba_num
;;;133    		}
;;;134    		if (suba_type == 3)
                  |L1.1600|
000640  e3510003          CMP      r1,#3
000644  1a00000b          BNE      |L1.1656|
;;;135    		{	/* 子地址结构为8+X*/
;;;136    			I2C_sla			= sla + ((suba >> 7 )& 0x0e) + 1;	/* 读器件的从地址,R=1	*/
000648  e3a0000e          MOV      r0,#0xe
00064c  e00003a2          AND      r0,r0,r2,LSR #7
000650  e080000c          ADD      r0,r0,r12
000654  e2800001          ADD      r0,r0,#1
000658  e59f41a8          LDR      r4,|L1.2056|
00065c  e5c40000          STRB     r0,[r4,#0]  ; I2C_sla
;;;137    			I2C_suba		= suba & 0x0ff;						/* 器件子地址	 		*/
000660  e20200ff          AND      r0,r2,#0xff
000664  e59f41b0          LDR      r4,|L1.2076|
000668  e5840000          STR      r0,[r4,#0]  ; I2C_suba
;;;138    			I2C_suba_num	= 1;								/* 器件子地址为8+x	 	*/
00066c  e3a00001          MOV      r0,#1
000670  e59f41a0          LDR      r4,|L1.2072|
000674  e5c40000          STRB     r0,[r4,#0]  ; I2C_suba_num
;;;139    		}
;;;140    		I2C_buf     = s;										/* 数据接收缓冲区指针 	*/
                  |L1.1656|
000678  e59f0190          LDR      r0,|L1.2064|
00067c  e5803000          STR      r3,[r0,#0]  ; I2C_buf
;;;141    		I2C_num     = num;										/* 要读取的个数 		*/
000680  e59f0184          LDR      r0,|L1.2060|
000684  e580e000          STR      lr,[r0,#0]  ; I2C_num
;;;142    		I2C_suba_en = 1;										/* 有子地址读 			*/
000688  e3a00001          MOV      r0,#1
00068c  e59f4170          LDR      r4,|L1.2052|
000690  e5c40000          STRB     r0,[r4,#0]  ; I2C_suba_en
;;;143    		I2C_end     = 0;
000694  e3a00000          MOV      r0,#0
000698  e59f4174          LDR      r4,|L1.2068|
00069c  e5c40000          STRB     r0,[r4,#0]  ; I2C_end
;;;144    		
;;;145    		/* 清除STA,SI,AA标志位 */
;;;146    		I2C0CONCLR = 	(1 << 2)|	/* AA 		*/
0006a0  e3a0002c          MOV      r0,#0x2c
0006a4  e59f4154          LDR      r4,|L1.2048|
0006a8  e5c40018          STRB     r0,[r4,#0x18]
;;;147    					(1 << 3)|	/* SI 		*/
;;;148    					(1 << 5);	/* STA 		*/
;;;149    		
;;;150    		/* 置位STA,启动I2C总线 */
;;;151    		I2C0CONSET = 	(1 << 5)|	/* STA 		*/
0006ac  e3a00060          MOV      r0,#0x60
0006b0  e5c40000          STRB     r0,[r4,#0]
;;;152    					(1 << 6);	/* I2CEN 	*/
;;;153    		
;;;154    		/* 等待I2C操作完成 */
;;;155    		while (I2C_end == 0)
0006b4  e1a00000          MOV      r0,r0
                  |L1.1720|
0006b8  e59f0154          LDR      r0,|L1.2068|
0006bc  e5d00000          LDRB     r0,[r0,#0]  ; I2C_end
0006c0  e3500000          CMP      r0,#0
0006c4  0afffffb          BEQ      |L1.1720|
;;;156    		{	}
;;;157    		if (I2C_end == 1)
0006c8  e59f0144          LDR      r0,|L1.2068|
0006cc  e5d00000          LDRB     r0,[r0,#0]  ; I2C_end
0006d0  e3500001          CMP      r0,#1
0006d4  1a000002          BNE      |L1.1764|
;;;158    			return (TRUE);
0006d8  e3a00001          MOV      r0,#1
                  |L1.1756|
0006dc  e8bd4010          POP      {r4,lr}
;;;159    		else
;;;160    			return (FALSE);			
;;;161    	}
;;;162    	return (FALSE);
;;;163    }
0006e0  e12fff1e          BX       lr
                  |L1.1764|
0006e4  e3a00000          MOV      r0,#0                 ;160
0006e8  eafffffb          B        |L1.1756|             ;160
                  |L1.1772|
0006ec  e3a00000          MOV      r0,#0                 ;162
0006f0  eafffff9          B        |L1.1756|             ;162
                          ENDP

                  I2C_WriteNByte PROC
;;;178    uint8 I2C_WriteNByte(uint8 sla, uint8 suba_type, uint32 suba, uint8 *s, uint32 num)
;;;179    {
0006f4  e92d4010          PUSH     {r4,lr}
0006f8  e1a0e000          MOV      lr,r0
0006fc  e59dc008          LDR      r12,[sp,#8]
;;;180    	if (num > 0)/* 如果读取的个数为0,则返回错误 */
000700  e35c0000          CMP      r12,#0
000704  0a00003b          BEQ      |L1.2040|
;;;181    	{	/* 设置参数 */	
;;;182    		if (suba_type == 1)
000708  e3510001          CMP      r1,#1
00070c  1a000006          BNE      |L1.1836|
;;;183    		{	/* 子地址为单字节 */
;;;184    			I2C_sla     	= sla;								/* 读器件的从地址	 	*/
000710  e59f00f0          LDR      r0,|L1.2056|
000714  e5c0e000          STRB     lr,[r0,#0]  ; I2C_sla
;;;185    			I2C_suba    	= suba;								/* 器件子地址 			*/
000718  e59f00fc          LDR      r0,|L1.2076|
00071c  e5802000          STR      r2,[r0,#0]  ; I2C_suba
;;;186    			I2C_suba_num	= 1;								/* 器件子地址为1字节 	*/
000720  e3a00001          MOV      r0,#1
000724  e59f40ec          LDR      r4,|L1.2072|
000728  e5c40000          STRB     r0,[r4,#0]  ; I2C_suba_num
;;;187    		}
;;;188    		if (suba_type == 2)
                  |L1.1836|
00072c  e3510002          CMP      r1,#2
000730  1a000006          BNE      |L1.1872|
;;;189    		{	/* 子地址为2字节 */
;;;190    			I2C_sla     	= sla;								/* 读器件的从地址 		*/
000734  e59f00cc          LDR      r0,|L1.2056|
000738  e5c0e000          STRB     lr,[r0,#0]  ; I2C_sla
;;;191    			I2C_suba   	 	= suba;								/* 器件子地址 			*/
00073c  e59f00d8          LDR      r0,|L1.2076|
000740  e5802000          STR      r2,[r0,#0]  ; I2C_suba
;;;192    			I2C_suba_num	= 2;								/* 器件子地址为2字节 	*/
000744  e3a00002          MOV      r0,#2
000748  e59f40c8          LDR      r4,|L1.2072|
00074c  e5c40000          STRB     r0,[r4,#0]  ; I2C_suba_num
;;;193    		}
;;;194    		if (suba_type == 3)
                  |L1.1872|
000750  e3510003          CMP      r1,#3
000754  1a00000a          BNE      |L1.1924|
;;;195    		{	/* 子地址结构为8+X */
;;;196    			I2C_sla			= sla + ((suba >> 7 )& 0x0e);		/* 读器件的从地址		*/
000758  e3a0000e          MOV      r0,#0xe
00075c  e00003a2          AND      r0,r0,r2,LSR #7
000760  e080000e          ADD      r0,r0,lr
000764  e59f409c          LDR      r4,|L1.2056|
000768  e5c40000          STRB     r0,[r4,#0]  ; I2C_sla
;;;197    			I2C_suba		= suba & 0x0ff;						/* 器件子地址			*/
00076c  e20200ff          AND      r0,r2,#0xff
000770  e59f40a4          LDR      r4,|L1.2076|
000774  e5840000          STR      r0,[r4,#0]  ; I2C_suba
;;;198    			I2C_suba_num	= 1;								/* 器件子地址为8+X	 	*/
000778  e3a00001          MOV      r0,#1
00077c  e59f4094          LDR      r4,|L1.2072|
000780  e5c40000          STRB     r0,[r4,#0]  ; I2C_suba_num
;;;199    		}
;;;200    
;;;201    		I2C_buf     = s;										/* 数据 				*/
                  |L1.1924|
000784  e59f0084          LDR      r0,|L1.2064|
000788  e5803000          STR      r3,[r0,#0]  ; I2C_buf
;;;202    		I2C_num     = num;										/* 数据个数 			*/
00078c  e59f0078          LDR      r0,|L1.2060|
000790  e580c000          STR      r12,[r0,#0]  ; I2C_num
;;;203    		I2C_suba_en = 2;										/* 有子地址,写操作 	*/
000794  e3a00002          MOV      r0,#2
000798  e59f4064          LDR      r4,|L1.2052|
00079c  e5c40000          STRB     r0,[r4,#0]  ; I2C_suba_en
;;;204    		I2C_end     = 0;
0007a0  e3a00000          MOV      r0,#0
0007a4  e59f4068          LDR      r4,|L1.2068|
0007a8  e5c40000          STRB     r0,[r4,#0]  ; I2C_end
;;;205    		
;;;206    		/* 清除STA,SI,AA标志位 */
;;;207    		I2C0CONCLR = 	(1 << 2)|	/* AA 	*/
0007ac  e3a0002c          MOV      r0,#0x2c
0007b0  e59f4048          LDR      r4,|L1.2048|
0007b4  e5c40018          STRB     r0,[r4,#0x18]
;;;208    					(1 << 3)|	/* SI 	*/
;;;209    					(1 << 5);	/* STA 	*/
;;;210    		
;;;211    		/* 置位STA,启动I2C总线 */
;;;212    		I2C0CONSET = 	(1 << 5)|	/* STA 	*/
0007b8  e3a00060          MOV      r0,#0x60
0007bc  e5c40000          STRB     r0,[r4,#0]
;;;213    					(1 << 6);	/* I2CEN*/
;;;214    		
;;;215    		/* 等待I2C操作完成 */
;;;216    		while (I2C_end == 0) 
0007c0  e1a00000          MOV      r0,r0
                  |L1.1988|
0007c4  e59f0048          LDR      r0,|L1.2068|
0007c8  e5d00000          LDRB     r0,[r0,#0]  ; I2C_end
0007cc  e3500000          CMP      r0,#0
0007d0  0afffffb          BEQ      |L1.1988|
;;;217    		{	}
;;;218    		if (I2C_end == 1)
0007d4  e59f0038          LDR      r0,|L1.2068|
0007d8  e5d00000          LDRB     r0,[r0,#0]  ; I2C_end
0007dc  e3500001          CMP      r0,#1
0007e0  1a000002          BNE      |L1.2032|
;;;219    			return (TRUE);
0007e4  e3a00001          MOV      r0,#1
                  |L1.2024|
0007e8  e8bd4010          POP      {r4,lr}
;;;220    		else
;;;221    			return (FALSE);	
;;;222    	}
;;;223    	return (FALSE);
;;;224    }
0007ec  e12fff1e          BX       lr
                  |L1.2032|
0007f0  e3a00000          MOV      r0,#0                 ;221
0007f4  eafffffb          B        |L1.2024|             ;221
                  |L1.2040|
0007f8  e3a00000          MOV      r0,#0                 ;223
0007fc  eafffff9          B        |L1.2024|             ;223
                  |L1.2048|
000800  e001c000          DCD      0xe001c000            ;223
                  |L1.2052|
000804  00000000          DCD      I2C_suba_en           ;223
                  |L1.2056|
000808  00000000          DCD      I2C_sla               ;223
                  |L1.2060|
00080c  00000000          DCD      I2C_num               ;223
                  |L1.2064|
000810  00000000          DCD      I2C_buf               ;223
                  |L1.2068|
000814  00000000          DCD      I2C_end               ;223
                  |L1.2072|
000818  00000000          DCD      I2C_suba_num          ;223
                  |L1.2076|
00081c  00000000          DCD      I2C_suba              ;223
                  |L1.2080|
000820  00061a80          DCD      0x00061a80            ;223
                  |L1.2084|
000824  e002c000          DCD      0xe002c000            ;223
                  |L1.2088|
000828  00b71b00          DCD      0x00b71b00            ;223
                  |L1.2092|
00082c  0000ffff          DCD      0x0000ffff            ;223
                  |L1.2096|
000830  00000000          DCD      IRQ_I2C               ;223
                          ENDP



                          AREA ||.data||, DATA, ALIGN=2

                  I2C_sla
                          DCB      0x00
                          DCB      0x00,0x00,0x00
                  I2C_suba
                          DCD      0x00000000
                  I2C_suba_num
                          DCB      0x00
                          DCB      0x00,0x00,0x00
                  I2C_buf
                          DCD      0x00000000
                  I2C_num
                          DCD      0x00000000
                  I2C_end
                          DCB      0x00
                  I2C_suba_en
                          DCB      0x00

⌨️ 快捷键说明

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