?? twi.lst
字號:
###############################################################################
# #
# 08/Mar/2009 18:02:08 #
# IAR ANSI C/C++ Compiler V5.20.2.21007/W32 EVALUATION for ARM #
# Copyright 1999-2008 IAR Systems AB. #
# #
# Cpu mode = arm #
# Endian = little #
# Source file = E:\IAR\at91lib\peripherals\twi\twi.c #
# Command line = E:\IAR\at91lib\peripherals\twi\twi.c -D at91sam9260 -D #
# sdram -lC E:\IAR\at91sam9260-ek\basic-twi-eeprom-project #
# \ewp\at91sam9260_sdram\List\ --remarks --diag_suppress #
# Pe826,Pe1375 -o E:\IAR\at91sam9260-ek\basic-twi-eeprom-p #
# roject\ewp\at91sam9260_sdram\Obj\ --no_cse --no_unroll #
# --no_inline --no_code_motion --no_tbaa --no_clustering #
# --no_scheduling --debug --endian=little #
# --cpu=ARM926EJ-S -e --fpu=None --dlib_config #
# "D:\Program Files\IAR Systems\Embedded Workbench 5.0 #
# Evaluation\ARM\INC\DLib_Config_Full.h" -I #
# E:\IAR\at91sam9260-ek\basic-twi-eeprom-project\ewp\..\.. #
# \..\at91lib\ -I E:\IAR\at91sam9260-ek\basic-twi-eeprom-p #
# roject\ewp\..\..\..\at91lib\boards\at91sam9260-ek\ -I #
# E:\IAR\at91sam9260-ek\basic-twi-eeprom-project\ewp\..\.. #
# \..\at91lib\peripherals\ -I #
# E:\IAR\at91sam9260-ek\basic-twi-eeprom-project\ewp\..\.. #
# \..\at91lib\components\ -I E:\IAR\at91sam9260-ek\basic-t #
# wi-eeprom-project\ewp\..\..\..\at91lib\usb\ -I #
# "D:\Program Files\IAR Systems\Embedded Workbench 5.0 #
# Evaluation\ARM\INC\" --interwork --cpu_mode arm -On #
# List file = E:\IAR\at91sam9260-ek\basic-twi-eeprom-project\ewp\at91s #
# am9260_sdram\List\twi.lst #
# Object file = E:\IAR\at91sam9260-ek\basic-twi-eeprom-project\ewp\at91s #
# am9260_sdram\Obj\twi.o #
# #
# #
###############################################################################
E:\IAR\at91lib\peripherals\twi\twi.c
1 /* ----------------------------------------------------------------------------
2 * ATMEL Microcontroller Software Support
3 * ----------------------------------------------------------------------------
4 * Copyright (c) 2008, Atmel Corporation
5 *
6 * All rights reserved.
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions are met:
10 *
11 * - Redistributions of source code must retain the above copyright notice,
12 * this list of conditions and the disclaimer below.
13 *
14 * Atmel's name may not be used to endorse or promote products derived from
15 * this software without specific prior written permission.
16 *
17 * DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
19 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
20 * DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
23 * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
24 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
25 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
26 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 * ----------------------------------------------------------------------------
28 */
29
30 #ifndef trace_LEVEL
31 #define trace_LEVEL 1
32 #endif
33
34 //------------------------------------------------------------------------------
35 // Headers
36 //------------------------------------------------------------------------------
37
38 #include "twi.h"
39 #include <pio/pio.h>
40 #include <pmc/pmc.h>
41 #include <utility/math.h>
42 #include <utility/assert.h>
43 #include <utility/trace.h>
44
45 #define TWI_CLOCK 100000
46 #define ERROR (AT91C_TWI_NACK_SLAVE) //狀態寄存器的一位,如果置1表示從機未應答
47
48 //------------------------------------------------------------------------------
49 // Global functions
50 //------------------------------------------------------------------------------
51
52
53 //*=============================================================================
54 //* \fn AT91F_TWI_CfgPIO
55 //* \brief Configure PIO controllers to drive TWI signals
56 //*=============================================================================
\ In section .text, align 4, keep-with-next
57 void TWI_CfgPIO (void)
58 {
\ TWI_CfgPIO:
\ 00000000 00502DE9 PUSH {R12,LR}
59 // Configure PIO controllers to periph mode
60 PIO_CfgPeriph(AT91C_BASE_PIOA, // PIO controller base address
61 ((unsigned int) AT91C_PA23_TWD ) |
62 ((unsigned int) AT91C_PA24_TWCK ), // Peripheral A
63 0); // Peripheral B
\ 00000004 0020A0E3 MOV R2,#+0
\ 00000008 6017A0E3 MOV R1,#+25165824
\ 0000000C FF00E0E3 MVN R0,#+255
\ 00000010 B00EC0E3 BIC R0,R0,#0xB00
\ 00000014 ........ BL PIO_CfgPeriph
64 }
\ 00000018 0180BDE8 POP {R0,PC} ;; return
65
66
67 //*=============================================================================
68 //* 函數名稱:TWI_Configure
69 //* 函數功能:配置 TWI 時鐘及模式
70 //* 入口參數:1. twck: TWI 指針
71 //* 2. mck : 系統主頻
72 //* 返回值 :無
73 //*=============================================================================
\ In section .text, align 4, keep-with-next
74 void TWI_Configure(AT91S_TWI *pTwi, unsigned int twck, unsigned int mck)
75 {
\ TWI_Configure:
\ 00000000 F0472DE9 PUSH {R4-R10,LR}
\ 00000004 0080B0E1 MOVS R8,R0
\ 00000008 0190B0E1 MOVS R9,R1
\ 0000000C 0240B0E1 MOVS R4,R2
76 unsigned int ckdiv = 0;
\ 00000010 0000A0E3 MOV R0,#+0
\ 00000014 0050B0E1 MOVS R5,R0
77 unsigned int cldiv;
78 unsigned char ok = 0;
\ 00000018 0000A0E3 MOV R0,#+0
\ 0000001C 0070B0E1 MOVS R7,R0
79
80 trace_LOG(trace_DEBUG, "-D- TWI_Configure()\r\n");
81 SANITY_CHECK(pTwi);
\ 00000020 000058E3 CMP R8,#+0
\ 00000024 0400001A BNE ??TWI_Configure_0
\ 00000028 5120A0E3 MOV R2,#+81
\ 0000002C ........ LDR R1,??DataTable34 ;; `?<Constant "E:\\\\IAR\\\\at91lib\\\\periph...">`
\ 00000030 ........ LDR R0,??DataTable35 ;; `?<Constant "Sanity check failed a...">`
\ 00000034 ........ BL printf
\ ??TWI_Configure_1:
\ 00000038 FEFFFFEA B ??TWI_Configure_1
82
83 // Reset the TWI
84 pTwi->TWI_CR = AT91C_TWI_SWRST;
\ ??TWI_Configure_0:
\ 0000003C 8000A0E3 MOV R0,#+128
\ 00000040 000088E5 STR R0,[R8, #+0]
85
86 // Set master mode
87 pTwi->TWI_CR = AT91C_TWI_MSEN;
\ 00000044 0400A0E3 MOV R0,#+4
\ 00000048 000088E5 STR R0,[R8, #+0]
88
89 // Configure clock
90 while (!ok)
\ ??TWI_Configure_2:
\ 0000004C FF7017E2 ANDS R7,R7,#0xFF ;; Zero extend
\ 00000050 000057E3 CMP R7,#+0
\ 00000054 1300001A BNE ??TWI_Configure_3
91 {
92 cldiv = ((mck / (2 * twck)) - 3) / power(2, ckdiv);
\ 00000058 0400B0E1 MOVS R0,R4
\ 0000005C 0220A0E3 MOV R2,#+2
\ 00000060 920911E0 MULS R1,R2,R9
\ 00000064 ........ BL __aeabi_uidivmod
\ 00000068 030050E2 SUBS R0,R0,#+3
\ 0000006C 00A0B0E1 MOVS R10,R0
\ 00000070 0510B0E1 MOVS R1,R5
\ 00000074 0200A0E3 MOV R0,#+2
\ 00000078 ........ BL power
\ 0000007C 0010B0E1 MOVS R1,R0
\ 00000080 0A00B0E1 MOVS R0,R10
\ 00000084 ........ BL __aeabi_uidivmod
\ 00000088 0060B0E1 MOVS R6,R0
93 if (cldiv <= 255)
\ 0000008C 400F56E3 CMP R6,#+256
\ 00000090 0200002A BCS ??TWI_Configure_4
94 ok = 1;
\ 00000094 0100A0E3 MOV R0,#+1
\ 00000098 0070B0E1 MOVS R7,R0
\ 0000009C EAFFFFEA B ??TWI_Configure_2
95 else
96 ckdiv++;
\ ??TWI_Configure_4:
\ 000000A0 015095E2 ADDS R5,R5,#+1
\ 000000A4 E8FFFFEA B ??TWI_Configure_2
97 }
98
99 ASSERT(ckdiv < 8, "-F- Cannot find valid TWI clock parameters\r\n");
\ ??TWI_Configure_3:
\ 000000A8 080055E3 CMP R5,#+8
\ 000000AC 0200003A BCC ??TWI_Configure_5
\ 000000B0 18009FE5 LDR R0,??TWI_Configure_6 ;; `?<Constant "-F- Cannot find valid...">`
\ 000000B4 ........ BL printf
\ ??TWI_Configure_7:
\ 000000B8 FEFFFFEA B ??TWI_Configure_7
100 //trace_LOG(trace_INFO, "-D- Using CKDIV = %u and CLDIV/CHDIV = %u\r\n", ckdiv, cldiv);
101
102 pTwi->TWI_CWGR = (ckdiv << 16) | (cldiv << 8) | cldiv;
\ ??TWI_Configure_5:
\ 000000BC 0604B0E1 LSLS R0,R6,#+8
\ 000000C0 050890E1 ORRS R0,R0,R5, LSL #+16
\ 000000C4 000096E1 ORRS R0,R6,R0
\ 000000C8 100088E5 STR R0,[R8, #+16]
103 }
\ 000000CC F087BDE8 POP {R4-R10,PC} ;; return
\ ??TWI_Configure_6:
\ 000000D0 ........ DC32 `?<Constant "-F- Cannot find valid...">`
104
105
106
107 //*----------------------------------------------------------------------------
108 //* \fn AT91F_TWI_Configure
109 //* \brief Configure TWI in master mode
110 //*----------------------------------------------------------------------------
\ In section .text, align 4, keep-with-next
111 void AT91F_TWI_Configure ( AT91PS_TWI pTWI ) // \arg pointer to a TWI controller
112 {
113 //* Disable interrupts
114 pTWI->TWI_IDR = (unsigned int) -1;
\ AT91F_TWI_Configure:
\ 00000000 0010E0E3 MVN R1,#+0
\ 00000004 281080E5 STR R1,[R0, #+40]
115
116 //* Reset peripheral
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -