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

📄 bsp_i2c.lst

📁 IARSOURCECODE是基于LPC2478嵌入式软件IAR EWARM V4.42的应用实例代码
💻 LST
📖 第 1 页 / 共 4 页
字号:
   \                                 In segment CODE, align 4, keep-with-next
    126          void  I2C_Init (void)
    127          {
   \                     I2C_Init:
   \   00000000   00402DE9           PUSH     {LR}
    128              CPU_INT32U  pinsel;
    129          
    130          
    131              VICIntSelect       &= ~(1 << VIC_I2C0);                     /* Configure the I2C interrupt as an IRQ source             */
   \   00000004   F300E0E3           MVN      R0,#+243
   \   00000008   F00EC0E3           BIC      R0,R0,#0xF00
   \   0000000C   F310E0E3           MVN      R1,#+243
   \   00000010   F01EC1E3           BIC      R1,R1,#0xF00
   \   00000014   001091E5           LDR      R1,[R1, #+0]
   \   00000018   801FD1E3           BICS     R1,R1,#0x200
   \   0000001C   001080E5           STR      R1,[R0, #+0]
    132              VICVectAddr9        =  (CPU_INT32U)I2C_ISR_Handler;         /* Set the vector address                                   */
   \   00000020   DB00E0E3           MVN      R0,#+219
   \   00000024   E00EC0E3           BIC      R0,R0,#0xE00
   \   00000028   78109FE5           LDR      R1,??I2C_Init_0  ;; I2C_ISR_Handler
   \   0000002C   001080E5           STR      R1,[R0, #+0]
    133              VICIntEnClear       =  (1 << VIC_I2C0);                     /* Disable the interrupt source                             */
   \   00000030   EB00E0E3           MVN      R0,#+235
   \   00000034   F00EC0E3           BIC      R0,R0,#0xF00
   \   00000038   801FA0E3           MOV      R1,#+512
   \   0000003C   001080E5           STR      R1,[R0, #+0]
    134          
    135              pinsel              = PINSEL1;
   \   00000040   4E02A0E3           MOV      R0,#-536870908
   \   00000044   B00B80E3           ORR      R0,R0,#0x2C000
   \   00000048   000090E5           LDR      R0,[R0, #+0]
    136              pinsel             &= 0xFC3FFFFF;
   \   0000004C   F007D0E3           BICS     R0,R0,#0x3C00000
    137              pinsel             |= 0x01400000;
   \   00000050   500790E3           ORRS     R0,R0,#0x1400000
    138              PINSEL1             = pinsel;
   \   00000054   4E12A0E3           MOV      R1,#-536870908
   \   00000058   B01B81E3           ORR      R1,R1,#0x2C000
   \   0000005C   000081E5           STR      R0,[R1, #+0]
    139          
    140              I20CONCLR           = 0x006C;                               /* Clear flags                                              */
   \   00000060   ........           LDR      R0,??DataTable66  ;; 0xffffffffe001c018
   \   00000064   6C10A0E3           MOV      R1,#+108
   \   00000068   001080E5           STR      R1,[R0, #+0]
    141          
    142              I20SCLH             = 0x00F0;
   \   0000006C   38009FE5           LDR      R0,??I2C_Init_0+0x4  ;; 0xffffffffe001c010
   \   00000070   F010A0E3           MOV      R1,#+240
   \   00000074   001080E5           STR      R1,[R0, #+0]
    143              I20SCLL             = 0x0160;
   \   00000078   30009FE5           LDR      R0,??I2C_Init_0+0x8  ;; 0xffffffffe001c014
   \   0000007C   581FA0E3           MOV      R1,#+352
   \   00000080   001080E5           STR      R1,[R0, #+0]
    144          
    145              I2C_SemWait         = OSSemCreate(0);
   \   00000084   0000A0E3           MOV      R0,#+0
   \   00000088   ........           _BLF     OSSemCreate,??OSSemCreate??rA
   \   0000008C   ........           LDR      R1,??DataTable65  ;; I2C_SemWait
   \   00000090   000081E5           STR      R0,[R1, #+0]
    146              I2C_SemBusy         = OSSemCreate(1);
   \   00000094   0100A0E3           MOV      R0,#+1
   \   00000098   ........           _BLF     OSSemCreate,??OSSemCreate??rA
   \   0000009C   ........           LDR      R1,??DataTable28  ;; I2C_SemBusy
   \   000000A0   000081E5           STR      R0,[R1, #+0]
    147          }
   \   000000A4   0080BDE8           POP      {PC}             ;; return
   \                     ??I2C_Init_0:
   \   000000A8   ........           DC32     I2C_ISR_Handler
   \   000000AC   10C001E0           DC32     0xffffffffe001c010
   \   000000B0   14C001E0           DC32     0xffffffffe001c014
    148          
    149          /*
    150          *********************************************************************************************************
    151          *                                        I2C_Read()
    152          *
    153          * Description : This function reads from the I2C bus.
    154          *
    155          * Arguements  : p_buf   is a pointer to the buffer into which the bytes will be stored
    156          *               count   is the number of bytes to read
    157          *
    158          * Returns     : None
    159          *********************************************************************************************************
    160          */
    161          

   \                                 In segment CODE, align 4, keep-with-next
    162          void  I2C_Read (CPU_INT08U *p_buf, CPU_INT08U count)
    163          {
   \                     I2C_Read:
   \   00000000   30402DE9           PUSH     {R4,R5,LR}
   \   00000004   04D04DE2           SUB      SP,SP,#+4
   \   00000008   0040B0E1           MOVS     R4,R0
   \   0000000C   0150B0E1           MOVS     R5,R1
    164              CPU_INT08U      err;
    165          
    166          
    167              OSSemPend(I2C_SemBusy, 0, &err);                            /* Wait until I2C is free                                   */
   \   00000010   0D20B0E1           MOVS     R2,SP
   \   00000014   0010A0E3           MOV      R1,#+0
   \   00000018   ........           LDR      R0,??DataTable28  ;; I2C_SemBusy
   \   0000001C   000090E5           LDR      R0,[R0, #+0]
   \   00000020   ........           _BLF     OSSemPend,??OSSemPend??rA
    168          
    169              I20CONCLR           = I2CON_I2EN
    170                                  | I2CON_STA
    171                                  | I2CON_SI
    172                                  | I2CON_AA;
   \   00000024   ........           LDR      R0,??DataTable66  ;; 0xffffffffe001c018
   \   00000028   6C10A0E3           MOV      R1,#+108
   \   0000002C   001080E5           STR      R1,[R0, #+0]
    173          
    174              I20CONSET           = I2CON_I2EN;
   \   00000030   E004A0E3           MOV      R0,#-536870912
   \   00000034   700B80E3           ORR      R0,R0,#0x1C000
   \   00000038   4010A0E3           MOV      R1,#+64
   \   0000003C   001080E5           STR      R1,[R0, #+0]
    175          
    176              I2C_Address         = (PCA9532_ADDRESS | 0x01);             /* Set lower bit of address                                 */
   \   00000040   ........           LDR      R0,??DataTable29  ;; I2C_Address
   \   00000044   C110A0E3           MOV      R1,#+193
   \   00000048   0010C0E5           STRB     R1,[R0, #+0]
    177              I2C_BufPtr          = p_buf;
   \   0000004C   ........           LDR      R0,??DataTable61  ;; I2C_BufPtr
   \   00000050   004080E5           STR      R4,[R0, #+0]
    178              I2C_Count           = count;
   \   00000054   ........           LDR      R0,??DataTable63  ;; I2C_Count
   \   00000058   0050C0E5           STRB     R5,[R0, #+0]
    179          
    180              I20CONSET           = I2CON_STA
    181                                  | I2CON_AA;
   \   0000005C   E004A0E3           MOV      R0,#-536870912
   \   00000060   700B80E3           ORR      R0,R0,#0x1C000
   \   00000064   2410A0E3           MOV      R1,#+36
   \   00000068   001080E5           STR      R1,[R0, #+0]
    182          
    183          
    184              VICIntEnable        =  (1 << VIC_I2C0);                     /* Enable the interrupt source                              */
   \   0000006C   EF00E0E3           MVN      R0,#+239
   \   00000070   F00EC0E3           BIC      R0,R0,#0xF00
   \   00000074   801FA0E3           MOV      R1,#+512
   \   00000078   001080E5           STR      R1,[R0, #+0]
    185              OSSemPend(I2C_SemWait, 0, &err);                            /* Wait until complete                                      */
   \   0000007C   0D20B0E1           MOVS     R2,SP
   \   00000080   0010A0E3           MOV      R1,#+0
   \   00000084   ........           LDR      R0,??DataTable65  ;; I2C_SemWait
   \   00000088   000090E5           LDR      R0,[R0, #+0]
   \   0000008C   ........           _BLF     OSSemPend,??OSSemPend??rA
    186          
    187              OSSemPost(I2C_SemBusy);                                     /* Free I2C                                                 */
   \   00000090   ........           LDR      R0,??DataTable28  ;; I2C_SemBusy
   \   00000094   000090E5           LDR      R0,[R0, #+0]
   \   00000098   ........           _BLF     OSSemPost,??OSSemPost??rA
    188          }
   \   0000009C   04D08DE2           ADD      SP,SP,#+4        ;; stack cleaning
   \   000000A0   3080BDE8           POP      {R4,R5,PC}       ;; return
    189          
    190          /*
    191          *********************************************************************************************************
    192          *                                        I2C_ReadReg()
    193          *
    194          * Description : This function reads a register on an I2C device.
    195          *
    196          * Arguements  : p_buf   is a pointer to the buffer into which the bytes will be stored
    197          *               count   is the number of bytes to read
    198          *               reg     is the register to read
    199          *
    200          * Returns     : None
    201          *********************************************************************************************************
    202          */
    203          

   \                                 In segment CODE, align 4, keep-with-next
    204          void  I2C_ReadReg (CPU_INT08U *p_buf, CPU_INT08U count, CPU_INT08U reg)
    205          {
   \                     I2C_ReadReg:
   \   00000000   34402DE9           PUSH     {R2,R4,R5,LR}
   \   00000004   04D04DE2           SUB      SP,SP,#+4
   \   00000008   0040B0E1           MOVS     R4,R0
   \   0000000C   0150B0E1           MOVS     R5,R1
    206              CPU_INT08U      err;
    207          
    208          
    209              OSSemPend(I2C_SemBusy, 0, &err);                            /* Wait until I2C is free                                   */
   \   00000010   0D20B0E1           MOVS     R2,SP
   \   00000014   0010A0E3           MOV      R1,#+0
   \   00000018   ........           LDR      R0,??DataTable28  ;; I2C_SemBusy
   \   0000001C   000090E5           LDR      R0,[R0, #+0]
   \   00000020   ........           _BLF     OSSemPend,??OSSemPend??rA
    210          
    211          
    212          
    213              I20CONCLR           = I2CON_I2EN
    214                                  | I2CON_STA
    215                                  | I2CON_SI
    216                                  | I2CON_AA;
   \   00000024   ........           LDR      R0,??DataTable66  ;; 0xffffffffe001c018
   \   00000028   6C10A0E3           MOV      R1,#+108
   \   0000002C   001080E5           STR      R1,[R0, #+0]
    217          
    218              I20CONSET           = I2CON_I2EN;
   \   00000030   E004A0E3           MOV      R0,#-536870912
   \   00000034   700B80E3           ORR      R0,R0,#0x1C000
   \   00000038   4010A0E3           MOV      R1,#+64
   \   0000003C   001080E5           STR      R1,[R0, #+0]
    219          
    220              I2C_Address         = (PCA9532_ADDRESS & 0xFE);             /* Clear lower bit of address                               */
   \   00000040   ........           LDR      R0,??DataTable29  ;; I2C_Address
   \   00000044   C010A0E3           MOV      R1,#+192
   \   00000048   0010C0E5           STRB     R1,[R0, #+0]
    221              I2C_BufPtr          = &reg;
   \   0000004C   ........           LDR      R0,??DataTable61  ;; I2C_BufPtr
   \   00000050   04108DE2           ADD      R1,SP,#+4
   \   00000054   001080E5           STR      R1,[R0, #+0]
    222              I2C_Count           = 1;
   \   00000058   ........           LDR      R0,??DataTable63  ;; I2C_Count
   \   0000005C   0110A0E3           MOV      R1,#+1
   \   00000060   0010C0E5           STRB     R1,[R0, #+0]
    223          
    224              I20CONSET           = I2CON_STA
    225                                  | I2CON_AA;
   \   00000064   E004A0E3           MOV      R0,#-536870912
   \   00000068   700B80E3           ORR      R0,R0,#0x1C000
   \   0000006C   2410A0E3           MOV      R1,#+36
   \   00000070   001080E5           STR      R1,[R0, #+0]
    226          
    227              VICIntEnable        =  (1 << VIC_I2C0);                     /* Enable the interrupt source                              */
   \   00000074   EF00E0E3           MVN      R0,#+239
   \   00000078   F00EC0E3           BIC      R0,R0,#0xF00
   \   0000007C   801FA0E3           MOV      R1,#+512
   \   00000080   001080E5           STR      R1,[R0, #+0]
    228              OSSemPend(I2C_SemWait, 0, &err);                            /* Wait until complete                                      */
   \   00000084   0D20B0E1           MOVS     R2,SP
   \   00000088   0010A0E3           MOV      R1,#+0
   \   0000008C   ........           LDR      R0,??DataTable65  ;; I2C_SemWait
   \   00000090   000090E5           LDR      R0,[R0, #+0]
   \   00000094   ........           _BLF     OSSemPend,??OSSemPend??rA
    229          
    230          
    231          
    232              I20CONCLR           = I2CON_I2EN
    233                                  | I2CON_STA
    234                                  | I2CON_SI
    235                                  | I2CON_AA;
   \   00000098   ........           LDR      R0,??DataTable66  ;; 0xffffffffe001c018
   \   0000009C   6C10A0E3           MOV      R1,#+108
   \   000000A0   001080E5           STR      R1,[R0, #+0]
    236          
    237              I20CONSET           = I2CON_I2EN;
   \   000000A4   E004A0E3           MOV      R0,#-536870912
   \   000000A8   700B80E3           ORR      R0,R0,#0x1C000
   \   000000AC   4010A0E3           MOV      R1,#+64
   \   000000B0   001080E5           STR      R1,[R0, #+0]
    238          
    239              I2C_Address         = (PCA9532_ADDRESS | 0x01);             /* Set lower bit of address                                 */
   \   000000B4   ........           LDR      R0,??DataTable29  ;; I2C_Address
   \   000000B8   C110A0E3           MOV      R1,#+193
   \   000000BC   0010C0E5           STRB     R1,[R0, #+0]
    240              I2C_BufPtr          = p_buf;
   \   000000C0   ........           LDR      R0,??DataTable61  ;; I2C_BufPtr

⌨️ 快捷键说明

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