📄 i2cint.txt
字号:
;;;68 I2C_num--;
;;;69 }
;;;70 else
;;;71 { I2CONSET = 0x10; // 无数据发送,结束总线
;;;72 I2CONCLR = 0x28;
;;;73 I2C_end = 1;
;;;74 }
;;;75 break;
;;;76 }
;;;77 if(1==I2C_suba_en) // 若是指定地址读,则重新启动总线
;;;78 { I2CONSET = 0x20;
;;;79 I2CONCLR = 0x08;
;;;80 I2C_suba_en = 0; // 子地址己处理
;;;81 }
;;;82 break;
;;;83
;;;84
;;;85 case 0x20:
;;;86 case 0x30:
;;;87 case 0x38:
;;;88 I2CONCLR = 0x28; // 总线进入不可寻址从模式
;;;89 I2C_end = 0xFF; // 总线出错,设置标志
;;;90 break;
;;;91
;;;92
;;;93 case 0x40: // 己发送SLA+R,并已接收到应答
;;;94 if(1==I2C_num) // 最后一字节,接收数据后发送非应答信号
;;;95 { I2CONCLR = 0x2C; // AA=0,接收到数据后产生非应答
;;;96 }
;;;97 else // 接收数据并发送应答信号
;;;98 { I2CONSET = 0x04; // AA=1,接收到数据后产生应答
;;;99 I2CONCLR = 0x28;
;;;100 }
;;;101 break;
;;;102
;;;103 case 0x50:
;;;104 *I2C_buf++ = I2DAT; // 读取数据
;;;105 I2C_num--;
;;;106 if(1==I2C_num)
;;;107 { I2CONCLR = 0x2C; // AA=0,接收到数据后产生非应答
;;;108 }
;;;109 else
;;;110 { I2CONSET = 0x04; // AA=1,接收到数据后产生应答
;;;111 I2CONCLR = 0x28;
;;;112 }
;;;113 break;
;;;114
;;;115 case 0x58:
;;;116 *I2C_buf++ = I2DAT; // 读取最后一字节数据
;;;117 I2CONSET = 0x10; // 结束总线
;;;118 I2CONCLR = 0x28;
;;;119 I2C_end = 1;
;;;120 break;
;;;121
;;;122 case 0x48:
;;;123 I2CONCLR = 0x28; // 总线进入不可寻址从模式
;;;124 I2C_end = 0xFF;
;;;125 break;
;;;126
;;;127 default:
;;;128 break;
;;;129 }
;;;130
;;;131 //I2CONCLR = 0x08;
;;;132 VICVectAddr = 0x00; // 中断处理结束
;;;133 }
ENDP
ISendByte PROC
;;;143 uint8 ISendByte(uint8 sla, uint8 dat)
;;;144 { /* 参数设置 */
0003e4 e92d0003 PUSH {r0,r1}
0003e8 e1a02000 MOV r2,r0
0003ec e59f022c LDR r0,|L1.1568|
0003f0 e5c02000 STRB r2,[r0,#0] ; I2C_sla
0003f4 e28d0004 ADD r0,sp,#4
0003f8 e59f1228 LDR r1,|L1.1576|
0003fc e5810000 STR r0,[r1,#0] ; I2C_buf
000400 e3a00001 MOV r0,#1
000404 e59f1218 LDR r1,|L1.1572|
000408 e5c10000 STRB r0,[r1,#0] ; I2C_num
00040c e3a00000 MOV r0,#0
000410 e59f1204 LDR r1,|L1.1564|
000414 e5c10000 STRB r0,[r1,#0] ; I2C_suba_en
000418 e59f120c LDR r1,|L1.1580|
00041c e5c10000 STRB r0,[r1,#0] ; I2C_end
000420 e3a0002c MOV r0,#0x2c
000424 e59f11ec LDR r1,|L1.1560|
000428 e5c10018 STRB r0,[r1,#0x18]
00042c e3a00060 MOV r0,#0x60
000430 e5c10000 STRB r0,[r1,#0]
000434 e1a00000 MOV r0,r0
|L1.1080|
000438 e59f01ec LDR r0,|L1.1580|
00043c e5d00000 LDRB r0,[r0,#0] ; I2C_end
000440 e3500000 CMP r0,#0
000444 0afffffb BEQ |L1.1080|
000448 e59f01dc LDR r0,|L1.1580|
00044c e5d00000 LDRB r0,[r0,#0] ; I2C_end
000450 e3500001 CMP r0,#1
000454 1a000002 BNE |L1.1124|
000458 e3a00001 MOV r0,#1
|L1.1116|
00045c e28dd008 ADD sp,sp,#8
000460 e12fff1e BX lr
|L1.1124|
000464 e3a00000 MOV r0,#0
000468 eafffffb B |L1.1116|
;;;145 I2C_sla = sla; // 写操作的器件地址
;;;146 I2C_buf = &dat; // 待发送的数据
;;;147 I2C_num = 1; // 发送1字节数据
;;;148 I2C_suba_en = 0; // 无子地址
;;;149 I2C_end = 0;
;;;150
;;;151 I2CONCLR = 0x2C;
;;;152 I2CONSET = 0x60; // 设置为主机,并启动总线
;;;153
;;;154 while(0==I2C_end);
;;;155 if(1==I2C_end) return(1);
;;;156 else return(0);
;;;157 }
ENDP
ISendStr PROC
;;;169 uint8 ISendStr(uint8 sla, uint8 suba, uint8 *s, uint8 no)
;;;170 { /* 参数设置 */
00046c e52de004 PUSH {lr}
000470 e1a0c000 MOV r12,r0
000474 e59f01a4 LDR r0,|L1.1568|
000478 e5c0c000 STRB r12,[r0,#0] ; I2C_sla
00047c e59f01ac LDR r0,|L1.1584|
000480 e5c01000 STRB r1,[r0,#0] ; I2C_suba
000484 e59f019c LDR r0,|L1.1576|
000488 e5802000 STR r2,[r0,#0] ; I2C_buf
00048c e59f0190 LDR r0,|L1.1572|
000490 e5c03000 STRB r3,[r0,#0] ; I2C_num
000494 e3a00002 MOV r0,#2
000498 e59fe17c LDR lr,|L1.1564|
00049c e5ce0000 STRB r0,[lr,#0] ; I2C_suba_en
0004a0 e3a00000 MOV r0,#0
0004a4 e59fe180 LDR lr,|L1.1580|
0004a8 e5ce0000 STRB r0,[lr,#0] ; I2C_end
0004ac e3a0002c MOV r0,#0x2c
0004b0 e59fe160 LDR lr,|L1.1560|
0004b4 e5ce0018 STRB r0,[lr,#0x18]
0004b8 e3a00060 MOV r0,#0x60
0004bc e5ce0000 STRB r0,[lr,#0]
0004c0 e1a00000 MOV r0,r0
|L1.1220|
0004c4 e59f0160 LDR r0,|L1.1580|
0004c8 e5d00000 LDRB r0,[r0,#0] ; I2C_end
0004cc e3500000 CMP r0,#0
0004d0 0afffffb BEQ |L1.1220|
0004d4 e59f0150 LDR r0,|L1.1580|
0004d8 e5d00000 LDRB r0,[r0,#0] ; I2C_end
0004dc e3500001 CMP r0,#1
0004e0 1a000002 BNE |L1.1264|
0004e4 e3a00001 MOV r0,#1
|L1.1256|
0004e8 e49de004 POP {lr}
0004ec e12fff1e BX lr
|L1.1264|
0004f0 e3a00000 MOV r0,#0
0004f4 eafffffb B |L1.1256|
;;;171 I2C_sla = sla; // 写操作的器件地址
;;;172 I2C_suba = suba; // 子地址
;;;173 I2C_buf = s;
;;;174 I2C_num = no;
;;;175 I2C_suba_en = 2; // 有子地址写
;;;176 I2C_end = 0;
;;;177
;;;178 I2CONCLR = 0x2C;
;;;179 I2CONSET = 0x60; // 设置为主机,并启动总线
;;;180
;;;181 while(0==I2C_end);
;;;182 if(1==I2C_end) return(1);
;;;183 else return(0);
;;;184 }
ENDP
IRcvByte PROC
;;;196 uint8 IRcvByte(uint8 sla, uint8 *dat)
;;;197 { /* 参数设置 */
0004f8 e1a02000 MOV r2,r0
0004fc e2820001 ADD r0,r2,#1
000500 e59f3118 LDR r3,|L1.1568|
000504 e5c30000 STRB r0,[r3,#0] ; I2C_sla
000508 e59f0118 LDR r0,|L1.1576|
00050c e5801000 STR r1,[r0,#0] ; I2C_buf
000510 e3a00001 MOV r0,#1
000514 e59f3108 LDR r3,|L1.1572|
000518 e5c30000 STRB r0,[r3,#0] ; I2C_num
00051c e3a00000 MOV r0,#0
000520 e59f30f4 LDR r3,|L1.1564|
000524 e5c30000 STRB r0,[r3,#0] ; I2C_suba_en
000528 e59f30fc LDR r3,|L1.1580|
00052c e5c30000 STRB r0,[r3,#0] ; I2C_end
000530 e3a0002c MOV r0,#0x2c
000534 e59f30dc LDR r3,|L1.1560|
000538 e5c30018 STRB r0,[r3,#0x18]
00053c e3a00060 MOV r0,#0x60
000540 e5c30000 STRB r0,[r3,#0]
000544 e1a00000 MOV r0,r0
|L1.1352|
000548 e59f00dc LDR r0,|L1.1580|
00054c e5d00000 LDRB r0,[r0,#0] ; I2C_end
000550 e3500000 CMP r0,#0
000554 0afffffb BEQ |L1.1352|
000558 e59f00cc LDR r0,|L1.1580|
00055c e5d00000 LDRB r0,[r0,#0] ; I2C_end
000560 e3500001 CMP r0,#1
000564 1a000001 BNE |L1.1392|
000568 e3a00001 MOV r0,#1
|L1.1388|
00056c e12fff1e BX lr
|L1.1392|
000570 e3a00000 MOV r0,#0
000574 eafffffc B |L1.1388|
;;;198 I2C_sla = sla+1; // 读操作的器件地址
;;;199 I2C_buf = dat;
;;;200 I2C_num = 1;
;;;201 I2C_suba_en = 0; // 无子地址
;;;202 I2C_end = 0;
;;;203
;;;204 I2CONCLR = 0x2C;
;;;205 I2CONSET = 0x60; // 设置为主机,并启动总线
;;;206
;;;207 while(0==I2C_end);
;;;208 if(1==I2C_end) return(1);
;;;209 else return(0);
;;;210 }
ENDP
IRcvStr PROC
;;;224 uint8 IRcvStr(uint8 sla, uint8 suba, uint8 *s, uint8 no)
;;;225 { if(0==no) return(0);
000578 e52de004 PUSH {lr}
00057c e1a0c000 MOV r12,r0
000580 e3530000 CMP r3,#0
000584 1a000002 BNE |L1.1428|
000588 e3a00000 MOV r0,#0
|L1.1420|
00058c e49de004 POP {lr}
000590 e12fff1e BX lr
|L1.1428|
000594 e28c0001 ADD r0,r12,#1
000598 e59fe080 LDR lr,|L1.1568|
00059c e5ce0000 STRB r0,[lr,#0] ; I2C_sla
0005a0 e59f0088 LDR r0,|L1.1584|
0005a4 e5c01000 STRB r1,[r0,#0] ; I2C_suba
0005a8 e59f0078 LDR r0,|L1.1576|
0005ac e5802000 STR r2,[r0,#0] ; I2C_buf
0005b0 e59f006c LDR r0,|L1.1572|
0005b4 e5c03000 STRB r3,[r0,#0] ; I2C_num
0005b8 e3a00001 MOV r0,#1
0005bc e59fe058 LDR lr,|L1.1564|
0005c0 e5ce0000 STRB r0,[lr,#0] ; I2C_suba_en
0005c4 e3a00000 MOV r0,#0
0005c8 e59fe05c LDR lr,|L1.1580|
0005cc e5ce0000 STRB r0,[lr,#0] ; I2C_end
0005d0 e3a0002c MOV r0,#0x2c
0005d4 e59fe03c LDR lr,|L1.1560|
0005d8 e5ce0018 STRB r0,[lr,#0x18]
0005dc e3a00060 MOV r0,#0x60
0005e0 e5ce0000 STRB r0,[lr,#0]
0005e4 e1a00000 MOV r0,r0
|L1.1512|
0005e8 e59f003c LDR r0,|L1.1580|
0005ec e5d00000 LDRB r0,[r0,#0] ; I2C_end
0005f0 e3500000 CMP r0,#0
0005f4 0afffffb BEQ |L1.1512|
0005f8 e59f002c LDR r0,|L1.1580|
0005fc e5d00000 LDRB r0,[r0,#0] ; I2C_end
000600 e3500001 CMP r0,#1
000604 1a000001 BNE |L1.1552|
000608 e3a00001 MOV r0,#1
00060c eaffffde B |L1.1420|
|L1.1552|
000610 e3a00000 MOV r0,#0
000614 eaffffdc B |L1.1420|
|L1.1560|
000618 e001c000 DCD 0xe001c000
|L1.1564|
00061c 00000000 DCD I2C_suba_en
|L1.1568|
000620 00000000 DCD I2C_sla
|L1.1572|
000624 00000000 DCD I2C_num
|L1.1576|
000628 00000000 DCD I2C_buf
|L1.1580|
00062c 00000000 DCD I2C_end
|L1.1584|
000630 00000000 DCD I2C_suba
;;;226
;;;227 /* 参数设置 */
;;;228 I2C_sla = sla+1; // 读操作的器件地址
;;;229 I2C_suba = suba;
;;;230 I2C_buf = s;
;;;231 I2C_num = no;
;;;232 I2C_suba_en = 1; // 有子地址读
;;;233 I2C_end = 0;
;;;234
;;;235 I2CONCLR = 0x2C;
;;;236 I2CONSET = 0x60; // 设置为主机,并启动总线
;;;237
;;;238 while(0==I2C_end);
;;;239 if(1==I2C_end) return(1);
;;;240 else return(0);
;;;241 }
ENDP
AREA ||.data||, DATA, ALIGN=2
||.data$0||
I2C_sla
DCB 0x00
I2C_suba
DCB 0x00
DCB 0x00,0x00
I2C_buf
DCD 0x00000000
I2C_num
DCB 0x00
I2C_end
DCB 0x00
I2C_suba_en
DCB 0x00
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -