📄 bsp_i2c.txt
字号:
000300 e3a01000 MOV r1,#0
000304 e5010ff4 STR r0,[r1,#-0xff4]
;;;132 VICVectAddr9 = (CPU_INT32U)I2C_ISR_Handler; /* Set the vector address */
000308 e24f0e31 ADR r0,I2C_ISR_Handler
00030c e5010edc STR r0,[r1,#-0xedc]
;;;133 VICIntEnClear = (1 << VIC_I2C0); /* Disable the interrupt source */
000310 e3a00c02 MOV r0,#0x200
000314 e5010fec STR r0,[r1,#-0xfec]
;;;134
;;;135 pinsel = PINSEL1;
000318 e59f0270 LDR r0,|L1.1424|
00031c e5904004 LDR r4,[r0,#4]
;;;136 pinsel &= 0xFC3FFFFF;
000320 e3c4450f BIC r4,r4,#0x3c00000
;;;137 pinsel |= 0x01400000;
000324 e3844505 ORR r4,r4,#0x1400000
;;;138 PINSEL1 = pinsel;
000328 e5804004 STR r4,[r0,#4]
;;;139
;;;140 I20CONCLR = 0x006C; /* Clear flags */
00032c e3a0006c MOV r0,#0x6c
000330 e59f1244 LDR r1,|L1.1404|
000334 e5810018 STR r0,[r1,#0x18]
;;;141
;;;142 I20SCLH = 0x00F0;
000338 e3a000f0 MOV r0,#0xf0
00033c e5810010 STR r0,[r1,#0x10]
;;;143 I20SCLL = 0x0160;
000340 e3a00e16 MOV r0,#0x160
000344 e5810014 STR r0,[r1,#0x14]
;;;144
;;;145 I2C_SemWait = OSSemCreate(0);
000348 e3a00000 MOV r0,#0
00034c ebfffffe BL OSSemCreate
000350 e59f1234 LDR r1,|L1.1420|
000354 e5810000 STR r0,[r1,#0] ; I2C_SemWait
;;;146 I2C_SemBusy = OSSemCreate(1);
000358 e3a00001 MOV r0,#1
00035c ebfffffe BL OSSemCreate
000360 e59f122c LDR r1,|L1.1428|
000364 e5810000 STR r0,[r1,#0] ; I2C_SemBusy
;;;147 }
000368 e8bd4010 POP {r4,lr}
00036c e12fff1e BX lr
ENDP
I2C_Read PROC
;;;162 void I2C_Read (CPU_INT08U *p_buf, CPU_INT08U count)
;;;163 {
000370 e92d4038 PUSH {r3-r5,lr}
000374 e1a04000 MOV r4,r0
000378 e1a05001 MOV r5,r1
;;;164 CPU_INT08U err;
;;;165
;;;166
;;;167 OSSemPend(I2C_SemBusy, 0, &err); /* Wait until I2C is free */
00037c e28d2000 ADD r2,sp,#0
000380 e3a01000 MOV r1,#0
000384 e59f0208 LDR r0,|L1.1428|
000388 e5900000 LDR r0,[r0,#0] ; I2C_SemBusy
00038c ebfffffe BL OSSemPend
;;;168
;;;169 I20CONCLR = I2CON_I2EN
000390 e3a0006c MOV r0,#0x6c
000394 e59f11e0 LDR r1,|L1.1404|
000398 e5810018 STR r0,[r1,#0x18]
;;;170 | I2CON_STA
;;;171 | I2CON_SI
;;;172 | I2CON_AA;
;;;173
;;;174 I20CONSET = I2CON_I2EN;
00039c e3a00040 MOV r0,#0x40
0003a0 e5810000 STR r0,[r1,#0]
;;;175
;;;176 I2C_Address = (PCA9532_ADDRESS | 0x01); /* Set lower bit of address */
0003a4 e3a000c1 MOV r0,#0xc1
0003a8 e59f11d0 LDR r1,|L1.1408|
0003ac e5c10000 STRB r0,[r1,#0] ; I2C_Address
;;;177 I2C_BufPtr = p_buf;
0003b0 e2810004 ADD r0,r1,#4
0003b4 e5804000 STR r4,[r0,#0] ; I2C_BufPtr
;;;178 I2C_Count = count;
0003b8 e2810008 ADD r0,r1,#8
0003bc e5c05000 STRB r5,[r0,#0] ; I2C_Count
;;;179
;;;180 I20CONSET = I2CON_STA
0003c0 e3a00024 MOV r0,#0x24
0003c4 e59f11b0 LDR r1,|L1.1404|
0003c8 e5810000 STR r0,[r1,#0]
;;;181 | I2CON_AA;
;;;182
;;;183
;;;184 VICIntEnable = (1 << VIC_I2C0); /* Enable the interrupt source */
0003cc e3a00c02 MOV r0,#0x200
0003d0 e3a01000 MOV r1,#0
0003d4 e5010ff0 STR r0,[r1,#-0xff0]
;;;185 OSSemPend(I2C_SemWait, 0, &err); /* Wait until complete */
0003d8 e28d2000 ADD r2,sp,#0
0003dc e59f01a8 LDR r0,|L1.1420|
0003e0 e5900000 LDR r0,[r0,#0] ; I2C_SemWait
0003e4 ebfffffe BL OSSemPend
;;;186
;;;187 OSSemPost(I2C_SemBusy); /* Free I2C */
0003e8 e59f01a4 LDR r0,|L1.1428|
0003ec e5900000 LDR r0,[r0,#0] ; I2C_SemBusy
0003f0 ebfffffe BL OSSemPost
;;;188 }
0003f4 e8bd4038 POP {r3-r5,lr}
0003f8 e12fff1e BX lr
ENDP
I2C_ReadReg PROC
;;;204 void I2C_ReadReg (CPU_INT08U *p_buf, CPU_INT08U count, CPU_INT08U reg)
;;;205 {
0003fc e92d4037 PUSH {r0-r2,r4,r5,lr}
000400 e24dd008 SUB sp,sp,#8
000404 e1a04000 MOV r4,r0
000408 e1a05001 MOV r5,r1
;;;206 CPU_INT08U err;
;;;207
;;;208
;;;209 OSSemPend(I2C_SemBusy, 0, &err); /* Wait until I2C is free */
00040c e28d2004 ADD r2,sp,#4
000410 e3a01000 MOV r1,#0
000414 e59f0178 LDR r0,|L1.1428|
000418 e5900000 LDR r0,[r0,#0] ; I2C_SemBusy
00041c ebfffffe BL OSSemPend
;;;210
;;;211
;;;212
;;;213 I20CONCLR = I2CON_I2EN
000420 e3a0006c MOV r0,#0x6c
000424 e59f1150 LDR r1,|L1.1404|
000428 e5810018 STR r0,[r1,#0x18]
;;;214 | I2CON_STA
;;;215 | I2CON_SI
;;;216 | I2CON_AA;
;;;217
;;;218 I20CONSET = I2CON_I2EN;
00042c e3a00040 MOV r0,#0x40
000430 e5810000 STR r0,[r1,#0]
;;;219
;;;220 I2C_Address = (PCA9532_ADDRESS & 0xFE); /* Clear lower bit of address */
000434 e3a000c0 MOV r0,#0xc0
000438 e59f1140 LDR r1,|L1.1408|
00043c e5c10000 STRB r0,[r1,#0] ; I2C_Address
;;;221 I2C_BufPtr = ®
000440 e28d0010 ADD r0,sp,#0x10
000444 e2811004 ADD r1,r1,#4
000448 e5810000 STR r0,[r1,#0] ; I2C_BufPtr
;;;222 I2C_Count = 1;
00044c e3a00001 MOV r0,#1
000450 e2811004 ADD r1,r1,#4
000454 e5c10000 STRB r0,[r1,#0] ; I2C_Count
;;;223
;;;224 I20CONSET = I2CON_STA
000458 e3a00024 MOV r0,#0x24
00045c e59f1118 LDR r1,|L1.1404|
000460 e5810000 STR r0,[r1,#0]
;;;225 | I2CON_AA;
;;;226
;;;227 VICIntEnable = (1 << VIC_I2C0); /* Enable the interrupt source */
000464 e3a00c02 MOV r0,#0x200
000468 e3a01000 MOV r1,#0
00046c e5010ff0 STR r0,[r1,#-0xff0]
;;;228 OSSemPend(I2C_SemWait, 0, &err); /* Wait until complete */
000470 e28d2004 ADD r2,sp,#4
000474 e59f0110 LDR r0,|L1.1420|
000478 e5900000 LDR r0,[r0,#0] ; I2C_SemWait
00047c ebfffffe BL OSSemPend
;;;229
;;;230
;;;231
;;;232 I20CONCLR = I2CON_I2EN
000480 e3a0006c MOV r0,#0x6c
000484 e59f10f0 LDR r1,|L1.1404|
000488 e5810018 STR r0,[r1,#0x18]
;;;233 | I2CON_STA
;;;234 | I2CON_SI
;;;235 | I2CON_AA;
;;;236
;;;237 I20CONSET = I2CON_I2EN;
00048c e3a00040 MOV r0,#0x40
000490 e5810000 STR r0,[r1,#0]
;;;238
;;;239 I2C_Address = (PCA9532_ADDRESS | 0x01); /* Set lower bit of address */
000494 e3a000c1 MOV r0,#0xc1
000498 e59f10e0 LDR r1,|L1.1408|
00049c e5c10000 STRB r0,[r1,#0] ; I2C_Address
;;;240 I2C_BufPtr = p_buf;
0004a0 e2810004 ADD r0,r1,#4
0004a4 e5804000 STR r4,[r0,#0] ; I2C_BufPtr
;;;241 I2C_Count = count;
0004a8 e2810008 ADD r0,r1,#8
0004ac e5c05000 STRB r5,[r0,#0] ; I2C_Count
;;;242
;;;243 I20CONSET = I2CON_STA
0004b0 e3a00024 MOV r0,#0x24
0004b4 e59f10c0 LDR r1,|L1.1404|
0004b8 e5810000 STR r0,[r1,#0]
;;;244 | I2CON_AA;
;;;245
;;;246
;;;247 VICIntEnable = (1 << VIC_I2C0); /* Enable the interrupt source */
0004bc e3a00c02 MOV r0,#0x200
0004c0 e3a01000 MOV r1,#0
0004c4 e5010ff0 STR r0,[r1,#-0xff0]
;;;248 OSSemPend(I2C_SemWait, 0, &err); /* Wait until complete */
0004c8 e28d2004 ADD r2,sp,#4
0004cc e59f00b8 LDR r0,|L1.1420|
0004d0 e5900000 LDR r0,[r0,#0] ; I2C_SemWait
0004d4 ebfffffe BL OSSemPend
;;;249
;;;250
;;;251 OSSemPost(I2C_SemBusy); /* Free I2C */
0004d8 e59f00b4 LDR r0,|L1.1428|
0004dc e5900000 LDR r0,[r0,#0] ; I2C_SemBusy
0004e0 ebfffffe BL OSSemPost
;;;252 }
0004e4 e28dd014 ADD sp,sp,#0x14
0004e8 e8bd4030 POP {r4,r5,lr}
0004ec e12fff1e BX lr
ENDP
I2C_Write PROC
;;;267 void I2C_Write (CPU_INT08U *p_buf, CPU_INT08U count)
;;;268 {
0004f0 e92d4038 PUSH {r3-r5,lr}
0004f4 e1a04000 MOV r4,r0
0004f8 e1a05001 MOV r5,r1
;;;269 CPU_INT08U err;
;;;270
;;;271
;;;272 OSSemPend(I2C_SemBusy, 0, &err); /* Wait until I2C is free */
0004fc e28d2000 ADD r2,sp,#0
000500 e3a01000 MOV r1,#0
000504 e59f0088 LDR r0,|L1.1428|
000508 e5900000 LDR r0,[r0,#0] ; I2C_SemBusy
00050c ebfffffe BL OSSemPend
;;;273
;;;274 I20CONCLR = I2CON_I2EN
000510 e3a0006c MOV r0,#0x6c
000514 e59f1060 LDR r1,|L1.1404|
000518 e5810018 STR r0,[r1,#0x18]
;;;275 | I2CON_STA
;;;276 | I2CON_SI
;;;277 | I2CON_AA;
;;;278
;;;279 I20CONSET = I2CON_I2EN;
00051c e3a00040 MOV r0,#0x40
000520 e5810000 STR r0,[r1,#0]
;;;280
;;;281 I2C_Address = (PCA9532_ADDRESS & 0xFE); /* Clear lower bit of address */
000524 e3a000c0 MOV r0,#0xc0
000528 e59f1050 LDR r1,|L1.1408|
00052c e5c10000 STRB r0,[r1,#0] ; I2C_Address
;;;282 I2C_BufPtr = p_buf;
000530 e2810004 ADD r0,r1,#4
000534 e5804000 STR r4,[r0,#0] ; I2C_BufPtr
;;;283 I2C_Count = count;
000538 e2810008 ADD r0,r1,#8
00053c e5c05000 STRB r5,[r0,#0] ; I2C_Count
;;;284
;;;285 I20CONSET = I2CON_STA
000540 e3a00024 MOV r0,#0x24
000544 e59f1030 LDR r1,|L1.1404|
000548 e5810000 STR r0,[r1,#0]
;;;286 | I2CON_AA;
;;;287
;;;288 VICIntEnable = (1 << VIC_I2C0); /* Enable the interrupt source */
00054c e3a00c02 MOV r0,#0x200
000550 e3a01000 MOV r1,#0
000554 e5010ff0 STR r0,[r1,#-0xff0]
;;;289 OSSemPend(I2C_SemWait, 0, &err); /* Wait until complete */
000558 e28d2000 ADD r2,sp,#0
00055c e59f0028 LDR r0,|L1.1420|
000560 e5900000 LDR r0,[r0,#0] ; I2C_SemWait
000564 ebfffffe BL OSSemPend
;;;290
;;;291 OSSemPost(I2C_SemBusy); /* Free I2C */
000568 e59f0024 LDR r0,|L1.1428|
00056c e5900000 LDR r0,[r0,#0] ; I2C_SemBusy
000570 ebfffffe BL OSSemPost
;;;292 }
000574 e8bd4038 POP {r3-r5,lr}
000578 e12fff1e BX lr
ENDP
|L1.1404|
00057c e001c000 DCD 0xe001c000
|L1.1408|
000580 00000000 DCD ||.data||
|L1.1412|
000584 00000004 DCD ||.data||+0x4
|L1.1416|
000588 00000008 DCD ||.data||+0x8
|L1.1420|
00058c 0000000c DCD ||.data||+0xc
|L1.1424|
000590 e002c000 DCD 0xe002c000
|L1.1428|
000594 00000010 DCD ||.data||+0x10
AREA ||.data||, DATA, ALIGN=2
I2C_Address
000000 00000000 DCB 0x00,0x00,0x00,0x00
I2C_BufPtr
000004 00000000 DCD 0x00000000
I2C_Count
000008 00000000 DCB 0x00,0x00,0x00,0x00
I2C_SemWait
00000c 00000000 DCD 0x00000000
I2C_SemBusy
000010 00000000 DCD 0x00000000
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -