/**
******************************************************************************
* @file stm32f0xx_i2c_cpal.c
* @author MCD Application Team
* @version V1.0.0RC1
* @date 27-January-2012
* @brief This file provides all the CPAL firmware functions for I2C peripheral.
******************************************************************************
* @attention
*
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
*
* FOR MORE INFORMATION PLEASE READ CAREFULLY THE LICENSE AGREEMENT FILE
* LOCATED IN THE ROOT DIRECTORY OF THIS FIRMWARE PACKAGE.
*
* <h2><center>© COPYRIGHT 2012 STMicroelectronics</center></h2>
******************************************************************************
*/
/* Includes ------------------------------------------------------------------*/
#include "stm32f0xx_i2c_cpal.h"
/* Private typedef -----------------------------------------------------------*/
/* Private defines -----------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* This macro allows to test on a flag status and to start Timeout procedure if the
waiting time exceeds the allowed timeout period.
@note This macro has not been implemented as a function because the entered parameter
'cmd' itself can be a macro (if it was implemented as a function, the check on the
flag would be done only once, while the required behavior is to check the flag
continuously).*/
#define __CPAL_I2C_TIMEOUT_DETECT ((pDevInitStruct->wCPAL_Timeout == CPAL_I2C_TIMEOUT_MIN) ||\
(pDevInitStruct->wCPAL_Timeout == CPAL_I2C_TIMEOUT_DEFAULT))
#define __CPAL_I2C_TIMEOUT(cmd, timeout) pDevInitStruct->wCPAL_Timeout = CPAL_I2C_TIMEOUT_MIN + (timeout);\
while (((cmd) == 0) && (!__CPAL_I2C_TIMEOUT_DETECT))\
if (__CPAL_I2C_TIMEOUT_DETECT)\
{\
return CPAL_I2C_Timeout (pDevInitStruct); \
}\
pDevInitStruct->wCPAL_Timeout = CPAL_I2C_TIMEOUT_DEFAULT
/* Private variables ---------------------------------------------------------*/
/*========= Table Exported from HAL =========*/
extern I2C_TypeDef* CPAL_I2C_DEVICE[];
#ifdef CPAL_I2C_DMA_PROGMODEL
extern DMA_TypeDef* CPAL_I2C_DMA[];
extern DMA_Channel_TypeDef* CPAL_I2C_DMA_TX_Channel[];
extern DMA_Channel_TypeDef* CPAL_I2C_DMA_RX_Channel[];
extern const uint32_t CPAL_I2C_DMA_TX_TC_FLAG[];
extern const uint32_t CPAL_I2C_DMA_RX_TC_FLAG[];
extern const uint32_t CPAL_I2C_DMA_TX_HT_FLAG[];
extern const uint32_t CPAL_I2C_DMA_RX_HT_FLAG[];
extern const uint32_t CPAL_I2C_DMA_TX_TE_FLAG[];
extern const uint32_t CPAL_I2C_DMA_RX_TE_FLAG[];
#endif /* CPAL_I2C_DMA_PROGMODEL */
/*========= Local structures used in CPAL_I2C_StructInit() function ==========*/
I2C_InitTypeDef I2C_InitStructure;
__IO uint32_t Num_Data = 0;
uint32_t CR2_tmp = 0;
/* Private function prototypes -----------------------------------------------*/
/*========= Local Master events handlers =========*/
#ifdef CPAL_I2C_MASTER_MODE
static uint32_t I2C_MASTER_TCR_Handle(CPAL_InitTypeDef* pDevInitStruct); /* Handle Master TCR Interrupt event */
static uint32_t I2C_MASTER_TC_Handle(CPAL_InitTypeDef* pDevInitStruct); /* Handle Master TC Interrupt event */
static uint32_t I2C_MASTER_STOP_Handle(CPAL_InitTypeDef* pDevInitStruct); /* Handle Master STOP Interrupt event */
static uint32_t I2C_MASTER_NACK_Handle(CPAL_InitTypeDef* pDevInitStruct); /* Handle Master NACK Interrupt event */
#ifdef CPAL_I2C_IT_PROGMODEL
static uint32_t I2C_MASTER_TXIS_Handle(CPAL_InitTypeDef* pDevInitStruct); /* Handle Master TXIS Interrupt event */
static uint32_t I2C_MASTER_RXNE_Handle(CPAL_InitTypeDef* pDevInitStruct); /* Handle Master RXNE Interrupt event */
#endif /* CPAL_I2C_IT_PROGMODEL */
#endif /* CPAL_I2C_MASTER_MODE */
/*========= Local Slave events handlers =========*/
#ifdef CPAL_I2C_SLAVE_MODE
static uint32_t I2C_SLAVE_ADDR_Handle(CPAL_InitTypeDef* pDevInitStruct); /* Handle Slave ADDR Interrupt event */
static uint32_t I2C_SLAVE_STOP_Handle(CPAL_InitTypeDef* pDevInitStruct); /* Handle Slave STOPF Interrupt event */
static uint32_t I2C_SLAVE_NACK_Handle(CPAL_InitTypeDef* pDevInitStruct); /* Handle Slave NACK Interrupt event */
#ifdef CPAL_I2C_IT_PROGMODEL
static uint32_t I2C_SLAVE_TXIS_Handle(CPAL_InitTypeDef* pDevInitStruct); /* Handle Slave TXIS Interrupt event */
static uint32_t I2C_SLAVE_RXNE_Handle(CPAL_InitTypeDef* pDevInitStruct); /* Handle Slave RXNE Interrupt event */
#endif /* CPAL_I2C_IT_PROGMODEL */
#endif /* CPAL_I2C_SLAVE_MODE */
#ifdef CPAL_I2C_DMA_PROGMODEL
/*========= Local DMA Manager =========*/
static uint32_t I2C_Enable_DMA (CPAL_InitTypeDef* pDevInitStruct, CPAL_DirectionTypeDef Direction);
#endif /* CPAL_I2C_DMA_PROGMODEL */
/*========= CPAL Timeout handler =========*/
static uint32_t CPAL_I2C_Timeout (CPAL_InitTypeDef* pDevInitStruct);
/* Private functions ---------------------------------------------------------*/
/*================== USER CPAL Functions ==================*/
/**
* @brief Initialize the peripheral and all related clocks, GPIOs, DMA and
* Interrupts according to the specified parameters in the
* CPAL_InitTypeDef structure.
* @param pDevInitStruct : Pointer to the peripheral configuration structure.
* @retval CPAL_PASS or CPAL_FAIL
*/
uint32_t CPAL_I2C_Init(CPAL_InitTypeDef* pDevInitStruct)
{
CPAL_LOG("\n\r\n\rLOG <CPAL_I2C_Init> : I2C Device Init");
/* If CPAL_State is not BUSY */
if ((pDevInitStruct->CPAL_State == CPAL_STATE_READY)
|| (pDevInitStruct->CPAL_State == CPAL_STATE_ERROR)
|| (pDevInitStruct->CPAL_State == CPAL_STATE_DISABLED))
{
/*
- If CPAL_State is CPAL_STATE_ERROR (an Error occurred in transaction):
Perform the initialization routines (device will be deinitialized during initialization).
- If CPAL_State is CPAL_STATE_READY:
Perform the initialization routines
- If CPAL_State is CPAL_STATE_DISABLED:
Perform the Initialization routines */
#ifndef CPAL_I2C_DMA_PROGMODEL
if (pDevInitStruct->CPAL_ProgModel == CPAL_PROGMODEL_DMA)
{
/* Update CPAL_State to CPAL_STATE_ERROR */
pDevInitStruct->CPAL_State = CPAL_STATE_ERROR;
/* Exit Init function */
return CPAL_FAIL;
}
#endif /* CPAL_I2C_DMA_PROGMODEL */
#ifndef CPAL_I2C_IT_PROGMODEL
if (pDevInitStruct->CPAL_ProgModel == CPAL_PROGMODEL_INTERRUPT)
{
/* Update CPAL_State to CPAL_STATE_ERROR */
pDevInitStruct->CPAL_State = CPAL_STATE_ERROR;
/* Exit Init function */
return CPAL_FAIL;
}
#endif /* CPAL_I2C_IT_PROGMODEL */
/* Disable I2Cx device */
__CPAL_I2C_HAL_DISABLE_DEV(pDevInitStruct->CPAL_Dev);
CPAL_LOG("\n\rLOG : I2C Device Disabled");
/* Deinitialize I2Cx GPIO */
CPAL_I2C_HAL_GPIODeInit(pDevInitStruct->CPAL_Dev);
CPAL_LOG("\n\rLOG : I2C Device IOs Deinit");
/* Deinitialize I2Cx clock */
CPAL_I2C_HAL_CLKDeInit(pDevIn