PeripheralDriver_AutoChips_.../inc/spi_master_drv.h

211 lines
9.5 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_master_drv.h
*
* @brief This file provides spi master integration functions interface.
*
*/
/* PRQA S 3630 EOF */ /* struct/union type will be used by user app. */
#ifndef SPI_MASTER_DRV_H
#define SPI_MASTER_DRV_H
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
/* =========================================== Includes =========================================== */
#include "spi_shared_function.h"
/* ============================================ Define ============================================ */
/* =========================================== Typedef ============================================ */
/*!
* @brief Data structure containing information about a device on the SPI bus
*/
typedef struct
{
uint32_t bitsPerSec; /*!< Baud rate in bits per second */
spi_which_pcs_t whichPcs; /*!< Selects which PCS to use */
spi_signal_polarity_t pcsPolarity; /*!< PCS polarity */
bool isPcsContinuous; /*!< Keeps PCS asserted until transfer complete */
uint16_t bitcount; /*!< Number of bits per frame, support 4~32 bits */
uint32_t spiSrcClk; /*!< SPI functional clock */
spi_clock_phase_t clkPhase; /*!< Selects which phase of clock to capture data */
spi_sck_polarity_t clkPolarity; /*!< Selects clock polarity */
bool msbFirst; /*!< Option to transmit MSB first */
spi_transfer_type transferType; /*!< Type of SPI transfer, using DMA or interrupt mode */
uint8_t rxDMAChannel; /*!< Select DMA rx channel. If DMA mode isn't used this field will be ignored. */
uint8_t txDMAChannel; /*!< Select DMA tx channel. If DMA mode isn't used this field will be ignored. */
spi_callback_t callback; /*!< Select the callback to transfer complete */
void *callbackParam; /*!< Select additional callback parameters if it's necessary */
} spi_master_config_t;
/* ========================================== Variables =========================================== */
/* ==================================== Functions declaration ===================================== */
/*!
* @brief Get default configuration for SPI master.
*
* @param[out] spiConfig: Pointer to configuration structure which is filled with default configuration
*/
void SPI_DRV_MasterGetDefaultConfig(spi_master_config_t *spiConfig);
/*!
* @brief Initializes SPI.
*
* @param[in] instance: SPI instance
* @param[in] spiState: The pointer to the SPI master driver state structure
* @param[in] spiConfig: The data structure containing information about a device on the SPI bus
* @return An error code or STATUS_SUCCESS.
*/
status_t SPI_DRV_MasterInit(uint32_t instance, spi_state_t *spiState, const spi_master_config_t *spiConfig);
/*!
* @brief De-initializes SPI.
*
* @param[in] instance: SPI instance
* @return STATUS_SUCCESS or STATUS_ERROR
*/
status_t SPI_DRV_MasterDeinit(uint32_t instance);
/*!
* @brief Configures the SPI master mode CS timing delay options.
*
* @param[in] instance: SPI instance
* @param[in] delayBetwenTransfers: Minimum delay between 2 transfers(CS_IDLE) in microseconds
* @param[in] delaySCKtoPCS: Minimum delay between SCK and CS(CS_HOLD) in microseconds
* @param[in] delayPCStoSCK: Minimum delay between CS and SCK(CS_SETUP) in microseconds
* @return STATUS_SUCCESS
*/
status_t SPI_DRV_MasterSetDelay(uint32_t instance, uint32_t delayBetwenTransfers,
uint32_t delaySCKtoPCS, uint32_t delayPCStoSCK);
/*!
* @brief Configures the SPI bus physical parameters.
*
* @param[in] instance: SPI module instance
* @param[in] spiConfig: Pointer to the spiConfig structure
* @param[out] calculatedBaudRate: The calculated baud rate which will return for user
* @return STATUS_SUCCESS The transfer has completed successfully, or
* STATUS_ERROR if driver is error and needs to clean error.
*/
status_t SPI_DRV_MasterConfigureBus(uint32_t instance,
const spi_master_config_t *spiConfig,
uint32_t *calculatedBaudRate);
/*!
* @brief SPI using interrupt or DMA transfer by blocking mode, which will not return
* untill timeout or transfer finish.
*
* @param[in] instance: SPI module instance
* @param[in] sendBuffer: The pointer to the data buffer of the data to send.
* @param[in] receiveBuffer: Pointer to the buffer where the received bytes are stored.
* @param transferByteCount: The number of bytes to send and receive which is equal to size of send or receive buffers
* @param timeout: A timeout for the transfer in milliseconds. If the transfer takes longer than
* this amount of time, the transfer is aborted and a STATUS_TIMEOUT error returned.
* @return STATUS_SUCCESS The transfer was successful, or
* STATUS_BUSY Cannot perform transfer because a transfer is already in progress, or
* STATUS_TIMEOUT The transfer timed out and was aborted.
*/
status_t SPI_DRV_MasterTransferBlocking(uint32_t instance,
const uint8_t *sendBuffer,
uint8_t *receiveBuffer,
uint16_t transferByteCount,
uint32_t timeout);
/*!
* @brief SPI using interrupt or DMA transfer by no-blocking mode, which will
* return after start transfer.The user needs to check whether the transfer
* is complete using the SPI_DRV_MasterGetTransferStatus function.
*
* @param[in] instance: SPI module instance
* @param[in] sendBuffer: The pointer to the data buffer of the data to send.
* @param[in] receiveBuffer: Pointer to the buffer where the received bytes are stored.
* @param[in] transferByteCount: The number of bytes to send and receive which is equal
* to size of send or receive buffers
* @return STATUS_SUCCESS The transfer was successful, or
* STATUS_BUSY Cannot perform transfer because a transfer is already in progress, or
* STATUS_TIMEOUT The transfer timed out and was aborted.
*/
status_t SPI_DRV_MasterTransfer(uint32_t instance,
const uint8_t *sendBuffer,
uint8_t *receiveBuffer,
uint16_t transferByteCount);
/*!
* @brief Returns whether the previous SPI using interrupt or DMA transfer
* (non-blocking) transfer is completed.
*
* @param[in] instance: SPI module instance
* @param[in] bytesRemained: Remaining bytes to be transferred
* @return STATUS_BUSY, STATUS_SUCCESS or STATUS_ERROR
*/
status_t SPI_DRV_MasterGetTransferStatus(uint32_t instance, uint32_t *bytesRemained);
/*!
* @brief Terminates asynchronous transfer early(no-blocking)
*
* @param[in] instance: SPI module instance
* @return STATUS_SUCCESS
*/
status_t SPI_DRV_MasterAbortTransfer(uint32_t instance);
/*!
* @brief Interrupt handler for SPI master mode, which will update the state
* stored in the spi_state_t structs to transfer data.This is not a
* public API as it is called whenever an interrupt occurs.
* @param[in] instance: SPI module instance
* @return none
*/
void SPI_DRV_MasterIRQHandler(uint32_t instance);
/*!
* @brief Release SPI Master CS to stop continuous selection of Slave
*
* @param[in] instance: SPI module instance
* @return none
*/
void SPI_DRV_MasterReleaseCS(uint32_t instance);
#if defined(__cplusplus)
}
#endif /* __cplusplus */
#endif /* SPI_MASTER_DRV_H */
/* ============================================= EOF ============================================== */