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 + -
显示快捷键?