mbed-os/targets/TARGET_TOSHIBA/TARGET_TMPM3H6/periph_driver/txz_tspi.c

2556 lines
83 KiB
C

/**
*******************************************************************************
* @file txz_tspi.c
* @brief This file provides API functions for TSPI driver.
* @version V1.0.0.9
* $Date:: 2018-01-22 15:26:40 #$
*
* DO NOT USE THIS SOFTWARE WITHOUT THE SOFTWARE LISENCE AGREEMENT.
*
* (C)Copyright TOSHIBA MICROELECTRONICS CORPORATION 2017 All rights reserved
*******************************************************************************
*/
#ifdef __cplusplus
extern "C" {
#endif
/*------------------------------------------------------------------------------*/
/* Includes */
/*------------------------------------------------------------------------------*/
#include "txz_tspi.h"
#if defined(__TSPI_H)
/**
* @addtogroup Periph_Driver
* @{
*/
/**
* @addtogroup TSPI
* @{
*/
/*------------------------------------------------------------------------------*/
/* Macro Definition */
/*------------------------------------------------------------------------------*/
/**
* @defgroup TSPI_Private_define TSPI Private Define
* @{
*/
/**
* @name TSPI NULL Pointer
* @brief Null Pointer for TSPI
* @{
*/
#define TSPI_NULL ((void *)0) /*!< NULL pointer. */
/**
* @}
*/ /* End of name TSPI NULL Pointer */
/**
* @name Parameter Result
* @brief Whether the parameter is specified or not.
* @{
*/
#define PARAM_OK ((int32_t)1) /*!< Parameter is valid(specified). */
#define PARAM_NG ((int32_t)0) /*!< Parameter is invalid(not specified). */
/**
* @}
*/ /* End of name Parameter Result */
/**
* @name FIFO Max Num.
* @brief Transfer's/Receive's FIFO Max Num.
* @{
*/
#define TRANSFER_FIFO_MAX_NUM ((uint32_t)8) /*!< Transfer's FIFO Max Num. */
#define RECEIVE_FIFO_MAX_NUM ((uint32_t)8) /*!< Receive's FIFO Max Num. */
/**
* @}
*/ /* End of name FIFO Max Num */
/**
* @name TSPIxDR_MASK Macro Definition.
* @brief TSPIxDR_MASK Macro Definition.
* @{
*/
/* DR */
#define TSPI_DR_8BIT_MASK ((uint32_t)0x000000FF) /*!< DR :Mask for 8bit */
#define TSPI_DR_9BIT_MASK ((uint32_t)0x000001FF) /*!< DR :Mask for 8bit */
#define TSPI_DR_10BIT_MASK ((uint32_t)0x000003FF) /*!< DR :Mask for 8bit */
#define TSPI_DR_11BIT_MASK ((uint32_t)0x000007FF) /*!< DR :Mask for 8bit */
#define TSPI_DR_12BIT_MASK ((uint32_t)0x00000FFF) /*!< DR :Mask for 8bit */
#define TSPI_DR_13BIT_MASK ((uint32_t)0x00001FFF) /*!< DR :Mask for 8bit */
#define TSPI_DR_14BIT_MASK ((uint32_t)0x00003FFF) /*!< DR :Mask for 8bit */
#define TSPI_DR_15BIT_MASK ((uint32_t)0x00007FFF) /*!< DR :Mask for 8bit */
#define TSPI_DR_16BIT_MASK ((uint32_t)0x0000FFFF) /*!< DR :Mask for 8bit */
#define TSPI_DR_17BIT_MASK ((uint32_t)0x0001FFFF) /*!< DR :Mask for 8bit */
#define TSPI_DR_18BIT_MASK ((uint32_t)0x0003FFFF) /*!< DR :Mask for 8bit */
#define TSPI_DR_19BIT_MASK ((uint32_t)0x0007FFFF) /*!< DR :Mask for 8bit */
#define TSPI_DR_20BIT_MASK ((uint32_t)0x000FFFFF) /*!< DR :Mask for 8bit */
#define TSPI_DR_21BIT_MASK ((uint32_t)0x001FFFFF) /*!< DR :Mask for 8bit */
#define TSPI_DR_22BIT_MASK ((uint32_t)0x003FFFFF) /*!< DR :Mask for 8bit */
#define TSPI_DR_23BIT_MASK ((uint32_t)0x007FFFFF) /*!< DR :Mask for 8bit */
#define TSPI_DR_24BIT_MASK ((uint32_t)0x00FFFFFF) /*!< DR :Mask for 8bit */
#define TSPI_DR_25BIT_MASK ((uint32_t)0x01FFFFFF) /*!< DR :Mask for 8bit */
#define TSPI_DR_26BIT_MASK ((uint32_t)0x03FFFFFF) /*!< DR :Mask for 8bit */
#define TSPI_DR_27BIT_MASK ((uint32_t)0x07FFFFFF) /*!< DR :Mask for 8bit */
#define TSPI_DR_28BIT_MASK ((uint32_t)0x0FFFFFFF) /*!< DR :Mask for 8bit */
#define TSPI_DR_29BIT_MASK ((uint32_t)0x1FFFFFFF) /*!< DR :Mask for 8bit */
#define TSPI_DR_30BIT_MASK ((uint32_t)0x3FFFFFFF) /*!< DR :Mask for 8bit */
#define TSPI_DR_31BIT_MASK ((uint32_t)0x7FFFFFFF) /*!< DR :Mask for 8bit */
/**
* @}
*/ /* End of name TSPIxDR_MASK Macro Definition */
/**
* @name TSPI _DATA_LENGTH Macro Definition.
* @brief TSPI DATA LENGTH Macro Definition.
* @{
*/
#define DATA_LENGTH_8 ((uint32_t)0x08) /*!< 8 bit */
#define DATA_LENGTH_9 ((uint32_t)0x09) /*!< 9 bit */
#define DATA_LENGTH_10 ((uint32_t)0x0a) /*!< 10 bit */
#define DATA_LENGTH_11 ((uint32_t)0x0b) /*!< 11 bit */
#define DATA_LENGTH_12 ((uint32_t)0x0c) /*!< 12 bit */
#define DATA_LENGTH_13 ((uint32_t)0x0d) /*!< 13 bit */
#define DATA_LENGTH_14 ((uint32_t)0x0e) /*!< 14 bit */
#define DATA_LENGTH_15 ((uint32_t)0x0f) /*!< 15 bit */
#define DATA_LENGTH_16 ((uint32_t)0x10) /*!< 16 bit */
#define DATA_LENGTH_17 ((uint32_t)0x11) /*!< 17 bit */
#define DATA_LENGTH_18 ((uint32_t)0x12) /*!< 18 bit */
#define DATA_LENGTH_19 ((uint32_t)0x13) /*!< 19 bit */
#define DATA_LENGTH_20 ((uint32_t)0x14) /*!< 20 bit */
#define DATA_LENGTH_21 ((uint32_t)0x15) /*!< 21 bit */
#define DATA_LENGTH_22 ((uint32_t)0x16) /*!< 22 bit */
#define DATA_LENGTH_23 ((uint32_t)0x17) /*!< 23 bit */
#define DATA_LENGTH_24 ((uint32_t)0x18) /*!< 24 bit */
#define DATA_LENGTH_25 ((uint32_t)0x19) /*!< 25 bit */
#define DATA_LENGTH_26 ((uint32_t)0x1a) /*!< 26 bit */
#define DATA_LENGTH_27 ((uint32_t)0x1b) /*!< 27 bit */
#define DATA_LENGTH_28 ((uint32_t)0x1c) /*!< 28 bit */
#define DATA_LENGTH_29 ((uint32_t)0x1d) /*!< 29 bit */
#define DATA_LENGTH_30 ((uint32_t)0x1e) /*!< 30 bit */
#define DATA_LENGTH_31 ((uint32_t)0x1f) /*!< 31 bit */
#define DATA_LENGTH_32 ((uint32_t)0x20) /*!< 32 bit */
/**
* @}
*/ /* End of name TSPI _DATA_LENGTH Macro Definition */
/**
* @}
*/ /* End of group TSPI_Private_typedef */
/*------------------------------------------------------------------------------*/
/* Enumerated Type Definition */
/*------------------------------------------------------------------------------*/
/**
* @defgroup TSPI_Private_define TSPI Private Define
* @{
*/
/* no define */
/**
* @}
*/ /* End of group TSPI_Private_define */
/*------------------------------------------------------------------------------*/
/* Structure Definition */
/*------------------------------------------------------------------------------*/
/**
* @defgroup TSPI_Private_typedef TSPI Private Typedef
* @{
*/
/*----------------------------------*/
/**
* @brief TSPI mask array.
*/
/*----------------------------------*/
static uint32_t mask[32] ={
0,
0,
0,
0,
0,
0,
0,
0,
TSPI_DR_8BIT_MASK,
TSPI_DR_9BIT_MASK,
TSPI_DR_10BIT_MASK,
TSPI_DR_11BIT_MASK,
TSPI_DR_12BIT_MASK,
TSPI_DR_13BIT_MASK,
TSPI_DR_14BIT_MASK,
TSPI_DR_15BIT_MASK,
TSPI_DR_16BIT_MASK,
TSPI_DR_17BIT_MASK,
TSPI_DR_18BIT_MASK,
TSPI_DR_19BIT_MASK,
TSPI_DR_20BIT_MASK,
TSPI_DR_21BIT_MASK,
TSPI_DR_22BIT_MASK,
TSPI_DR_23BIT_MASK,
TSPI_DR_24BIT_MASK,
TSPI_DR_25BIT_MASK,
TSPI_DR_26BIT_MASK,
TSPI_DR_27BIT_MASK,
TSPI_DR_28BIT_MASK,
TSPI_DR_29BIT_MASK,
TSPI_DR_30BIT_MASK,
TSPI_DR_31BIT_MASK
};
/**
* @}
*/ /* End of group TSPI_Private_typedef */
/*------------------------------------------------------------------------------*/
/* Private Function */
/*------------------------------------------------------------------------------*/
/**
* @defgroup TSPI_Private_fuctions TSPI Private Fuctions
* @{
*/
#ifdef DEBUG
__INLINE static int32_t check_param_transmit_enable(uint32_t param);
__INLINE static int32_t check_param_transmit_tspi_sio(uint32_t param);
__INLINE static int32_t check_param_transmit_master(uint32_t param);
__INLINE static int32_t check_param_transmit_mode(uint32_t param);
__INLINE static int32_t check_param_transmit_sel_select(uint32_t param);
__INLINE static int32_t check_param_frame_range(uint32_t param);
__INLINE static int32_t check_param_idle_imp(uint32_t param);
__INLINE static int32_t check_param_underrun_imp(uint32_t param);
__INLINE static int32_t check_param_tx_fill_level(uint32_t param);
__INLINE static int32_t check_param_rx_fill_level(uint32_t param);
__INLINE static int32_t check_param_tx_fifo_int(uint32_t param);
__INLINE static int32_t check_param_rx_fifo_int(uint32_t param);
__INLINE static int32_t check_param_err_int(uint32_t param);
__INLINE static int32_t check_param_tx_dma_int(uint32_t param);
__INLINE static int32_t check_param_rx_dma_int(uint32_t param);
__INLINE static int32_t check_param_input_clock(uint32_t param);
__INLINE static int32_t check_param_input_divider(uint32_t param);
__INLINE static int32_t check_param_data_direction(uint32_t param);
__INLINE static int32_t check_param_frame_length(uint32_t param);
__INLINE static int32_t check_param_frame_interval(uint32_t param);
__INLINE static int32_t check_param_tspixcs3_imp(uint32_t param);
__INLINE static int32_t check_param_tspixcs2_imp(uint32_t param);
__INLINE static int32_t check_param_tspixcs1_imp(uint32_t param);
__INLINE static int32_t check_param_tspixcs0_imp(uint32_t param);
__INLINE static int32_t check_param_clock_edge_imp(uint32_t param);
__INLINE static int32_t check_param_clock_idle_imp(uint32_t param);
__INLINE static int32_t check_param_min_idle_time(uint32_t param);
__INLINE static int32_t check_param_clock_delay(uint32_t param);
__INLINE static int32_t check_param_negate_delay(uint32_t param);
__INLINE static int32_t check_param_parity_enable(uint32_t param);
__INLINE static int32_t check_param_parity_bit(uint32_t param);
#endif
#ifdef DEBUG
/*--------------------------------------------------*/
/**
* @brief Check the Transmit Enable's parameter.
* @param param :Transmit Enable's parameter
* @retval PARAM_OK :Valid
* @retval PARAM_NG :Invalid
* @note Macro definition is @ref TSPI_Transmission_Control
*/
/*--------------------------------------------------*/
__INLINE static int32_t check_param_transmit_enable(uint32_t param)
{
int32_t result = PARAM_NG;
switch (param)
{
case TSPI_TRXE_DISABLE:
case TSPI_TRXE_ENABLE:
result = PARAM_OK;
break;
default:
/* no process */
break;
}
return (result);
}
/*--------------------------------------------------*/
/**
* @brief Check the Transmit Mode's parameter.
* @param param :Transmit Mode's parameter
* @retval PARAM_OK :Valid
* @retval PARAM_NG :Invalid
* @note Macro definition is @ref TSPI_Transmission_Mode
*/
/*--------------------------------------------------*/
__INLINE static int32_t check_param_transmit_tspi_sio(uint32_t param)
{
int32_t result = PARAM_NG;
switch (param)
{
case TSPI_SPI_MODE:
case TSPI_SIO_MODE:
result = PARAM_OK;
break;
default:
/* no process */
break;
}
return (result);
}
/*--------------------------------------------------*/
/**
* @brief Check the Transmit Master/Slave parameter.
* @param param :Transmit Master/Slave parameter (Only support Master mode)
* @retval PARAM_OK :Valid
* @retval PARAM_NG :Invalid
* @note Macro definition is @ref TSPI_Operation_Select
*/
/*--------------------------------------------------*/
__INLINE static int32_t check_param_transmit_master(uint32_t param)
{
int32_t result = PARAM_NG;
switch (param)
{
case TSPI_MASTER_OPEARTION:
case TSPI_SLAVE_OPERATION:
result = PARAM_OK;
break;
default:
/* no process */
break;
}
return (result);
}
/*--------------------------------------------------*/
/**
* @brief Check the Transfer Mode's parameter.
* @param param :Transfer Mode's parameter (not support Two Way)
* @retval PARAM_OK :Valid
* @retval PARAM_NG :Invalid
* @note Macro definition is @ref TSPI_Transfer_Mode
*/
/*--------------------------------------------------*/
__INLINE static int32_t check_param_transmit_mode(uint32_t param)
{
int32_t result = PARAM_NG;
switch (param)
{
case TSPI_TWO_WAY:
case TSPI_TX_ONLY:
case TSPI_RX_ONLY:
result = PARAM_OK;
break;
default:
/* no process */
break;
}
return (result);
}
/*--------------------------------------------------*/
/**
* @brief Check the Transmit Sel Select's parameter.
* @param param :Transmit Sel Select's parameter (not support Two Way)
* @retval PARAM_OK :Valid
* @retval PARAM_NG :Invalid
* @note Macro definition is @ref TSPI_CSSEL_Select
*/
/*--------------------------------------------------*/
__INLINE static int32_t check_param_transmit_sel_select(uint32_t param)
{
int32_t result = PARAM_NG;
switch (param)
{
case TSPI_TSPIxCS0_ENABLE:
case TSPI_TSPIxCS1_ENABLE:
case TSPI_TSPIxCS2_ENABLE:
case TSPI_TSPIxCS3_ENABLE:
result = PARAM_OK;
break;
default:
/* no process */
break;
}
return (result);
}
/*--------------------------------------------------*/
/**
* @brief Check the Transmit Frame Range's parameter.
* @param param :TransmitFrame Range's parameter
* @retval PARAM_OK :Valid
* @retval PARAM_NG :Invalid
* @note Macro definition is @ref TSPI_Transfer_Frame_Range
*/
/*--------------------------------------------------*/
__INLINE static int32_t check_param_frame_range(uint32_t param)
{
int32_t result = PARAM_NG;
if ((TSPI_TRANS_RANGE_SINGLE == param) || (param <= TSPI_TRANS_RANGE_MAX)){
result = PARAM_OK;
}
return (result);
}
/*--------------------------------------------------*/
/**
* @brief Check the IDLE Output Value's parameter.
* @param param :IDLE Output Value's parameter
* @retval PARAM_OK :Valid
* @retval PARAM_NG :Invalid
* @note Macro definition is @ref TSPI_IDLE_Output_value
*/
/*--------------------------------------------------*/
__INLINE static int32_t check_param_idle_imp(uint32_t param)
{
int32_t result = PARAM_NG;
switch (param)
{
case TSPI_TIDLE_Hiz:
case TSPI_TIDLE_LAST_DATA:
case TSPI_TIDLE_LOW:
case TSPI_TIDLE_HI:
result = PARAM_OK;
break;
default:
/* no process */
break;
}
return (result);
}
/*--------------------------------------------------*/
/**
* @brief Check the Underrun Occur Output Value's parameter.
* @param param :Underrun Occur Output Value's parameter
* @retval PARAM_OK :Valid
* @retval PARAM_NG :Invalid
* @note Macro definition is @ref TSPI_Underrun_Output_value
*/
/*--------------------------------------------------*/
__INLINE static int32_t check_param_underrun_imp(uint32_t param)
{
int32_t result = PARAM_NG;
switch (param)
{
case TSPI_TXDEMP_LOW:
case TSPI_TXDEMP_HI:
result = PARAM_OK;
break;
default:
/* no process */
break;
}
return (result);
}
/*--------------------------------------------------*/
/**
* @brief Check the Tx Fill Level's parameter.
* @param param :Tx Fill Level's parameter
* @retval PARAM_OK :Valid
* @retval PARAM_NG :Invalid
* @note Macro definition is @ref TSPI_TxFillLevel
*/
/*--------------------------------------------------*/
__INLINE static int32_t check_param_tx_fill_level(uint32_t param)
{
int32_t result = PARAM_NG;
switch (param)
{
case TSPI_TX_FILL_LEVEL_0:
case TSPI_TX_FILL_LEVEL_1:
case TSPI_TX_FILL_LEVEL_2:
case TSPI_TX_FILL_LEVEL_3:
case TSPI_TX_FILL_LEVEL_4:
case TSPI_TX_FILL_LEVEL_5:
case TSPI_TX_FILL_LEVEL_6:
case TSPI_TX_FILL_LEVEL_7:
result = PARAM_OK;
break;
default:
/* no process */
break;
}
return (result);
}
/*--------------------------------------------------*/
/**
* @brief Check the Rx Fill Level's parameter.
* @param param :Rx Fill Level's parameter
* @retval PARAM_OK :Valid
* @retval PARAM_NG :Invalid
* @note Macro definition is @ref TSPI_RxFillLevel
*/
/*--------------------------------------------------*/
__INLINE static int32_t check_param_rx_fill_level(uint32_t param)
{
int32_t result = PARAM_NG;
switch (param)
{
case TSPI_RX_FILL_LEVEL_0:
case TSPI_RX_FILL_LEVEL_1:
case TSPI_RX_FILL_LEVEL_2:
case TSPI_RX_FILL_LEVEL_3:
case TSPI_RX_FILL_LEVEL_4:
case TSPI_RX_FILL_LEVEL_5:
case TSPI_RX_FILL_LEVEL_6:
case TSPI_RX_FILL_LEVEL_7:
result = PARAM_OK;
break;
default:
/* no process */
break;
}
return (result);
}
/*--------------------------------------------------*/
/**
* @brief Check the Tx FIFO Interrpt's parameter.
* @param param :Tx FIFO Interrpt's parameter
* @retval PARAM_OK :Valid
* @retval PARAM_NG :Invalid
* @note Macro definition is @ref TSPI_TxInterrupt
*/
/*--------------------------------------------------*/
__INLINE static int32_t check_param_tx_fifo_int(uint32_t param)
{
int32_t result = PARAM_NG;
switch (param)
{
case TSPI_TX_FIFO_INT_DISABLE:
case TSPI_TX_FIFO_INT_ENABLE:
result = PARAM_OK;
break;
default:
/* no process */
break;
}
return (result);
}
/*--------------------------------------------------*/
/**
* @brief Check the Tx Interrpt's parameter.
* @param param :Tx Interrpt's parameter
* @retval PARAM_OK :Valid
* @retval PARAM_NG :Invalid
* @note Macro definition is @ref TSPI_TxInterrupt
*/
/*--------------------------------------------------*/
__INLINE static int32_t check_param_tx_int(uint32_t param)
{
int32_t result = PARAM_NG;
switch (param)
{
case TSPI_TX_INT_DISABLE:
case TSPI_TX_INT_ENABLE:
result = PARAM_OK;
break;
default:
/* no process */
break;
}
return (result);
}
/*--------------------------------------------------*/
/**
* @brief Check the Rx FIFO Interrpt's parameter.
* @param param :Rx FIFO Interrpt's parameter
* @retval PARAM_OK :Valid
* @retval PARAM_NG :Invalid
* @note Macro definition is @ref TSPI_RxFIFOInterrupt
*/
/*--------------------------------------------------*/
__INLINE static int32_t check_param_rx_fifo_int(uint32_t param)
{
int32_t result = PARAM_NG;
switch (param)
{
case TSPI_RX_FIFO_INT_DISABLE:
case TSPI_RX_FIFO_INT_ENABLE:
result = PARAM_OK;
break;
default:
/* no process */
break;
}
return (result);
}
/*--------------------------------------------------*/
/**
* @brief Check the Rx Interrpt's parameter.
* @param param :Rx Interrpt's parameter
* @retval PARAM_OK :Valid
* @retval PARAM_NG :Invalid
* @note Macro definition is @ref TSPI_RxInterrupt
*/
/*--------------------------------------------------*/
__INLINE static int32_t check_param_rx_int(uint32_t param)
{
int32_t result = PARAM_NG;
switch (param)
{
case TSPI_RX_INT_DISABLE:
case TSPI_RX_INT_ENABLE:
result = PARAM_OK;
break;
default:
/* no process */
break;
}
return (result);
}
/*--------------------------------------------------*/
/**
* @brief Check the Error Interrupt's parameter.
* @param param :Error Interrupt's parameter
* @retval PARAM_OK :Valid
* @retval PARAM_NG :Invalid
* @note Macro definition is @ref TSPI_ErrorInterrupt
*/
/*--------------------------------------------------*/
__INLINE static int32_t check_param_err_int(uint32_t param)
{
int32_t result = PARAM_NG;
switch (param)
{
case TSPI_ERR_INT_DISABLE:
case TSPI_ERR_INT_ENABLE:
result = PARAM_OK;
break;
default:
/* no process */
break;
}
return (result);
}
/*--------------------------------------------------*/
/**
* @brief Check the Tx DMA Interrupt's parameter.
* @param param :Tx DMA Interrupt's parameter
* @retval PARAM_OK :Valid
* @retval PARAM_NG :Invalid
* @note Macro definition is @ref TSPI_TxDMAInterrupt
*/
/*--------------------------------------------------*/
__INLINE static int32_t check_param_tx_dma_int(uint32_t param)
{
int32_t result = PARAM_NG;
switch (param)
{
case TSPI_TX_DMA_INT_DISABLE:
case TSPI_TX_DMA_INT_ENABLE:
result = PARAM_OK;
break;
default:
/* no process */
break;
}
return (result);
}
/*--------------------------------------------------*/
/**
* @brief Check the Rx DMA Interrupt's parameter.
* @param param :Rx DMA Interrupt's parameter
* @retval PARAM_OK :Valid
* @retval PARAM_NG :Invalid
* @note Macro definition is @ref TSPI_RxDMAInterrupt
*/
/*--------------------------------------------------*/
__INLINE static int32_t check_param_rx_dma_int(uint32_t param)
{
int32_t result = PARAM_NG;
switch (param)
{
case TSPI_RX_DMA_INT_DISABLE:
case TSPI_RX_DMA_INT_ENABLE:
result = PARAM_OK;
break;
default:
/* no process */
break;
}
return (result);
}
/*--------------------------------------------------*/
/**
* @brief Check the Input Clock's parameter.
* @param param :Input Clock's parameter
* @retval PARAM_OK :Valid
* @retval PARAM_NG :Invalid
* @note Macro definition is @ref TSPI_Baudrate_Clock
*/
/*--------------------------------------------------*/
__INLINE static int32_t check_param_input_clock(uint32_t param)
{
int32_t result = PARAM_NG;
switch (param)
{
case TSPI_BR_CLOCK_0:
case TSPI_BR_CLOCK_1:
case TSPI_BR_CLOCK_2:
case TSPI_BR_CLOCK_4:
case TSPI_BR_CLOCK_8:
case TSPI_BR_CLOCK_16:
case TSPI_BR_CLOCK_32:
case TSPI_BR_CLOCK_64:
case TSPI_BR_CLOCK_128:
case TSPI_BR_CLOCK_256:
result = PARAM_OK;
break;
default:
/* no process */
break;
}
return (result);
}
/*--------------------------------------------------*/
/**
* @brief Check the Baudrate Divider's parameter.
* @param param :Baudrate Divider's parameter
* @retval PARAM_OK :Valid
* @retval PARAM_NG :Invalid
* @note Macro definition is @ref TSPI_Baudrate_Clock
*/
/*--------------------------------------------------*/
__INLINE static int32_t check_param_input_divider(uint32_t param)
{
int32_t result = PARAM_NG;
switch (param)
{
case TSPI_BR_DIVIDER_16:
case TSPI_BR_DIVIDER_1:
case TSPI_BR_DIVIDER_2:
case TSPI_BR_DIVIDER_3:
case TSPI_BR_DIVIDER_4:
case TSPI_BR_DIVIDER_5:
case TSPI_BR_DIVIDER_6:
case TSPI_BR_DIVIDER_7:
case TSPI_BR_DIVIDER_8:
case TSPI_BR_DIVIDER_9:
case TSPI_BR_DIVIDER_10:
case TSPI_BR_DIVIDER_11:
case TSPI_BR_DIVIDER_12:
case TSPI_BR_DIVIDER_13:
case TSPI_BR_DIVIDER_14:
case TSPI_BR_DIVIDER_15:
result = PARAM_OK;
break;
default:
/* no process */
break;
}
return (result);
}
/*--------------------------------------------------*/
/**
* @brief Check the Data Direction's parameter.
* @param param :Data Direction's parameter
* @retval PARAM_OK :Valid
* @retval PARAM_NG :Invalid
* @note Macro definition is @ref TSPI_DataDirection"TSPI_DATA_DIRECTION_xxxx".
*/
/*--------------------------------------------------*/
__INLINE static int32_t check_param_data_direction(uint32_t param)
{
int32_t result = PARAM_NG;
switch (param)
{
case TSPI_DATA_DIRECTION_LSB:
case TSPI_DATA_DIRECTION_MSB:
result = PARAM_OK;
break;
default:
/* no process */
break;
}
return (result);
}
/*--------------------------------------------------*/
/**
* @brief Check the Data Length's parameter.
* @param param :Data Length's parameter (Only support 8bit DATA)
* @retval PARAM_OK :Valid
* @retval PARAM_NG :Invalid
* @note Macro definition is @ref TSPI_DataLength"TSPI_DATA_LENGTH_xxxx".
*/
/*--------------------------------------------------*/
__INLINE static int32_t check_param_frame_length(uint32_t param)
{
int32_t result = PARAM_NG;
switch (param)
{
case TSPI_DATA_LENGTH_8:
case TSPI_DATA_LENGTH_9:
case TSPI_DATA_LENGTH_10:
case TSPI_DATA_LENGTH_11:
case TSPI_DATA_LENGTH_12:
case TSPI_DATA_LENGTH_13:
case TSPI_DATA_LENGTH_14:
case TSPI_DATA_LENGTH_15:
case TSPI_DATA_LENGTH_16:
case TSPI_DATA_LENGTH_17:
case TSPI_DATA_LENGTH_18:
case TSPI_DATA_LENGTH_19:
case TSPI_DATA_LENGTH_20:
case TSPI_DATA_LENGTH_21:
case TSPI_DATA_LENGTH_22:
case TSPI_DATA_LENGTH_23:
case TSPI_DATA_LENGTH_24:
case TSPI_DATA_LENGTH_25:
case TSPI_DATA_LENGTH_26:
case TSPI_DATA_LENGTH_27:
case TSPI_DATA_LENGTH_28:
case TSPI_DATA_LENGTH_29:
case TSPI_DATA_LENGTH_30:
case TSPI_DATA_LENGTH_31:
case TSPI_DATA_LENGTH_32:
result = PARAM_OK;
break;
default:
/* no process */
break;
}
return (result);
}
/*--------------------------------------------------*/
/**
* @brief Check the Frame Interval's parameter.
* @param param :Frame Interval's parameter
* @retval PARAM_OK :Valid
* @retval PARAM_NG :Invalid
* @note Macro definition is @ref TSPI_Frame_Interval_Time
*/
/*--------------------------------------------------*/
__INLINE static int32_t check_param_frame_interval(uint32_t param)
{
int32_t result = PARAM_NG;
switch (param)
{
case TSPI_INTERVAL_TIME_0:
case TSPI_INTERVAL_TIME_1:
case TSPI_INTERVAL_TIME_2:
case TSPI_INTERVAL_TIME_3:
case TSPI_INTERVAL_TIME_4:
case TSPI_INTERVAL_TIME_5:
case TSPI_INTERVAL_TIME_6:
case TSPI_INTERVAL_TIME_7:
case TSPI_INTERVAL_TIME_8:
case TSPI_INTERVAL_TIME_9:
case TSPI_INTERVAL_TIME_10:
case TSPI_INTERVAL_TIME_11:
case TSPI_INTERVAL_TIME_12:
case TSPI_INTERVAL_TIME_13:
case TSPI_INTERVAL_TIME_14:
case TSPI_INTERVAL_TIME_15:
result = PARAM_OK;
break;
default:
/* no process */
break;
}
return (result);
}
/*--------------------------------------------------*/
/**
* @brief Check the TTSPIxCS3 Polarity's parameter.
* @param param :TTSPIxCS3 Polarity's parameter
* @retval PARAM_OK :Valid
* @retval PARAM_NG :Invalid
* @note Macro definition is @ref TSPI_TTSPIxCS3_Polarity.
*/
/*--------------------------------------------------*/
__INLINE static int32_t check_param_tspixcs3_imp(uint32_t param)
{
int32_t result = PARAM_NG;
switch (param)
{
case TSPI_TSPIxCS3_NEGATIVE:
case TSPI_TSPIxCS3_POSITIVE:
result = PARAM_OK;
break;
default:
/* no process */
break;
}
return (result);
}
/*--------------------------------------------------*/
/**
* @brief Check the TTSPIxCS2 Polarity's parameter.
* @param param :TTSPIxCS2 Polarity's parameter
* @retval PARAM_OK :Valid
* @retval PARAM_NG :Invalid
* @note Macro definition is @ref TSPI_TTSPIxCS2_Polarity.
*/
/*--------------------------------------------------*/
__INLINE static int32_t check_param_tspixcs2_imp(uint32_t param)
{
int32_t result = PARAM_NG;
switch (param)
{
case TSPI_TSPIxCS2_NEGATIVE:
case TSPI_TSPIxCS2_POSITIVE:
result = PARAM_OK;
break;
default:
/* no process */
break;
}
return (result);
}
/*--------------------------------------------------*/
/**
* @brief Check the TTSPIxCS1 Polarity's parameter.
* @param param :TTSPIxCS1 Polarity's parameter
* @retval PARAM_OK :Valid
* @retval PARAM_NG :Invalid
* @note Macro definition is @ref TSPI_TTSPIxCS1_Polarity.
*/
/*--------------------------------------------------*/
__INLINE static int32_t check_param_tspixcs1_imp(uint32_t param)
{
int32_t result = PARAM_NG;
switch (param)
{
case TSPI_TSPIxCS1_NEGATIVE:
case TSPI_TSPIxCS1_POSITIVE:
result = PARAM_OK;
break;
default:
/* no process */
break;
}
return (result);
}
/*--------------------------------------------------*/
/**
* @brief Check the TTSPIxCS0 Polarity's parameter.
* @param param :TTSPIxCS0 Polarity's parameter
* @retval PARAM_OK :Valid
* @retval PARAM_NG :Invalid
* @note Macro definition is @ref TSPI_TTSPIxCS0_Polarity.
*/
/*--------------------------------------------------*/
__INLINE static int32_t check_param_tspixcs0_imp(uint32_t param)
{
int32_t result = PARAM_NG;
switch (param)
{
case TSPI_TSPIxCS0_NEGATIVE:
case TSPI_TSPIxCS0_POSITIVE:
result = PARAM_OK;
break;
default:
/* no process */
break;
}
return (result);
}
/*--------------------------------------------------*/
/**
* @brief Check the Serial Clock Polarity's parameter.
* @param param :Serial Clock Polarity's parameter
* @retval PARAM_OK :Valid
* @retval PARAM_NG :Invalid
* @note Macro definition is @ref TSPI_Serial_Clock_Polarity
*/
/*--------------------------------------------------*/
__INLINE static int32_t check_param_clock_edge_imp(uint32_t param)
{
int32_t result = PARAM_NG;
switch (param)
{
case TSPI_SERIAL_CK_1ST_EDGE:
case TSPI_SERIAL_CK_2ND_EDGE:
result = PARAM_OK;
break;
default:
/* no process */
break;
}
return (result);
}
/*--------------------------------------------------*/
/**
* @brief Check the Serial Clock IDLE Polarity's parameter.
* @param param :Serial Clock IDLE Polarity's parameter
* @retval PARAM_OK :Valid
* @retval PARAM_NG :Invalid
* @note Macro definition is @ref TSPI_Serial_Clock_IDLE_Polarity
*/
/*--------------------------------------------------*/
__INLINE static int32_t check_param_clock_idle_imp(uint32_t param)
{
int32_t result = PARAM_NG;
switch (param)
{
case TSPI_SERIAL_CK_IDLE_LOW:
case TSPI_SERIAL_CK_IDLE_HI:
result = PARAM_OK;
break;
default:
/* no process */
break;
}
return (result);
}
/*--------------------------------------------------*/
/**
* @brief Check the Minimum IDLE Time's parameter.
* @param param :Minimum IDLE Time's parameter
* @retval PARAM_OK :Valid
* @retval PARAM_NG :Invalid
* @note Macro definition is @ref TSPI_Minimum_IDLE_Time
*/
/*--------------------------------------------------*/
__INLINE static int32_t check_param_min_idle_time(uint32_t param)
{
int32_t result = PARAM_NG;
switch (param)
{
case TSPI_MIN_IDLE_TIME_1:
case TSPI_MIN_IDLE_TIME_2:
case TSPI_MIN_IDLE_TIME_3:
case TSPI_MIN_IDLE_TIME_4:
case TSPI_MIN_IDLE_TIME_5:
case TSPI_MIN_IDLE_TIME_6:
case TSPI_MIN_IDLE_TIME_7:
case TSPI_MIN_IDLE_TIME_8:
case TSPI_MIN_IDLE_TIME_9:
case TSPI_MIN_IDLE_TIME_10:
case TSPI_MIN_IDLE_TIME_11:
case TSPI_MIN_IDLE_TIME_12:
case TSPI_MIN_IDLE_TIME_13:
case TSPI_MIN_IDLE_TIME_14:
case TSPI_MIN_IDLE_TIME_15:
result = PARAM_OK;
break;
default:
/* no process */
break;
}
return (result);
}
/*--------------------------------------------------*/
/**
* @brief Check the Serial Clock Delay's parameter.
* @param param :Serial Clock Delay's parameter
* @retval PARAM_OK :Valid
* @retval PARAM_NG :Invalid
* @note Macro definition is @ref TSPI_Serial_Clock_Delay
*/
/*--------------------------------------------------*/
__INLINE static int32_t check_param_clock_delay(uint32_t param)
{
int32_t result = PARAM_NG;
switch (param)
{
case TSPI_SERIAL_CK_DELAY_1:
case TSPI_SERIAL_CK_DELAY_2:
case TSPI_SERIAL_CK_DELAY_3:
case TSPI_SERIAL_CK_DELAY_4:
case TSPI_SERIAL_CK_DELAY_5:
case TSPI_SERIAL_CK_DELAY_6:
case TSPI_SERIAL_CK_DELAY_7:
case TSPI_SERIAL_CK_DELAY_8:
case TSPI_SERIAL_CK_DELAY_9:
case TSPI_SERIAL_CK_DELAY_10:
case TSPI_SERIAL_CK_DELAY_11:
case TSPI_SERIAL_CK_DELAY_12:
case TSPI_SERIAL_CK_DELAY_13:
case TSPI_SERIAL_CK_DELAY_14:
case TSPI_SERIAL_CK_DELAY_15:
case TSPI_SERIAL_CK_DELAY_16:
result = PARAM_OK;
break;
default:
/* no process */
break;
}
return (result);
}
/*--------------------------------------------------*/
/**
* @brief Check the Negate Delay's parameter.
* @param param :Negate Delay's parameter
* @retval PARAM_OK :Valid
* @retval PARAM_NG :Invalid
* @note Macro definition is @ref TSPI_Negate_Delay
*/
/*--------------------------------------------------*/
__INLINE static int32_t check_param_negate_delay(uint32_t param)
{
int32_t result = PARAM_NG;
switch (param)
{
case TSPI_NEGATE_1:
case TSPI_NEGATE_2:
case TSPI_NEGATE_3:
case TSPI_NEGATE_4:
case TSPI_NEGATE_5:
case TSPI_NEGATE_6:
case TSPI_NEGATE_7:
case TSPI_NEGATE_8:
case TSPI_NEGATE_9:
case TSPI_NEGATE_10:
case TSPI_NEGATE_11:
case TSPI_NEGATE_12:
case TSPI_NEGATE_13:
case TSPI_NEGATE_14:
case TSPI_NEGATE_15:
case TSPI_NEGATE_16:
result = PARAM_OK;
break;
default:
/* no process */
break;
}
return (result);
}
/*--------------------------------------------------*/
/**
* @brief Check the Parity Enable's parameter.
* @param param :Parity Enable's parameter
* @retval PARAM_OK :Valid
* @retval PARAM_NG :Invalid
* @note Macro definition is @ref TSPI_ParityEnable"TSPI_PARITY_xxxx".
*/
/*--------------------------------------------------*/
__INLINE static int32_t check_param_parity_enable(uint32_t param)
{
int32_t result = PARAM_NG;
switch (param)
{
case TSPI_PARITY_DISABLE:
case TSPI_PARITY_ENABLE:
result = PARAM_OK;
break;
default:
/* no process */
break;
}
return (result);
}
/*--------------------------------------------------*/
/**
* @brief Check the Parity Bit's parameter.
* @param param :Parity Bit's parameter
* @retval PARAM_OK :Valid
* @retval PARAM_NG :Invalid
* @note Macro definition is @ref TSPI_ParityBit"TSPI_PARITY_BIT_xxxx".
*/
/*--------------------------------------------------*/
__INLINE static int32_t check_param_parity_bit(uint32_t param)
{
int32_t result = PARAM_NG;
switch (param)
{
case TSPI_PARITY_BIT_ODD:
case TSPI_PARITY_BIT_EVEN:
result = PARAM_OK;
break;
default:
/* no process */
break;
}
return (result);
}
#endif
/**
* @}
*/ /* End of group TSPI_Private_functions */
/*------------------------------------------------------------------------------*/
/* Public Function */
/*------------------------------------------------------------------------------*/
/**
* @addtogroup TSPI_Exported_functions
* @{
*/
/*--------------------------------------------------*/
/**
* @brief Initialize the TSPI object.
* @param p_obj :TSPI object.
* @retval TXZ_SUCCESS :Success.
* @retval TXZ_ERROR :Failure.
* @note When p_obj is NULL, "Failure" is returned.
* @attention This function is not available in interrupt.
*/
/*--------------------------------------------------*/
TXZ_Result tspi_init(tspi_t *p_obj)
{
TXZ_Result result = TXZ_SUCCESS;
/* Check the parameters */
#ifdef DEBUG
/* Check the NULL of address. */
assert_param(IS_POINTER_NOT_NULL(p_obj));
/* Check the parameter of TTSPIxCR1. */
assert_param(check_param_transmit_enable(p_obj->init.cnt1.trxe));
assert_param(check_param_transmit_tspi_sio(p_obj->init.cnt1.tspims));
assert_param(check_param_transmit_master(p_obj->init.cnt1.mstr));
assert_param(check_param_transmit_mode(p_obj->init.cnt1.tmmd));
assert_param(check_param_transmit_sel_select(p_obj->init.cnt1.cssel));
assert_param(check_param_frame_range(p_obj->init.cnt1.fc));
/* Check the parameter of TTSPIxCR2 */
assert_param(check_param_idle_imp(p_obj->init.cnt2.tidle));
assert_param(check_param_underrun_imp(p_obj->init.cnt2.txdemp));
assert_param(check_param_tx_fill_level(p_obj->init.cnt2.til));
assert_param(check_param_rx_fill_level(p_obj->init.cnt2.ril));
assert_param(check_param_tx_int(p_obj->init.cnt2.inttxwe));
assert_param(check_param_rx_int(p_obj->init.cnt2.intrxwe));
assert_param(check_param_tx_fifo_int(p_obj->init.cnt2.inttxfe));
assert_param(check_param_rx_fifo_int(p_obj->init.cnt2.intrxfe));
assert_param(check_param_err_int(p_obj->init.cnt2.interr));
assert_param(check_param_tx_dma_int(p_obj->init.cnt2.dmate));
assert_param(check_param_rx_dma_int(p_obj->init.cnt2.dmare));
/* Check the parameter of TTSPIxBR */
assert_param(check_param_input_clock(p_obj->init.brd.brck));
assert_param(check_param_input_divider(p_obj->init.brd.brs));
/* Check the parameter of TTSPIxFMTR0 */
assert_param(check_param_data_direction(p_obj->init.fmr0.dir));
assert_param(check_param_frame_length(p_obj->init.fmr0.fl));
assert_param(check_param_frame_interval(p_obj->init.fmr0.fint));
assert_param(check_param_tspixcs3_imp(p_obj->init.fmr0.cs3pol));
assert_param(check_param_tspixcs2_imp(p_obj->init.fmr0.cs2pol));
assert_param(check_param_tspixcs1_imp(p_obj->init.fmr0.cs1pol));
assert_param(check_param_tspixcs0_imp(p_obj->init.fmr0.cs0pol));
assert_param(check_param_clock_edge_imp(p_obj->init.fmr0.ckpha));
assert_param(check_param_clock_idle_imp(p_obj->init.fmr0.ckpol));
assert_param(check_param_min_idle_time(p_obj->init.fmr0.csint));
assert_param(check_param_clock_delay(p_obj->init.fmr0.cssckdl));
assert_param(check_param_negate_delay(p_obj->init.fmr0.sckcsdl));
/* Check the parameter of TTSPIxFMTR1 */
assert_param(check_param_parity_enable(p_obj->init.fmr1.vpe));
assert_param(check_param_parity_bit(p_obj->init.fmr1.vpm));
#endif
/* TSPI Software Reset */
p_obj->p_instance->CR0 = (TSPI_RESET10 | TSPI_ENABLE);
p_obj->p_instance->CR0 = (TSPI_RESET01 | TSPI_ENABLE);
/* Wait for 2 clocks of reset completion */
__NOP();
__NOP();
/* Control1 Register1 Set*/
p_obj->p_instance->CR1 = 0x00001C01U;
p_obj->p_instance->CR1 = (p_obj->init.cnt1.cssel | p_obj->init.cnt1.fc | p_obj->init.cnt1.mstr | p_obj->init.cnt1.tmmd | \
p_obj->init.cnt1.trxe | p_obj->init.cnt1.tspims| p_obj->init.cnt1.trgen);
/* Control2 Register Set */
p_obj->p_instance->CR2 = 0x00E10100U;
p_obj->p_instance->CR2 = (p_obj->init.cnt2.tidle | p_obj->init.cnt2.txdemp | p_obj->init.cnt2.rxdly | p_obj->init.cnt2.til | \
p_obj->init.cnt2.ril | p_obj->init.cnt2.inttxfe | p_obj->init.cnt2.intrxfe |p_obj->init.cnt2.inttxwe | \
p_obj->init.cnt2.intrxwe | p_obj->init.cnt2.interr | p_obj->init.cnt2.dmate | p_obj->init.cnt2.dmare );
/* Control3 Register is FIFO clear, do nothing */
/* Baudrate Register Set */
p_obj->p_instance->BR = 0U;
p_obj->p_instance->BR = (p_obj->init.brd.brck | p_obj->init.brd.brs);
/* Format control0 Register Set */
p_obj->p_instance->FMTR0 = 0x8800C400U;
p_obj->p_instance->FMTR0 = (p_obj->init.fmr0.ckpha | p_obj->init.fmr0.ckpol | p_obj->init.fmr0.cs0pol | p_obj->init.fmr0.cs1pol | \
p_obj->init.fmr0.cs2pol | p_obj->init.fmr0.cs3pol | p_obj->init.fmr0.csint | p_obj->init.fmr0.cssckdl | \
p_obj->init.fmr0.dir | p_obj->init.fmr0.fint | p_obj->init.fmr0.fl | p_obj->init.fmr0.sckcsdl );
/* Format control1 Register Set*/
p_obj->p_instance->FMTR1 = 0U;
p_obj->p_instance->FMTR1 = (p_obj->init.fmr1.vpm | p_obj->init.fmr1.vpe);
/* not created */
return (result);
}
/*--------------------------------------------------*/
/**
* @brief Release the TSPI object.
* @param p_obj :TSPI object.
* @retval TXZ_SUCCESS :Success.
* @retval TXZ_ERROR :Failure.
* @note When p_obj is NULL, "Failure" is returned.
* @attention This function is not available in interrupt.
*/
/*--------------------------------------------------*/
TXZ_Result tspi_deinit(tspi_t *p_obj)
{
TXZ_Result result = TXZ_SUCCESS;
/* Check the parameters */
#ifdef DEBUG
/* Check the NULL of address. */
assert_param(IS_POINTER_NOT_NULL(p_obj));
#endif
/* Disable the selected TSPI peripheral */
p_obj->p_instance->CR0 |= TSPI_DISABLE;
return (result);
}
/*--------------------------------------------------*/
/**
* @brief Transmit data..
* @param p_obj :TSPI object.
* @param p_info :The information of transmit data.
* @param timeout :Timeout duration.
* @retval TXZ_SUCCESS :Success.
* @retval TXZ_ERROR :Failure.
* @note When p_obj is NULL, "Failure" is returned.
* @note When p_info is NULL, "Failure" is returned.
*/
/*--------------------------------------------------*/
TXZ_Result tspi_master_write(tspi_t *p_obj, tspi_transmit_t *p_info, uint32_t timeout)
{
TXZ_Result result = TXZ_SUCCESS;
uint32_t err=0;
uint32_t length = 0;
/* Check the parameters */
#ifdef DEBUG
/* Check the NULL of address. */
assert_param(IS_POINTER_NOT_NULL(p_obj));
#endif
p_obj->errcode = NOERROR;
/* Check the Transfer Mode setting */
if((p_obj->p_instance->CR1 & TSPI_Transfer_Mode_MASK) == TSPI_RX_ONLY) {
p_obj->errcode = TRANSMITMODEERR;
result = TXZ_ERROR;
return (result);
}
/* Transmit data check*/
if((p_info->tx8.p_data == TSPI_NULL ) || (p_info->tx8.num == 0))
{
p_obj->errcode = DATABUFEMPERR;
result = TXZ_ERROR;
return (result);
}
/* FIFO Cear */
p_obj->p_instance->CR3 |= TSPI_TX_BUFF_CLR_DONE;
/* Check the Frame length setting */
length = ((p_obj->p_instance->FMTR0 & TSPI_DATA_LENGTH_MASK) >> 24);
/* Blocking Communication support frame length 8bit (1 byte) only */
if (length == (TSPI_DATA_LENGTH_8 >> 24)) {
p_obj->transmit.tx_allign = TSPI_DATA_ALLIGN_8;
}else{
p_obj->errcode = DATALENGTHERR;
result = TXZ_ERROR;
return (result);
}
/* Check if the TSPI is already enabled */
if((p_obj->p_instance->CR0 & TSPI_ENABLE) != TSPI_ENABLE)
{
p_obj->p_instance->CR0 |= TSPI_ENABLE;
}
/* Enable TSPI Transmission Control */
p_obj->p_instance->CR1 |= TSPI_TRXE_ENABLE;
/* Transmit Data write to D ata Register */
while (p_info->tx8.num > 0)
{
/* Check the current fill level */
if(((p_obj->p_instance->SR & TSPI_TX_REACH_FILL_LEVEL_MASK) >> 16) <= 7)
{
*((__IO uint8_t*)&p_obj->p_instance->DR) = ((*p_info->tx8.p_data++) & (uint8_t)TSPI_DR_8BIT_MASK);
p_info->tx8.num--;
/* check complete transmit */
if((p_obj->p_instance->SR & TSPI_TX_DONE_FLAG) != TSPI_TX_DONE)
{
timeout--;
if(timeout == 0) {
p_obj->errcode = TIMEOUTERR;
result = TXZ_ERROR;
return (result);
}
}
else
{
/* Enable TSPI Transmission Control */
if(p_info->tx8.num==0){
p_obj->p_instance->CR3 |= TSPI_TX_BUFF_CLR_DONE;
return (result);
}
else {
/* Next transmit data sending */
p_obj->p_instance->SR |= TSPI_TX_DONE_CLR;
p_obj->p_instance->CR1 |= TSPI_TRXE_ENABLE;
}
}
}else{
p_obj->errcode = FIFOFULLERR;
timeout--;
if(timeout == 0) {
p_obj->errcode = TIMEOUTERR;
result = TXZ_ERROR;
return (result);
}
}
}
/* check complete transmit */
while((p_obj->p_instance->SR & TSPI_TX_DONE_FLAG) != TSPI_TX_DONE)
{
timeout--;
if(timeout == 0) {
p_obj->errcode = TIMEOUTERR;
result = TXZ_ERROR;
return (result);
}
}
/* Check Error Flag */
tspi_get_error(p_obj, &err);
if(((err) & TSPI_UNDERRUN_ERR)== TSPI_UNDERRUN_ERR) {p_obj->errcode = UNDERRUNERR;}
else if(((err) & TSPI_OVERRUN_ERR) == TSPI_OVERRUN_ERR) {p_obj->errcode = OVERRUNERR;}
else if(((err) & TSPI_PARITY_ERR) == TSPI_PARITY_ERR) {p_obj->errcode = PARITYERR;}
if(p_obj->errcode == NOERROR) {
//p_obj->p_instance->SR |= TSPI_TX_DONE_CLR;
p_obj->p_instance->CR3 |= TSPI_TX_BUFF_CLR_DONE;
p_obj->p_instance->CR1 &= TSPI_TRXE_DISABLE_MASK;
return (result);
}else{
result = TXZ_ERROR;
return (result);
}
}
/*--------------------------------------------------*/
/**
* @brief Receive data. Blocking Communication.
* @param p_obj :TSPI object.
* @param p_info :The information of receive buffer.
* @param timeout :Timeout duration.
* @retval TXZ_SUCCESS :Success.
* @retval TXZ_ERROR :Failure.
* @note When p_obj is NULL, "Failure" is returned.
* @note When p_info is NULL, "Failure" is returned.
*/
/*--------------------------------------------------*/
TXZ_Result tspi_master_read(tspi_t *p_obj, tspi_receive_t *p_info, uint32_t timeout)
{
TXZ_Result result = TXZ_SUCCESS;
uint32_t err=0;
uint32_t length = 0;
uint32_t count = 0;
uint32_t index = 0;
// uint32_t level = 0;
/* Check the parameters */
#ifdef DEBUG
/* Check the NULL of address. */
assert_param(IS_POINTER_NOT_NULL(p_obj));
#endif
p_obj->errcode = NOERROR;
/* Check the Transfer Mode setting */
if((p_obj->p_instance->CR1 & TSPI_Transfer_Mode_MASK) == TSPI_TX_ONLY) {
p_obj->errcode = TRANSMITMODEERR;
result = TXZ_ERROR;
return (result);
}
if((p_obj->p_instance->CR1 & TSPI_Transfer_Mode_MASK) == TSPI_RX_ONLY) {
/* Enable TSPI Transmission Control */
p_obj->p_instance->CR1 |= TSPI_TRXE_ENABLE;
}
/* Transmit data check*/
if((p_info->rx8.p_data == TSPI_NULL ) || (p_info->rx8.num == 0))
{
result = TXZ_ERROR;
return (result);
}
count = p_info->rx8.num;
/* Check the Frame length setting */
length = ((p_obj->p_instance->FMTR0 & TSPI_DATA_LENGTH_MASK) >> 24U);
/* Blocking Communication support frame length 8bit (1 byte) only */
if (length == (TSPI_DATA_LENGTH_8 >> 24)) {
p_obj->receive.rx_allign = TSPI_DATA_ALLIGN_8;
}else{
p_obj->errcode = DATALENGTHERR;
result = TXZ_ERROR;
return (result);
}
/* Check if the TSPI is already enabled */
if((p_obj->p_instance->CR0 & TSPI_ENABLE) != TSPI_ENABLE)
{
/* Enable TSPI Transmission Control */
p_obj->p_instance->CR0 |= TSPI_ENABLE;
}
while (timeout > 0)
{
/* Wait until Receive Complete Flag is set to receive data */
if((p_obj->p_instance->SR & TSPI_RX_DONE_FLAG) == TSPI_RX_DONE)
{
while (count > 0) {
/* Check the remain data exist */
if((p_obj->p_instance->SR & TSPI_RX_REACH_FILL_LEVEL_MASK) != 0){
p_info->rx8.p_data[index] = (*((__IO uint8_t*)&p_obj->p_instance->DR) & (uint8_t)TSPI_DR_8BIT_MASK);
count--;
index++;
}else{
p_obj->errcode = FIFOFULLERR;
timeout--;
if(timeout == 0) {
p_obj->errcode = TIMEOUTERR;
result = TXZ_ERROR;
return (result);
}
}
}
/* Receive Complete Flag is clear */
p_obj->p_instance->SR |= TSPI_RX_DONE_CLR;
/* FIFO Cear */
p_obj->p_instance->CR2 |= TSPI_RX_BUFF_CLR_DONE;
p_obj->p_instance->CR1 &= TSPI_TRXE_DISABLE_MASK;
return (result);
}
else {timeout--;}
}
/* Timeout management */
p_obj->errcode = TIMEOUTERR;
/* Check Error Flag set */
tspi_get_error(p_obj, &err);
if(((err) & TSPI_UNDERRUN_ERR)== TSPI_UNDERRUN_ERR) {p_obj->errcode = UNDERRUNERR;}
else if(((err) & TSPI_OVERRUN_ERR) == TSPI_OVERRUN_ERR) {p_obj->errcode = OVERRUNERR;}
else if(((err) & TSPI_PARITY_ERR) == TSPI_PARITY_ERR) {p_obj->errcode = PARITYERR;}
result = TXZ_ERROR;
return (result);
}
/*--------------------------------------------------*/
/**
* @brief Transmit data. Non-Blocking Communication.
* @param p_obj :TSPI object.
* @param p_info :The information of transmit data.
* @retval SUCCESS :Success.
* @retval FAILURE :Failure.
* @note Asynchronous Processing.
* @attention This function is not available in interrupt.
*/
/*--------------------------------------------------*/
TXZ_Result tspi_master_transfer(tspi_t *p_obj, tspi_transmit_t *p_info)
{
TXZ_Result result = TXZ_SUCCESS;
uint32_t length = 0;
/*------------------------------*/
/* Parameter Check */
/*------------------------------*/
#ifdef DEBUG
/* Check the TSPI_NULL of address. */
assert_param(IS_POINTER_NOT_NULL(p_obj));
assert_param(IS_POINTER_NOT_NULL(p_obj->p_instance));
assert_param(IS_POINTER_NOT_NULL(p_info));
/* Check the parameter of transmit. */
if(p_obj->init.fmr0.fl == TSPI_DATA_LENGTH_8)
{
/* 8 bit */
assert_param(IS_POINTER_NOT_NULL(p_info->tx8.p_data));
}
else if ((p_obj->init.fmr0.fl > TSPI_DATA_LENGTH_8) && (p_obj->init.fmr0.fl < TSPI_DATA_LENGTH_17) )
{
/* 9 - 16 bit */
assert_param(IS_POINTER_NOT_NULL(p_info->tx16.p_data));
}
else
{
/* 17 - 32 bit */
assert_param(IS_POINTER_NOT_NULL(p_info->tx32.p_data));
}
#endif /* #ifdef DEBUG */
/*------------------------------*/
/* Disable Transmit */
/*------------------------------*/
/*--- TSPIxTRANS ---*/
/* Write to TRXE(=0). */
p_obj->p_instance->CR1 &= TSPI_TRXE_DISABLE_MASK;
p_obj->p_instance->SR |= TSPI_TX_DONE_CLR;
p_obj->p_instance->CR3 |= TSPI_TX_BUFF_CLR_DONE;
/*------------------------------*/
/* Information Setting */
/*------------------------------*/
p_obj->transmit.rp = 0;
length = ((p_obj->p_instance->FMTR0 & TSPI_DATA_LENGTH_MASK) >> 24U);
if(length == DATA_LENGTH_8)
{
/* 8 bit */
p_obj->transmit.info.tx8.p_data = p_info->tx8.p_data;
p_obj->transmit.info.tx8.num = p_info->tx8.num;
p_obj->transmit.tx_allign = 8;
}
else if ((length > DATA_LENGTH_8) && (length < DATA_LENGTH_17) )
{
/* 9 - 16 bit */
p_obj->transmit.info.tx16.p_data = p_info->tx16.p_data;
p_obj->transmit.info.tx16.num = p_info->tx16.num;
p_obj->transmit.tx_allign = 16;
}
else
{
/* 17 - 32 bit */
p_obj->transmit.info.tx32.p_data = p_info->tx32.p_data;
p_obj->transmit.info.tx32.num = p_info->tx32.num;
p_obj->transmit.tx_allign = 32;
}
/*------------------------------*/
/* Data Setting */
/*------------------------------*/
{
/* transmit data length set */
/*--- TSPIxSR ---*/
/* Read FIFO fill level. */
/* Read current TLVL. */
__IO uint32_t tlvl = (p_obj->p_instance->SR & TSPI_TX_REACH_FILL_LEVEL_MASK);
tlvl >>= 8;
/* FIFO Max = TRANSFER_FIFO_MAX_NUM */
if (tlvl > TRANSFER_FIFO_MAX_NUM)
{
tlvl = TRANSFER_FIFO_MAX_NUM;
}
/* Empty FIFO Num */
{
__IO uint32_t work = tlvl;
tlvl = (TRANSFER_FIFO_MAX_NUM - work);
}
/*--- TSPIxDR ---*/
/* Only the empty number of FIFO is a transmission data set. */
{
uint32_t i = 0;
TXZ_WorkState loopBreak = TXZ_BUSY;
/* Set data to FIFO. */
for (i=0; (i < tlvl) && (loopBreak == TXZ_BUSY); i++)
{
switch (p_obj->transmit.tx_allign)
{
case 8:
if (p_obj->transmit.info.tx8.num > p_obj->transmit.rp)
{
p_obj->p_instance->DR = ((uint32_t)*(p_obj->transmit.info.tx8.p_data + p_obj->transmit.rp) & (uint8_t)TSPI_DR_8BIT_MASK);
p_obj->transmit.rp += 1;
}
else
{
loopBreak = TXZ_DONE;
}
break;
case 16:
if (p_obj->transmit.info.tx16.num > p_obj->transmit.rp)
{
p_obj->p_instance->DR = ((uint32_t)*(p_obj->transmit.info.tx16.p_data + p_obj->transmit.rp) & mask[length]);
p_obj->transmit.rp += 1;
}
else
{
loopBreak = TXZ_DONE;
}
break;
case 32:
if (p_obj->transmit.info.tx32.num > p_obj->transmit.rp)
{
p_obj->p_instance->DR = ((uint32_t)*(p_obj->transmit.info.tx32.p_data + p_obj->transmit.rp) & mask[length]);
p_obj->transmit.rp += 1;
}
else
{
loopBreak = TXZ_DONE;
}
break;
default:
/* no process */
break;
}
}
}
}
/*------------------------------*/
/* Enable Transmit */
/*------------------------------*/
/*--- TSPIxTRANS ---*/
/* Write to TRXE(=1). */
/* Check if the TSPI is already enabled */
if((p_obj->p_instance->CR0 & TSPI_ENABLE) != TSPI_ENABLE)
{
p_obj->p_instance->CR0 |= TSPI_ENABLE;
}
/* Enable TSPI Transmission Control */
p_obj->p_instance->CR1 |= TSPI_TRXE_ENABLE;
return (result);
}
/*--------------------------------------------------*/
/**
* @brief Receive data. Non-Blocking Communication.
* @param p_obj :TSPI object.
* @param p_info :The information of receive buffer.
* @retval SUCCESS :Success.
* @retval FAILURE :Failure.
* @note Asynchronous Processing.
* @attention "p_info->rx8(or rx16).num" must be over FIFO max(Refer @ref TSPI_TxReachFillLevel) num.
* @attention This function is not available in interrupt.
*/
/*--------------------------------------------------*/
TXZ_Result tspi_master_receive(tspi_t *p_obj, tspi_receive_t *p_info)
{
TXZ_Result result = TXZ_SUCCESS;
uint32_t length = 0;
/*------------------------------*/
/* Parameter Check */
/*------------------------------*/
#ifdef DEBUG
/* Check the TSPI_NULL of address. */
assert_param(IS_POINTER_NOT_NULL(p_obj));
assert_param(IS_POINTER_NOT_NULL(p_obj->p_instance));
assert_param(IS_POINTER_NOT_NULL(p_info));
/* Check the parameter of transmit. */
if(p_obj->init.fmr0.fl == TSPI_DATA_LENGTH_8)
{
/* 8 bit */
assert_param(IS_POINTER_NOT_NULL(p_info->rx8.p_data));
}
else if ((p_obj->init.fmr0.fl > TSPI_DATA_LENGTH_8) && (p_obj->init.fmr0.fl < TSPI_DATA_LENGTH_17) )
{
/* 9 - 16 bit */
assert_param(IS_POINTER_NOT_NULL(p_info->rx16.p_data));
}
else
{
/* 17 - 32 bit */
assert_param(IS_POINTER_NOT_NULL(p_info->rx32.p_data));
}
#endif /* #ifdef DEBUG */
/*------------------------------*/
/* Disable Receive */
/*------------------------------*/
/*--- TSPIxTRANS ---*/
/* Write to TRXE(=0). */
//p_obj->p_instance->CR1 &= TSPI_TRXE_DISABLE_MASK;
/*------------------------------*/
/* Information Setting */
/*------------------------------*/
length = ((p_obj->p_instance->FMTR0 & TSPI_DATA_LENGTH_MASK) >> 24U);
if(length == DATA_LENGTH_8)
{
/* 8 bit */
p_obj->receive.info.rx8.p_data = p_info->rx8.p_data;
p_obj->receive.info.rx8.num = p_info->rx8.num;
p_obj->receive.rx_allign = 8;
}
else if ((length > DATA_LENGTH_8) && (length < DATA_LENGTH_17) )
{
/* 9 - 16 bit */
p_obj->receive.info.rx16.p_data = p_info->rx16.p_data;
p_obj->receive.info.rx16.num = p_info->rx16.num;
p_obj->receive.rx_allign = 16;
}
else
{
/* 17 - 32 bit */
p_obj->receive.info.rx32.p_data = p_info->rx32.p_data;
p_obj->receive.info.rx32.num = p_info->rx32.num;
p_obj->receive.rx_allign = 32;
}
/*------------------------------*/
/* Enable Receive */
/*------------------------------*/
/*--- TSPIxTRANS ---*/
/* Write to TRXE(=1). */
/* Check if the TSPI is already enabled */
if((p_obj->p_instance->CR0 & TSPI_ENABLE) != TSPI_ENABLE)
{
p_obj->p_instance->CR0 |= TSPI_ENABLE;
}
/* Enable TSPI Transmission Control */
p_obj->p_instance->CR1 |= TSPI_TRXE_ENABLE;
return (result);
}
/*--------------------------------------------------*/
/**
* @brief IRQ Handler for transmit.
* @param p_obj :TSPI object.
* @retval -
* @note -
*/
/*--------------------------------------------------*/
void tspi_irq_handler_transmit(tspi_t *p_obj)
{
__IO uint32_t status;
uint32_t length;
/*------------------------------*/
/* Parameter Check */
/*------------------------------*/
#ifdef DEBUG
/* Check the TSPI_NULL of address. */
assert_param(IS_POINTER_NOT_NULL(p_obj));
assert_param(IS_POINTER_NOT_NULL(p_obj->p_instance));
#endif /* #ifdef DEBUG */
/*------------------------------*/
/* Status Registar Control */
/*------------------------------*/
/* Read current TSPIxSR. */
status = p_obj->p_instance->SR;
/* Clear the transmit's end flag. */
/* Write to TXEND(=1), and TXFF(=1). */
//p_obj->p_instance->SR = (TSPI_TX_DONE_CLR | TSPI_TX_FIFO_INT_CLR);
/*------------------------------*/
/* Data length setting */
/*------------------------------*/
length = ((p_obj->p_instance->FMTR0 & TSPI_DATA_LENGTH_MASK) >> 24U);
/*------------------------------*/
/* Transmit Status Check */
/*------------------------------*/
/* Check the transmit's end flag. */
if (((status & TSPI_TX_DONE_FLAG ) == TSPI_TX_DONE) ||
((status & TSPI_TX_REACH_FILL_LEVEL_MASK) == p_obj->init.cnt2.til))
{
TXZ_WorkState txDone = TXZ_BUSY;
/* Read FIFO fill level. */
__IO uint32_t tlvl = (status & TSPI_TX_REACH_FILL_LEVEL_MASK);
tlvl >>= 8;
/* FIFO Max = TRANSFER_FIFO_MAX_NUM */
if (tlvl > TRANSFER_FIFO_MAX_NUM)
{
tlvl = TRANSFER_FIFO_MAX_NUM;
}
/* Get the empty num in FIFO. */
{
__IO uint32_t work = tlvl;
tlvl = (TRANSFER_FIFO_MAX_NUM - work);
}
if (tlvl == TRANSFER_FIFO_MAX_NUM)
{
if(length == DATA_LENGTH_8)
{
/* 8 bit */
p_obj->transmit.tx_allign = 8;
if (p_obj->transmit.info.tx8.num <= p_obj->transmit.rp)
{
txDone = TXZ_DONE;
}
}
else if ((length > DATA_LENGTH_8) && (length < DATA_LENGTH_17) )
{
/* 9 - 16 bit */
p_obj->transmit.tx_allign = 16;
if (p_obj->transmit.info.tx16.num <= p_obj->transmit.rp)
{
txDone = TXZ_DONE;
}
}
else
{
/* 17 - 32 bit */
p_obj->transmit.tx_allign = 32;
if (p_obj->transmit.info.tx32.num <= p_obj->transmit.rp)
{
txDone = TXZ_DONE;
}
}
}
if (txDone == TXZ_DONE)
{
/*=== Transmit Done!! ===*/
/*--- TSPIxTRANS ---*/
/* Write to TRXE(=0). */
p_obj->p_instance->CR1 &= TSPI_TRXE_DISABLE_MASK;
/*------------------------------*/
/* Call Handler */
/*------------------------------*/
if (p_obj->transmit.handler != TSPI_NULL)
{
/* Call the transmit handler with SUCCESS. */
p_obj->transmit.handler(p_obj->init.id, TXZ_SUCCESS);
}
}
else
{
/*=== Transmit Continue ===*/
/*------------------------------*/
/* Data Setting */
/*------------------------------*/
/* Only the empty number of FIFO is a transmission data set. */
uint32_t i = 0;
TXZ_WorkState loopBreak = TXZ_BUSY;
/* Set data to FIFO. */
for (i=0; (i < tlvl) && (loopBreak == TXZ_BUSY); i++)
{
switch (p_obj->transmit.tx_allign)
{
case 8:
if (p_obj->transmit.info.tx8.num > p_obj->transmit.rp)
{
p_obj->p_instance->DR = ((uint32_t)*(p_obj->transmit.info.tx8.p_data + p_obj->transmit.rp) & (uint8_t)TSPI_DR_8BIT_MASK);
p_obj->transmit.rp += 1;
}
else
{
loopBreak = TXZ_DONE;
}
break;
case 16:
if (p_obj->transmit.info.tx16.num > p_obj->transmit.rp)
{
p_obj->p_instance->DR = ((uint32_t)*(p_obj->transmit.info.tx16.p_data + p_obj->transmit.rp) & mask[length]);
p_obj->transmit.rp += 1;
}
else
{
loopBreak = TXZ_DONE;
}
break;
case 32:
if (p_obj->transmit.info.tx32.num > p_obj->transmit.rp)
{
p_obj->p_instance->DR = ((uint32_t)*(p_obj->transmit.info.tx32.p_data + p_obj->transmit.rp) & mask[length]);
p_obj->transmit.rp += 1;
}
else
{
loopBreak = TXZ_DONE;
}
break;
default:
/* no process */
break;
}
}
#if 0
/*------------------------------*/
/* Enable Transmit */
/*------------------------------*/
/*--- TSPIxTRANS ---*/
/* Write to TRXE(=1). */
/* Check if the TSPI is already enabled */
if((p_obj->p_instance->CR0 & TSPI_ENABLE) != TSPI_ENABLE)
{
p_obj->p_instance->CR0 |= TSPI_ENABLE;
}
/* Enable TSPI Transmission Control */
p_obj->p_instance->CR1 |= TSPI_TRXE_ENABLE;
#endif
}
}
}
/*--------------------------------------------------*/
/**
* @brief IRQ Handler for receive.
* @param p_obj :TSPI object.
* @retval -
* @note -
*/
/*--------------------------------------------------*/
void tspi_irq_handler_receive(tspi_t *p_obj)
{
__IO uint32_t status;
uint32_t length = 0;
/*------------------------------*/
/* Parameter Check */
/*------------------------------*/
#ifdef DEBUG
/* Check the TSPI_NULL of address. */
assert_param(IS_POINTER_NOT_NULL(p_obj));
assert_param(IS_POINTER_NOT_NULL(p_obj->p_instance));
#endif /* #ifdef DEBUG */
/*------------------------------*/
/* Status Registar Control */
/*------------------------------*/
/* Read current TSPIxSR. */
status = p_obj->p_instance->SR;
/* Clear the transmit's end flag. */
/* Write to RXEND(=1), and RXFF(=1). */
//p_obj->p_instance->SR = (TSPI_RX_DONE_CLR | TSPI_RX_FIFO_INT_CLR);
/*------------------------------*/
/* Data length setting */
/*------------------------------*/
length = ((p_obj->p_instance->FMTR0 & TSPI_DATA_LENGTH_MASK) >> 24);
if(length == DATA_LENGTH_8)
{
/* 8 bit */
p_obj->receive.rx_allign = 8;
}
else if ((length > DATA_LENGTH_8) && (length < DATA_LENGTH_17) )
{
/* 9 - 16 bit */
p_obj->receive.rx_allign = 16;
}
else
{
/* 17 - 32 bit */
p_obj->receive.rx_allign = 32;
}
/*------------------------------*/
/* Receive Status Check */
/*------------------------------*/
/* Check the receive's end flag. */
if (((status & TSPI_RX_DONE_FLAG ) == TSPI_RX_DONE) ||
((status & TSPI_RX_REACH_FILL_LEVEL_MASK) == p_obj->init.cnt2.ril))
{
/* Read FIFO fill level. */
__IO uint32_t rlvl = (status & TSPI_RX_REACH_FILL_LEVEL_MASK);
//__IO uint32_t rlvl = 7;
/* FIFO Max = RECEIVE_FIFO_MAX_NUM */
if (rlvl > RECEIVE_FIFO_MAX_NUM)
{
rlvl = RECEIVE_FIFO_MAX_NUM;
}
/*------------------------------*/
/* Data Read */
/*------------------------------*/
/* Read FIFO data. */
if (rlvl != 0)
{
uint32_t i;
for (i=0; i<rlvl; i++)
{
switch (p_obj->receive.rx_allign)
{
case 8:
*(p_obj->receive.info.rx8.p_data + i) = (uint8_t)(p_obj->p_instance->DR & (uint8_t)TSPI_DR_8BIT_MASK);
break;
case 16:
*(p_obj->receive.info.rx16.p_data + i) = (uint8_t)(p_obj->p_instance->DR & mask[length]);
break;
case 32:
*(p_obj->receive.info.rx32.p_data + i) = (uint8_t)(p_obj->p_instance->DR & mask[length]);
break;
default:
/* no process */
break;
}
}
/*------------------------------*/
/* Call Handler */
/*------------------------------*/
if (p_obj->receive.handler != TSPI_NULL)
{
tspi_receive_t param;
switch (p_obj->receive.rx_allign)
{
case 8:
param.rx8.p_data = p_obj->receive.info.rx8.p_data;
param.rx8.num = rlvl;
break;
case 16:
param.rx16.p_data = p_obj->receive.info.rx16.p_data;
param.rx16.num = rlvl;
break;
case 32:
param.rx32.p_data = p_obj->receive.info.rx32.p_data;
param.rx32.num = rlvl;
break;
default:
/* no process */
break;
}
/* Call the receive handler with SUCCESS. */
p_obj->receive.handler(p_obj->init.id, TXZ_SUCCESS, &param);
}
}
}
}
/*--------------------------------------------------*/
/**
* @brief IRQ Handler for error.
* @param p_obj :TSPI object.
* @retval -
* @note -
*/
/*--------------------------------------------------*/
void tspi_error_irq_handler(tspi_t *p_obj)
{
__IO uint32_t error;
/*------------------------------*/
/* Parameter Check */
/*------------------------------*/
#ifdef DEBUG
/* Check the TSPI_NULL of address. */
assert_param(IS_POINTER_NOT_NULL(p_obj));
assert_param(IS_POINTER_NOT_NULL(p_obj->p_instance));
#endif /* #ifdef DEBUG */
/*------------------------------*/
/* Error Registar Control */
/*------------------------------*/
/* Read current TSPIxERR. */
error = p_obj->p_instance->ERR;
/* Now, no clear the error flag. */
/*------------------------------*/
/* Error Check */
/*------------------------------*/
/*--- TSPIxERR ---*/
/* Check the transmit error. */
/* TRGERR */
if ((error & TSPI_TRGERR_MASK) == TSPI_TRGERR_ERR)
{
/*------------------------------*/
/* Disable Receive */
/*------------------------------*/
/*--- TSPIxTRANS ---*/
/* Write to TRXE(=0). */
p_obj->p_instance->CR1 &= TSPI_TRXE_DISABLE_MASK;
/*------------------------------*/
/* Call Handler */
/*------------------------------*/
if (p_obj->transmit.handler != TSPI_NULL)
{
/* Call the transmit handler with FAILURE. */
p_obj->transmit.handler(p_obj->init.id, TXZ_ERROR);
}
}
/* Check the receive error. */
{
TXZ_Result err = TXZ_SUCCESS;
/* UNDERERR */
if ((error & TSPI_UNDERRUN_MASK) == TSPI_UNDERRUN_ERR)
{
err = TXZ_ERROR;
}
/* OVRERR */
if ((error & TSPI_OVERRUN_MASK) == TSPI_OVERRUN_ERR)
{
err = TXZ_ERROR;
}
/* PERR */
if ((error & TSPI_PARITY_MASK) == TSPI_PARITY_ERR)
{
err = TXZ_ERROR;
}
if (err == TXZ_ERROR)
{
/*------------------------------*/
/* Receive Check */
/*------------------------------*/
/*------------------------------*/
/* Disable Receive */
/*------------------------------*/
/*--- TSPIxTRANS ---*/
/* Write to TRXE(=0). */
p_obj->p_instance->CR1 &= TSPI_TRXE_DISABLE_MASK;
/*------------------------------*/
/* Call Handler */
/*------------------------------*/
if (p_obj->receive.handler != TSPI_NULL)
{
/* Call the receive handler with FAILURE. */
p_obj->receive.handler(p_obj->init.id, TXZ_ERROR, TSPI_NULL);
}
}
}
}
/*--------------------------------------------------*/
/**
* @brief Data Format setting
* @param p_obj :TSPI object.
* @retval -
* @note When p_obj is NULL, no processing.
*/
/*--------------------------------------------------*/
TXZ_Result tspi_format(tspi_t *p_obj)
{
TXZ_Result result = TXZ_SUCCESS;
/* Check the parameters */
#ifdef DEBUG
/* Check the NULL of address. */
assert_param(IS_POINTER_NOT_NULL(p_obj));
/* Check the parameter of TTSPIxFMTR0 */
assert_param(check_param_data_direction(p_obj->init.fmr0.dir));
assert_param(check_param_frame_length(p_obj->init.fmr0.fl));
assert_param(check_param_frame_interval(p_obj->init.fmr0.fint));
assert_param(check_param_tspixcs3_imp(p_obj->init.fmr0.cs3pol));
assert_param(check_param_tspixcs2_imp(p_obj->init.fmr0.cs2pol));
assert_param(check_param_tspixcs1_imp(p_obj->init.fmr0.cs1pol));
assert_param(check_param_tspixcs0_imp(p_obj->init.fmr0.cs0pol));
assert_param(check_param_clock_edge_imp(p_obj->init.fmr0.ckpha));
assert_param(check_param_clock_idle_imp(p_obj->init.fmr0.ckpol));
assert_param(check_param_min_idle_time(p_obj->init.fmr0.csint));
assert_param(check_param_clock_delay(p_obj->init.fmr0.cssckdl));
assert_param(check_param_negate_delay(p_obj->init.fmr0.sckcsdl));
/* Check the parameter of TTSPIxFMTR1 */
assert_param(check_param_parity_enable(p_obj->init.fmr1.vpe));
assert_param(check_param_parity_bit(p_obj->init.fmr1.vpm));
#endif
/* Format control1 Register Set*/
p_obj->p_instance->FMTR1 = (p_obj->init.fmr1.vpm | p_obj->init.fmr1.vpe);
/* Format control0 Register Set */
p_obj->p_instance->FMTR0 = (p_obj->init.fmr0.ckpha | p_obj->init.fmr0.ckpol | p_obj->init.fmr0.cs0pol | p_obj->init.fmr0.cs1pol | \
p_obj->init.fmr0.cs2pol | p_obj->init.fmr0.cs3pol | p_obj->init.fmr0.csint | p_obj->init.fmr0.cssckdl | \
p_obj->init.fmr0.dir | p_obj->init.fmr0.fint | p_obj->init.fmr0.fl | p_obj->init.fmr0.sckcsdl );
return (result);
}
/*--------------------------------------------------*/
/**
* @brief Get status.
* @details Status bits.
* | Bit | Bit Symbol | Function |
* | :--- | :--- | :--- |
* | 31 | SUE | Setting Enable Flag. Use @ref TSPI_Status_Setting_flag. |
* | 30-24 | - | - |
* | 23 | TXRUN | Transmitting State Flag. Use @ref TSPI_TxState. |
* | 22 | TXEND | Transmitting Done Flag. Use @ref TSPI_TxDone. |
* | 21 | INTTXWF | Transmitting FIFO Interrpt Flag. Use @ref TSPI_TxFIFOInterruptFlag. |
* | 20 | TFEMP | Transmitting FIFO Empty Flag. Use @ref TSPI_TxFIFOEmptyFlag. |
* | 19-16 | TLVL | Current Transmitting FIFO Level. @ref TSPI_TxReachFillLevel. |
* | 15-8 | - | - |
* | 7 | RXRUN | Receive State Flag. Use @ref TSPI_RxState. |
* | 6 | RXEND | Receive Done Flag. Use @ref TSPI_RxDone. |
* | 5 | INTRXFF | Receiving FIFO Interrpt Flag. Use @ref TSPI_RxFIFOInterruptFlag. |
* | 4 | RXFLL | Receiving FIFO Full Flag. Use @ref TSPI_RxFIFOFullFlag |
* | 3-0 | RLVL | Current Receive FIFO Level. Use @ref TSPI_RxFIFOFullFlag |
*
* @param p_obj :TSPI object.
* @param p_status :Save area for status.
* @retval TXZ_SUCCESS :Success.
* @retval TXZ_ERROR :Failure.
* @note When p_obj is NULL, "Failure" is returned.
* @note When p_status is NULL, "Failure" is returned.
*/
/*--------------------------------------------------*/
TXZ_Result tspi_get_status(tspi_t *p_obj, uint32_t *p_status)
{
TXZ_Result result = TXZ_SUCCESS;
/* Check the parameters */
#ifdef DEBUG
/* Check the NULL of address. */
assert_param(IS_POINTER_NOT_NULL(p_obj));
#endif
/* Return TSPI state */
*p_status = p_obj->p_instance->SR;
if(p_status != TSPI_NULL){ return (result);}
else {
result = TXZ_ERROR;
return (result);
}
}
/*--------------------------------------------------*/
/**
* @brief Get error information.
* @details Error bits.
* | Bit | Bit Symbol | Function |
* | :--- | :--- | :--- |
* | 31-3 | - | - |
* | 2 | UDRERR | Overrun Error. Use @ref TSPI_UnderrunErr. |
* | 1 | OVRERR | Overrun Error. Use @ref TSPI_OverrunErr. |
* | 0 | PERR | Parity Error. Use @ref TSPI_ParityErr. |
*
* @param p_obj :TSPI object.
* @param p_error :Save area for error.
* @retval TXZ_SUCCESS :Success.
* @retval TXZ_ERROR :Failure.
* @note When p_obj is NULL, "Failure" is returned.
* @note When p_error is NULL, "Failure" is returned.
*/
/*--------------------------------------------------*/
TXZ_Result tspi_get_error(tspi_t *p_obj, uint32_t *p_error)
{
TXZ_Result result = TXZ_SUCCESS;
/* Check the parameters */
#ifdef DEBUG
/* Check the NULL of address. */
assert_param(IS_POINTER_NOT_NULL(p_obj));
#endif
/* Return TSPI ERROR */
*p_error = p_obj->p_instance->ERR;
return (result);
}
/*--------------------------------------------------*/
/**
* @brief Error information clear.
* @details Error bits.
* | Bit | Bit Symbol | Function |
* | :--- | :--- | :--- |
* | 31-3 | - | - |
* | 3 | TRGERR | Trigger Error. Use @ref TSPI_TRGErr. |
* | 2 | UDRERR | Overrun Error. Use @ref TSPI_UnderrunErr. |
* | 1 | OVRERR | Overrun Error. Use @ref TSPI_OverrunErr. |
* | 0 | PERR | Parity Error. Use @ref TSPI_ParityErr. |
*
* @param p_obj :TSPI object.
* @retval TXZ_SUCCESS :Success.
* @retval TXZ_ERROR :Failure.
* @note When p_obj is NULL, "Failure" is returned.
* @note When p_error is NULL, "Failure" is returned.
*/
/*--------------------------------------------------*/
TXZ_Result tspi_error_clear(tspi_t *p_obj)
{
TXZ_Result result = TXZ_SUCCESS;
/* Check the parameters */
#ifdef DEBUG
/* Check the NULL of address. */
assert_param(IS_POINTER_NOT_NULL(p_obj));
#endif
p_obj->p_instance->ERR = (TSPI_TRGERR_ERR | TSPI_UNDERRUN_ERR | TSPI_OVERRUN_ERR | TSPI_PARITY_ERR);
return (result);
}
/*--------------------------------------------------*/
/**
* @brief Discard transmit.
* @param p_obj :TSPI object.
* @retval TXZ_SUCCESS :Success.
* @retval TXZ_ERROR :Failure.
* @note This function clears transmit's fifo, end flag and error info.
* @attention This function is not available in interrupt.
* @attention Use after interrupt is disabled.
*/
/*--------------------------------------------------*/
TXZ_Result tspi_discard_transmit(tspi_t *p_obj)
{
TXZ_Result result = TXZ_SUCCESS;
/*------------------------------*/
/* Parameter Check */
/*------------------------------*/
#ifdef DEBUG
/* Check the TSPI_NULL of address. */
assert_param(IS_POINTER_NOT_NULL(p_obj));
assert_param(IS_POINTER_NOT_NULL(p_obj->p_instance));
#endif /* #ifdef DEBUG */
/*------------------------------*/
/* Disable Transfer */
/*------------------------------*/
/*--- TSPIxTRXE ---*/
p_obj->p_instance->CR1 &= TSPI_TRXE_DISABLE_MASK;
/*------------------------------*/
/* Refresh Setting */
/*------------------------------*/
/*--- TSPIxSR ---*/
/* Clear the transmit's end flag. */
/* Write to TXEND(=1), and TXFF(=1). */
p_obj->p_instance->SR = (TSPI_TX_DONE_CLR | TSPI_RX_DONE_CLR);
/*--- TSPIxFIFOCLR ---*/
/* Clear the transmit's FIFO. */
/* Write to TFCLR(=1). */
p_obj->p_instance->CR3 = (TSPI_TX_BUFF_CLR_DONE | TSPI_RX_BUFF_CLR_DONE);
/*--- TSPIxERR ---*/
/* Clear the trigger error flag. */
/* Write to TRGERR(=1). */
p_obj->p_instance->ERR = (TSPI_TRGERR_ERR );
/*------------------------------*/
/* Enable Transmit */
/*------------------------------*/
/*--- TSPIxTRANS ---*/
/* Write to TRXE(=1). */
/* Check if the TSPI is already enabled */
if((p_obj->p_instance->CR0 & TSPI_ENABLE) != TSPI_ENABLE)
{
p_obj->p_instance->CR0 |= TSPI_ENABLE;
}
/* Enable TSPI Transmission Control */
p_obj->p_instance->CR1 |= TSPI_TRXE_ENABLE;
return (result);
}
/*--------------------------------------------------*/
/**
* @brief Discard receive.
* @param p_obj :TSPI object.
* @retval TXZ_SUCCESS :Success.
* @retval TXZ_ERROR :Failure.
* @note This function clears receive's fifo, end flag and error info.
* @attention This function is not available in interrupt.
* @attention Use after interrupt is disabled.
*/
/*--------------------------------------------------*/
TXZ_Result tspi_discard_receive(tspi_t *p_obj)
{
TXZ_Result result = TXZ_SUCCESS;
/*------------------------------*/
/* Parameter Check */
/*------------------------------*/
#ifdef DEBUG
/* Check the TSPI_NULL of address. */
assert_param(IS_POINTER_NOT_NULL(p_obj));
assert_param(IS_POINTER_NOT_NULL(p_obj->p_instance));
#endif /* #ifdef DEBUG */
/*------------------------------*/
/* Disable Transfer */
/*------------------------------*/
/*--- TSPIxTRXE ---*/
p_obj->p_instance->CR1 &= TSPI_TRXE_DISABLE_MASK;
/*------------------------------*/
/* Refresh Setting */
/*------------------------------*/
/*------------------------------*/
/* Refresh Setting */
/*------------------------------*/
/*--- TSPIxSR ---*/
/* Clear the transmit's end flag. */
/* Write to TXEND(=1), and TXFF(=1). */
p_obj->p_instance->SR = (TSPI_TX_DONE_CLR | TSPI_RX_DONE_CLR);
/*--- TSPIxFIFOCLR ---*/
/* Clear the transmit's FIFO. */
/* Write to TFCLR(=1). */
p_obj->p_instance->CR3 = (TSPI_TX_BUFF_CLR_DONE | TSPI_RX_BUFF_CLR_DONE);
/*--- TSPIxERR ---*/
/* Clear the trigger error flag. */
/* Write to TRGERR(=1), UDRERR(=1), and OVRERR(=1), PERR(=1) */
p_obj->p_instance->ERR = (TSPI_TRGERR_ERR | TSPI_UNDERRUN_ERR |TSPI_OVERRUN_ERR | TSPI_PARITY_ERR );
/*------------------------------*/
/* Enable Transmit */
/*------------------------------*/
/*--- TSPIxTRANS ---*/
/* Write to TRXE(=1). */
/* Check if the TSPI is already enabled */
if((p_obj->p_instance->CR0 & TSPI_ENABLE) != TSPI_ENABLE)
{
p_obj->p_instance->CR0 |= TSPI_ENABLE;
}
/* Enable TSPI Transmission Control */
p_obj->p_instance->CR1 |= TSPI_TRXE_ENABLE;
return (result);
}
/**
* @}
*/ /* End of group TSPI_Exported_functions */
/**
* @}
*/ /* End of group TSPI */
/**
* @}
*/ /* End of group Periph_Driver */
#endif /* defined(__TSPI_H) */
#ifdef __cplusplus
}
#endif /* __cplusplus */