twi.lst

来自「IAR5.2下 AT91SAM9260 ARM 对 MCP2515 控制源化码」· LST 代码 · 共 1,163 行 · 第 1/5 页

LST
1,163
字号
    415                      // 如果发送完一个字节后没收到应答信号,则表明有一次传输错误
    416                      if ((status & ERROR) == ERROR)   
   \   00000074   400F14E3           TST      R4,#0x100
   \   00000078   F8FFFF0A           BEQ      ??TWI_Write_2
    417                          error++;
   \   0000007C   010090E2           ADDS     R0,R0,#+1
   \   00000080   F6FFFFEA           B        ??TWI_Write_2
    418                  }
    419          	
    420                  // 发送下一个字节
    421                  pTwi->TWI_THR = *(data2send++);	
   \                     ??TWI_Write_3:
   \   00000084   0060D3E5           LDRB     R6,[R3, #+0]
   \   00000088   34608CE5           STR      R6,[R12, #+52]
   \   0000008C   013093E2           ADDS     R3,R3,#+1
   \   00000090   EEFFFFEA           B        ??TWI_Write_0
    422                  //delay_ms();	
    423              }
    424          	
    425              // 发送停止位
    426              pTwi->TWI_CR = AT91C_TWI_STOP;		
   \                     ??TWI_Write_1:
   \   00000094   0260A0E3           MOV      R6,#+2
   \   00000098   00608CE5           STR      R6,[R12, #+0]
    427          
    428              status = pTwi->TWI_SR;
   \   0000009C   20609CE5           LDR      R6,[R12, #+32]
   \   000000A0   0640B0E1           MOVS     R4,R6
    429              if ((status & ERROR) == ERROR)   
   \   000000A4   400F14E3           TST      R4,#0x100
   \   000000A8   0000000A           BEQ      ??TWI_Write_4
    430              	error++;
   \   000000AC   010090E2           ADDS     R0,R0,#+1
    431              	
    432              // 等待数据发送完毕
    433              while (!(pTwi->TWI_SR & AT91C_TWI_TXCOMP))
   \                     ??TWI_Write_4:
   \   000000B0   20609CE5           LDR      R6,[R12, #+32]
   \   000000B4   010016E3           TST      R6,#0x1
   \   000000B8   0500001A           BNE      ??TWI_Write_5
    434              {
    435              	status = pTwi->TWI_SR;
   \   000000BC   20609CE5           LDR      R6,[R12, #+32]
   \   000000C0   0640B0E1           MOVS     R4,R6
    436                  if ((status & ERROR) == ERROR)   
   \   000000C4   400F14E3           TST      R4,#0x100
   \   000000C8   F8FFFF0A           BEQ      ??TWI_Write_4
    437                      error++;
   \   000000CC   010090E2           ADDS     R0,R0,#+1
   \   000000D0   F6FFFFEA           B        ??TWI_Write_4
    438              }	
    439              return error;
   \                     ??TWI_Write_5:
   \   000000D4   7080BDE8           POP      {R4-R6,PC}       ;; return
    440          }
    441          
    442          
    443          //*============================================================================
    444          //* 函数名称:TWI_Read
    445          //* 函数功能:从从设备中读取 size 字节数据
    446          //* 入口参数:pTwi	: 指向TWI结构的首地址-----设为AT91C_BASE_TWI
    447          //*	      slvAddr	: 从设备地址
    448          //*	      address	: 从设备内部地址(要读取数据的位置)
    449          //*	      *data	: 要读取数据的起始地址
    450          //*	      size	: 要读取数据的长度
    451          //* 返回值  :0  : 读正常
    452          //*	      非0:读过程发生错误
    453          //*============================================================================

   \                                 In section .text, align 4, keep-with-next
    454          int TWI_Read(const AT91PS_TWI pTwi ,char slvAddr, int address, char *data, int size)
    455          {
   \                     TWI_Read:
   \   00000000   70402DE9           PUSH     {R4-R6,LR}
   \   00000004   00C0B0E1           MOVS     R12,R0
   \   00000008   10509DE5           LDR      R5,[SP, #+16]
    456              unsigned int status,SLV_ADDR,error;
    457          	
    458              SLV_ADDR = slvAddr << 16;
   \   0000000C   0160B0E1           MOVS     R6,R1
   \   00000010   FF6016E2           ANDS     R6,R6,#0xFF      ;; Zero extend
   \   00000014   0668B0E1           LSLS     R6,R6,#+16
   \   00000018   0640B0E1           MOVS     R4,R6
    459              // 设置 TWI 为主接收模式,内部地址为 1 字节
    460              pTwi->TWI_MMR = SLV_ADDR | AT91C_TWI_IADRSZ_1_BYTE | AT91C_TWI_MREAD;	
   \   0000001C   446D94E3           ORRS     R6,R4,#0x1100
   \   00000020   04608CE5           STR      R6,[R12, #+4]
    461          	
    462              // 装载从设备地址
    463              pTwi->TWI_IADR = address;
   \   00000024   0C208CE5           STR      R2,[R12, #+12]
    464          	
    465              // 发送起始位
    466              pTwi->TWI_CR = AT91C_TWI_START;
   \   00000028   0160A0E3           MOV      R6,#+1
   \   0000002C   00608CE5           STR      R6,[R12, #+0]
    467          	
    468              status = pTwi->TWI_SR;
   \   00000030   20609CE5           LDR      R6,[R12, #+32]
   \   00000034   06E0B0E1           MOVS     LR,R6
    469          		
    470              while (size-- >1)
   \                     ??TWI_Read_0:
   \   00000038   0560B0E1           MOVS     R6,R5
   \   0000003C   015056E2           SUBS     R5,R6,#+1
   \   00000040   020056E3           CMP      R6,#+2
   \   00000044   0C0000BA           BLT      ??TWI_Read_1
    471              {	
    472                  // 等待接收保存寄存器满
    473                  while (!(pTwi->TWI_SR & AT91C_TWI_RXRDY))
   \                     ??TWI_Read_2:
   \   00000048   20609CE5           LDR      R6,[R12, #+32]
   \   0000004C   020016E3           TST      R6,#0x2
   \   00000050   0500001A           BNE      ??TWI_Read_3
    474                  {
    475                      // 读取状态寄存器
    476                      status = pTwi->TWI_SR;
   \   00000054   20609CE5           LDR      R6,[R12, #+32]
   \   00000058   06E0B0E1           MOVS     LR,R6
    477                      // 如果发送完一个字节后没收到应答信号,则表明有一次传输错误
    478                      if ((status & ERROR) == ERROR)   
   \   0000005C   400F1EE3           TST      LR,#0x100
   \   00000060   F8FFFF0A           BEQ      ??TWI_Read_2
    479                          error++;
   \   00000064   010090E2           ADDS     R0,R0,#+1
   \   00000068   F6FFFFEA           B        ??TWI_Read_2
    480                  }
    481          
    482                  // 接收数据
    483                  *(data++) = pTwi->TWI_RHR;
   \                     ??TWI_Read_3:
   \   0000006C   30609CE5           LDR      R6,[R12, #+48]
   \   00000070   0060C3E5           STRB     R6,[R3, #+0]
   \   00000074   013093E2           ADDS     R3,R3,#+1
   \   00000078   EEFFFFEA           B        ??TWI_Read_0
    484              }
    485          	
    486              // 发送停止位
    487              pTwi->TWI_CR = AT91C_TWI_STOP;
   \                     ??TWI_Read_1:
   \   0000007C   0260A0E3           MOV      R6,#+2
   \   00000080   00608CE5           STR      R6,[R12, #+0]
    488          
    489              status = pTwi->TWI_SR;
   \   00000084   20609CE5           LDR      R6,[R12, #+32]
   \   00000088   06E0B0E1           MOVS     LR,R6
    490              if ((status & ERROR) == ERROR)   
   \   0000008C   400F1EE3           TST      LR,#0x100
   \   00000090   0000000A           BEQ      ??TWI_Read_4
    491                  error++;
   \   00000094   010090E2           ADDS     R0,R0,#+1
    492          
    493              // 等待数据传输完毕
    494              while (!(pTwi->TWI_SR & AT91C_TWI_TXCOMP))
   \                     ??TWI_Read_4:
   \   00000098   20609CE5           LDR      R6,[R12, #+32]
   \   0000009C   010016E3           TST      R6,#0x1
   \   000000A0   0500001A           BNE      ??TWI_Read_5
    495              {
    496              	status = pTwi->TWI_SR;
   \   000000A4   20609CE5           LDR      R6,[R12, #+32]
   \   000000A8   06E0B0E1           MOVS     LR,R6
    497                  if ((status & ERROR) == ERROR)   
   \   000000AC   400F1EE3           TST      LR,#0x100
   \   000000B0   F8FFFF0A           BEQ      ??TWI_Read_4
    498                      error++;	
   \   000000B4   010090E2           ADDS     R0,R0,#+1
   \   000000B8   F6FFFFEA           B        ??TWI_Read_4
    499              }
    500          
    501              // 接收最后一字节
    502              *data = pTwi->TWI_RHR;
   \                     ??TWI_Read_5:
   \   000000BC   30609CE5           LDR      R6,[R12, #+48]
   \   000000C0   0060C3E5           STRB     R6,[R3, #+0]
    503          		
    504              return error;
   \   000000C4   7080BDE8           POP      {R4-R6,PC}       ;; return
    505          }

   \                                 In section .text, align 4, keep-with-next
   \                     ??DataTable34:
   \   00000000   ........           DC32     `?<Constant "E:\\\\IAR\\\\at91lib\\\\periph...">`

   \                                 In section .text, align 4, keep-with-next
   \                     ??DataTable35:
   \   00000000   ........           DC32     `?<Constant "Sanity check failed a...">`

   \                                 In section .rodata, align 4
   \                     `?<Constant "Sanity check failed a...">`:
   \   00000000   53616E697479       DC8 "Sanity check failed at %s:%d\012\015"
   \              20636865636B
   \              206661696C65
   \              642061742025
   \              733A25640A0D
   \              00          
   \   0000001F   00                 DC8 0

   \                                 In section .rodata, align 4
   \                     `?<Constant "E:\\\\IAR\\\\at91lib\\\\periph...">`:
   \   00000000   453A5C494152       DC8 "E:\\IAR\\at91lib\\peripherals\\twi\\twi.c"
   \              5C617439316C
   \              69625C706572
   \              697068657261
   \              6C735C747769
   \              5C7477692E63
   \              00          
   \   00000025   000000             DC8 0, 0, 0

   \                                 In section .rodata, align 4
   \                     `?<Constant "-F- Cannot find valid...">`:
   \   00000000   2D462D204361       DC8 "-F- Cannot find valid TWI clock parameters\015\012"
   \              6E6E6F742066
   \              696E64207661
   \              6C6964205457
   \              4920636C6F63
   \              6B2070617261
   \              6D6574657273
   \              0D0A00      
   \   0000002D   000000             DC8 0, 0, 0

   Maximum stack usage in bytes:

     Function             .cstack
     --------             -------
     AT91F_SetTwiClock         0
     AT91F_TWI_Configure       0
     TWI_ByteReceived          0
     TWI_ByteSent              0
     TWI_CfgPIO                0
     TWI_Cl

⌨️ 快捷键说明

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