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

📄 bsp_i2c.txt

📁 IARSOURCECODE是基于LPC2478嵌入式软件IAR EWARM V4.42的应用实例代码
💻 TXT
📖 第 1 页 / 共 2 页
字号:
; generated by ARM/Thumb C/C++ Compiler with , RVCT3.1 [Build 903] for uVision
; commandline ArmCC [--debug -c --asm --interleave -obsp_i2c.o --depend=bsp_i2c.d --device=DARMP --apcs=interwork -I. -I..\BSP -I..\..\..\..\..\uCOS-II\Ports\ARM\Generic\RVMDK -I..\..\..\..\..\uCOS-II\Source -I..\..\..\..\..\uC-CPU -I..\..\..\..\..\uC-CPU\ARM\RVMDK -I..\..\..\..\..\uC-LIB -I..\..\..\..\..\uCOSView\Source -I..\..\..\..\..\uCOSView\Ports\ARM7\LPC2468\IAR -Id:\Keil\ARM\INC\Philips ..\BSP\bsp_i2c.c]
                          ARM

                          AREA ||.text||, CODE, READONLY, ALIGN=2

                  I2C_ISR_Handler PROC
;;;306    void  I2C_ISR_Handler (void)
;;;307    {
000000  e92d4070          PUSH     {r4-r6,lr}
;;;308        CPU_INT32U  status;
;;;309        CPU_INT32U  temp;
;;;310    
;;;311    
;;;312        status      = I20STAT;
000004  e59f0570          LDR      r0,|L1.1404|
000008  e5904004          LDR      r4,[r0,#4]
;;;313        temp        = 0;
00000c  e3a05000          MOV      r5,#0
;;;314    
;;;315        switch (status & 0xF8) {
000010  e20400f8          AND      r0,r4,#0xf8
000014  e3100007          TST      r0,#7
000018  1a0000ac          BNE      |L1.720|
00001c  e1a001c0          ASR      r0,r0,#3
000020  e350000c          CMP      r0,#0xc
000024  308ff100          ADDCC    pc,pc,r0,LSL #2
000028  ea0000a8          B        |L1.720|
00002c  ea0000a7          B        |L1.720|
000030  ea000009          B        |L1.92|
000034  ea00000a          B        |L1.100|
000038  ea000010          B        |L1.128|
00003c  ea000047          B        |L1.352|
000040  ea000022          B        |L1.208|
000044  ea000047          B        |L1.360|
000048  ea000053          B        |L1.412|
00004c  ea00005d          B        |L1.456|
000050  ea000045          B        |L1.364|
000054  ea00006b          B        |L1.520|
000058  ea000085          B        |L1.628|
                  |L1.92|
;;;316    
;;;317            case I2STAT_START:
00005c  e1a00000          MOV      r0,r0
;;;318            case I2STAT_REPEATED_START:
000060  e1a00000          MOV      r0,r0
                  |L1.100|
;;;319                 I20DAT             = I2C_Address;
000064  e59f0514          LDR      r0,|L1.1408|
000068  e5d00000          LDRB     r0,[r0,#0]  ; I2C_Address
00006c  e59f1508          LDR      r1,|L1.1404|
000070  e5810008          STR      r0,[r1,#8]
;;;320                 I20CONCLR          = I2CON_STA | I2CON_SI;
000074  e3a00028          MOV      r0,#0x28
000078  e5810018          STR      r0,[r1,#0x18]
;;;321                 break;
00007c  ea000098          B        |L1.740|
                  |L1.128|
;;;322    
;;;323            case I2STAT_SLA_W_ACK:
000080  e1a00000          MOV      r0,r0
;;;324                 temp               = *I2C_BufPtr;
000084  e59f04f8          LDR      r0,|L1.1412|
000088  e5900000          LDR      r0,[r0,#0]  ; I2C_BufPtr
00008c  e5d05000          LDRB     r5,[r0,#0]
;;;325                 I20DAT             = temp;
000090  e59f04e4          LDR      r0,|L1.1404|
000094  e5805008          STR      r5,[r0,#8]
;;;326                 I2C_BufPtr        += 1;
000098  e59f04e4          LDR      r0,|L1.1412|
00009c  e5900000          LDR      r0,[r0,#0]  ; I2C_BufPtr
0000a0  e2800001          ADD      r0,r0,#1
0000a4  e59f14d8          LDR      r1,|L1.1412|
0000a8  e5810000          STR      r0,[r1,#0]  ; I2C_BufPtr
;;;327                 I2C_Count         -= 1;
0000ac  e2810004          ADD      r0,r1,#4
0000b0  e5d00000          LDRB     r0,[r0,#0]  ; I2C_Count
0000b4  e2400001          SUB      r0,r0,#1
0000b8  e2811004          ADD      r1,r1,#4
0000bc  e5c10000          STRB     r0,[r1,#0]  ; I2C_Count
;;;328                 I20CONCLR          = I2CON_STA | I2CON_SI;
0000c0  e3a00028          MOV      r0,#0x28
0000c4  e59f14b0          LDR      r1,|L1.1404|
0000c8  e5810018          STR      r0,[r1,#0x18]
;;;329                 break;
0000cc  ea000084          B        |L1.740|
                  |L1.208|
;;;330    
;;;331            case I2STAT_DAT_T_ACK:
0000d0  e1a00000          MOV      r0,r0
;;;332                 if (I2C_Count > 0) {
0000d4  e59f04ac          LDR      r0,|L1.1416|
0000d8  e5d00000          LDRB     r0,[r0,#0]  ; I2C_Count
0000dc  e3500000          CMP      r0,#0
0000e0  da000012          BLE      |L1.304|
;;;333                     temp           = *I2C_BufPtr;
0000e4  e59f0498          LDR      r0,|L1.1412|
0000e8  e5900000          LDR      r0,[r0,#0]  ; I2C_BufPtr
0000ec  e5d05000          LDRB     r5,[r0,#0]
;;;334                     I20DAT         = temp;
0000f0  e59f0484          LDR      r0,|L1.1404|
0000f4  e5805008          STR      r5,[r0,#8]
;;;335                     I2C_BufPtr    += 1;
0000f8  e59f0484          LDR      r0,|L1.1412|
0000fc  e5900000          LDR      r0,[r0,#0]  ; I2C_BufPtr
000100  e2800001          ADD      r0,r0,#1
000104  e59f1478          LDR      r1,|L1.1412|
000108  e5810000          STR      r0,[r1,#0]  ; I2C_BufPtr
;;;336                     I2C_Count     -= 1;
00010c  e2810004          ADD      r0,r1,#4
000110  e5d00000          LDRB     r0,[r0,#0]  ; I2C_Count
000114  e2400001          SUB      r0,r0,#1
000118  e2811004          ADD      r1,r1,#4
00011c  e5c10000          STRB     r0,[r1,#0]  ; I2C_Count
;;;337                     I20CONCLR      = I2CON_STA | I2CON_SI;
000120  e3a00028          MOV      r0,#0x28
000124  e59f1450          LDR      r1,|L1.1404|
000128  e5810018          STR      r0,[r1,#0x18]
00012c  ea00000a          B        |L1.348|
                  |L1.304|
;;;338                 } else {
;;;339                     I20CONCLR      = I2CON_STA | I2CON_SI;
000130  e3a00028          MOV      r0,#0x28
000134  e59f1440          LDR      r1,|L1.1404|
000138  e5810018          STR      r0,[r1,#0x18]
;;;340                     I20CONSET      = I2CON_STO;
00013c  e3a00010          MOV      r0,#0x10
000140  e5810000          STR      r0,[r1,#0]
;;;341                     OSSemPost(I2C_SemWait);
000144  e59f0440          LDR      r0,|L1.1420|
000148  e5900000          LDR      r0,[r0,#0]  ; I2C_SemWait
00014c  ebfffffe          BL       OSSemPost
;;;342                     VICIntEnClear  =  (1 << VIC_I2C0);
000150  e3a00c02          MOV      r0,#0x200
000154  e3a01000          MOV      r1,#0
000158  e5010fec          STR      r0,[r1,#-0xfec]
                  |L1.348|
;;;343                 }
;;;344                 break;
00015c  ea000060          B        |L1.740|
                  |L1.352|
;;;345    
;;;346            case I2STAT_SLA_W_NOACK:
000160  e1a00000          MOV      r0,r0
;;;347            case I2STAT_DAT_T_NOACK:
000164  e1a00000          MOV      r0,r0
                  |L1.360|
;;;348            case I2STAT_SLA_R_NOACK:
000168  e1a00000          MOV      r0,r0
                  |L1.364|
;;;349                 I20CONSET          = I2CON_STO;
00016c  e3a00010          MOV      r0,#0x10
000170  e59f1404          LDR      r1,|L1.1404|
000174  e5810000          STR      r0,[r1,#0]
;;;350                 I20CONCLR          = I2CON_STA | I2CON_SI;
000178  e3a00028          MOV      r0,#0x28
00017c  e5810018          STR      r0,[r1,#0x18]
;;;351                 OSSemPost(I2C_SemWait);
000180  e59f0404          LDR      r0,|L1.1420|
000184  e5900000          LDR      r0,[r0,#0]  ; I2C_SemWait
000188  ebfffffe          BL       OSSemPost
;;;352                 VICIntEnClear      =  (1 << VIC_I2C0);
00018c  e3a00c02          MOV      r0,#0x200
000190  e3a01000          MOV      r1,#0
000194  e5010fec          STR      r0,[r1,#-0xfec]
;;;353                 break;
000198  ea000051          B        |L1.740|
                  |L1.412|
;;;354    
;;;355            case I2STAT_ARB_LOST:
00019c  e1a00000          MOV      r0,r0
;;;356                 I20CONCLR          = I2CON_STA | I2CON_SI;
0001a0  e3a00028          MOV      r0,#0x28
0001a4  e59f13d0          LDR      r1,|L1.1404|
0001a8  e5810018          STR      r0,[r1,#0x18]
;;;357                 OSSemPost(I2C_SemWait);
0001ac  e59f03d8          LDR      r0,|L1.1420|
0001b0  e5900000          LDR      r0,[r0,#0]  ; I2C_SemWait
0001b4  ebfffffe          BL       OSSemPost
;;;358                 VICIntEnClear      =  (1 << VIC_I2C0);
0001b8  e3a00c02          MOV      r0,#0x200
0001bc  e3a01000          MOV      r1,#0
0001c0  e5010fec          STR      r0,[r1,#-0xfec]
;;;359                 break;
0001c4  ea000046          B        |L1.740|
                  |L1.456|
;;;360    
;;;361    
;;;362            case I2STAT_SLA_R_ACK:
0001c8  e1a00000          MOV      r0,r0
;;;363                 if (I2C_Count <= 1) {
0001cc  e59f03b4          LDR      r0,|L1.1416|
0001d0  e5d00000          LDRB     r0,[r0,#0]  ; I2C_Count
0001d4  e3500001          CMP      r0,#1
0001d8  ca000003          BGT      |L1.492|
;;;364                     I20CONSET      = I2CON_AA;
0001dc  e3a00004          MOV      r0,#4
0001e0  e59f1394          LDR      r1,|L1.1404|
0001e4  e5810000          STR      r0,[r1,#0]
0001e8  ea000002          B        |L1.504|
                  |L1.492|
;;;365                 } else {
;;;366                     I20CONCLR      = I2CON_AA;
0001ec  e3a00004          MOV      r0,#4
0001f0  e59f1384          LDR      r1,|L1.1404|
0001f4  e5810018          STR      r0,[r1,#0x18]
                  |L1.504|
;;;367                 }
;;;368                 I20CONCLR          = I2CON_STA | I2CON_SI;
0001f8  e3a00028          MOV      r0,#0x28
0001fc  e59f1378          LDR      r1,|L1.1404|
000200  e5810018          STR      r0,[r1,#0x18]
;;;369                 break;
000204  ea000036          B        |L1.740|
                  |L1.520|
;;;370    
;;;371            case I2STAT_DAT_R_ACK:
000208  e1a00000          MOV      r0,r0
;;;372                 temp               = I20DAT;
00020c  e59f0368          LDR      r0,|L1.1404|
000210  e5905008          LDR      r5,[r0,#8]
;;;373                *I2C_BufPtr         = temp;
000214  e59f1368          LDR      r1,|L1.1412|
000218  e5911000          LDR      r1,[r1,#0]  ; I2C_BufPtr
00021c  e5c15000          STRB     r5,[r1,#0]
;;;374                 I2C_BufPtr        += 1;
000220  e59f035c          LDR      r0,|L1.1412|
000224  e5900000          LDR      r0,[r0,#0]  ; I2C_BufPtr
000228  e2800001          ADD      r0,r0,#1
00022c  e59f1350          LDR      r1,|L1.1412|
000230  e5810000          STR      r0,[r1,#0]  ; I2C_BufPtr
;;;375                 I2C_Count         -= 1;
000234  e2810004          ADD      r0,r1,#4
000238  e5d00000          LDRB     r0,[r0,#0]  ; I2C_Count
00023c  e2400001          SUB      r0,r0,#1
000240  e2811004          ADD      r1,r1,#4
000244  e5c10000          STRB     r0,[r1,#0]  ; I2C_Count
;;;376                 if (I2C_Count <= 1) {
000248  e2810000          ADD      r0,r1,#0
00024c  e5d00000          LDRB     r0,[r0,#0]  ; I2C_Count
000250  e3500001          CMP      r0,#1
000254  ca000002          BGT      |L1.612|
;;;377                     I20CONCLR      = I2CON_AA;
000258  e3a00004          MOV      r0,#4
00025c  e59f1318          LDR      r1,|L1.1404|
000260  e5810018          STR      r0,[r1,#0x18]
                  |L1.612|
;;;378                 }
;;;379                 I20CONCLR          = I2CON_STA | I2CON_SI;
000264  e3a00028          MOV      r0,#0x28
000268  e59f130c          LDR      r1,|L1.1404|
00026c  e5810018          STR      r0,[r1,#0x18]
;;;380                 break;
000270  ea00001b          B        |L1.740|
                  |L1.628|
;;;381    
;;;382            case I2STAT_DAT_R_NOACK:
000274  e1a00000          MOV      r0,r0
;;;383                 temp               = I20DAT;
000278  e59f02fc          LDR      r0,|L1.1404|
00027c  e5905008          LDR      r5,[r0,#8]
;;;384                *I2C_BufPtr         = temp;
000280  e59f12fc          LDR      r1,|L1.1412|
000284  e5911000          LDR      r1,[r1,#0]  ; I2C_BufPtr
000288  e5c15000          STRB     r5,[r1,#0]
;;;385                 I2C_Count         -= 1;
00028c  e59f02f4          LDR      r0,|L1.1416|
000290  e5d00000          LDRB     r0,[r0,#0]  ; I2C_Count
000294  e2400001          SUB      r0,r0,#1
000298  e59f12e8          LDR      r1,|L1.1416|
00029c  e5c10000          STRB     r0,[r1,#0]  ; I2C_Count
;;;386                 I20CONSET          = I2CON_STO;
0002a0  e3a00010          MOV      r0,#0x10
0002a4  e59f12d0          LDR      r1,|L1.1404|
0002a8  e5810000          STR      r0,[r1,#0]
;;;387                 I20CONCLR          = I2CON_STA | I2CON_SI;
0002ac  e3a00028          MOV      r0,#0x28
0002b0  e5810018          STR      r0,[r1,#0x18]
;;;388                 OSSemPost(I2C_SemWait);
0002b4  e59f02d0          LDR      r0,|L1.1420|
0002b8  e5900000          LDR      r0,[r0,#0]  ; I2C_SemWait
0002bc  ebfffffe          BL       OSSemPost
;;;389                 VICIntEnClear      =  (1 << VIC_I2C0);
0002c0  e3a00c02          MOV      r0,#0x200
0002c4  e3a01000          MOV      r1,#0
0002c8  e5010fec          STR      r0,[r1,#-0xfec]
;;;390                 break;
0002cc  ea000004          B        |L1.740|
                  |L1.720|
;;;391    
;;;392            default:
0002d0  e1a00000          MOV      r0,r0
;;;393                 I20CONCLR          = I2CON_STA | I2CON_SI;
0002d4  e3a00028          MOV      r0,#0x28
0002d8  e59f129c          LDR      r1,|L1.1404|
0002dc  e5810018          STR      r0,[r1,#0x18]
;;;394                 break;
0002e0  e1a00000          MOV      r0,r0
                  |L1.740|
0002e4  e1a00000          MOV      r0,r0
;;;395        }
;;;396    }
0002e8  e8bd4070          POP      {r4-r6,lr}
0002ec  e12fff1e          BX       lr
                          ENDP

                  I2C_Init PROC
;;;126    void  I2C_Init (void)
;;;127    {
0002f0  e92d4010          PUSH     {r4,lr}
;;;128        CPU_INT32U  pinsel;
;;;129    
;;;130    
;;;131        VICIntSelect       &= ~(1 << VIC_I2C0);                     /* Configure the I2C interrupt as an IRQ source             */
0002f4  e3a00000          MOV      r0,#0
0002f8  e5100ff4          LDR      r0,[r0,#-0xff4]
0002fc  e3c00c02          BIC      r0,r0,#0x200

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -