twid.lst

来自「IAR5.2下 AT91SAM9260 ARM 对 MCP2515 控制源化码」· LST 代码 · 共 814 行 · 第 1/3 页

LST
814
字号
   \   00000100   0110D0E7           LDRB     R1,[R0, +R1]
   \   00000104   0700B0E1           MOVS     R0,R7
   \   00000108   ........           BL       TWI_WriteByte
    135                      pTransfer->transferred++;
   \   0000010C   100096E5           LDR      R0,[R6, #+16]
   \   00000110   010090E2           ADDS     R0,R0,#+1
   \   00000114   100086E5           STR      R0,[R6, #+16]
   \   00000118   100000EA           B        ??TWID_Handler_4
    136                  }
    137              }
    138              // Transfer complete
    139              else if (TWI_STATUS_TXCOMP(status)) 
   \                     ??TWID_Handler_5:
   \   0000011C   0500B0E1           MOVS     R0,R5
   \   00000120   FF0010E2           ANDS     R0,R0,#0xFF      ;; Zero extend
   \   00000124   010010E3           TST      R0,#0x1
   \   00000128   0C00000A           BEQ      ??TWID_Handler_4
    140              {
    141                  TWI_DisableIt(pTwi, AT91C_TWI_TXCOMP);
   \   0000012C   0110A0E3           MOV      R1,#+1
   \   00000130   0700B0E1           MOVS     R0,R7
   \   00000134   ........           BL       TWI_DisableIt
    142                  pTransfer->status = 0;
   \   00000138   0000A0E3           MOV      R0,#+0
   \   0000013C   0000C6E5           STRB     R0,[R6, #+0]
    143                  if (pTransfer->callback)  
   \   00000140   040096E5           LDR      R0,[R6, #+4]
   \   00000144   000050E3           CMP      R0,#+0
   \   00000148   0200000A           BEQ      ??TWID_Handler_7
    144                      pTransfer->callback((Async *) pTransfer);
   \   0000014C   0600B0E1           MOVS     R0,R6
   \   00000150   041096E5           LDR      R1,[R6, #+4]
   \   00000154   31FF2FE1           BLX      R1
    145                  pTwid->pTransfer = 0;
   \                     ??TWID_Handler_7:
   \   00000158   0000A0E3           MOV      R0,#+0
   \   0000015C   040084E5           STR      R0,[R4, #+4]
    146              }
    147          }
   \                     ??TWID_Handler_4:
   \   00000160   F180BDE8           POP      {R0,R4-R7,PC}    ;; return
    148          
    149          //-----------------------------------------------------------------------------
    150          /// Asynchronously reads data from a slave on the TWI bus. An optional
    151          /// callback function is triggered when the transfer is complete.
    152          /// Returns 0 if the transfer has been started; otherwise returns a TWI error
    153          /// code.
    154          /// \param pTwid  Pointer to a Twid instance.
    155          /// \param address  TWI slave address.
    156          /// \param iaddress  Optional slave internal address.
    157          /// \param isize  Internal address size in bytes.
    158          /// \param pData  Data buffer for storing received bytes.
    159          /// \param num  Number of bytes to read.
    160          /// \param pAsync  Asynchronous transfer descriptor.
    161          //-----------------------------------------------------------------------------

   \                                 In section .text, align 4, keep-with-next
    162          unsigned char TWID_Read(
    163              Twid *pTwid,
    164              unsigned char address,
    165              unsigned int iaddress,
    166              unsigned char isize,
    167              unsigned char *pData,
    168              unsigned int num,
    169              Async *pAsync)
    170          {
   \                     TWID_Read:
   \   00000000   F14F2DE9           PUSH     {R0,R4-R11,LR}
   \   00000004   01A0B0E1           MOVS     R10,R1
   \   00000008   0290B0E1           MOVS     R9,R2
   \   0000000C   0380B0E1           MOVS     R8,R3
   \   00000010   28409DE5           LDR      R4,[SP, #+40]
   \   00000014   2C509DE5           LDR      R5,[SP, #+44]
   \   00000018   30B09DE5           LDR      R11,[SP, #+48]
    171              AT91S_TWI *pTwi = pTwid->pTwi;
   \   0000001C   00009DE5           LDR      R0,[SP, #+0]
   \   00000020   000090E5           LDR      R0,[R0, #+0]
   \   00000024   0060B0E1           MOVS     R6,R0
    172              AsyncTwi *pTransfer = (AsyncTwi *) pTwid->pTransfer;
   \   00000028   00009DE5           LDR      R0,[SP, #+0]
   \   0000002C   040090E5           LDR      R0,[R0, #+4]
   \   00000030   0070B0E1           MOVS     R7,R0
    173          
    174              trace_LOG(trace_DEBUG, "-D- TWID_Read()\n\r");
    175              SANITY_CHECK(pTwid);
   \   00000034   00009DE5           LDR      R0,[SP, #+0]
   \   00000038   000050E3           CMP      R0,#+0
   \   0000003C   0400001A           BNE      ??TWID_Read_0
   \   00000040   AF20A0E3           MOV      R2,#+175
   \   00000044   ........           LDR      R1,??DataTable20  ;; `?<Constant "E:\\\\IAR\\\\at91lib\\\\driver...">`
   \   00000048   ........           LDR      R0,??DataTable21  ;; `?<Constant "Sanity check failed a...">`
   \   0000004C   ........           BL       printf
   \                     ??TWID_Read_1:
   \   00000050   FEFFFFEA           B        ??TWID_Read_1
    176              SANITY_CHECK((address & 0x80) == 0);
   \                     ??TWID_Read_0:
   \   00000054   80001AE3           TST      R10,#0x80
   \   00000058   0400000A           BEQ      ??TWID_Read_2
   \   0000005C   B020A0E3           MOV      R2,#+176
   \   00000060   ........           LDR      R1,??DataTable20  ;; `?<Constant "E:\\\\IAR\\\\at91lib\\\\driver...">`
   \   00000064   ........           LDR      R0,??DataTable21  ;; `?<Constant "Sanity check failed a...">`
   \   00000068   ........           BL       printf
   \                     ??TWID_Read_3:
   \   0000006C   FEFFFFEA           B        ??TWID_Read_3
    177              SANITY_CHECK((iaddress & 0xFF000000) == 0);
   \                     ??TWID_Read_2:
   \   00000070   FF0419E3           TST      R9,#0xFF000000
   \   00000074   0400000A           BEQ      ??TWID_Read_4
   \   00000078   B120A0E3           MOV      R2,#+177
   \   0000007C   ........           LDR      R1,??DataTable20  ;; `?<Constant "E:\\\\IAR\\\\at91lib\\\\driver...">`
   \   00000080   ........           LDR      R0,??DataTable21  ;; `?<Constant "Sanity check failed a...">`
   \   00000084   ........           BL       printf
   \                     ??TWID_Read_5:
   \   00000088   FEFFFFEA           B        ??TWID_Read_5
    178              SANITY_CHECK(isize < 4);
   \                     ??TWID_Read_4:
   \   0000008C   FF8018E2           ANDS     R8,R8,#0xFF      ;; Zero extend
   \   00000090   040058E3           CMP      R8,#+4
   \   00000094   0400003A           BCC      ??TWID_Read_6
   \   00000098   B220A0E3           MOV      R2,#+178
   \   0000009C   ........           LDR      R1,??DataTable20  ;; `?<Constant "E:\\\\IAR\\\\at91lib\\\\driver...">`
   \   000000A0   ........           LDR      R0,??DataTable21  ;; `?<Constant "Sanity check failed a...">`
   \   000000A4   ........           BL       printf
   \                     ??TWID_Read_7:
   \   000000A8   FEFFFFEA           B        ??TWID_Read_7
    179          
    180              // Check that no transfer is already pending
    181              if (pTransfer) {
   \                     ??TWID_Read_6:
   \   000000AC   000057E3           CMP      R7,#+0
   \   000000B0   0300000A           BEQ      ??TWID_Read_8
    182          
    183                  trace_LOG(trace_ERROR, "-E- TWID_Read: A transfer is already pending\n\r");
   \   000000B4   E4009FE5           LDR      R0,??TWID_Read_9  ;; `?<Constant "-E- TWID_Read: A tran...">`
   \   000000B8   ........           BL       printf
    184                  return TWID_ERROR_BUSY;
   \   000000BC   0100A0E3           MOV      R0,#+1
   \   000000C0   350000EA           B        ??TWID_Read_10
    185              }
    186          
    187              // Set STOP signal if only one byte is sent
    188              if (num == 1) {
   \                     ??TWID_Read_8:
   \   000000C4   010055E3           CMP      R5,#+1
   \   000000C8   0100001A           BNE      ??TWID_Read_11
    189          
    190                  TWI_Stop(pTwi);
   \   000000CC   0600B0E1           MOVS     R0,R6
   \   000000D0   ........           BL       TWI_Stop
    191              }
    192          
    193              // Asynchronous transfer
    194              if (pAsync) {
   \                     ??TWID_Read_11:
   \   000000D4   00005BE3           CMP      R11,#+0
   \   000000D8   1300000A           BEQ      ??TWID_Read_12
    195              
    196                  // Update the transfer descriptor
    197                  pTwid->pTransfer = pAsync;
   \   000000DC   00009DE5           LDR      R0,[SP, #+0]
   \   000000E0   04B080E5           STR      R11,[R0, #+4]
    198                  pTransfer = (AsyncTwi *) pAsync;
   \   000000E4   0B70B0E1           MOVS     R7,R11
    199                  pTransfer->status = ASYNC_STATUS_PENDING;
   \   000000E8   FF00A0E3           MOV      R0,#+255
   \   000000EC   0000C7E5           STRB     R0,[R7, #+0]
    200                  pTransfer->pData = pData;
   \   000000F0   084087E5           STR      R4,[R7, #+8]
    201                  pTransfer->num = num;
   \   000000F4   0C5087E5           STR      R5,[R7, #+12]
    202                  pTransfer->transferred = 0;
   \   000000F8   0000A0E3           MOV      R0,#+0
   \   000000FC   100087E5           STR      R0,[R7, #+16]
    203                  
    204                  // Enable read interrupt and start the transfer
    205                  TWI_EnableIt(pTwi, AT91C_TWI_RXRDY);
   \   00000100   0210A0E3           MOV      R1,#+2
   \   00000104   0600B0E1           MOVS     R0,R6
   \   00000108   ........           BL       TWI_EnableIt
    206                  TWI_StartRead(pTwi, address, iaddress, isize);
   \   0000010C   0830B0E1           MOVS     R3,R8
   \   00000110   FF3013E2           ANDS     R3,R3,#0xFF      ;; Zero extend
   \   00000114   0920B0E1           MOVS     R2,R9
   \   00000118   0A10B0E1           MOVS     R1,R10
   \   0000011C   FF1011E2           ANDS     R1,R1,#0xFF      ;; Zero extend
   \   00000120   0600B0E1           MOVS     R0,R6
   \   00000124   ........           BL       TWI_StartRead
   \   00000128   1A0000EA           B        ??TWID_Read_13
    207              }
    208              // Synchronous transfer
    209              else {
    210          
    211                  // Start read
    212                  TWI_StartRead(pTwi, address, iaddress, isize);
   \                     ??TWID_Read_12:
   \   0000012C   0830B0E1           MOVS     R3,R8
   \   00000130   FF3013E2           ANDS     R3,R3,#0xFF      ;; Zero extend
   \   00000134   0920B0E1           MOVS     R2,R9
   \   00000138   0A10B0E1           MOVS     R1,R10
   \   0000013C   FF1011E2           ANDS     R1,R1,#0xFF      ;; Zero extend
   \   00000140   0600B0E1           MOVS     R0,R6
   \   00000144   ........           BL       TWI_StartRead
    213          
    214                  // Read all bytes, setting STOP before the last byte
    215                  while (num > 0) {
   \                     ??TWID_Read_14:
   \   00000148   000055E3           CMP      R5,#+0
   \   0000014C   0D00000A           BEQ      ??TWID_Read_15
    216          
    217                      // Last byte
    218                      if (num == 1) {
   \   00000150   010055E3           CMP      R5,#+1
   \   00000154   0100001A           BNE      ??TWID_Read_16
    219          
    220                          TWI_Stop(pTwi);
   \   00000158   0600B0E1           MOVS     R0,R6
   \   0000015C   ........           BL       TWI_Stop
    221                      }
    222          
    223                      // Wait for byte then read and store it
    224                      while (!TWI_ByteReceived(pTwi));
   \                     ??TWID_Read_16:
   \   00000160   0600B0E1           MOVS     R0,R6
   \   00000164   ........           BL       TWI_ByteReceived
   \   00000168   000050E3           CMP      R0,#+0
   \   0000016C   FBFFFF0A           BEQ      ??TWID_Read_16
    225                      *pData++ = TWI_ReadByte(pTwi);
   \   00000170   0600B0E1           MOVS     R0,R6
   \   00000174   ........           BL       TWI_ReadByte
   \   00000178   0000C4E5           STRB     R0,[R4, #+0]
   \   0000017C   014094E2           ADDS     R4,R4,#+1
    226                      num--;
   \   00000180   015055E2           SUBS     R5,R5,#+1
   \   00000184   EFFFFFEA           B        ??TWID_Read_14
    227                  }
    228          
    229                  // Wait for transfer to be complete
    230                  while (!TWI_TransferComplete(pTwi));
   \                     ??TWID_Read_15:
   \   00000188   0600B0E1           MOVS     R0,R6
   \   0000018C   ........           BL       TWI_TransferComplete
   \   00000190   000050E3           CMP      R0,#+0
   \   00000194   FBFFFF0A           BEQ      ??TWID_Read_15
    231              }
    232          
    233              return 0;
   \                     ??TWID_Read_13:
   \   00000198   0000A0E3           MOV      R0,#+0
   \                     ??TWID_Read_10:
   \   0000019C   F28FBDE8           POP      {R1,R4-R11,PC}   ;; return
   \                     ??TWID_Read_9:
   \   000001A0   ........           DC32     `?<Constant "-E- TWID_Read: A tran...">`
    234          }
    235          
    236          //------------------------------------------------------------------------------
    237          /// Asynchronously sends data to a slave on the TWI bus. An optional callback
    238          /// function is invoked whenever the transfer is complete.
    239          /// \param pTwid  Pointer to a Twid instance.
    240          /// \param address  Slave address.
    241          /// \param iaddress  Optional slave internal address.
    242          /// \param isize  Number of internal address bytes.
    243          /// \param pData  Data buffer to send.
    244          /// \param num  Number of bytes to send.
    245          /// \param pAsync  Pointer to an Asynchronous transfer descriptor.
    246          //------------------------------------------------------------------------------

   \                                 In section .text, align 4, keep-with-next
    247          unsigned char TWID_Write(
    248              Twid *pTwid,
    249              unsigned char address,
    250              unsigned int iaddress,
    251              unsigned char isize,

⌨️ 快捷键说明

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