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

📄 i2c.c

📁 ST7 Mcu I2C program driver code for learning
💻 C
字号:
/*****************************************************************************
COPYRIGHT 2002 STMicroelectronics
Source File Name : I2C.c 
Group            : IPSW,CMG-IPDF
Author           : MCD Application Team
Date First Issued: 04/03/2002
********************************Documentation**********************************
General Purpose - Contains source code for all the functions of I2C.
********************************Revision History*******************************
_______________________________________________________________________________
Date :04/03/2002                  Release:1.0         	   	   	      	       		        
Date :21/06/2004                  Misra changes 
******************************************************************************/
#include "ST7lib_config.h"                            /* Selection of device */
#include "I2C_hr.h"                       /* Declaration of I2C HW registers */
#include "I2C.h"           /* Prototype definitions of I2C library functions */

/*---------------------------------------------------------------------------*/
                                      /* Declaration of all global variables */
volatile unsigned char I2C_Multimaster;/* Multimaster configuration variable */

const volatile unsigned char* I2C_TxAdd ;         /* Global address variable */
 
volatile unsigned char* I2C_RxAdd ;               /* Global address variable */

static unsigned char I2C_Buff_Count;/* Transmitter and receiver buffer count */

static unsigned char I2C_String_Count;           /* Transmitter String count */                                     

static unsigned char I2C_Err ;                      /* Global Error variable */                            
               
static unsigned char I2C_DATA ;         
               /* Variable for single byte reception/ last byte transmission */

static unsigned char I2C_Status_Byte ;         
  /* Variable for slave address transmission and single byte IT driven count */

static unsigned char I2C_Status ;               /* Interrupt bit Status flag */

/*---------------------------------------------------------------------------*/                                                                               
/*-----------------------------------------------------------------------------
ROUTINE NAME : I2C_Init
INPUT        : I2C_DEFAULT_PARAM1, I2C_ACK_ENABLE, I2C_IT_ENABLE
OUTPUT       : None.
DESCRIPTION  : Initialization of I2C. Acknowledge and interrupt are enabled as
               per the input parameters passed.
COMMENTS     : Must be called before starting any I2C operation
-----------------------------------------------------------------------------*/
void I2C_Init (I2C_InitParam Init_Value)
{
                                   /* Loads reset value in all I2C registers */
    I2CDR = I2C_DEFAULT_PARAM1 ;  
    I2CCCR = I2C_DEFAULT_PARAM1 ;  
    I2CCR = I2C_DEFAULT_PARAM1 ;                      
    
    I2CCR |= PE ;                                             /* Enables I2C */
    I2CCR |= (unsigned char)Init_Value ;           /* Configuration of I2C control register */       
                                         /* All global variables initialised */
    I2C_Multimaster = I2C_DEFAULT_PARAM1;
    I2C_Buff_Count = I2C_DEFAULT_PARAM1 ;
    I2C_String_Count = I2C_DEFAULT_PARAM1 ;
    I2C_Err = I2C_DEFAULT_PARAM1 ;
    I2C_DATA = I2C_DEFAULT_PARAM1 ;
    I2C_Status_Byte = 1 ;
    I2C_Status = I2C_DEFAULT_PARAM1 ;  
}

/*-----------------------------------------------------------------------------
ROUTINE NAME : I2C_MultiMaster_Config
INPUT        : I2C_MULTIMASTER_PARAM, I2C_ENGC_ENABLE
OUTPUT       : None.
DESCRIPTION  : Configure I2C as multimaster I2C device.
COMMENTS     : I2C_ENGC_ENABLE is valid only for slave mode for ST72F521/
               ST72f63 devices.
-----------------------------------------------------------------------------*/
#if (defined I2C_72F521 || defined I2C_72F63 || defined I2C_72F264)
void I2C_MultiMaster_Config (void)
{
    I2C_Multimaster = 1 ;                     /* Multimaster mode configured */           
}     
#endif

