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

📄 twi.lst

📁 IAR5.2下 AT91SAM9260 ARM 对 MCP2515 控制源化码
💻 LST
📖 第 1 页 / 共 5 页
字号:
    117              pTWI->TWI_CR = AT91C_TWI_SWRST;
   \   00000008   8010A0E3           MOV      R1,#+128
   \   0000000C   001080E5           STR      R1,[R0, #+0]
    118          
    119              //* Set Master mode
    120              pTWI->TWI_CR = AT91C_TWI_MSEN;
   \   00000010   0410A0E3           MOV      R1,#+4
   \   00000014   001080E5           STR      R1,[R0, #+0]
    121          
    122          }
   \   00000018   1EFF2FE1           BX       LR               ;; return
    123          
    124          
    125          //*============================================================================
    126          //*		                 TWI初始化
    127          //*============================================================================
    128          //*============================================================================
    129          //* 函数名称:AT91F_SetTwiClock
    130          //* 函数功能:设置TWI时钟
    131          //* 入口参数:无
    132          //* 返回值  :无
    133          //*============================================================================

   \                                 In section .text, align 4, keep-with-next
    134          void AT91F_SetTwiClock(const AT91PS_TWI pTwi)
    135          {
   \                     AT91F_SetTwiClock:
   \   00000000   70402DE9           PUSH     {R4-R6,LR}
   \   00000004   0040B0E1           MOVS     R4,R0
    136          	int sclock;
    137          
    138          	/* Here, CKDIV = 1 and CHDIV=CLDIV  ==> CLDIV = CHDIV = 1/4*((Fmclk/FTWI) -6)*/
    139          
    140          	sclock = (10*BOARD_MCK / TWI_CLOCK);
   \   00000008   CC00A0E3           MOV      R0,#+204
   \   0000000C   980D80E3           ORR      R0,R0,#0x2600
   \   00000010   0050B0E1           MOVS     R5,R0
    141          	if (sclock % 10 >= 5)
   \   00000014   0500B0E1           MOVS     R0,R5
   \   00000018   0A10A0E3           MOV      R1,#+10
   \   0000001C   ........           BL       __aeabi_idivmod
   \   00000020   050051E3           CMP      R1,#+5
   \   00000024   040000BA           BLT      ??AT91F_SetTwiClock_0
    142          		sclock = (sclock /10) - 5;
   \   00000028   0500B0E1           MOVS     R0,R5
   \   0000002C   0A10A0E3           MOV      R1,#+10
   \   00000030   ........           BL       __aeabi_idivmod
   \   00000034   055050E2           SUBS     R5,R0,#+5
   \   00000038   030000EA           B        ??AT91F_SetTwiClock_1
    143          	else
    144          		sclock = (sclock /10)- 6;
   \                     ??AT91F_SetTwiClock_0:
   \   0000003C   0500B0E1           MOVS     R0,R5
   \   00000040   0A10A0E3           MOV      R1,#+10
   \   00000044   ........           BL       __aeabi_idivmod
   \   00000048   065050E2           SUBS     R5,R0,#+6
    145          	sclock = (sclock + (4 - sclock %4)) >> 2;	// div 4
   \                     ??AT91F_SetTwiClock_1:
   \   0000004C   046095E2           ADDS     R6,R5,#+4
   \   00000050   0500B0E1           MOVS     R0,R5
   \   00000054   0410A0E3           MOV      R1,#+4
   \   00000058   ........           BL       __aeabi_idivmod
   \   0000005C   010056E0           SUBS     R0,R6,R1
   \   00000060   4051B0E1           ASRS     R5,R0,#+2
    146          
    147                  pTwi->TWI_CWGR	= 0x00010000 | sclock | (sclock << 8);
   \   00000064   050495E1           ORRS     R0,R5,R5, LSL #+8
   \   00000068   400B90E3           ORRS     R0,R0,#0x10000
   \   0000006C   100084E5           STR      R0,[R4, #+16]
    148          }
   \   00000070   7080BDE8           POP      {R4-R6,PC}       ;; return
    149          
    150          
    151          //*============================================================================
    152          //* 函数名称: TWI_Open
    153          //* 函数功能: 打开 TWI 
    154          //*============================================================================

   \                                 In section .text, align 4, keep-with-next
    155          void TWI_Open(void)
    156          {
   \                     TWI_Open:
   \   00000000   00502DE9           PUSH     {R12,LR}
    157          	// 配制 PIO 为 TWI
    158          	TWI_CfgPIO ();
   \   00000004   ........           BL       TWI_CfgPIO
    159                          
    160          	PIO_CfgOpendrain(AT91C_BASE_PIOA, AT91C_PA23_TWD | AT91C_PA24_TWCK);		//配制 PA23,PA24 为开漏
   \   00000008   6017A0E3           MOV      R1,#+25165824
   \   0000000C   FF00E0E3           MVN      R0,#+255
   \   00000010   B00EC0E3           BIC      R0,R0,#0xB00
   \   00000014   ........           BL       PIO_CfgOpendrain
    161          
    162          	// 使能 TWI 电源时钟
    163          	PMC_EnablePeripheral(AT91C_ID_TWI );
   \   00000018   0B00A0E3           MOV      R0,#+11
   \   0000001C   ........           BL       PMC_EnablePeripheral
    164          	
    165          	// 配制 TWI 为主模式
    166          	TWI_Configure (AT91C_BASE_TWI, TWI_CLOCK, BOARD_MCK);
   \   00000020   5E26A0E3           MOV      R2,#+98566144
   \   00000024   BA2A82E3           ORR      R2,R2,#0xBA000
   \   00000028   601BA0E3           MOV      R1,#+98304
   \   0000002C   6A1E81E3           ORR      R1,R1,#0x6A0
   \   00000030   04009FE5           LDR      R0,??TWI_Open_0  ;; 0xfffac000
   \   00000034   ........           BL       TWI_Configure
    167          }
   \   00000038   0180BDE8           POP      {R0,PC}          ;; return
   \                     ??TWI_Open_0:
   \   0000003C   00C0FAFF           DC32     0xfffac000
    168          
    169          
    170          //*============================================================================
    171          //* 函数名称: AT91F_TWI_Close
    172          //* 函数功能: 关闭 TWI 
    173          //*============================================================================

   \                                 In section .text, align 4, keep-with-next
    174          void TWI_Close(void)
    175          {
   \                     TWI_Close:
   \   00000000   00502DE9           PUSH     {R12,LR}
    176              // 禁用 TWI 电源时钟
    177              PMC_DisablePeripheral( AT91C_ID_TWI );
   \   00000004   0B00A0E3           MOV      R0,#+11
   \   00000008   ........           BL       PMC_DisablePeripheral
    178          }
   \   0000000C   0180BDE8           POP      {R0,PC}          ;; return
    179          
    180          
    181          
    182          //*=============================================================================
    183          //* 函数名称:TWI_Stop
    184          //* 函数功能:发送停止位
    185          //* 入口参数:1. twck: TWI 指针
    186          //* 返回值  :无
    187          //*=============================================================================

   \                                 In section .text, align 4, keep-with-next
    188          void TWI_Stop(AT91S_TWI *pTwi)
    189          {
   \                     TWI_Stop:
   \   00000000   10402DE9           PUSH     {R4,LR}
   \   00000004   0040B0E1           MOVS     R4,R0
    190              SANITY_CHECK(pTwi);
   \   00000008   000054E3           CMP      R4,#+0
   \   0000000C   0400001A           BNE      ??TWI_Stop_0
   \   00000010   BE20A0E3           MOV      R2,#+190
   \   00000014   ........           LDR      R1,??DataTable34  ;; `?<Constant "E:\\\\IAR\\\\at91lib\\\\periph...">`
   \   00000018   ........           LDR      R0,??DataTable35  ;; `?<Constant "Sanity check failed a...">`
   \   0000001C   ........           BL       printf
   \                     ??TWI_Stop_1:
   \   00000020   FEFFFFEA           B        ??TWI_Stop_1
    191          
    192              pTwi->TWI_CR = AT91C_TWI_STOP;
   \                     ??TWI_Stop_0:
   \   00000024   0200A0E3           MOV      R0,#+2
   \   00000028   000084E5           STR      R0,[R4, #+0]
    193          }
   \   0000002C   1080BDE8           POP      {R4,PC}          ;; return
    194          
    195          //------------------------------------------------------------------------------
    196          /// Starts a read operation on the TWI bus with the specified slave, and returns
    197          /// immediately. Data must then be read using TWI_ReadByte() whenever a byte is
    198          /// available (poll using TWI_ByteReceived()).
    199          /// \param pTwi  Pointer to an AT91S_TWI instance.
    200          /// \param address  Slave address on the bus.
    201          /// \param iaddress  Optional internal address bytes.
    202          /// \param isize  Number of internal address bytes.
    203          //-----------------------------------------------------------------------------

   \                                 In section .text, align 4, keep-with-next
    204          void TWI_StartRead( AT91S_TWI *pTwi,
    205                              unsigned char address,
    206                              unsigned int iaddress,
    207                              unsigned char isize)
    208          {
   \                     TWI_StartRead:
   \   00000000   F8402DE9           PUSH     {R3-R7,LR}
   \   00000004   0050B0E1           MOVS     R5,R0
   \   00000008   0160B0E1           MOVS     R6,R1
   \   0000000C   0270B0E1           MOVS     R7,R2
   \   00000010   0340B0E1           MOVS     R4,R3
    209              trace_LOG(trace_DEBUG, "-D- TWI_StartRead()\n\r");
    210              SANITY_CHECK(pTwi);
   \   00000014   000055E3           CMP      R5,#+0
   \   00000018   0400001A           BNE      ??TWI_StartRead_0
   \   0000001C   D220A0E3           MOV      R2,#+210
   \   00000020   ........           LDR      R1,??DataTable34  ;; `?<Constant "E:\\\\IAR\\\\at91lib\\\\periph...">`
   \   00000024   ........           LDR      R0,??DataTable35  ;; `?<Constant "Sanity check failed a...">`
   \   00000028   ........           BL       printf
   \                     ??TWI_StartRead_1:
   \   0000002C   FEFFFFEA           B        ??TWI_StartRead_1
    211              SANITY_CHECK((address & 0x80) == 0);
   \                     ??TWI_StartRead_0:
   \   00000030   800016E3           TST      R6,#0x80
   \   00000034   0400000A           BEQ      ??TWI_StartRead_2
   \   00000038   D320A0E3           MOV      R2,#+211
   \   0000003C   ........           LDR      R1,??DataTable34  ;; `?<Constant "E:\\\\IAR\\\\at91lib\\\\periph...">`
   \   00000040   ........           LDR      R0,??DataTable35  ;; `?<Constant "Sanity check failed a...">`
   \   00000044   ........           BL       printf
   \                     ??TWI_StartRead_3:
   \   00000048   FEFFFFEA           B        ??TWI_StartRead_3
    212              SANITY_CHECK((iaddress & 0xFF000000) == 0);
   \                     ??TWI_StartRead_2:
   \   0000004C   FF0417E3           TST      R7,#0xFF000000
   \   00000050   0400000A           BEQ      ??TWI_StartRead_4
   \   00000054   D420A0E3           MOV      R2,#+212
   \   00000058   ........           LDR      R1,??DataTable34  ;; `?<Constant "E:\\\\IAR\\\\at91lib\\\\periph...">`
   \   0000005C   ........           LDR      R0,??DataTable35  ;; `?<Constant "Sanity check failed a...">`
   \   00000060   ........           BL       printf
   \                     ??TWI_StartRead_5:
   \   00000064   FEFFFFEA           B        ??TWI_StartRead_5
    213              SANITY_CHECK(isize < 4);
   \                     ??TWI_StartRead_4:
   \   00000068   FF4014E2           ANDS     R4,R4,#0xFF      ;; Zero extend
   \   0000006C   040054E3           CMP      R4,#+4
   \   00000070   0400003A           BCC      ??TWI_StartRead_6
   \   00000074   D520A0E3           MOV      R2,#+213
   \   00000078   ........           LDR      R1,??DataTable34  ;; `?<Constant "E:\\\\IAR\\\\at91lib\\\\periph...">`
   \   0000007C   ........           LDR      R0,??DataTable35  ;; `?<Constant "Sanity check failed a...">`
   \   00000080   ........           BL       printf
   \                     ??TWI_StartRead_7:
   \   00000084   FEFFFFEA           B        ??TWI_StartRead_7
    214          
    215              // Set slave address and number of internal address bytes
    216              pTwi->TWI_MMR = (isize << 8) | AT91C_TWI_MREAD | (address << 16);
   \                     ??TWI_StartRead_6:
   \   00000088   0400B0E1           MOVS     R0,R4
   \   0000008C   FF0010E2           ANDS     R0,R0,#0xFF      ;; Zero extend
   \   00000090   0610B0E1           MOVS     R1,R6
   \   00000094   FF1011E2           ANDS     R1,R1,#0xFF      ;; Zero extend
   \   00000098   0118B0E1           LSLS     R1,R1,#+16

⌨️ 快捷键说明

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