⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lib_twi.lst

📁 atmelsam7s64twi完美底层驱动
💻 LST
📖 第 1 页 / 共 5 页
字号:
ARM COMPILER V2.53,  lib_twi                                                               19/07/06  08:38:07  PAGE 1   


ARM COMPILER V2.53, COMPILATION OF MODULE lib_twi
OBJECT MODULE PLACED IN .\out\lib_twi.obj
COMPILER INVOKED BY: C:\Keil\ARM\BIN\CA.exe lib_twi.c THUMB BROWSE DEBUG PRINT(.\OUT\LIB_TWI.LST) TABS(4) OBJECT(.\out\l
                    -ib_twi.obj) 

stmt  level    source

    1          #include "lib_twi.h"
    2          #include "lib_AT91SAM7S64.h"
    3          #define  ERROR      (AT91C_TWI_NACK)//状态寄存器的一位,如果置1表示从机未应答
    4          //*============================================================================
    5          //*                      TWI初始化
    6          //*============================================================================
    7          //*----------------------------------------------------------------------------
    8          //* 函数名: AT91F_SetTwiClock
    9          //* 功能:   设置TWI时钟波形发生寄存器
   10          //*----------------------------------------------------------------------------
   11          void AT91F_SetTwiClock(void)
   12          {
   13   1          int sclock;
   14   1      
   15   1          sclock = (10*MCK /AT91C_TWI_CLOCK);
   16   1          if (sclock % 10 >= 5)
   17   1              sclock = (sclock /10) - 5;
   18   1          else
   19   1              sclock = (sclock /10)- 6;
   20   1          sclock = (sclock + (4 - sclock %4)) >> 2;   // div 4
   21   1      
   22   1          AT91C_BASE_TWI->TWI_CWGR    = ( 1<<16 ) | (sclock << 8) | sclock  ;
   23   1      }
   24          
   25           //*----------------------------------------------------------------------------
   26          //*函数名: AT91F_TWI_Open
   27          //* 功能:  初始化TWI接口
   28          //*----------------------------------------------------------------------------
   29          void AT91F_TWI_Open(void)
   30          {
   31   1          // 配置I/O口作为TWI功能
   32   1          AT91F_TWI_CfgPIO ();
   33   1      
   34   1              // 将TWD和TWCK定义为开路
   35   1               AT91F_PIO_CfgOpendrain(AT91C_BASE_PIOA,Twd_Twck);
   36   1      
   37   1              // 开TWI时钟源
   38   1          AT91F_TWI_CfgPMC ();
   39   1      
   40   1          // 配置TWI工作在主模式,禁止TWI中断,采用查询读写方式
   41   1          AT91F_TWI_Configure (AT91C_BASE_TWI);
   42   1      
   43   1          // 设置TWI时钟波形发生寄存器
   44   1          AT91F_SetTwiClock();
   45   1      }
   46          
   47          //*=============================================================================
   48          //*                         写EPROM
   49          //*=============================================================================
   50          //*----------------------------------------------------------------------------
   51          //* 函数名:AT91F_TWI_WriteByte
   52          //* 功能:  发送(以字节为单位)数据到设备(EPROM)
   53          //*参数说明:
   54          //         pTwi:指向TWI结构的首地址-----设为AT91C_BASE_TWI
   55          //         mode:TWI的工作模式----用于设置WTI的主模式寄存器(内部器件地址长度,主机读写方向,器件地址),
             -见DATASHEET
   56          //         int_address:器件的内部地址(要写入的位置)
   57          //         data2send:代写的数据缓冲区地址