/*-----------------------------------------------------------------------------
ROUTINE NAME : I2C_Select_Speed
INPUT        : Input Parameter1 - I2C_DEFAULT_PARAM2, I2C_FASTSPEED
               Input Parameter2 - I2C_Speed
OUTPUT       : None.
DESCRIPTION  : Selects I2C clock speed both in standard and fast speed mode.
COMMENTS     : If the exact selected speed is not possible, user will get the 
               nearest possible speed.
-----------------------------------------------------------------------------*/
/* RBuilder can override this function by adding #define REM_I2C_SELECT_SPEED*/
#ifndef REM_I2C_SELECT_SPEED 

void I2C_Select_Speed (I2C_SpeedParam Speed_Value, unsigned int I2C_Speed)
{
    unsigned long Temp ;
     
    I2CCCR &= (unsigned char)~(unsigned char)I2C_FASTSPEED ;
    if (Speed_Value == I2C_FASTSPEED )        /* Fast speed mode is selected */
    {                   
        Temp = (unsigned long)((Fcpu /(3000 * (unsigned long)I2C_Speed))- 2);
        I2CCCR = (unsigned char)(Temp);             
                             /* Speed value calculated from input parameters */
        I2CCCR |= I2C_FASTSPEED ;                    /* FM/SM bit is enabled */
    }
    else
    {                                       /* Standard speed mode selected */          
        Temp =  (unsigned long)((Fcpu /(2000 * (unsigned long)I2C_Speed))-2);
        I2CCCR = (unsigned char)(Temp) ;                                     
                             /* Speed value calculated from input parameters */
    }
}

#endif /* REM_I2C_SELECT_SPEED */  

/*-----------------------------------------------------------------------------
ROUTINE NAME : I2C_Load_Address
INPUT        : Addr_Byte
OUTPUT       : None.
DESCRIPTION  : In master mode, transmit address byte to select slave device.
COMMENTS     : None.
-----------------------------------------------------------------------------*/
void I2C_Load_Address (unsigned char Addr_Byte, I2C_Mode Mode_Value)
{
    unsigned char Temp; 
                                    
    if ( Mode_Value == I2C_RX_MODE)     
    {                           /* Checking for transmitter or receiver mode */
        I2C_Status_Byte = 0 ;
        Addr_Byte |= I2C_RX_MODE;             /* LSB of slave address made 1 */          
    }    
    else if ( Mode_Value == I2C_SUB_ADD)
    {     
        I2CCR |= PE  ;                    /* Clearing sequence for event EV6 */
        Temp = I2CSR1 ; 
        I2C_Status_Byte = 1;
    }                                   
    else if ( Mode_Value == I2C_TX_MODE)
    {     
        I2C_Status_Byte = 0 ;
        Addr_Byte &= (unsigned char)~(unsigned char)I2C_RX_MODE;
                                              /* LSB of slave address made 0 */
    }                          
    I2C_DATA = Addr_Byte ;        /* Slave address copied to global variable */
    if (I2C_Status ==1)
    {
        I2CCR |= ITE ;                         /* Interrupt is enabled again */
        I2C_Status = 0 ;
    }                     
    I2CDR = Addr_Byte ;               /* Loads address byte in data register */ 
}

/*-----------------------------------------------------------------------------
ROUTINE NAME : I2C_PutByte
INPUT        : Tx_Data
OUTPUT       : None.
DESCRIPTION  : Transmits single byte of data
COMMENTS     : None.
-----------------------------------------------------------------------------*/
void I2C_PutByte (unsigned char Tx_Data)
{            
    unsigned char Temp ;
          
    Temp = I2CSR1 ;     
    while (!( Temp & BTF))
    { 
        Temp = I2CSR1 ;             /* Waiting till address byte transmitted */        
    }   
    I2CDR = Tx_Data ;       /* Loads data to be transmitted in data register */
}

#ifdef I2C_POLLING_TX
/*-----------------------------------------------------------------------------
ROUTINE NAME : I2C_PutString
INPUT        : *PtrToString
OUTPUT       : Transmission status.
DESCRIPTION  : Transmits data string for 慞olling

⌨️ 快捷键说明

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