⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bsp_i2c.txt

📁 IARSOURCECODE是基于LPC2478嵌入式软件IAR EWARM V4.42的应用实例代码
💻 TXT
📖 第 1 页 / 共 2 页
字号:
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          = &reg;
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 + -