PeripheralDriver_AutoChips_.../inc/spi_shared_function.h

280 lines
10 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 spi_shared_function.h
*
* @brief This file provides spi integration shared functions interface.
*
*/
/* PRQA S 3630 EOF */ /* struct/union type will be used by user app. */
#ifndef SPI_SHARED_FUNCTION_H
#define SPI_SHARED_FUNCTION_H
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
/* =========================================== Includes =========================================== */
#include "device_register.h"
#include "osif.h"
/*=====================================SOURCE FILE VERSION INFORMATION==============================*/
#define SPI_HAL_MODULE_ID (631U)
#define SPI_HAL_SW_MAJOR_VERSION (3U)
#define SPI_HAL_SW_MINOR_VERSION (6U)
#define SPI_HAL_SW_PATCH_VERSION (2U)
/* ============================================ Define ============================================ */
/* =========================================== Typedef ============================================ */
/*!< Callback for SPI */
typedef void (*spi_callback_t)(void *driverState, uint32_t event, void *userData);
/*!
* @brief Define the enum of the events which can trigger SPI callback
*/
typedef enum
{
SPI_EVENT_END_TRANSFER = 0U,
SPI_EVENT_DATA_MATCH = 1U,
SPI_EVENT_MODE_FAULT_ERROR = 2U,
} spi_event_t;
/*!
* @brief SPI Peripheral Chip Select(PCS) configuration
*/
typedef enum
{
SPI_PCS0 = 0U, /*!< PCS0 */
SPI_PCS1 = 1U, /*!< PCS1 */
SPI_PCS2 = 2U, /*!< PCS2 */
SPI_PCS3 = 3U, /*!< PCS3 */
SPI_PCS_AS_GPIO = 4U, /*!< PCS USE GPIO */
SPI_PCS_MAX = 5U /*!< PCS MAX */
} spi_which_pcs_t;
/*!
* @brief SPI PCS polarity configuration
*/
typedef enum
{
SPI_ACTIVE_LOW = 0U, /*!< PCS active low (idle is high). */
SPI_ACTIVE_HIGH = 1U /*!< PCS active high (idle is low). */
} spi_signal_polarity_t;
/*!
* @brief SPI transfer data cwidth configuration.
*/
typedef enum
{
SPI_DATA_WIDTH_1BIT = 0U, /*!< SPI data line 1 bit, data out on SOUT, in on SIN (standby SPI) */
SPI_DATA_WIDTH_2BIT, /*!< SPI data line 2 bits, data out/in on SOUT, SIN */
SPI_DATA_WIDTH_4BIT /*!< SPI data line 4 bits, out on SDO/SDI/PCS[3:2] and in on SDO/SDI/PCS[3:2] */
} spi_transfer_width_t;
/*!
* @brief SPI clock phase configuration.
*/
typedef enum
{
SPI_CLOCK_PHASE_1ST_EDGE = 0U, /*!< Data captured on SCK 1st edge, changed on 2nd. */
SPI_CLOCK_PHASE_2ND_EDGE = 1U /*!< Data changed on SCK 1st edge, captured on 2nd. */
} spi_clock_phase_t;
/*!
* @brief SPI Clock (SCK) polarity configuration.
*/
typedef enum
{
SPI_SCK_ACTIVE_HIGH = 0U, /*!< SCK is Active High (idle is low). */
SPI_SCK_ACTIVE_LOW = 1U /*!< SCK is Active Low (idle is high). */
} spi_sck_polarity_t;
/*!
* @brief Type of SPI transfer using interrupts or DMA.
*/
typedef enum
{
SPI_USING_DMA = 0U, /*!< SPI use DMA to transfer */
SPI_USING_INTERRUPTS, /*!< SPI use interrupts to transfer */
SPI_USING_POLL /*!< SPI use poll to transfer */
} spi_transfer_type;
/*!
* @brief Type of error reported by SPI
*/
typedef enum
{
SPI_TRANSFER_OK = 0U, /*!< Transfer OK */
SPI_TRANSMIT_FAIL, /*!< Error during transmission */
SPI_RECEIVE_FAIL /*!< Error during reception */
} transfer_status_t;
/*!
* @brief Runtime state structure for the SPI master driver.
*/
typedef struct
{
uint16_t bitsPerFrame; /*!< Number of bits per frame: 4 to 32 bits */
bool isPcsContinuous; /*!< Select PCS continous mode */
bool isBlocking; /*!< Save the blocking status */
uint32_t spiSrcClk; /*!< SPI module fucntion clock source */
volatile bool isTransferInProgress; /*!< True if transfer is active */
const uint8_t *txBuff; /*!< Transmit buffer base pointer */
uint8_t *rxBuff; /*!< Receive buffer base pointer */
uint8_t *rxBuff1; /*!< Receive buffer base pointer */
volatile uint16_t xferCount; /*!< Number of max bytes to transfer */
volatile uint16_t txCount; /*!< Number of bytes remaining to transmit */
volatile uint16_t rxCount; /*!< Number of bytes remaining to receive */
volatile bool msb; /*!< True if first bit is MSB and false if first bit is LSB */
uint8_t rxDMAChannel; /*!< Select DMA rx channel */
uint8_t txDMAChannel; /*!< Select DMA tx channel */
spi_transfer_type transferType; /*!< Type of SPI transfer: interrupt or DMA mode */
semaphore_t spiSemaphore; /*!< The semaphore used for blocking transfers */
transfer_status_t status; /*!< The current transfer status */
spi_which_pcs_t whichPcs; /*!< Selects which PCS to use */
spi_callback_t callback; /*!< Calling the callback function when transfer complete */
void *callbackParam; /*!< Select additional callback parameters if it's necessary */
uint32_t dummy; /*!< This field is used for the cases when TX is NULL and SPI is in DMA mode */
} spi_state_t;
/* ========================================== Variables =========================================== */
/*!< Table of base pointers for SPI instances. */
extern SPI_Type *g_spiBase[SPI_INSTANCE_MAX];
/*!< Table to save SPI IRQ enumeration numbers defined in the CMSIS header file. */
extern IRQn_Type g_spiIrqId[SPI_INSTANCE_MAX];
/*!< Table to save SPI ckgen interface clocks. */
extern ckgen_clock_t g_spiBusClock[SPI_INSTANCE_MAX];
/*!< Table to save SPI soft resets. */
extern ckgen_softreset_t g_spiSoftReset[SPI_INSTANCE_MAX];
/*!< Pointer to runtime state structure.*/
extern spi_state_t *g_spiStatePtr[SPI_INSTANCE_MAX];
/* ==================================== Functions declaration ===================================== */
/*!
* @brief Get SPI module base address.
*
* @param[in] instance: SPI module instance
* @return SPI module base address
*/
SPI_Type *SPI_DRV_GetBase(uint32_t instance);
/*!
* @brief SPI interrupt handler.
*
* @param[in] instance: SPI instance
* @return none
*/
void SPI_DRV_IRQHandler(uint32_t instance);
/*!
* @brief Fill up the TX buffer with data. This is not a public API as it is
* called from other driver functions.
*
* @param[in] instance: SPI instance
* @return none
*/
void SPI_DRV_FillupTxBuffer(uint32_t instance);
/*!
* @brief Read data and stored in buffer.
* This is not a public API as it is called from other driver functions.
*
* @param[in] instance: SPI instance
* @return none
*/
void SPI_DRV_ReadRXBuffer(uint32_t instance);
/*!
* @brief Disable the TX empty interrupts.
*
* @param[in] instance: SPI instance
* @return none
*/
void SPI_DRV_DisableTEIEInterrupts(uint32_t instance);
/*!
* @brief Select the chip to communicate with.
*
* The main purpose of this function is to set the PCS and the appropriate polarity.
* @param[in] instance: SPI module instance
* @param[in] whichPcs: selected chip
* @param[in] polarity: chip select line polarity
* @return STATUS_SUCCESS The transfer has completed successfully, or
* STATUS_ERROR if driver is error and needs to clean error.
*/
status_t SPI_DRV_SetPcs(uint32_t instance, spi_which_pcs_t whichPcs, spi_signal_polarity_t polarity);
/*!
* @brief Set the FrameSize to data.
*
* @param[in] instance: SPI module instance
* @param[in] framesize: FrameSize
* @return STATUS_SUCCESS The transfer has completed successfully, or
* STATUS_ERROR if driver is error and needs to clean error.
*/
status_t SPI_DRV_SetFrameSize(uint32_t instance, uint16_t framesize);
/*!
* @brief Set the FrameSize to data.
*
* @param[in] instance: SPI module instance
* @param[in] Width: SPI Width 1bit,2bit or 4bit
* @return STATUS_SUCCESS The transfer has completed successfully, or
* STATUS_ERROR if driver is error and needs to clean error.
*/
status_t SPI_DRV_SetDataWidth(uint32_t instance, spi_transfer_width_t Width);
/*!
* @brief Get module version information.
*
* @param[out] versionInfo: Module version information address.
* @return void
*/
void SPI_DRV_GetVersionInfo(Drv_VersionInfo_Type *versionInfo);
#if defined(__cplusplus)
}
#endif /* __cplusplus */
#endif /* SPI_SHARED_FUNCTION_H */
/* ============================================= EOF ============================================== */