ARM COMPILER V2.53,  lib_twi                                                               19/07/06  08:38:07  PAGE 2   

   58          //         nb:写入的字节数
   59          //*----------------------------------------------------------------------------
   60          int AT91F_TWI_WriteByte(const AT91PS_TWI pTwi ,int mode, int int_address, char *data2send, int nb)
   61          {
   62   1          unsigned int status,counter=0,error=0;
   63   1      
   64   1          // 设置TWI内部地址寄存器---可设为0,1,2,3位内部地址
   65   1          if ((mode & AT91C_TWI_IADRSZ) != 0)  pTwi->TWI_IADR = int_address;
   66   1      
   67   1          // 设置TWI的主模式寄存器(此处为主机写)
   68   1           pTwi->TWI_MMR = mode & ~AT91C_TWI_MREAD;
   69   1      
   70   1               // 如果只写1个字节
   71   1          if(nb <2)
   72   1              {
   73   2               //发送START状态,使能传输,传输完后发送STOP状态
   74   2           pTwi->TWI_CR = AT91C_TWI_START | AT91C_TWI_MSEN | AT91C_TWI_STOP;
   75   2               //将数据写入发送保持寄存器
   76   2           pTwi->TWI_THR = *data2send;
   77   2          }
   78   1      
   79   1              //如果一次写入多个字节
   80   1          else
   81   1          {
   82   2            for(counter=0;counter<nb;counter++)
   83   2                {
   84   3      
   85   3                 //发送START状态,使能传输
   86   3                 pTwi->TWI_CR = AT91C_TWI_START | AT91C_TWI_MSEN;
   87   3      
   88   3                 //最后一个数据发送完后,接着发送STOP状态
   89   3                 if (counter == (nb - 1)) pTwi->TWI_CR = AT91C_TWI_STOP;
   90   3      
   91   3                 //读取状态寄存器
   92   3                 status = pTwi->TWI_SR;
   93   3      
   94   3                 //如果发送完一个字节后没收到应答信号,则表明有一次传输错误
   95   3                 if ((status & ERROR) == ERROR)   error++;
   96   3      
   97   3                 while (!(status & AT91C_TWI_TXRDY))
   98   3                 {
   99   4                   status = pTwi->TWI_SR;
  100   4                   if ((status & ERROR) == ERROR) error++;
  101   4                  } //END while
  102   3      
  103   3                   //传输下一个字节
  104   3                   pTwi->TWI_THR = *(data2send+counter);
  105   3             }//END for
  106   2          }//END  else
  107   1      
  108   1              //读取状态寄存器
  109   1          status = pTwi->TWI_SR;
  110   1              //如果发送完一个字节后没收到应答信号,则表明有一次传输错误
  111   1          if ((status & ERROR) == ERROR) error++;
  112   1      
  113   1          //等待数据发送完
  114   1              while (!(status & AT91C_TWI_TXCOMP))
  115   1              {
  116   2                //读取状态寄存器
  117   2               status = pTwi->TWI_SR;
  118   2               //如果发送完一个字节后没收到应答信号,则表明有一次传输错误
  119   2               if ((status & ERROR) == ERROR) error++;
  120   2              }//END while
  121   1      
  122   1           return error;
  123   1      }
ARM COMPILER V2.53,  lib_twi                                                               19/07/06  08:38:07  PAGE 3   

  124          
  125          //*=============================================================================
  126          //*                           读(EPROM)
  127          //*=============================================================================
  128          //*----------------------------------------------------------------------------
  129          //* 函数名:AT91F_TWI_ReadByte
  130          //* 功能: 从设备(EPROM)中读取一个字节的数据
  131          //*参数说明:
  132          //         pTwi:指向TWI结构的首地址-----设为AT91C_BASE_TWI
  133          //         mode:TWI的工作模式----用于设置WTI的主模式寄存器(内部器件地址长度,主机读写方向,器件地址),
             -见DATASHEET
  134          //         int_address:器件的内部地址(要写入的位置)
  135          //         data2read:数据缓冲区地址
  136          //         nb:要读出的字节数
  137          //* Creation            : 张正锋 2005-12-30 zhangzf@baite-group.com
  138          //*----------------------------------------------------------------------------
  139          int AT91F_TWI_ReadByte(const AT91PS_TWI pTwi ,int mode, int int_address, char *data2read, int nb)
  140          {
  141   1          unsigned int status,counter=0,error=0;
  142   1      
  143   1              // 设置TWI内部地址寄存器---可设为0,1,2,3位内部地址
  144   1          if ((mode & AT91C_TWI_IADRSZ) != 0) pTwi->TWI_IADR = int_address;
  145   1      
  146   1          // 设置TWI的主模式寄存器(此处为主机读)
  147   1          pTwi->TWI_MMR = mode | AT91C_TWI_MREAD;
  148   1      
  149   1          //如果只读取一个字节
  150   1          if (nb == 1)
  151   1              {
  152   2                  //发送START状态,接收完后发送STOP状态
  153   2             pTwi->TWI_CR = AT91C_TWI_START | AT91C_TWI_STOP;
  154   2      
  155   2                 //读取状态寄存器
  156   2             status = pTwi->TWI_SR;
  157   2                //如果没收到应答信号,则表明有一次传输错误
  158   2                 if ((status & ERROR) == ERROR) error++;
  159   2      
  160   2                 //等待操作完
  161   2             while (!(status & AT91C_TWI_TXCOMP)){
  162   3                    status = pTwi->TWI_SR;
  163   3                    if ((status & ERROR) == ERROR) error++;
  164   3                 }
  165   2      
  166   2                 //将数据放入缓冲区
  167   2             *(data2read) = pTwi->TWI_RHR;
  168   2           } //END if
  169   1      
  170   1              //如果读取多个字节
  171   1          else
  172   1             {
  173   2                 //发送START状态,接收完后发送STOP状态
  174   2             pTwi->TWI_CR = AT91C_TWI_START | AT91C_TWI_MSEN;
  175   2      
  176   2                 //读取状态寄存器
  177   2             status = pTwi->TWI_SR;
  178   2                 //如果没收到应答信号,则表明有一次传输错误
  179   2             if ((status & ERROR) == ERROR) error++;
  180   2      
  181   2            //等待操作完
  182   2                 while (!(status & AT91C_TWI_TXCOMP))
  183   2                 {
  184   3                      status = pTwi->TWI_SR;
  185   3              if ((status & ERROR )== ERROR) error++;
  186   3      
  187   3                      //查看是否收到一个字节数据
  188   3                  if(status & AT91C_TWI_RXRDY)
ARM COMPILER V2.53,  lib_twi                                                               19/07/06  08:38:07  PAGE 4   

  189   3                      {
  190   4                       //将数据放入缓从区
  191   4               *(data2read+counter++) = pTwi->TWI_RHR;
  192   4      
  193   4                       //如果是最后一次读取则发送STOP 状态
  194   4               if (counter == (nb - 1)) pTwi->TWI_CR = AT91C_TWI_STOP;
  195   4                   } //END if
  196   3              } //END while
  197   2          } //END else
  198   1      
  199   1            return error;
  200   1      }
  201          
  202          
  203          
  204          
  205          
