MoistureSoftware/.pack/Keil/STM32F1xx_DFP.2.3.0/RTE_Driver/I2C_STM32F10x.h

199 lines
7.7 KiB
C

/* -----------------------------------------------------------------------------
* Copyright (c) 2013-2015 ARM Ltd.
*
* This software is provided 'as-is', without any express or implied warranty.
* In no event will the authors be held liable for any damages arising from
* the use of this software. Permission is granted to anyone to use this
* software for any purpose, including commercial applications, and to alter
* it and redistribute it freely, subject to the following restrictions:
*
* 1. The origin of this software must not be misrepresented; you must not
* claim that you wrote the original software. If you use this software in
* a product, an acknowledgment in the product documentation would be
* appreciated but is not required.
*
* 2. Altered source versions must be plainly marked as such, and must not be
* misrepresented as being the original software.
*
* 3. This notice may not be removed or altered from any source distribution.
*
*
* $Date: 22. September 2015
* $Revision: V2.0
*
* Project: I2C Driver definitions for STMicroelectronics STM32F10x
* -------------------------------------------------------------------------- */
#ifndef __I2C_STM32F10X_H
#define __I2C_STM32F10X_H
#include <stdint.h>
#include <stdbool.h>
#include <string.h>
#include "stm32f10x.h"
#include "GPIO_STM32F10x.h"
#include "DMA_STM32F10x.h"
#include "Driver_I2C.h"
#include "RTE_Components.h"
#include "RTE_Device.h"
#if ((defined(RTE_Drivers_I2C1) || \
defined(RTE_Drivers_I2C2)) \
&& (RTE_I2C1 == 0) \
&& (RTE_I2C2 == 0))
#error "I2C not configured in RTE_Device.h!"
#endif
#define RCC_APB_I2C1_MASK RCC_APB1ENR_I2C1EN /* same for Clock/Reset */
#define RCC_APB_I2C2_MASK RCC_APB1ENR_I2C2EN /* same for Clock/Reset */
#define RCC_APB_I2C3_MASK RCC_APB1ENR_I2C3EN /* same for Clock/Reset */
/* I2C1 configuration definitions */
#if defined (RTE_I2C1) && (RTE_I2C1 == 1)
#if (((RTE_I2C1_RX_DMA != 0) && (RTE_I2C1_TX_DMA == 0)) || \
((RTE_I2C1_RX_DMA == 0) && (RTE_I2C1_TX_DMA != 0)))
#error "I2C1 using DMA requires Rx and Tx DMA channel enabled in RTE_Device.h!"
#endif
#define USE_I2C1
#if (RTE_I2C1_RX_DMA == 1) && (RTE_I2C1_TX_DMA == 1)
#define USE_I2C1_DMA
/* Rx channel */
#define I2C1_RX_DMA_Instance DMAx_CHANNELy(RTE_I2C1_RX_DMA_NUMBER, RTE_I2C1_RX_DMA_CHANNEL)
#define I2C1_RX_DMA_Number RTE_I2C1_RX_DMA_NUMBER
#define I2C1_RX_DMA_Channel RTE_I2C1_RX_DMA_CHANNEL
#define I2C1_RX_DMA_Priority RTE_I2C1_RX_DMA_PRIORITY
#define I2C1_RX_DMA_Handler DMAx_CHANNELy_EVENT (RTE_I2C1_RX_DMA_NUMBER, RTE_I2C1_RX_DMA_CHANNEL)
/* Tx channel */
#define I2C1_TX_DMA_Instance DMAx_CHANNELy(RTE_I2C1_TX_DMA_NUMBER, RTE_I2C1_TX_DMA_CHANNEL)
#define I2C1_TX_DMA_Number RTE_I2C1_TX_DMA_NUMBER
#define I2C1_TX_DMA_Channel RTE_I2C1_TX_DMA_CHANNEL
#define I2C1_TX_DMA_Priority RTE_I2C1_TX_DMA_PRIORITY
#define I2C1_TX_DMA_Handler DMAx_CHANNELy_EVENT (RTE_I2C1_TX_DMA_NUMBER, RTE_I2C1_TX_DMA_CHANNEL)
#endif
#define I2C1_SCL_GPIOx RTE_I2C1_SCL_PORT
#define I2C1_SCL_GPIO_Pin RTE_I2C1_SCL_BIT
#define I2C1_SDA_GPIOx RTE_I2C1_SDA_PORT
#define I2C1_SDA_GPIO_Pin RTE_I2C1_SDA_BIT
#define I2C1_AF_REMAP RTE_I2C1_AF_REMAP
#endif
/* I2C2 configuration definitions */
#if defined (RTE_I2C2) && (RTE_I2C2 == 1)
#if !defined(I2C2)
#error "I2C2 not available for selected device!"
#endif
#if (((RTE_I2C2_RX_DMA != 0) && (RTE_I2C2_TX_DMA == 0)) || \
((RTE_I2C2_RX_DMA == 0) && (RTE_I2C2_TX_DMA != 0)))
#error "I2C2 using DMA requires Rx and Tx DMA channel enabled in RTE_Device.h!"
#endif
#define USE_I2C2
#if (RTE_I2C2_RX_DMA == 1) && (RTE_I2C2_TX_DMA == 1)
#define USE_I2C2_DMA
/* Rx channel */
#define I2C2_RX_DMA_Instance DMAx_CHANNELy(RTE_I2C2_RX_DMA_NUMBER, RTE_I2C2_RX_DMA_CHANNEL)
#define I2C2_RX_DMA_Number RTE_I2C2_RX_DMA_NUMBER
#define I2C2_RX_DMA_Channel RTE_I2C2_RX_DMA_CHANNEL
#define I2C2_RX_DMA_Priority RTE_I2C2_RX_DMA_PRIORITY
#define I2C2_RX_DMA_Handler DMAx_CHANNELy_EVENT (RTE_I2C2_RX_DMA_NUMBER, RTE_I2C2_RX_DMA_CHANNEL)
/* Tx channel */
#define I2C2_TX_DMA_Instance DMAx_CHANNELy(RTE_I2C2_TX_DMA_NUMBER, RTE_I2C2_TX_DMA_CHANNEL)
#define I2C2_TX_DMA_Number RTE_I2C2_TX_DMA_NUMBER
#define I2C2_TX_DMA_Channel RTE_I2C2_TX_DMA_CHANNEL
#define I2C2_TX_DMA_Priority RTE_I2C2_TX_DMA_PRIORITY
#define I2C2_TX_DMA_Handler DMAx_CHANNELy_EVENT (RTE_I2C2_TX_DMA_NUMBER, RTE_I2C2_TX_DMA_CHANNEL)
#endif
#define I2C2_SCL_GPIOx RTE_I2C2_SCL_PORT
#define I2C2_SCL_GPIO_Pin RTE_I2C2_SCL_BIT
#define I2C2_SDA_GPIOx RTE_I2C2_SDA_PORT
#define I2C2_SDA_GPIO_Pin RTE_I2C2_SDA_BIT
#define I2C2_AF_REMAP RTE_I2C2_AF_REMAP
#endif
/* Current driver status flag definition */
#define I2C_INIT ((uint8_t)0x01) // I2C initialized
#define I2C_POWER ((uint8_t)0x02) // I2C powered on
#define I2C_SETUP ((uint8_t)0x04) // I2C configured
/* Transfer status flags definitions */
#define XFER_CTRL_XPENDING ((uint8_t)0x01) // Transfer pending
#define XFER_CTRL_RSTART ((uint8_t)0x02) // Generate repeated start and readdress
#define XFER_CTRL_ADDR_DONE ((uint8_t)0x04) // Addressing done
#define XFER_CTRL_DMA_DONE ((uint8_t)0x08) // DMA transfer done
#define XFER_CTRL_WAIT_BTF ((uint8_t)0x10) // Wait for byte transfer finished
#define XFER_CTRL_XACTIVE ((uint8_t)0x20) // Transfer active
/* DMA Information definitions */
typedef struct _I2C_DMA {
DMA_Channel_TypeDef *reg; // DMA register interface
uint8_t dma_num; // DMA number
uint8_t channel; // Channel number
uint8_t priority; // Channel priority
} const I2C_DMA;
/* I2C Input/Output Configuration */
typedef const struct _I2C_IO {
GPIO_TypeDef *scl_port; // SCL IO Port
GPIO_TypeDef *sda_port; // SDA IO Port
uint16_t scl_pin; // SCL IO Pin
uint16_t sda_pin; // SDA IO Pin
AFIO_REMAP remap;
} I2C_IO;
/* I2C Transfer Information (Run-Time) */
typedef struct _I2C_TRANSFER_INFO {
uint32_t num; // Number of data to transfer
uint32_t cnt; // Data transfer counter
uint8_t *data; // Data pointer
uint16_t addr; // Device address
uint8_t ctrl; // Transfer control flags
} I2C_TRANSFER_INFO;
/* I2C Information (Run-Time) */
typedef struct _I2C_INFO {
ARM_I2C_SignalEvent_t cb_event; // Event Callback
ARM_I2C_STATUS status; // Status flags
I2C_TRANSFER_INFO xfer; // Transfer information
uint8_t flags; // Current I2C state flags
} I2C_INFO;
/* I2C Resources definition */
typedef struct {
I2C_TypeDef *reg; // I2C peripheral register interface
I2C_DMA *dma_rx; // I2C DMA Configuration
I2C_DMA *dma_tx; // I2C DMA Configuration
I2C_IO io; // I2C Input/Output pins
IRQn_Type ev_irq_num; // I2C Event IRQ Number
IRQn_Type er_irq_num; // I2C Error IRQ Number
uint32_t apb_mask; // APB Clock/Reset register mask
I2C_INFO *info; // Run-Time information
} const I2C_RESOURCES;
#endif /* __I2C_STM32F10X_H */