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