📄 iic.txt
字号:
0002b0 e5900000 LDR r0,[r0,#0] ; _iicStatus
0002b4 e3500f40 CMP r0,#0x100
0002b8 0afffffb BEQ |L1.684|
;;;150
;;;151 if(!(_iicStatus&0x1))
0002bc e59f0420 LDR r0,|L1.1764|
0002c0 e5900000 LDR r0,[r0,#0] ; _iicStatus
0002c4 e3100001 TST r0,#1
0002c8 1a000000 BNE |L1.720|
;;;152 break; //When ACK is received
0002cc ea000000 B |L1.724|
;;;153 }
|L1.720|
0002d0 eaffffe8 B |L1.632|
;;;154 rIICSTAT = 0xd0; //Stop MasTx condition
|L1.724|
0002d4 e3a000d0 MOV r0,#0xd0
0002d8 e3a01454 MOV r1,#0x54000000
0002dc e5810004 STR r0,[r1,#4]
;;;155 rIICCON = 0xaf; //Resumes IIC operation.
0002e0 e3a000af MOV r0,#0xaf
0002e4 e3a01454 MOV r1,#0x54000000
0002e8 e5810000 STR r0,[r1,#0]
;;;156 Delay(1); //Wait until stop condtion is in effect.
0002ec e3a00001 MOV r0,#1
0002f0 ebfffffe BL Delay
;;;157 //Write is completed.
;;;158 }
0002f4 e8bd8070 LDMFD sp!,{r4-r6,pc}
ENDP
IicInt PROC
;;;187 void __irq IicInt(void)
;;;188 {
0002f8 e92d503f STMFD sp!,{r0-r5,r12,lr}
;;;189 U32 iicSt,i;
;;;190
;;;191 rSRCPND = BIT_IIC; //Clear pending bit
0002fc e3a00680 MOV r0,#0x8000000
000300 e3a0144a MOV r1,#0x4a000000
000304 e5810000 STR r0,[r1,#0]
;;;192 rINTPND = BIT_IIC;
000308 e3a00680 MOV r0,#0x8000000
00030c e3a0144a MOV r1,#0x4a000000
000310 e5810010 STR r0,[r1,#0x10]
;;;193 iicSt = rIICSTAT;
000314 e3a00454 MOV r0,#0x54000000
000318 e5900004 LDR r0,[r0,#4]
00031c e1a05000 MOV r5,r0
;;;194
;;;195 if(iicSt & 0x8){} //When bus arbitration is failed.
000320 e1a00000 NOP
;;;196 if(iicSt & 0x4){} //When a slave address is matched with IICADD
000324 e1a00000 NOP
;;;197 if(iicSt & 0x2){} //When a slave address is 0000000b
000328 e1a00000 NOP
;;;198 if(iicSt & 0x1){} //When ACK isn't received
00032c e1a00000 NOP
;;;199
;;;200 switch(_iicMode)
000330 e59f039c LDR r0,|L1.1748|
000334 e5900000 LDR r0,[r0,#0] ; _iicMode
000338 e3500001 CMP r0,#1
00033c 0a000038 BEQ |L1.1060|
000340 e3500002 CMP r0,#2
000344 0a000004 BEQ |L1.860|
000348 e3500003 CMP r0,#3
00034c 0a000005 BEQ |L1.872|
000350 e3500004 CMP r0,#4
000354 1a000070 BNE |L1.1308|
000358 ea000054 B |L1.1200|
;;;201 {
;;;202 case POLLACK:
;;;203 _iicStatus = iicSt;
|L1.860|
00035c e59f0380 LDR r0,|L1.1764|
000360 e5805000 STR r5,[r0,#0] ; _iicStatus
;;;204 break;
000364 ea00006d B |L1.1312|
;;;205
;;;206 case RDDATA:
;;;207 if((_iicDataCount--)==0)
|L1.872|
000368 e59f0370 LDR r0,|L1.1760|
00036c e5900000 LDR r0,[r0,#0] ; _iicDataCount
000370 e2401001 SUB r1,r0,#1
000374 e59f0364 LDR r0,|L1.1760|
000378 e5902000 LDR r2,[r0,#0] ; _iicDataCount
00037c e5801000 STR r1,[r0,#0] ; _iicDataCount
000380 e3520000 CMP r2,#0
000384 1a000011 BNE |L1.976|
;;;208 {
;;;209 _iicData[_iicPt++] = rIICDS;
000388 e3a00454 MOV r0,#0x54000000
00038c e590100c LDR r1,[r0,#0xc]
000390 e59f0340 LDR r0,|L1.1752|
000394 e5900000 LDR r0,[r0,#0] ; _iicPt
000398 e2802001 ADD r2,r0,#1
00039c e59f3334 LDR r3,|L1.1752|
0003a0 e5832000 STR r2,[r3,#0] ; _iicPt
0003a4 e59f2330 LDR r2,|L1.1756|
0003a8 e7c21000 STRB r1,[r2,r0]
;;;210
;;;211 rIICSTAT = 0x90; //Stop MasRx condition
0003ac e3a00090 MOV r0,#0x90
0003b0 e3a01454 MOV r1,#0x54000000
0003b4 e5810004 STR r0,[r1,#4]
;;;212 rIICCON = 0xaf; //Resumes IIC operation.
0003b8 e3a000af MOV r0,#0xaf
0003bc e3a01454 MOV r1,#0x54000000
0003c0 e5810000 STR r0,[r1,#0]
;;;213 Delay(1); //Wait until stop condtion is in effect.
0003c4 e3a00001 MOV r0,#1
0003c8 ebfffffe BL Delay
;;;214 //Too long time...
;;;215 //The pending bit will not be set after issuing stop condition.
;;;216 break;
0003cc ea000053 B |L1.1312|
;;;217 }
;;;218 _iicData[_iicPt++] = rIICDS; //The last data has to be read with no ack.
|L1.976|
0003d0 e3a00454 MOV r0,#0x54000000
0003d4 e590100c LDR r1,[r0,#0xc]
0003d8 e59f02f8 LDR r0,|L1.1752|
0003dc e5900000 LDR r0,[r0,#0] ; _iicPt
0003e0 e2802001 ADD r2,r0,#1
0003e4 e59f32ec LDR r3,|L1.1752|
0003e8 e5832000 STR r2,[r3,#0] ; _iicPt
0003ec e59f22e8 LDR r2,|L1.1756|
0003f0 e7c21000 STRB r1,[r2,r0]
;;;219
;;;220 if((_iicDataCount)==0)
0003f4 e59f02e4 LDR r0,|L1.1760|
0003f8 e5900000 LDR r0,[r0,#0] ; _iicDataCount
0003fc e3500000 CMP r0,#0
000400 1a000003 BNE |L1.1044|
;;;221 rIICCON = 0x2f; //Resumes IIC operation with NOACK.
000404 e3a0002f MOV r0,#0x2f
000408 e3a01454 MOV r1,#0x54000000
00040c e5810000 STR r0,[r1,#0]
000410 ea000002 B |L1.1056|
;;;222 else
;;;223 rIICCON = 0xaf; //Resumes IIC operation with ACK
|L1.1044|
000414 e3a000af MOV r0,#0xaf
000418 e3a01454 MOV r1,#0x54000000
00041c e5810000 STR r0,[r1,#0]
;;;224 break;
|L1.1056|
000420 ea00003e B |L1.1312|
;;;225
;;;226 case WRDATA:
;;;227 if((_iicDataCount--)==0)
|L1.1060|
000424 e59f02b4 LDR r0,|L1.1760|
000428 e5900000 LDR r0,[r0,#0] ; _iicDataCount
00042c e2401001 SUB r1,r0,#1
000430 e59f02a8 LDR r0,|L1.1760|
000434 e5902000 LDR r2,[r0,#0] ; _iicDataCount
000438 e5801000 STR r1,[r0,#0] ; _iicDataCount
00043c e3520000 CMP r2,#0
000440 1a000008 BNE |L1.1128|
;;;228 {
;;;229 rIICSTAT = 0xd0; //Stop MasTx condition
000444 e3a000d0 MOV r0,#0xd0
000448 e3a01454 MOV r1,#0x54000000
00044c e5810004 STR r0,[r1,#4]
;;;230 rIICCON = 0xaf; //Resumes IIC operation.
000450 e3a000af MOV r0,#0xaf
000454 e3a01454 MOV r1,#0x54000000
000458 e5810000 STR r0,[r1,#0]
;;;231 Delay(1); //Wait until stop condtion is in effect.
00045c e3a00001 MOV r0,#1
000460 ebfffffe BL Delay
;;;232 //The pending bit will not be set after issuing stop condition.
;;;233 break;
000464 ea00002d B |L1.1312|
;;;234 }
;;;235 rIICDS = _iicData[_iicPt++]; //_iicData[0] has dummy.
|L1.1128|
000468 e59f0268 LDR r0,|L1.1752|
00046c e5900000 LDR r0,[r0,#0] ; _iicPt
000470 e2801001 ADD r1,r0,#1
000474 e59f225c LDR r2,|L1.1752|
000478 e5821000 STR r1,[r2,#0] ; _iicPt
00047c e59f1258 LDR r1,|L1.1756|
000480 e7d10000 LDRB r0,[r1,r0]
000484 e3a01454 MOV r1,#0x54000000
000488 e581000c STR r0,[r1,#0xc]
;;;236 for(i=0;i<10;i++); //for setup time until rising edge of IICSCL
00048c e3a04000 MOV r4,#0
|L1.1168|
000490 e354000a CMP r4,#0xa
000494 2a000001 BCS |L1.1184|
000498 e2844001 ADD r4,r4,#1
00049c eafffffb B |L1.1168|
;;;237
;;;238 rIICCON = 0xaf; //resumes IIC operation.
|L1.1184|
0004a0 e3a000af MOV r0,#0xaf
0004a4 e3a01454 MOV r1,#0x54000000
0004a8 e5810000 STR r0,[r1,#0]
;;;239 break;
0004ac ea00001b B |L1.1312|
;;;240
;;;241 case SETRDADDR:
;;;242 // Uart_Printf("[ S%d ]",_iicDataCount);
;;;243 if((_iicDataCount--)==0)
|L1.1200|
0004b0 e59f0228 LDR r0,|L1.1760|
0004b4 e5900000 LDR r0,[r0,#0] ; _iicDataCount
0004b8 e2401001 SUB r1,r0,#1
0004bc e59f021c LDR r0,|L1.1760|
0004c0 e5902000 LDR r2,[r0,#0] ; _iicDataCount
0004c4 e5801000 STR r1,[r0,#0] ; _iicDataCount
0004c8 e3520000 CMP r2,#0
0004cc 1a000000 BNE |L1.1236|
;;;244 break; //IIC operation is stopped because of IICCON[4]
0004d0 ea000012 B |L1.1312|
;;;245 rIICDS = _iicData[_iicPt++];
|L1.1236|
0004d4 e59f01fc LDR r0,|L1.1752|
0004d8 e5900000 LDR r0,[r0,#0] ; _iicPt
0004dc e2801001 ADD r1,r0,#1
0004e0 e59f21f0 LDR r2,|L1.1752|
0004e4 e5821000 STR r1,[r2,#0] ; _iicPt
0004e8 e59f11ec LDR r1,|L1.1756|
0004ec e7d10000 LDRB r0,[r1,r0]
0004f0 e3a01454 MOV r1,#0x54000000
0004f4 e581000c STR r0,[r1,#0xc]
;;;246 for(i=0;i<10;i++); //For setup time until rising edge of IICSCL
0004f8 e3a04000 MOV r4,#0
|L1.1276|
0004fc e354000a CMP r4,#0xa
000500 2a000001 BCS |L1.1292|
000504 e2844001 ADD r4,r4,#1
000508 eafffffb B |L1.1276|
;;;247 rIICCON = 0xaf; //Resumes IIC operation.
|L1.1292|
00050c e3a000af MOV r0,#0xaf
000510 e3a01454 MOV r1,#0x54000000
000514 e5810000 STR r0,[r1,#0]
;;;248 break;
000518 ea000000 B |L1.1312|
;;;249
;;;250 default:
;;;251 break;
|L1.1308|
00051c e1a00000 NOP
;;;252 }
;;;253 }
|L1.1312|
000520 e8bd503f LDMFD sp!,{r0-r5,r12,lr}
000524 e25ef004 SUBS pc,lr,#4
ENDP
Test_Iic PROC
;;;76 void Test_Iic(void)
;;;77 {
000528 e92d40f8 STMFD sp!,{r3-r7,lr}
;;;78 unsigned int i,j,save_E,save_PE;
;;;79 static U8 data[256];
;;;80
;;;81 Uart_Printf("[ IIC Test(Interrupt) using KS24C080 ]\n");
00052c e28f0f6d ADR r0,|L1.1768|
000530 ebfffffe BL Uart_Printf
;;;82
;;;83 save_E = rGPECON;
000534 e3a00456 MOV r0,#0x56000000
000538 e5900040 LDR r0,[r0,#0x40]
00053c e1a06000 MOV r6,r0
;;;84 save_PE = rGPEUP;
000540 e3a00456 MOV r0,#0x56000000
000544 e5900048 LDR r0,[r0,#0x48]
000548 e1a07000 MOV r7,r0
;;;85 rGPEUP |= 0xc000; //Pull-up disable
00054c e3a00456 MOV r0,#0x56000000
000550 e5900048 LDR r0,[r0,#0x48]
000554 e3800cc0 ORR r0,r0,#0xc000
000558 e3a01456 MOV r1,#0x56000000
00055c e5810048 STR r0,[r1,#0x48]
;;;86 rGPECON |= 0xa00000; //GPE15:IICSDA , GPE14:IICSCL
000560 e3a00456 MOV r0,#0x56000000
000564 e5900040 LDR r0,[r0,#0x40]
000568 e38008a0 ORR r0,r0,#0xa00000
00056c e3a01456 MOV r1,#0x56000000
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -