📄 twi.lst
字号:
317 return ((pTwi->TWI_SR & AT91C_TWI_TXCOMP) == AT91C_TWI_TXCOMP);
\ TWI_TransferComplete:
\ 00000000 200090E5 LDR R0,[R0, #+32]
\ 00000004 010010E2 ANDS R0,R0,#0x1
\ 00000008 FF0010E2 ANDS R0,R0,#0xFF ;; Zero extend
\ 0000000C 1EFF2FE1 BX LR ;; return
318 }
319
320 //-----------------------------------------------------------------------------
321 /// Enables the selected interrupts sources on a TWI peripheral.
322 /// \param pTwi Pointer to an AT91S_TWI instance.
323 /// \param sources Bitwise OR of selected interrupt sources.
324 //-----------------------------------------------------------------------------
\ In section .text, align 4, keep-with-next
325 void TWI_EnableIt(AT91S_TWI *pTwi, unsigned int sources)
326 {
\ TWI_EnableIt:
\ 00000000 38402DE9 PUSH {R3-R5,LR}
\ 00000004 0040B0E1 MOVS R4,R0
\ 00000008 0150B0E1 MOVS R5,R1
327 SANITY_CHECK(pTwi);
\ 0000000C 000054E3 CMP R4,#+0
\ 00000010 0500001A BNE ??TWI_EnableIt_0
\ 00000014 4720A0E3 MOV R2,#+71
\ 00000018 402F82E3 ORR R2,R2,#0x100
\ 0000001C ........ LDR R1,??DataTable34 ;; `?<Constant "E:\\\\IAR\\\\at91lib\\\\periph...">`
\ 00000020 ........ LDR R0,??DataTable35 ;; `?<Constant "Sanity check failed a...">`
\ 00000024 ........ BL printf
\ ??TWI_EnableIt_1:
\ 00000028 FEFFFFEA B ??TWI_EnableIt_1
328 SANITY_CHECK((sources & 0xFFFFFEF8) == 0);
\ ??TWI_EnableIt_0:
\ 0000002C 0700E0E3 MVN R0,#+7
\ 00000030 400FC0E3 BIC R0,R0,#0x100
\ 00000034 050010E1 TST R0,R5
\ 00000038 0400000A BEQ ??TWI_EnableIt_2
\ 0000003C 522FA0E3 MOV R2,#+328
\ 00000040 ........ LDR R1,??DataTable34 ;; `?<Constant "E:\\\\IAR\\\\at91lib\\\\periph...">`
\ 00000044 ........ LDR R0,??DataTable35 ;; `?<Constant "Sanity check failed a...">`
\ 00000048 ........ BL printf
\ ??TWI_EnableIt_3:
\ 0000004C FEFFFFEA B ??TWI_EnableIt_3
329
330 pTwi->TWI_IER = sources;
\ ??TWI_EnableIt_2:
\ 00000050 245084E5 STR R5,[R4, #+36]
331 }
\ 00000054 3180BDE8 POP {R0,R4,R5,PC} ;; return
332
333 //-----------------------------------------------------------------------------
334 /// Disables the selected interrupts sources on a TWI peripheral.
335 /// \param pTwi Pointer to an AT91S_TWI instance.
336 /// \param sources Bitwise OR of selected interrupt sources.
337 //-----------------------------------------------------------------------------
\ In section .text, align 4, keep-with-next
338 void TWI_DisableIt(AT91S_TWI *pTwi, unsigned int sources)
339 {
\ TWI_DisableIt:
\ 00000000 38402DE9 PUSH {R3-R5,LR}
\ 00000004 0040B0E1 MOVS R4,R0
\ 00000008 0150B0E1 MOVS R5,R1
340 SANITY_CHECK(pTwi);
\ 0000000C 000054E3 CMP R4,#+0
\ 00000010 0400001A BNE ??TWI_DisableIt_0
\ 00000014 552FA0E3 MOV R2,#+340
\ 00000018 ........ LDR R1,??DataTable34 ;; `?<Constant "E:\\\\IAR\\\\at91lib\\\\periph...">`
\ 0000001C ........ LDR R0,??DataTable35 ;; `?<Constant "Sanity check failed a...">`
\ 00000020 ........ BL printf
\ ??TWI_DisableIt_1:
\ 00000024 FEFFFFEA B ??TWI_DisableIt_1
341 SANITY_CHECK((sources & 0xFFFFFEF8) == 0);
\ ??TWI_DisableIt_0:
\ 00000028 0700E0E3 MVN R0,#+7
\ 0000002C 400FC0E3 BIC R0,R0,#0x100
\ 00000030 050010E1 TST R0,R5
\ 00000034 0500000A BEQ ??TWI_DisableIt_2
\ 00000038 5520A0E3 MOV R2,#+85
\ 0000003C 402F82E3 ORR R2,R2,#0x100
\ 00000040 ........ LDR R1,??DataTable34 ;; `?<Constant "E:\\\\IAR\\\\at91lib\\\\periph...">`
\ 00000044 ........ LDR R0,??DataTable35 ;; `?<Constant "Sanity check failed a...">`
\ 00000048 ........ BL printf
\ ??TWI_DisableIt_3:
\ 0000004C FEFFFFEA B ??TWI_DisableIt_3
342
343 pTwi->TWI_IDR = sources;
\ ??TWI_DisableIt_2:
\ 00000050 285084E5 STR R5,[R4, #+40]
344 }
\ 00000054 3180BDE8 POP {R0,R4,R5,PC} ;; return
345
346 //-----------------------------------------------------------------------------
347 /// Returns the current status register of the given TWI peripheral. This
348 /// resets the internal value of the status register, so further read may yield
349 /// different values.
350 /// \param pTwi Pointer to an AT91S_TWI instance.
351 //-----------------------------------------------------------------------------
\ In section .text, align 4, keep-with-next
352 unsigned int TWI_GetStatus(AT91S_TWI *pTwi)
353 {
\ TWI_GetStatus:
\ 00000000 10402DE9 PUSH {R4,LR}
\ 00000004 0040B0E1 MOVS R4,R0
354 SANITY_CHECK(pTwi);
\ 00000008 000054E3 CMP R4,#+0
\ 0000000C 0500001A BNE ??TWI_GetStatus_0
\ 00000010 6220A0E3 MOV R2,#+98
\ 00000014 402F82E3 ORR R2,R2,#0x100
\ 00000018 ........ LDR R1,??DataTable34 ;; `?<Constant "E:\\\\IAR\\\\at91lib\\\\periph...">`
\ 0000001C ........ LDR R0,??DataTable35 ;; `?<Constant "Sanity check failed a...">`
\ 00000020 ........ BL printf
\ ??TWI_GetStatus_1:
\ 00000024 FEFFFFEA B ??TWI_GetStatus_1
355
356 return pTwi->TWI_SR;
\ ??TWI_GetStatus_0:
\ 00000028 200094E5 LDR R0,[R4, #+32]
\ 0000002C 1080BDE8 POP {R4,PC} ;; return
357 }
358
359 //-----------------------------------------------------------------------------
360 /// Returns the current status register of the given TWI peripheral, but
361 /// masking interrupt sources which are not currently enabled.
362 /// This resets the internal value of the status register, so further read may
363 /// yield different values.
364 /// \param pTwi Pointer to an AT91S_TWI instance.
365 //-----------------------------------------------------------------------------
\ In section .text, align 4, keep-with-next
366 unsigned int TWI_GetMaskedStatus(AT91S_TWI *pTwi)
367 {
\ TWI_GetMaskedStatus:
\ 00000000 38402DE9 PUSH {R3-R5,LR}
\ 00000004 0040B0E1 MOVS R4,R0
368 unsigned int status;
369
370 SANITY_CHECK(pTwi);
\ 00000008 000054E3 CMP R4,#+0
\ 0000000C 0500001A BNE ??TWI_GetMaskedStatus_0
\ 00000010 7220A0E3 MOV R2,#+114
\ 00000014 402F82E3 ORR R2,R2,#0x100
\ 00000018 ........ LDR R1,??DataTable34 ;; `?<Constant "E:\\\\IAR\\\\at91lib\\\\periph...">`
\ 0000001C ........ LDR R0,??DataTable35 ;; `?<Constant "Sanity check failed a...">`
\ 00000020 ........ BL printf
\ ??TWI_GetMaskedStatus_1:
\ 00000024 FEFFFFEA B ??TWI_GetMaskedStatus_1
371
372 status = pTwi->TWI_SR;
\ ??TWI_GetMaskedStatus_0:
\ 00000028 200094E5 LDR R0,[R4, #+32]
\ 0000002C 0050B0E1 MOVS R5,R0
373 status &= pTwi->TWI_IMR;
\ 00000030 2C0094E5 LDR R0,[R4, #+44]
\ 00000034 055010E0 ANDS R5,R0,R5
374
375 return status;
\ 00000038 0500B0E1 MOVS R0,R5
\ 0000003C 3280BDE8 POP {R1,R4,R5,PC} ;; return
376 }
377
378
379 //*============================================================================
380 //* 函数名称:TWI_Write
381 //* 函数功能:写 size 字节数据到从设备
382 //* 入口参数:pTwi :指向TWI结构的首地址-----设为AT91C_BASE_TWI
383 //* slvAddr : 从设备地址
384 //* address : 从设备内部地址(要写入数据的位置)
385 //* *data2send: 要写入数据的起始地址
386 //* size : 要写入数据的长度
387 //* 返回值 :0 : 写正常
388 //* 非0:写过程发生错误
389 //*============================================================================
\ In section .text, align 4, keep-with-next
390 int TWI_Write(const AT91PS_TWI pTwi ,char slvAddr,int address, char *data2send, int size)
391 {
\ TWI_Write:
\ 00000000 70402DE9 PUSH {R4-R6,LR}
\ 00000004 00C0B0E1 MOVS R12,R0
\ 00000008 10E09DE5 LDR LR,[SP, #+16]
392 unsigned int status,SLV_ADDR,error = 0;
\ 0000000C 0060A0E3 MOV R6,#+0
\ 00000010 0600B0E1 MOVS R0,R6
393
394 SLV_ADDR = slvAddr << 16;
\ 00000014 0160B0E1 MOVS R6,R1
\ 00000018 FF6016E2 ANDS R6,R6,#0xFF ;; Zero extend
\ 0000001C 0668B0E1 LSLS R6,R6,#+16
\ 00000020 0650B0E1 MOVS R5,R6
395 // 设置 TWI 为主发送模式,内部地址为 1 字节
396 pTwi->TWI_MMR = ( SLV_ADDR | AT91C_TWI_IADRSZ_1_BYTE ) & ~AT91C_TWI_MREAD;
\ 00000024 406DD5E3 BICS R6,R5,#0x1000
\ 00000028 406F96E3 ORRS R6,R6,#0x100
\ 0000002C 04608CE5 STR R6,[R12, #+4]
397
398 // 装载从器件内部地址
399 pTwi->TWI_IADR = address;
\ 00000030 0C208CE5 STR R2,[R12, #+12]
400
401 status = pTwi->TWI_SR;
\ 00000034 20609CE5 LDR R6,[R12, #+32]
\ 00000038 0640B0E1 MOVS R4,R6
402
403 pTwi->TWI_THR = *(data2send++);
\ 0000003C 0060D3E5 LDRB R6,[R3, #+0]
\ 00000040 34608CE5 STR R6,[R12, #+52]
\ 00000044 013093E2 ADDS R3,R3,#+1
404 //delay_ms();
405 pTwi->TWI_CR = AT91C_TWI_START;
\ 00000048 0160A0E3 MOV R6,#+1
\ 0000004C 00608CE5 STR R6,[R12, #+0]
406
407 while (size-- >1)
\ ??TWI_Write_0:
\ 00000050 0E60B0E1 MOVS R6,LR
\ 00000054 01E056E2 SUBS LR,R6,#+1
\ 00000058 020056E3 CMP R6,#+2
\ 0000005C 0C0000BA BLT ??TWI_Write_1
408 {
409 // 等待发送保持寄存器空
410 while (!(pTwi->TWI_SR & AT91C_TWI_TXRDY))
\ ??TWI_Write_2:
\ 00000060 20609CE5 LDR R6,[R12, #+32]
\ 00000064 040016E3 TST R6,#0x4
\ 00000068 0500001A BNE ??TWI_Write_3
411 {
412 // 读取状态寄存器
413 status = pTwi->TWI_SR;
\ 0000006C 20609CE5 LDR R6,[R12, #+32]
\ 00000070 0640B0E1 MOVS R4,R6
414
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -