📄 eprom.txt
字号:
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 + -