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

📄 twi.lst

📁 IAR5.2下 AT91SAM9260 ARM 对 MCP2515 控制源化码
💻 LST
📖 第 1 页 / 共 5 页
字号:
    317              return ((pTwi->TWI_SR & AT91C_TWI_TXCOMP) == AT91C_TWI_TXCOMP);
   \                     TWI_TransferComplete:
   \   00000000   200090E5           LDR      R0,[R0, #+32]
   \   00000004   010010E2           ANDS     R0,R0,#0x1
   \   00000008   FF0010E2           ANDS     R0,R0,#0xFF      ;; Zero extend
   \   0000000C   1EFF2FE1           BX       LR               ;; return
    318          }
    319          
    320          //-----------------------------------------------------------------------------
    321          /// Enables the selected interrupts sources on a TWI peripheral.
    322          /// \param pTwi  Pointer to an AT91S_TWI instance.
    323          /// \param sources  Bitwise OR of selected interrupt sources.
    324          //-----------------------------------------------------------------------------

   \                                 In section .text, align 4, keep-with-next
    325          void TWI_EnableIt(AT91S_TWI *pTwi, unsigned int sources)
    326          {
   \                     TWI_EnableIt:
   \   00000000   38402DE9           PUSH     {R3-R5,LR}
   \   00000004   0040B0E1           MOVS     R4,R0
   \   00000008   0150B0E1           MOVS     R5,R1
    327              SANITY_CHECK(pTwi);
   \   0000000C   000054E3           CMP      R4,#+0
   \   00000010   0500001A           BNE      ??TWI_EnableIt_0
   \   00000014   4720A0E3           MOV      R2,#+71
   \   00000018   402F82E3           ORR      R2,R2,#0x100
   \   0000001C   ........           LDR      R1,??DataTable34  ;; `?<Constant "E:\\\\IAR\\\\at91lib\\\\periph...">`
   \   00000020   ........           LDR      R0,??DataTable35  ;; `?<Constant "Sanity check failed a...">`
   \   00000024   ........           BL       printf
   \                     ??TWI_EnableIt_1:
   \   00000028   FEFFFFEA           B        ??TWI_EnableIt_1
    328              SANITY_CHECK((sources & 0xFFFFFEF8) == 0);
   \                     ??TWI_EnableIt_0:
   \   0000002C   0700E0E3           MVN      R0,#+7
   \   00000030   400FC0E3           BIC      R0,R0,#0x100
   \   00000034   050010E1           TST      R0,R5
   \   00000038   0400000A           BEQ      ??TWI_EnableIt_2
   \   0000003C   522FA0E3           MOV      R2,#+328
   \   00000040   ........           LDR      R1,??DataTable34  ;; `?<Constant "E:\\\\IAR\\\\at91lib\\\\periph...">`
   \   00000044   ........           LDR      R0,??DataTable35  ;; `?<Constant "Sanity check failed a...">`
   \   00000048   ........           BL       printf
   \                     ??TWI_EnableIt_3:
   \   0000004C   FEFFFFEA           B        ??TWI_EnableIt_3
    329          
    330              pTwi->TWI_IER = sources;
   \                     ??TWI_EnableIt_2:
   \   00000050   245084E5           STR      R5,[R4, #+36]
    331          }
   \   00000054   3180BDE8           POP      {R0,R4,R5,PC}    ;; return
    332          
    333          //-----------------------------------------------------------------------------
    334          /// Disables the selected interrupts sources on a TWI peripheral.
    335          /// \param pTwi  Pointer to an AT91S_TWI instance.
    336          /// \param sources  Bitwise OR of selected interrupt sources.
    337          //-----------------------------------------------------------------------------

   \                                 In section .text, align 4, keep-with-next
    338          void TWI_DisableIt(AT91S_TWI *pTwi, unsigned int sources)
    339          {
   \                     TWI_DisableIt:
   \   00000000   38402DE9           PUSH     {R3-R5,LR}
   \   00000004   0040B0E1           MOVS     R4,R0
   \   00000008   0150B0E1           MOVS     R5,R1
    340              SANITY_CHECK(pTwi);
   \   0000000C   000054E3           CMP      R4,#+0
   \   00000010   0400001A           BNE      ??TWI_DisableIt_0
   \   00000014   552FA0E3           MOV      R2,#+340
   \   00000018   ........           LDR      R1,??DataTable34  ;; `?<Constant "E:\\\\IAR\\\\at91lib\\\\periph...">`
   \   0000001C   ........           LDR      R0,??DataTable35  ;; `?<Constant "Sanity check failed a...">`
   \   00000020   ........           BL       printf
   \                     ??TWI_DisableIt_1:
   \   00000024   FEFFFFEA           B        ??TWI_DisableIt_1
    341              SANITY_CHECK((sources & 0xFFFFFEF8) == 0);
   \                     ??TWI_DisableIt_0:
   \   00000028   0700E0E3           MVN      R0,#+7
   \   0000002C   400FC0E3           BIC      R0,R0,#0x100
   \   00000030   050010E1           TST      R0,R5
   \   00000034   0500000A           BEQ      ??TWI_DisableIt_2
   \   00000038   5520A0E3           MOV      R2,#+85
   \   0000003C   402F82E3           ORR      R2,R2,#0x100
   \   00000040   ........           LDR      R1,??DataTable34  ;; `?<Constant "E:\\\\IAR\\\\at91lib\\\\periph...">`
   \   00000044   ........           LDR      R0,??DataTable35  ;; `?<Constant "Sanity check failed a...">`
   \   00000048   ........           BL       printf
   \                     ??TWI_DisableIt_3:
   \   0000004C   FEFFFFEA           B        ??TWI_DisableIt_3
    342          
    343              pTwi->TWI_IDR = sources;
   \                     ??TWI_DisableIt_2:
   \   00000050   285084E5           STR      R5,[R4, #+40]
    344          }
   \   00000054   3180BDE8           POP      {R0,R4,R5,PC}    ;; return
    345          
    346          //-----------------------------------------------------------------------------
    347          /// Returns the current status register of the given TWI peripheral. This
    348          /// resets the internal value of the status register, so further read may yield
    349          /// different values.
    350          /// \param pTwi  Pointer to an AT91S_TWI instance.
    351          //-----------------------------------------------------------------------------

   \                                 In section .text, align 4, keep-with-next
    352          unsigned int TWI_GetStatus(AT91S_TWI *pTwi)
    353          {
   \                     TWI_GetStatus:
   \   00000000   10402DE9           PUSH     {R4,LR}
   \   00000004   0040B0E1           MOVS     R4,R0
    354              SANITY_CHECK(pTwi);
   \   00000008   000054E3           CMP      R4,#+0
   \   0000000C   0500001A           BNE      ??TWI_GetStatus_0
   \   00000010   6220A0E3           MOV      R2,#+98
   \   00000014   402F82E3           ORR      R2,R2,#0x100
   \   00000018   ........           LDR      R1,??DataTable34  ;; `?<Constant "E:\\\\IAR\\\\at91lib\\\\periph...">`
   \   0000001C   ........           LDR      R0,??DataTable35  ;; `?<Constant "Sanity check failed a...">`
   \   00000020   ........           BL       printf
   \                     ??TWI_GetStatus_1:
   \   00000024   FEFFFFEA           B        ??TWI_GetStatus_1
    355          
    356              return pTwi->TWI_SR;
   \                     ??TWI_GetStatus_0:
   \   00000028   200094E5           LDR      R0,[R4, #+32]
   \   0000002C   1080BDE8           POP      {R4,PC}          ;; return
    357          }
    358          
    359          //-----------------------------------------------------------------------------
    360          /// Returns the current status register of the given TWI peripheral, but
    361          /// masking interrupt sources which are not currently enabled.
    362          /// This resets the internal value of the status register, so further read may
    363          /// yield different values.
    364          /// \param pTwi  Pointer to an AT91S_TWI instance.
    365          //-----------------------------------------------------------------------------

   \                                 In section .text, align 4, keep-with-next
    366          unsigned int TWI_GetMaskedStatus(AT91S_TWI *pTwi)
    367          {
   \                     TWI_GetMaskedStatus:
   \   00000000   38402DE9           PUSH     {R3-R5,LR}
   \   00000004   0040B0E1           MOVS     R4,R0
    368              unsigned int status;
    369              
    370              SANITY_CHECK(pTwi);
   \   00000008   000054E3           CMP      R4,#+0
   \   0000000C   0500001A           BNE      ??TWI_GetMaskedStatus_0
   \   00000010   7220A0E3           MOV      R2,#+114
   \   00000014   402F82E3           ORR      R2,R2,#0x100
   \   00000018   ........           LDR      R1,??DataTable34  ;; `?<Constant "E:\\\\IAR\\\\at91lib\\\\periph...">`
   \   0000001C   ........           LDR      R0,??DataTable35  ;; `?<Constant "Sanity check failed a...">`
   \   00000020   ........           BL       printf
   \                     ??TWI_GetMaskedStatus_1:
   \   00000024   FEFFFFEA           B        ??TWI_GetMaskedStatus_1
    371              
    372              status = pTwi->TWI_SR;
   \                     ??TWI_GetMaskedStatus_0:
   \   00000028   200094E5           LDR      R0,[R4, #+32]
   \   0000002C   0050B0E1           MOVS     R5,R0
    373              status &= pTwi->TWI_IMR;
   \   00000030   2C0094E5           LDR      R0,[R4, #+44]
   \   00000034   055010E0           ANDS     R5,R0,R5
    374          
    375              return status;
   \   00000038   0500B0E1           MOVS     R0,R5
   \   0000003C   3280BDE8           POP      {R1,R4,R5,PC}    ;; return
    376          }
    377          
    378          
    379          //*============================================================================
    380          //* 函数名称:TWI_Write
    381          //* 函数功能:写 size 字节数据到从设备
    382          //* 入口参数:pTwi	:指向TWI结构的首地址-----设为AT91C_BASE_TWI
    383          //*	      slvAddr	: 从设备地址
    384          //*	      address	: 从设备内部地址(要写入数据的位置)
    385          //*	      *data2send: 要写入数据的起始地址
    386          //*	      size		: 要写入数据的长度
    387          //* 返回值  :0  : 写正常
    388          //*	      非0:写过程发生错误
    389          //*============================================================================

   \                                 In section .text, align 4, keep-with-next
    390          int TWI_Write(const AT91PS_TWI pTwi ,char slvAddr,int address, char *data2send, int size)
    391          {
   \                     TWI_Write:
   \   00000000   70402DE9           PUSH     {R4-R6,LR}
   \   00000004   00C0B0E1           MOVS     R12,R0
   \   00000008   10E09DE5           LDR      LR,[SP, #+16]
    392              unsigned int status,SLV_ADDR,error = 0;
   \   0000000C   0060A0E3           MOV      R6,#+0
   \   00000010   0600B0E1           MOVS     R0,R6
    393          	
    394              SLV_ADDR = slvAddr << 16;
   \   00000014   0160B0E1           MOVS     R6,R1
   \   00000018   FF6016E2           ANDS     R6,R6,#0xFF      ;; Zero extend
   \   0000001C   0668B0E1           LSLS     R6,R6,#+16
   \   00000020   0650B0E1           MOVS     R5,R6
    395              // 设置 TWI 为主发送模式,内部地址为 1 字节
    396              pTwi->TWI_MMR = ( SLV_ADDR | AT91C_TWI_IADRSZ_1_BYTE ) & ~AT91C_TWI_MREAD;	
   \   00000024   406DD5E3           BICS     R6,R5,#0x1000
   \   00000028   406F96E3           ORRS     R6,R6,#0x100
   \   0000002C   04608CE5           STR      R6,[R12, #+4]
    397          	
    398              // 装载从器件内部地址
    399              pTwi->TWI_IADR = address;
   \   00000030   0C208CE5           STR      R2,[R12, #+12]
    400          
    401              status = pTwi->TWI_SR;
   \   00000034   20609CE5           LDR      R6,[R12, #+32]
   \   00000038   0640B0E1           MOVS     R4,R6
    402          		
    403              pTwi->TWI_THR = *(data2send++);
   \   0000003C   0060D3E5           LDRB     R6,[R3, #+0]
   \   00000040   34608CE5           STR      R6,[R12, #+52]
   \   00000044   013093E2           ADDS     R3,R3,#+1
    404              //delay_ms();
    405              pTwi->TWI_CR = AT91C_TWI_START;
   \   00000048   0160A0E3           MOV      R6,#+1
   \   0000004C   00608CE5           STR      R6,[R12, #+0]
    406          		
    407              while (size-- >1)
   \                     ??TWI_Write_0:
   \   00000050   0E60B0E1           MOVS     R6,LR
   \   00000054   01E056E2           SUBS     LR,R6,#+1
   \   00000058   020056E3           CMP      R6,#+2
   \   0000005C   0C0000BA           BLT      ??TWI_Write_1
    408              {
    409                  // 等待发送保持寄存器空
    410                  while (!(pTwi->TWI_SR & AT91C_TWI_TXRDY))
   \                     ??TWI_Write_2:
   \   00000060   20609CE5           LDR      R6,[R12, #+32]
   \   00000064   040016E3           TST      R6,#0x4
   \   00000068   0500001A           BNE      ??TWI_Write_3
    411                  {
    412                      // 读取状态寄存器
    413                      status = pTwi->TWI_SR;
   \   0000006C   20609CE5           LDR      R6,[R12, #+32]
   \   00000070   0640B0E1           MOVS     R4,R6
    414          

⌨️ 快捷键说明

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