📄 i2c.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 + -