PeripheralDriver_AutoChips_.../inc/spi_slave_drv.h

214 lines
9.7 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_slave_drv.h
*
* @brief This file provides SPI slave integration functions interface.
*
*/
/* PRQA S 3630 EOF */ /* struct/union type will be used by user app. */
#ifndef SPI_SLAVE_DRV_H
#define SPI_SLAVE_DRV_H
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
/* =========================================== Includes =========================================== */
#include "spi_shared_function.h"
/* ============================================ Define ============================================ */
/* =========================================== Typedef ============================================ */
/*!
* @brief User configuration structure for the SPI slave driver.
*/
typedef struct
{
spi_signal_polarity_t pcsPolarity; /*!< PCS polarity */
uint16_t bitcount; /*!< Number of bits per frame, 4~32 bits */
spi_clock_phase_t clkPhase; /*!< Selects which phase of clock to capture data */
spi_which_pcs_t whichPcs;
spi_sck_polarity_t clkPolarity; /*!< Selects clock polarity */
bool msbFirst; /*!< Option to transmit LSB first */
spi_transfer_type transferType; /*!< Type of SPI transfer */
uint8_t rxDMAChannel; /*!< Slect DMA rx channel. If DMA mode isn't used this field will be ignored. */
uint8_t txDMAChannel; /*!< Slect 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_slave_config_t;
/* ========================================== Variables =========================================== */
/* ==================================== Functions declaration ===================================== */
/*!
* @brief Get default configuration for SPI slave.
*
* @param[out] spiConfig: Pointer to configuration structure which is filled with default configuration
*/
void SPI_DRV_SlaveGetDefaultConfig(spi_slave_config_t *spiConfig);
/*!
* @brief Initializes SPI.
*
* @param[in] instance: SPI instance
* @param[in] spiState: The pointer to the SPI slave 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_SlaveInit(uint32_t instance, spi_state_t *spiState, const spi_slave_config_t *slaveConfig);
/*!
* @brief De-initializes SPI.
*
* @param[in] instance: SPI instance
* @return STATUS_SUCCESS or STATUS_ERROR
*/
status_t SPI_DRV_SlaveDeinit(uint32_t instance);
/*!
* @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[in] transferByteCount: The number of bytes to send and receive which is equal to size
* of send or receive buffers
* @param[in] 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_SlaveTransferBlocking(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_SlaveGetTransferStatus 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_SlaveTransfer(uint32_t instance,
const uint8_t *sendBuffer,
uint8_t *receiveBuffer,
uint16_t transferByteCount);
/*!
* @brief Aborts the transfer that started by a non-blocking call transfer function.
*
* This function stops the transfer which was started by the calling the SPI_DRV_SlaveTransfer() function.
*
* @param instance The instance number of SPI peripheral
*
* @return STATUS_SUCCESS if everything is OK.
*
*/
status_t SPI_DRV_SlaveAbortTransfer(uint32_t instance);
/*!
* @brief Returns whether the previous transfer is finished.
*
* When performing an a-sync transfer, the user can call this function to ascertain
* the state of the current transfer: in progress (or busy) or complete (success).
* In addition, if the transfer is still in progress, the user can get the number
* of bytes that have been transferred up to now.
*
* @param instance The instance number of the SPI peripheral.
* @param bytesRemained Pointer to value that is filled in with the number of
* frames that have been sent in the active transfer. A frame is defined as the
* number of bits per frame.
*
* @return STATUS_SUCCESS The transfer has completed successfully, or
* STATUS_BUSY The transfer is still in progress.
* STATUS_ERROR if driver is error and needs to clean error.
*/
status_t SPI_DRV_SlaveGetTransferStatus(uint32_t instance, uint32_t *bytesRemained);
/*!
* @brief Interrupt handler for SPI slave mode.
* This handler uses the buffers stored in the SPI_slave_state_t structs to transfer data.
*
* @param instance The instance number of the SPI peripheral.
*/
void SPI_DRV_SlaveIRQHandler(uint32_t instance);
/*!
* @brief Get SPI had receive data len in SPI_DRV_SlaveReceiveNolimitLen mode.
* @param[in] instance: SPI module instance
* @param[in] receiveBuffer: data receive addr
* @return SPI had receive data len
*/
uint16_t SPI_DRV_SlaveGetReceiveLen(uint32_t instance, uint8_t **receiveBuffer);
/*!
* @brief SPI using interrupt receive by NolimitLen mode, which will
* return after start transfer.The user needs to check whether the receiveBuffer
* has valid data the SPI_DRV_SlaveGetTransferStatus function.
*
* @param[in] instance: SPI module instance
* @param[in] receiveBuffer1: Pointer to the buffer where the received bytes are stored.
* @param[in] receiveBuffer2: Pointer to the buffer where the received bytes are stored.
* @param[in] maxreceiveByteCount: The receiveBuffer max len.
* @return STATUS_SUCCESS The transfer was successful, or
* STATUS_BUSY Cannot perform transfer because a transfer is already in progress
*/
status_t SPI_DRV_SlaveReceiveNolimitLen(uint32_t instance,
uint8_t *receiveBuffer1,
uint8_t *receiveBuffer2,
uint16_t maxreceiveByteCount);
#if defined(__cplusplus)
}
#endif /* __cplusplus */
#endif /* SPI_SLAVE_DRV_H */
/* ============================================= EOF ============================================== */