ARM COMPILER V2.53,  lib_twi                                                               19/07/06  08:38:07  PAGE 5   

ASSEMBLY LISTING OF GENERATED OBJECT CODE



*** EXTERNALS:
 EXTERN CODE16 (?C?UDIV?T)
 EXTERN CODE16 (?C?SDIV?T)



*** PUBLICS:
 PUBLIC         AT91F_TWI_Open?T
 PUBLIC         AT91F_TWI_WriteByte?T
 PUBLIC         AT91F_TWI_ReadByte?T
 PUBLIC         AT91F_SetTwiClock?T



*** CODE SEGMENT '?PR?AT91F_MC_EFC_GetModeReg?T?lib_twi':
   66: __inline unsigned int AT91F_MC_EFC_GetModeReg(
 00000000  1C01      MOV         R1,R0 ; pMC
 00000002  ---- Variable 'pMC' assigned to Register 'R1' ----
   69:     return pMC->MC_FMR;
 00000002  1C08      MOV         R0,R1 ; pMC
 00000004  6E00      LDR         R0,[R0,#0x60]
   70: }
 00000006  4770      BX          R14
 00000008          ENDP ; 'AT91F_MC_EFC_GetModeReg?T'


*** CODE SEGMENT '?PR?AT91F_MC_EFC_GetStatus?T?lib_twi':
   97: __inline unsigned int AT91F_MC_EFC_GetStatus(
 00000000  1C01      MOV         R1,R0 ; pMC
 00000002  ---- Variable 'pMC' assigned to Register 'R1' ----
  100:     return pMC->MC_FSR;
 00000002  1C08      MOV         R0,R1 ; pMC
 00000004  6E80      LDR         R0,[R0,#0x68]
  101: }
 00000006  4770      BX          R14
 00000008          ENDP ; 'AT91F_MC_EFC_GetStatus?T'


*** CODE SEGMENT '?PR?AT91F_PDC_SetNextRx?T?lib_twi':
  132: __inline void AT91F_PDC_SetNextRx (
 00000000  B410      PUSH        {R4}
 00000002  ---- Variable 'bytes' assigned to Register 'R2' ----
 00000002  1C0C      MOV         R4,R1 ; address
 00000004  ---- Variable 'address' assigned to Register 'R4' ----
 00000004  1C03      MOV         R3,R0 ; pPDC
 00000006  ---- Variable 'pPDC' assigned to Register 'R3' ----
  137:     pPDC->PDC_RNPR = (unsigned int) address;
 00000006  1C21      MOV         R1,R4 ; address
 00000008  1C18      MOV         R0,R3 ; pPDC
 0000000A  6101      STR         R1,[R0,#0x10]
  138:     pPDC->PDC_RNCR = bytes;
 0000000C  1C11      MOV         R1,R2 ; bytes
 0000000E  1C18      MOV         R0,R3 ; pPDC
 00000010  6141      STR         R1,[R0,#0x14]
  139: }
 00000012  BC10      POP         {R4}

⌨️ 快捷键说明

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