PeripheralDriver_AutoChips_.../inc/i2c_drv.h

476 lines
19 KiB
C

/* Copyright Statement:
*
* This software/firmware and related documentation ("AutoChips Software") are
* protected under relevant copyright laws. The information contained herein is
* confidential and proprietary to AutoChips Inc. and/or its licensors. Without
* the prior written permission of AutoChips inc. and/or its licensors, any
* reproduction, modification, use or disclosure of AutoChips Software, and
* information contained herein, in whole or in part, shall be strictly
* prohibited.
*
* AutoChips Inc. (C) 2021. All rights reserved.
*
* BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("AUTOCHIPS SOFTWARE")
* RECEIVED FROM AUTOCHIPS AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
* ON AN "AS-IS" BASIS ONLY. AUTOCHIPS EXPRESSLY DISCLAIMS ANY AND ALL
* WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
* WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
* NONINFRINGEMENT. NEITHER DOES AUTOCHIPS PROVIDE ANY WARRANTY WHATSOEVER WITH
* RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
* INCORPORATED IN, OR SUPPLIED WITH THE AUTOCHIPS SOFTWARE, AND RECEIVER AGREES
* TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
* RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
* OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN AUTOCHIPS
* SOFTWARE. AUTOCHIPS SHALL ALSO NOT BE RESPONSIBLE FOR ANY AUTOCHIPS SOFTWARE
* RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
* STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND AUTOCHIPS'S
* ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE AUTOCHIPS SOFTWARE
* RELEASED HEREUNDER WILL BE, AT AUTOCHIPS'S OPTION, TO REVISE OR REPLACE THE
* AUTOCHIPS SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
* CHARGE PAID BY RECEIVER TO AUTOCHIPS FOR SUCH AUTOCHIPS SOFTWARE AT ISSUE.
*/
/*!
* @file i2c_drv.h
*
* @brief This file provides i2c interface for I2C functions.
*
*/
/* PRQA S 3630 EOF */ /* struct/union type will be used by user app. */
#ifndef I2C_DRV_H
#define I2C_DRV_H
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
/* ============================================ Include ============================================= */
#include "device_register.h"
#include "osif.h"
/*=====================================SOURCE FILE VERSION INFORMATION==============================*/
#define I2C_HAL_MODULE_ID (621U)
#define I2C_HAL_SW_MAJOR_VERSION (1U)
#define I2C_HAL_SW_MINOR_VERSION (2U)
#define I2C_HAL_SW_PATCH_VERSION (1U)
/* ============================================ Define ============================================ */
/*!
* @brief I2C 10bit address reserve mask bit macro.
*/
#define I2C_ADDEXT_PRIMARY_BYTE_FIX (0xF8UL)
/* =========================================== Typedef ============================================ */
/*!< Callback for I2C slave mode */
typedef void (*i2c_slave_callback_t)(uint32_t event, void *userData);
/*!< Callback for I2C master mode */
typedef void (*i2c_master_callback_t)(uint32_t event, void *userData);
/*!
* @brief Define the enum of the events which can trigger I2C slave callback
*/
typedef enum
{
I2C_SLAVE_EVENT_RX_FULL = 0x00U, /*!< Rx buffer is full */
I2C_SLAVE_EVENT_TX_EMPTY = 0x01U, /*!< Tx buffer is empty */
I2C_SLAVE_EVENT_TX_REQ = 0x02U, /*!< Tx request */
I2C_SLAVE_EVENT_RX_REQ = 0x03U, /*!< Rx request */
I2C_SLAVE_EVENT_STOP = 0x04U, /*!< Slave detected stop */
I2C_SLAVE_EVENT_ADDRESS_MATCH = 0x05U /*!< Slave address match */
} i2c_slave_event_t;
/*!
* @brief Define the enum of the events which can trigger I2C master callback
*/
typedef enum
{
I2C_MASTER_EVENT_END_TRANSFER = 0x0AU /*!< Master transferend event */
} i2c_master_event_t;
/*!
* @brief Type of I2C transfer direction (write or read)
*/
typedef enum
{
I2C_WRITE = 0x00U, /*!< I2C write transfer*/
I2C_READ = 0x01U /*!< I2C read transfer*/
} i2c_dir_type_t;
/*!
* @brief Type of I2C transfer(based on interrupts or DMA)
*/
typedef enum
{
I2C_USING_DMA = 0x00U, /*!< The driver will use DMA to perform I2C transfer*/
I2C_USING_INTERRUPTS = 0x01U /*!< The driver will use interrupt to perform I2C transfer*/
} i2c_transfer_type_t;
/*!
* @brief I2C master/slave mode enum
*/
typedef enum
{
I2C_SLAVE = 0x00U, /*!< I2C slave mode */
I2C_MASTER = 0x01U /*!< I2C master mode */
} i2c_mode_type_t;
/*!
* @brief Configuration structure that the user needs to set
*/
typedef struct
{
uint32_t baudRate; /*!< Baud rate */
uint16_t slaveAddress; /*!< Slave address, 7-bit or 10-bit */
bool syncEn; /*!< Enable/disable SCL sync */
bool arbitration; /*!< Enable/disable arbitration */
bool is10bitAddr; /*!< Select 7-bit or 10-bit slave address */
i2c_transfer_type_t transferType; /*!< Type of I2C transfer, DMA or interrupt */
uint8_t dmaChannel; /*!< Channel number for DMA. It will be ignored when DMA mode isn't used */
i2c_master_callback_t callback; /*!< Master callback function */
void *callbackParam; /*!< Parameter for the master callback function */
} i2c_master_user_config_t;
/*!
* @brief Master internal context structure
*/
typedef struct
{
uint32_t rxSize; /*!< Size of receive data buffer */
uint32_t txSize; /*!< Size of transmit data buffer */
uint32_t rxPointer; /*!< position of receive data in user defined buffer */
uint16_t slaveAddress; /*!< Slave address */
uint8_t *rxBuff; /*!< Pointer to receive data buffer */
const uint8_t *txBuff; /*!< Pointer to transmit data buffer */
uint8_t dmaChannel; /*!< Channel number for DMA */
i2c_dir_type_t dirType; /*!< Type of I2C transferdirection */
i2c_transfer_type_t transferType; /*!< Type of I2C transfer, DMA or interrupt */
volatile status_t status; /*!< Status of last driver operation */
volatile bool i2cIdle; /*!< Idle/busy state of the driver */
bool sendStop; /*!< Specifies if STOP condition must be generated after current transfer*/
bool is10bitAddr; /*!< Select 7-bit or 10-bit slave address */
semaphore_t idleSemaphore; /*!< Semaphore used by blocking functions */
bool blocking; /*!< Specifies if the current trandfer is blocking */
i2c_master_callback_t callback; /*!< Master callback function */
void *callbackParam; /*!< Parameter for the master callback function */
} i2c_master_state_t;
/*!
* @brief Slave configuration structure
*/
typedef struct
{
uint16_t slaveAddress; /*!< Slave address, 7-bit or 10-bit */
bool is10bitAddr; /*!< Select 7-bit or 10-bit slave address */
bool stretchEn; /*!< Enable/disable slave SCL stretch*/
bool wakeupEn; /*!< Enable/disable slave address match wakeup */
bool slaveListening; /*!< Slave mode (always listening or on demand only) */
i2c_transfer_type_t transferType; /*!< Type of I2C transfer, DMA or interrupt */
uint8_t dmaChannel; /*!< Channel number for DMA channel */
i2c_slave_callback_t callback; /*!< Slave callback function */
void *callbackParam; /*!< Parameter for the master callback function */
} i2c_slave_user_config_t;
/*!
* @brief Slave internal context structure
*/
typedef struct
{
uint32_t rxSize; /*!< Size of receive data buffer */
uint32_t txSize; /*!< Size of transmit data buffer */
uint32_t rxPointer; /*!< position of receive data in user defined buffer */
uint8_t *rxBuff; /*!< Pointer to receive data buffer */
const uint8_t *txBuff; /*!< Pointer to transmit data buffer */
uint8_t dmaChannel; /*!< Channel number for DMA channel */
i2c_transfer_type_t transferType; /*!< Type of I2C transfer, DMA or interrupt */
volatile status_t status; /*!< Status of last driver operation */
volatile bool isTransferInProgress; /*!< Slave is busy because of an ongoing transfer*/
semaphore_t idleSemaphore; /*!< Semaphore used by blocking functions */
bool blocking; /*!< Specifies if the current trandfer is blocking */
bool is10bitAddr; /*!< Select 7-bit or 10-bit slave address */
bool slaveListening; /*!< Slave mode (always listening or on demand only) */
i2c_slave_callback_t callback; /*!< Slave callback function */
void *callbackParam; /*!< Parameter for the master callback function */
} i2c_slave_state_t;
/* ========================================== Variables =========================================== */
/* ==================================== Functions declaration ===================================== */
/*!
* @brief Get I2C module base address.
*
* @param[in] instance: I2C module instance
* @return I2C module base address
*/
I2C_Type *I2C_DRV_GetBase(uint8_t instance);
/*!
* @brief Initialize the I2C master mode driver based on configuration input.
*
* @param[in] instance: The I2C instance number
* @param[in] userConfig: I2C master user configuration pointer
* @param[in] master: I2C master driver pointer
* @return The result of execution
*/
status_t I2C_DRV_MasterInit(uint8_t instance, const i2c_master_user_config_t *userConfig, \
i2c_master_state_t *master);
/*!
* @brief De-initialize the I2C master mode driver.
*
* @param[in] instance: The I2C instance number
* @return The result of execution
*/
status_t I2C_DRV_MasterDeinit(uint8_t instance);
/*!
* @brief Get the currently configured baud rate.
*
* @param[in] instance: The I2C instance number
* @param[out] baudRate: The current baud rate of I2C
* @return None
*/
void I2C_DRV_MasterGetBaudRate(uint8_t instance, uint32_t *baudRate);
/*!
* @brief Set the baud rate for I2C communication.
*
* @param[in] instance: The I2C instance number
* @param[in] baudRate: The current setting baud rate value
* @return The result of execution
*/
status_t I2C_DRV_MasterSetBaudRate(uint8_t instance, uint32_t baudRate);
/*!
* @brief Set the slave address for I2C communication.
*
* @param[in] instance: The I2C instance number
* @param[in] address: Slave address, 7-bit or 10-bit
* @param[in] is10bitAddr: Enable/disable 10-bit address
* @return None
*/
void I2C_DRV_MasterSetSlaveAddr(uint8_t instance, const uint16_t address, const bool is10bitAddr);
/*!
* @brief Perform a non-blocking send transaction on the I2C bus.
*
* @param[in] instance: The I2C instance number
* @param[in] txBuff: Pointer to the data to be transferred
* @param[in] txSize: Length of the data to be transferred
* @param[in] sendStop: If true generate stop condition after the transmission, otherwise not
* @return The result of execution
*/
status_t I2C_DRV_MasterSendData(uint8_t instance, const uint8_t *txBuff, uint32_t txSize, bool sendStop);
/*!
* @brief Perform a blocking send transaction on the I2C bus.
*
* @param[in] instance: The I2C instance number
* @param[in] txBuff: Pointer to the data to be transferred
* @param[in] txSize: Length of the data to be transferred
* @param[in] sendStop: If true generate stop condition after the transmission, otherwise not
* @param[in] timeout: Timeout for the transfer
* @return The result of execution
*/
status_t I2C_DRV_MasterSendDataBlocking(uint8_t instance, const uint8_t *txBuff, uint32_t txSize, \
bool sendStop, uint32_t timeout);
/*!
* @brief Abort a non-blocking I2C master transmission or reception.
*
* @param[in] instance: The I2C instance number
* @return The result of execution
*/
status_t I2C_DRV_MasterAbortTransferData(uint8_t instance);
/*!
* @brief Perform a non-blocking receive transaction on the I2C bus.
*
* @param[in] instance: The I2C instance number
* @param[in] rxBuff: Pointer to the buffer where to store received data
* @param[in] rxSize: Length of the data to be transferred
* @param[in] sendStop: Specifies whether or not to generate stop condition after the reception
* @return The result of execution
*/
status_t I2C_DRV_MasterReceiveData(uint8_t instance, uint8_t *rxBuff, uint32_t rxSize, bool sendStop);
/*!
* @brief Perform a blocking receive transaction on the I2C bus.
*
* @param[in] instance: The I2C instance number
* @param[in] rxBuff: Pointer to the buffer where to store received data
* @param[in] rxSize: Length of the data to be transferred
* @param[in] sendStop: Specifies whether or not to generate stop condition after the reception
* @param[in] timeout: Timeout for the transfer
* @return The result of execution
*/
status_t I2C_DRV_MasterReceiveDataBlocking(uint8_t instance, uint8_t *rxBuff, uint32_t rxSize, \
bool sendStop, uint32_t timeout);
/*!
* @brief Return the current status of the I2C master transfer.The user can call this function to ascertain
* the state of the current transferin an non-blocking transfer.
*
* @param[in] instance: The I2C instance number
* @param[out] bytesRemaining: The number of remaining bytes in the active I2C transfer
* @return The status of master
*/
status_t I2C_DRV_MasterGetTransferStatus(uint8_t instance, uint32_t *bytesRemaining);
/*!
* @brief Handle master operation when I2C interrupt occurs.
*
* @param[in] instance: The I2C instance number
* @return None
*/
void I2C_DRV_MasterIRQHandler(uint8_t instance);
/*!
* @brief Initialize the I2C slave mode driver.
*
* @param[in] instance: The I2C instance number
* @param[in] userConfig: Pointer to the I2C slave user configuration structure
* @param[in] slave: Pointer to the I2C slave driver context structure
* @return The result of execution
*/
status_t I2C_DRV_SlaveInit(uint8_t instance, const i2c_slave_user_config_t *userConfig, i2c_slave_state_t *slave);
/*!
* @brief De-initialize the I2C slave mode driver.
*
* @param[in] instance: The I2C instance number
* @return The result of execution
*/
status_t I2C_DRV_SlaveDeinit(uint8_t instance);
/*!
* @brief Provide a buffer for transmitting data.
*
* @param[in] instance: The I2C instance number
* @param[in] txBuff: Pointer to the data to be transferred
* @param[in] txSize: Length of the data to be transferred
* @return The result of execution
*/
status_t I2C_DRV_SlaveSetTxBuffer(uint8_t instance, const uint8_t *txBuff, uint32_t txSize);
/*!
* @brief Provide a buffer for receiving data.
*
* @param[in] instance: The I2C instance number
* @param[in] rxBuff: Pointer to the buffer where to store received data
* @param[in] rxSize: Length of the data to be transferred
* @return The result of execution
*/
status_t I2C_DRV_SlaveSetRxBuffer(uint8_t instance, uint8_t *rxBuff, uint32_t rxSize);
/*!
* @brief Perform a non-blocking send transaction on the I2C bus.
*
* @param[in] instance: The I2C instance number
* @param[in] txBuff: Pointer to the data to be transferred
* @param[in] txSize: Length of the data to be transferred
* @return The result of execution
*/
status_t I2C_DRV_SlaveSendData(uint8_t instance, const uint8_t *txBuff, uint32_t txSize);
/*!
* @brief Perform a blocking send transaction on the I2C bus.
*
* @param[in] instance: The I2C instance number
* @param[in] txBuff: Pointer to the data to be transferred
* @param[in] txSize: Length of the data to be transferred
* @param[in] timeout: Timeout for the transfer
* @return The result of execution
*/
status_t I2C_DRV_SlaveSendDataBlocking(uint8_t instance, const uint8_t *txBuff, uint32_t txSize, uint32_t timeout);
/*!
* @brief Perform a non-blocking receive transaction on the I2C bus.
*
* @param[in] instance: The I2C instance number
* @param[in] rxBuff: Pointer to the buffer where to store received data
* @param[in] rxSize: Length of the data to be transferred
* @return The result of execution
*/
status_t I2C_DRV_SlaveReceiveData(uint8_t instance, uint8_t *rxBuff, uint32_t rxSize);
/*!
* @brief Perform a blocking receive transaction on the I2C bus.
*
* @param[in] instance: The I2C instance number
* @param[in] rxBuff: Pointer to the buffer where to store received data
* @param[in] rxSize: Length of the data to be transferred
* @param[in] timeout: Timeout for the transfer
* @return The result of execution
*/
status_t I2C_DRV_SlaveReceiveDataBlocking(uint8_t instance, uint8_t *rxBuff, uint32_t rxSize, uint32_t timeout);
/*!
* @brief Return the current status of the I2C slave transfer. The user can call this function to ascertain
* the state of the current transferin an non-blocking transfer.
*
* @param[in] instance: The I2C instance number
* @param[out] bytesRemaining: The number of remaining bytes in the active I2C transfer
* @return The status of slave
*/
status_t I2C_DRV_SlaveGetTransferStatus(uint8_t instance, uint32_t *bytesRemaining);
/*!
* @brief Abort a non-blocking I2C slave transmission or reception.
*
* @param[in] instance: The I2C instance number
* @return The result of execution
*/
status_t I2C_DRV_SlaveAbortTransferData(uint8_t instance);
/*!
* @brief Handle slave operation when I2C interrupt occurs.
*
* @param[in] instance: The I2C instance number
* @return None
*/
void I2C_DRV_SlaveIRQHandler(uint8_t instance);
/*!
* @brief Handle operation when I2C interrupt occurs.
*
* @param[in] instance: The I2C instance number
* @return None
*/
void I2C_DRV_IRQHandler(uint8_t instance);
/*!
* @brief Gets the default configuration structure for master.
*
* @param[out] config: Pointer to configuration structure
* @return None
*/
void I2C_DRV_MasterGetDefaultConfig(i2c_master_user_config_t *config);
/*!
* @brief Gets the default configuration structure for slave.
*
* @param[out] config: Pointer to configuration structure
* @return None
*/
void I2C_DRV_SlaveGetDefaultConfig(i2c_slave_user_config_t *config);
/*!
* @brief Get module version information.
*
* @param[out] versionInfo: Module version information address.
* @return void
*/
void I2C_DRV_GetVersionInfo(Drv_VersionInfo_Type *versionInfo);
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* I2C_DRV_H */
/* ============================================= EOF ============================================== */