?? twi.lst
字號:
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 //* 函數(shù)名稱:AT91F_SetTwiClock
130 //* 函數(shù)功能:設置TWI時鐘
131 //* 入口參數(shù):無
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 //* 函數(shù)名稱: TWI_Open
153 //* 函數(shù)功能: 打開 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 //* 函數(shù)名稱: AT91F_TWI_Close
172 //* 函數(shù)功能: 關(guān)閉 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 //* 函數(shù)名稱:TWI_Stop
184 //* 函數(shù)功能:發(fā)送停止位
185 //* 入口參數(shù):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 + -