/**
|
******************************************************************************
|
* @file xl_i2c.c
|
* @author kirk ,xu.wang
|
* @version 4.5.2
|
* @date Fri Mar 26 17:29:12 2021
|
* @brief This file provide function about I2C firmware program
|
******************************************************************************
|
* @attention
|
*
|
* 2019 by Chipways Communications,Inc. All Rights Reserved.
|
* This software is supplied under the terms of a license
|
* agreement or non-disclosure agreement with Chipways.
|
* Passing on and copying of this document,and communication
|
* of its contents is not permitted without prior written
|
* authorization.
|
*
|
* <h2><center>© COPYRIGHT 2019 Chipways</center></h2>
|
******************************************************************************
|
*/
|
|
#if defined(__cplusplus)
|
extern "C" {
|
#endif /* __cplusplus */
|
|
/* Includes ---------------------------------------------------------------*/
|
#include "xl_i2c.h"
|
|
|
/** @addtogroup XL6600_StdPeriph_Driver
|
* @{
|
*/
|
|
/** @defgroup I2C I2C Module
|
* @brief I2C Driver Modules Library
|
* @{
|
*/
|
|
/* Private typedef -----------------------------------------------------------*/
|
/* Private define ------------------------------------------------------------*/
|
/* Private macro -------------------------------------------------------------*/
|
/* Private variables ---------------------------------------------------------*/
|
/* Private function prototypes -----------------------------------------------*/
|
/* Private functions ---------------------------------------------------------*/
|
|
/** @defgroup I2C_Private_Functions
|
* @{
|
*/
|
|
/**
|
* @brief I2C»Ö¸´³õʼ״̬
|
* @param I2Cx: I2CÍâÉè
|
* Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ:
|
* @arg I2C0 £ºI2C0ÍâÉè
|
* @arg I2C1 £ºI2C1ÍâÉè
|
* @retval None
|
*/
|
void I2C_Deinit(I2C_Type *I2Cx)
|
{
|
I2Cx->ENABLE = 0x0000u;
|
I2Cx->CR = 0x007Fu;
|
I2Cx->TAR = 0x0055u;
|
I2Cx->SAR = 0x0055u;
|
I2Cx->SSCH = 0x0190u;
|
I2Cx->SSCL = 0x01d6u;
|
I2Cx->FSCH = 0x003cu;
|
I2Cx->FSCL = 0x0082u;
|
I2Cx->RXTL = 0x0000u;
|
I2Cx->TXTL = 0x0000u;
|
|
}
|
/**
|
* @brief ÉèÖÃͨѶËÙ¶È
|
* @param I2Cx: I2CÍâÉè
|
* Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ:
|
* @arg I2C0 £ºI2C0ÍâÉè
|
* @arg I2C1 £ºI2C1ÍâÉè
|
* @param I2C_SourceClk: I2CʱÖÓÔ´Ñ¡Ôñ£¬ÏµÍ³Ê±ÖÓ
|
* @param I2C_SpeedMode: ͨѶËÙ¶Èģʽ
|
* Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ:
|
* @arg I2C_StandardMode £º ±ê׼ģʽ 100k
|
* @arg I2C_FastMode £º ¿ìËÙģʽ 400k
|
* @arg I2C_HighspeedMode £º¸ßËÙģʽ 3.4M
|
* @retval None
|
*/
|
static void I2C_SetSpeed(I2C_Type *I2Cx, uint16_t I2C_SourceClk,uint16_t I2C_SpeedMode)
|
{
|
uint16_t IC_HCNT;
|
uint16_t IC_LCNT;
|
/* set I2C speed in standaed mode */
|
if(I2C_SpeedMode == I2C_StandardMode)
|
{
|
IC_HCNT=(uint16_t)(4000u*(I2C_SourceClk)/1000u);
|
I2Cx->SSCH = (uint32_t)IC_HCNT;
|
IC_LCNT=(uint16_t)(4700u*(I2C_SourceClk)/1000u);
|
I2Cx->SSCL = (uint32_t)IC_LCNT;
|
}
|
/* set I2C speed in fast mode */
|
else
|
{
|
IC_HCNT=(uint16_t)(600u*(I2C_SourceClk)/1000u);
|
I2Cx->FSCH = (uint32_t)IC_HCNT;
|
IC_LCNT=(uint16_t)(1300u*(I2C_SourceClk)/1000u);
|
I2Cx->FSCL = (uint32_t)IC_LCNT;
|
}
|
}
|
|
/**
|
* @brief ³õʼ»¯I2CÄ£¿é
|
* @param I2Cx: I2CÍâÉè
|
* Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ:
|
* @arg I2C0 £ºI2C0ÍâÉè
|
* @arg I2C1 £ºI2C1ÍâÉè
|
* @param I2C_InitStruct I2C ³õʼ»¯µÄ²ÎÊý½á¹¹Ìå
|
* @retval None
|
*/
|
void I2C_Init(I2C_Type *I2Cx, const I2C_InitTypeDef * I2C_InitStruct)
|
{
|
uint32_t temp1;
|
|
/* Set the I2Cx control register */
|
I2Cx->CR = (I2C_InitStruct->I2C_MasterModeEn | I2C_InitStruct->I2C_SlaveModeDis |\
|
I2C_InitStruct->I2C_SendRestart | I2C_InitStruct->I2C_SpeedMode |\
|
I2C_InitStruct->I2C_SADmode | I2C_InitStruct->I2C_MADmode);
|
|
/* set I2C speed */
|
I2C_SetSpeed(I2Cx,I2C_InitStruct->I2C_SourceClk,I2C_InitStruct->I2C_SpeedMode);
|
|
/* IC_RXTL : I2C Receive FIFO Threshold Register */
|
I2Cx->RXTL = I2C_InitStruct->I2C_RXTL;
|
|
/* IC_TXTL : I2C Transmit FIFO Threshold Register */
|
I2Cx->TXTL = I2C_InitStruct->I2C_TXTL;
|
|
/*************************only used in master mode ***************************/
|
/* Set the I2Cx TAR register,only used in master mode */
|
temp1 = I2Cx->TAR;
|
|
temp1 &= ~I2C_TAR_TAD_MASK;
|
|
temp1 |= I2C_InitStruct->I2C_TargetAddress;
|
|
I2Cx->TAR = temp1;
|
|
/*************************only used in slave mode ***************************/
|
/* IC_SAR : I2C slave address register */
|
I2Cx->SAR = I2C_InitStruct->I2C_SlaveAddress;
|
}
|
|
|
/**
|
* @brief I2C ʹÄÜ
|
* @param I2Cx: I2CÍâÉè
|
* Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ:
|
* @arg I2C0 £ºI2C0ÍâÉè
|
* @arg I2C1 £ºI2C1ÍâÉè
|
* @param NewState: ״̬ѡÔñ
|
* Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ:
|
* @arg ENABLE £ºÊ¹ÄÜ
|
* @arg DISENABLE £ºÊ§ÄÜ
|
* @retval None
|
*/
|
void I2C_EnableCmd(I2C_Type *I2Cx, FunctionalState NewState)
|
{
|
/* enable the I2C moudle */
|
if(NewState != DISABLE )
|
{
|
/* Enable the selected I2C peripheral */
|
I2Cx->ENABLE |= I2C_ENABLE_EN_MASK ;
|
}
|
else
|
{
|
/* Disable the selected I2C peripheral */
|
I2Cx->ENABLE &= ~I2C_ENABLE_EN_MASK;
|
}
|
}
|
|
/**
|
* @brief I2C ²úÉúÒ»¸öCALLÃüÁî
|
* @param I2Cx: I2CÍâÉè
|
* Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ:
|
* @arg I2C0 £ºI2C0ÍâÉè
|
* @arg I2C1 £ºI2C1ÍâÉè
|
* @retval None
|
*/
|
void I2C_GeneralCall( I2C_Type* I2Cx)
|
{
|
/* set special mode */
|
I2Cx->TAR |=I2C_TAR_SPECIAL_MASK;
|
|
/* set General Call */
|
I2Cx->TAR &= ~I2C_TAR_GOS_MASK;
|
}
|
|
|
/**
|
* @brief I2CͨÓõ÷ÓÃÓ¦´ðʹÄÜ
|
* @param I2Cx: I2CÍâÉè
|
* Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ:
|
* @arg I2C0 £ºI2C0ÍâÉè
|
* @arg I2C1 £ºI2C1ÍâÉè
|
* @param NewState: ״̬ѡÔñ
|
* Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ:
|
* @arg ENABLE £ºÊ¹ÄÜ
|
* @arg DISENABLE £ºÊ§ÄÜ
|
* @retval None
|
*/
|
void I2C_GeneralCallAckEnableCmd(I2C_Type* I2Cx, FunctionalState NewState)
|
{
|
if(NewState != DISABLE )
|
{
|
I2Cx->ENABLE |= I2C_AGC_ACKGC_MASK ;
|
}
|
else
|
{
|
I2Cx->ENABLE &= ~I2C_AGC_ACKGC_MASK;
|
}
|
}
|
|
|
/**
|
* @brief I2C ²úÉúÒ»¸öStartByteÃüÁî
|
* @param I2Cx: I2CÍâÉè
|
* Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ:
|
* @arg I2C0 £ºI2C0ÍâÉè
|
* @arg I2C1 £ºI2C1ÍâÉè
|
* @param TargetAddress: Ä¿±êµØÖ·
|
* @retval None
|
*/
|
void I2C_StartByte(I2C_Type* I2Cx, uint32_t TargetAddress)
|
{
|
uint32_t temp;
|
|
temp = I2Cx->TAR;
|
|
temp &= ~I2C_TAR_TAD_MASK;
|
|
temp |= (I2C_TAR_SPECIAL_MASK | I2C_TAR_GOS_MASK | TargetAddress);
|
|
I2Cx->TAR = temp;
|
}
|
|
|
/**
|
* @brief I2C ÖжÏʹÄܺ¯Êý
|
* @param I2Cx: I2CÍâÉè
|
* Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ:
|
* @arg I2C0 £ºI2C0ÍâÉè
|
* @arg I2C1 £ºI2C1ÍâÉè
|
* @param I2C_Interrupt: ÖжÏÔ´
|
* Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ:
|
* @arg I2C_RXUNDERInterrupt RX UNDER Interrupt
|
* @arg I2C_RXOVERInterrupt RX OVER Interrupt
|
* @arg I2C_RXFULLInterrupt RX FULL Interrupt
|
* @arg I2C_TXOVERInterrupt TX OVER Interrupt
|
* @arg I2C_TXEMPTYInterrupt TX EMPTY Interrupt
|
* @arg I2C_RDREQInterrupt RD REQ Interrupt
|
* @arg I2C_TXABRTInterrupt TX ABRT Interrupt
|
* @arg I2C_RXDONEInterrupt RX DONE Interrupt
|
* @arg I2C_ACTIVITYInterrupt ACTIVITY Interrupt
|
* @arg I2C_STOPDETInterrupt STOP DET Interrupt
|
* @arg I2C_STARTDETInterrupt START DET Interrupt
|
* @arg I2C_GENCALLInterrupt GEN CALL Interrupt
|
* @param NewState: ״̬ѡÔñ
|
* Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ:
|
* @arg ENABLE £ºÊ¹ÄÜ
|
* @arg DISENABLE £ºÊ§ÄÜ
|
* @retval None
|
*/
|
void I2C_InterruptEn(I2C_Type *I2Cx, const I2C_InterruptTypeDef I2C_Interrupt, FunctionalState NewState)
|
{
|
uint16_t itmask;
|
|
/* Get the interrupt enable index */
|
itmask = (uint16_t)((uint32_t)1u << (uint8_t)I2C_Interrupt);
|
|
if (NewState != DISABLE)
|
{
|
/* Enable the selected I2C interrupts */
|
I2Cx->INTRM |= (uint32_t)itmask;
|
}
|
else
|
{
|
/* Disable the selected I2C interrupts */
|
I2Cx->INTRM &= ~(uint32_t)itmask;
|
}
|
}
|
/**
|
* @brief I2C µÃµ½ÖжÏ״̬º¯Êý
|
* @param I2Cx: I2CÍâÉè
|
* Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ:
|
* @arg I2C0 £ºI2C0ÍâÉè
|
* @arg I2C1 £ºI2C1ÍâÉè
|
* @param I2C_IntStatusType: ÖжÏÔ´
|
* Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ:
|
* @arg I2C_RXUNDERInterruptStatus RX UNDER Interrupt Masked Status.
|
* @arg I2C_RXOVERInterruptStatus RX OVER Interrupt Masked Status.
|
* @arg I2C_RXFULLInterruptStatus RX FULL Interrupt Masked Status.
|
* @arg I2C_TXOVERInterruptStatus TX OVER Interrupt Masked Status.
|
* @arg I2C_TXEMPTYInterruptStatus TX EMPTY Interrupt Masked Status.
|
* @arg I2C_RDREQInterruptStatus RD REQ Interrupt Masked Status.
|
* @arg I2C_TXABRTInterruptStatus TX ABRT Interrupt Masked Status.
|
* @arg I2C_RXDONEInterruptStatus RX DONE Interrupt Masked Status.
|
* @arg I2C_ACTIVITYInterruptStatus ACTIVITY Interrupt Masked Status.
|
* @arg I2C_STOPDETInterruptStatus STOP DET Interrupt Masked Status.
|
* @arg I2C_STARTDETInterruptStatus START DET Interrupt Masked Status.
|
* @arg I2C_GENCALLInterruptStatus GEN CALL Interrupt Masked Status.
|
* @retval ·µ»ØÖжÏ״̬
|
*/
|
uint16_t I2C_GetMaskedIntStatus(const I2C_Type *I2Cx, I2C_ITStatusMaskedDef I2C_IntStatusType)
|
{
|
uint16_t IntStatusTemp;
|
/* Get all the interrupt status */
|
IntStatusTemp =(uint16_t)(I2Cx->IS);
|
|
/* get the selected interrupt status */
|
return (uint16_t)((uint32_t)IntStatusTemp & ((uint32_t)1 << (uint8_t)I2C_IntStatusType));
|
}
|
|
|
/**
|
* @brief I2C µÃµ½I2CÔʼÖжÏ״̬
|
* @param I2Cx: I2CÍâÉè
|
* Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ:
|
* @arg I2C0 £ºI2C0ÍâÉè
|
* @arg I2C1 £ºI2C1ÍâÉè
|
* @param I2C_RawIntStatusType: ÖжÏÔ´
|
* Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ:
|
* @arg I2C_RXUNDERInterruptRawStatus RX UNDER Interrupt Raw Status.
|
* @arg I2C_RXOVERInterruptRawStatus RX OVER InterruptRawStatus.
|
* @arg I2C_RXFULLInterruptRawStatus RX FULL InterruptRawStatus.
|
* @arg I2C_TXOVERInterruptRawStatus TX OVER InterruptRawStatus.
|
* @arg I2C_TXEMPTYInterruptRawStatus TX EMPTY InterruptRawStatus.
|
* @arg I2C_RDREQInterruptRawStatus RD REQ Interrupt Raw Status.
|
* @arg I2C_TXABRTInterruptRawStatus TX ABRT Interrupt Raw Status.
|
* @arg I2C_RXDONEInterruptRawStatus RX DONE Interrupt Raw Status.
|
* @arg I2C_ACTIVITYInterruptRawStatus ACTIVITY Interrupt Raw Status.
|
* @arg I2C_STOPDETInterruptRawStatus STOP DET Interrupt Raw Status.
|
* @arg I2C_STARTDETInterruptRawStatus START DET Interrupt Raw Status.
|
* @arg I2C_GENCALLInterruptRawStatus GEN CALL Interrupt Raw Status.
|
* @retval ·µ»ØÖжÏ״̬
|
*/
|
uint16_t I2C_GetRawIntgStatus(const I2C_Type *I2Cx,I2C_RawITStatusTypeDef I2C_RawIntStatusType)
|
{
|
uint16_t RawIntStatusTemp;
|
|
/* Get all the Raw interrupt status */
|
RawIntStatusTemp =(uint16_t)(I2Cx->RIS) ;
|
|
/* get the selected Raw interrupt status */
|
return (uint16_t)((uint32_t)RawIntStatusTemp & ((uint32_t)1u << (uint8_t)I2C_RawIntStatusType));
|
}
|
|
/**
|
* @brief I2C Çå³ýÖжϱêÖ¾
|
* @param I2Cx: I2CÍâÉè
|
* Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ:
|
* @arg I2C0 £ºI2C0ÍâÉè
|
* @arg I2C1 £ºI2C1ÍâÉè
|
* @param I2C_Interrupt2Clear: ÖжÏÔ´
|
* Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ:
|
* @arg I2C_AllInterruptClear Combined and Individual Clear.
|
* @arg I2C_RXUNDERInterruptClear Clear RX UNDER Interrupt
|
* @arg I2C_RXOVERInterruptClear Clear RX OVER Interrupt
|
* @arg I2C_TXOVERInterruptClear Clear TX OVER Interrupt
|
* @arg I2C_RDREQInterruptClear Clear RD REQ Interrupt
|
* @arg I2C_TXABRTInterruptClear Clear TX ABRT Interrupt
|
* @arg I2C_RXDONEInterruptClear Clear RX DONE Interrupt
|
* @arg I2C_ACTIVITYInterruptClear Clear ACTIVITY Interrupt
|
* @arg I2C_STOPDETInterruptClear Clear STOP DET Interrupt
|
* @arg I2C_STARTDETInterruptClear Clear START DET Interrupt
|
* @arg I2C_GENCALLInterruptClear Clear GEN CALL Interrupt
|
* @retval ·µ»ØÖжÏ״̬
|
*/
|
uint16_t I2C_ClearInterrupt(const I2C_Type *I2Cx, I2C_InterruptClearDef I2C_Interrupt2Clear)
|
{
|
uint16_t interrupt2clear;
|
|
/*!< Clear GEN_CALL Interrupt Register */
|
if(I2C_Interrupt2Clear == I2C_GENCALLInterruptClear)
|
{
|
interrupt2clear=(uint16_t)(I2Cx->CGC);
|
}
|
/*!< Clear START_DET Interrupt Register */
|
else if(I2C_Interrupt2Clear == I2C_STARTDETInterruptClear)
|
{
|
interrupt2clear=(uint16_t)(I2Cx->CSTART);
|
}
|
/*!< Clear STOP_DET Interrupt Register */
|
else if(I2C_Interrupt2Clear == I2C_STOPDETInterruptClear)
|
{
|
interrupt2clear=(uint16_t)(I2Cx->CSTOP);
|
}
|
/*!< Clear ACTIVITY Interrupt Register */
|
else if(I2C_Interrupt2Clear == I2C_ACTIVITYInterruptClear)
|
{
|
interrupt2clear=(uint16_t)(I2Cx->CACT);
|
}
|
/*!< Clear RX_DONE Interrupt Register */
|
else if(I2C_Interrupt2Clear==I2C_RXDONEInterruptClear)
|
{
|
interrupt2clear=(uint16_t)(I2Cx->CRD);
|
}
|
/*!< Clear TX_ABRT Interrupt Register */
|
else if(I2C_Interrupt2Clear==I2C_TXABRTInterruptClear)
|
{
|
interrupt2clear=(uint16_t)(I2Cx->CTXA);
|
}
|
/*!< Clear RD_REQ Interrupt Register */
|
else if(I2C_Interrupt2Clear==I2C_RDREQInterruptClear)
|
{
|
interrupt2clear=(uint16_t)(I2Cx->CRR);
|
}
|
/*!< Clear TX_OVER Interrupt Register */
|
else if(I2C_Interrupt2Clear==I2C_TXOVERInterruptClear)
|
{
|
interrupt2clear=(uint16_t)(I2Cx->CTO);
|
}
|
/*!< Clear RX_OVER Interrupt Register */
|
else if(I2C_Interrupt2Clear==I2C_RXOVERInterruptClear)
|
{
|
interrupt2clear=(uint16_t)(I2Cx->CRO);
|
}
|
/*!< Clear RX_UNDER Interrupt Register */
|
else if(I2C_Interrupt2Clear == I2C_RXUNDERInterruptClear)
|
{
|
interrupt2clear=(uint16_t)(I2Cx->CRU);
|
}
|
/* Clear all Interrupt */
|
else
|
{
|
interrupt2clear=(uint16_t)(I2Cx->CCI);
|
}
|
|
return interrupt2clear;
|
}
|
|
/**
|
* @brief I2C »ñÈ¡I2C״̬
|
* @param I2Cx: I2CÍâÉè
|
* Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ:
|
* @arg I2C0 £ºI2C0ÍâÉè
|
* @arg I2C1 £ºI2C1ÍâÉè
|
* @param I2C_StatusType: ״̬ÀàÐÍ
|
* @arg I2C_ActivityStatus I2C Activity Status.
|
* @arg I2C_TransmitFIFONotFullStatus Transmit FIFO Not Full.
|
* @arg I2C_TransmitFIFOEmptyStatus Transmit FIFO Completely Empty
|
* @arg I2C_ReceiveFIFONotEmptyStatus Receive FIFO not Empty.
|
* @arg I2C_ReceiveFIFOFullStatus Receive FIFO Completely Full.
|
* @arg I2C_MasterFSMActStatus Master FSM Activity Status.
|
* @arg I2C_SlaveFSMActStatus Slave FSM Activity Status.
|
* @retval ·µ»ØÖжÏ״̬
|
*/
|
uint8_t I2C_GetStatus(const I2C_Type *I2Cx, I2C_StatusTypeDef I2C_StatusType)
|
{
|
uint8_t StatusTemp;
|
/* Get all the status */
|
StatusTemp =(uint8_t)(I2Cx->STATUS);
|
|
/* get the selected status */
|
return (StatusTemp &(uint8_t)(1u << (uint8_t)I2C_StatusType));
|
}
|
|
|
/**
|
* @brief I2C »ñÈ¡I2CÖÕÖ¹Ô´
|
* Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ:
|
* @arg I2C0 £ºI2C0ÍâÉè
|
* @arg I2C1 £ºI2C1ÍâÉè
|
* @param I2C_ABRTSourceType: ÖÕÖ¹Ô´
|
* @retval ·µ»ØÖжÏ״̬
|
*/
|
uint16_t I2C_GetAbortSource(const I2C_Type *I2Cx, I2C_ABRTSourceTypeDef I2C_ABRTSourceType)
|
{
|
uint16_t StatusTemp;
|
/* Get all the status */
|
StatusTemp = (uint16_t)(I2Cx->TXAS);
|
|
/* get the selected status */
|
return (uint16_t)((uint32_t)StatusTemp & ((uint32_t)1u << (uint8_t)I2C_ABRTSourceType));
|
}
|
|
/**
|
* @brief I2C »ñÈ¡I2CʹÄÜ״̬
|
* @param I2Cx: I2CÍâÉè
|
* Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ:
|
* @arg I2C0 £ºI2C0ÍâÉè
|
* @arg I2C1 £ºI2C1ÍâÉè
|
* @param I2C_EnableStatusType: ʹÄܵÄ״̬
|
* Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ:
|
* @arg I2C_ENStatusI2CENStatus I2C_en Status.
|
* @arg I2C_ENStatusSlaveRXOperationAborted Slave-Receiver Operation Aborted.
|
* @arg I2C_ENStatusSlaveFIFOFilledAndFlushed Slave FIFO Filled and Flushed.
|
* @retval ·µ»ØÖжÏ״̬
|
*/
|
uint8_t I2C_GetEnableStatus(const I2C_Type *I2Cx, I2C_EnableStatusTypeDef I2C_EnableStatusType)
|
{
|
uint8_t StatusTemp;
|
/* Get all the status */
|
StatusTemp =(uint8_t)(I2Cx->ES);
|
|
/* get the selected status */
|
return (StatusTemp &(uint8_t)(1u << (uint8_t)I2C_EnableStatusType));
|
}
|
|
/**
|
* @brief I2C »ñÈ¡I2C FIFOµÄ״̬
|
* @param I2Cx: I2CÍâÉè
|
* Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ:
|
* @arg I2C0 £ºI2C0ÍâÉè
|
* @arg I2C1 £ºI2C1ÍâÉè
|
* @param FIFOLevelDef: FIFOµÄ״̬Դ
|
* Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ:
|
* @arg I2C_TransmitFIFOLevel Transmit FIFO Level
|
* @arg I2C_ReceiveFIFOLevel Receive FIFO Level
|
* @retval ·µ»ØÖжÏ״̬
|
*/
|
uint8_t I2C_GetFIFOLev(const I2C_Type *I2Cx, I2C_TXRXFIFOLevelDef FIFOLevelDef)
|
{
|
uint8_t fifolevel;
|
|
/* Check the FIFO Level is transmit or receive*/
|
if(FIFOLevelDef==I2C_TransmitFIFOLevel)
|
{
|
fifolevel=(uint8_t)(I2Cx->TXFLR &I2C_TXFLR_TXFL_MASK);
|
}
|
else
|
{
|
fifolevel=(uint8_t)(I2Cx->RXFLR &I2C_RXFLR_RXFL_MASK);
|
}
|
/* return the fifolevel Value */
|
return fifolevel;
|
}
|
|
/**
|
* @brief I2C ·¢ËÍÊý¾Ý
|
* @param I2Cx: I2CÍâÉè
|
* Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ:
|
* @arg I2C0 £ºI2C0ÍâÉè
|
* @arg I2C1 £ºI2C1ÍâÉè
|
* @param u8DataBuff: ·¢Ë͵ÄÊý¾Ý
|
* @param isstop: ÊÇ·ñ·¢ËÍֹͣλ
|
* Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ:
|
* @arg I2C_No_Stop £º²»·¢ËÍSTOP
|
* @arg I2C_Stop £º·¢ËÍSTOP
|
* @retval None
|
*/
|
void I2C_WriteData(I2C_Type *I2Cx, uint8_t u8DataBuff,I2C_IsStopDef isstop)
|
{
|
if(isstop == I2C_Stop)
|
{
|
/* write to the DAT */
|
I2Cx->DBC = (uint32_t)u8DataBuff | I2C_DBC_STOP_MASK;
|
}
|
else
|
{
|
/* write to the DAT */
|
I2Cx->DBC = (uint32_t)u8DataBuff;
|
}
|
}
|
|
/**
|
* @brief I2C ½ÓÊÕÊý¾ÝÃüÁî
|
* @param I2Cx: I2CÍâÉè
|
* Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ:
|
* @arg I2C0 £ºI2C0ÍâÉè
|
* @arg I2C1 £ºI2C1ÍâÉè
|
* @param isstop: ÊÇ·ñ·¢ËÍֹͣλ
|
* Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ:
|
* @arg I2C_No_Stop £º²»·¢ËÍSTOP
|
* @arg I2C_Stop £º·¢ËÍSTOP
|
* @retval ½ÓÊÕµÄÊý¾Ý
|
*/
|
void I2C_ReadDataCmd(I2C_Type *I2Cx ,I2C_IsStopDef isstop)
|
{
|
if(isstop == I2C_Stop)
|
{
|
I2Cx->DBC = (I2C_DBC_CMD_MASK|I2C_DBC_STOP_MASK);
|
}
|
else
|
{
|
I2Cx->DBC = I2C_DBC_CMD_MASK;
|
}
|
}
|
|
/**
|
* @brief I2C ½ÓÊÕÊý¾Ýº¯Êý
|
* @param I2Cx: I2CÍâÉè
|
* Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ:
|
* @arg I2C0 £ºI2C0ÍâÉè
|
* @arg I2C1 £ºI2C1ÍâÉè
|
* @retval ½ÓÊÕµÄÊý¾Ý
|
*/
|
uint8_t I2C_ReadData(const I2C_Type *I2Cx)
|
{
|
uint8_t dtemp;
|
|
dtemp = (uint8_t)I2Cx->DBC;
|
|
return dtemp ;
|
}
|
|
|
/**
|
* @brief I2C ÖØÐ·¢ËÍ¿ªÊ¼²¢ÇÒÊǶÁÃüÁî
|
* @param I2Cx: I2CÍâÉè
|
* Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ:
|
* @arg I2C0 £ºI2C0ÍâÉè
|
* @arg I2C1 £ºI2C1ÍâÉè
|
* @retval None
|
*/
|
void I2C_ResStartRead(I2C_Type *I2Cx)
|
{
|
I2Cx->DBC = I2C_DBC_RESTART_MASK|I2C_DBC_CMD_MASK;
|
}
|
|
/**
|
* @brief I2C ÖØÐ¿ªÊ¼·¢ËÍÊý¾Ý
|
* @param I2Cx: I2CÍâÉè
|
* Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ:
|
* @arg I2C0 £ºI2C0ÍâÉè
|
* @arg I2C1 £ºI2C1ÍâÉè
|
* @retval None
|
*/
|
void I2C_ResStartWrite(I2C_Type *I2Cx,uint8_t u8DataBuff,I2C_IsStopDef isstop)
|
{
|
if(isstop == I2C_Stop)
|
{
|
I2Cx->DBC = (uint32_t)u8DataBuff |I2C_DBC_RESTART_MASK| I2C_DBC_STOP_MASK;
|
}
|
else
|
{
|
I2Cx->DBC = (uint32_t)u8DataBuff | I2C_DBC_RESTART_MASK ;
|
}
|
}
|
|
/**
|
* @brief I2C SDAÑÓʱ
|
* @param I2Cx: I2CÍâÉè
|
* Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ:
|
* @arg I2C0 £ºI2C0ÍâÉè
|
* @arg I2C1 £ºI2C1ÍâÉè
|
* @param I2Cclkfreq: ʱÖÓÆµÂÊ
|
* @param DelayReq: ÑÓʱÖÜÆÚ
|
* @retval None
|
*/
|
void I2C_SetSDADelay(I2C_Type *I2Cx, const uint8_t I2Cclkfreq, const uint8_t DelayReq)
|
{
|
uint8_t temp;
|
|
/* calculate the time delay,I2Cclkfreq in Mhz,DelayReq in ns*/
|
temp = (uint8_t)(((uint16_t)I2Cclkfreq * (uint16_t)DelayReq /1000u) + 1u);
|
|
/* set the amount of time delay */
|
I2Cx->SDAS = (uint32_t)temp;
|
}
|
|
/**
|
* @brief I2C SDA±£³Öʱ¼äÉèÖÃ
|
* @param I2Cx: I2CÍâÉè
|
* Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ:
|
* @arg I2C0 £ºI2C0ÍâÉè
|
* @arg I2C1 £ºI2C1ÍâÉè
|
* @param holdtime: ±£³ÖµÄʱ¼ä
|
* @retval None
|
*/
|
void I2C_SetSDAHoldTime(I2C_Type *I2Cx, uint16_t holdtime)
|
{
|
I2Cx->SDAHOLD = (uint32_t)holdtime;
|
}
|
|
/**
|
* @}
|
*/
|
|
/**
|
* @}
|
*/
|
|
/**
|
* @}
|
*/
|
|
#ifdef __cplusplus
|
}
|
#endif /* __cplusplus */
|
|
|
/*******************************************************************************
|
* EOF
|
******************************************************************************/
|