/**
*   @file    Spi.h
*   @implements Spi.h_Artifact
*   @version 1.0.0
*
*   @brief   AUTOSAR Spi - Spi driver header file.
*   @details AUTOSAR specific Spi driver header file.

*   @addtogroup [SPI_MODULE]
*   @{
*/
/*==================================================================================================
*   Project              : AUTOSAR 4.3 MCAL
*   Platform             : PA
*   Peripheral           : DSPI
*   Dependencies         : 
*
*   Autosar Version      : 4.3.1
*   Autosar Revision     : ASR_REL_4_3_REV_0001
*   Autosar Conf.Variant :
*   SW Version           : 1.0.0
*   Build Version        : MPC5777C_MCAL_1_0_0_RTM_ASR_REL_4_3_REV_0001_20190315
*
*   (c) Copyright 2006-2016 Freescale Semiconductor, Inc. 
*       Copyright 2017-2019 NXP
*   All Rights Reserved.
==================================================================================================*/
/*==================================================================================================
==================================================================================================*/

#ifndef SPI_H
#define SPI_H

#ifdef __cplusplus
extern "C"
{
#endif

/**
* @page misra_violations MISRA-C:2012 violations
*
* @section [global]
* Violates MISRA 2012 Required Rule 5.1, External identifiers shall be distinct. 
* The used compilers use more than 31 chars for identifiers.
*
* @section [global]
* Violates MISRA 2012 Required Rule 5.2, Identifiers declared in the same scope and name space shall be distinct. 
* The used compilers use more than 31 chars for identifiers.
*
* @section [global]
* Violates MISRA 2012 Required Rule 5.4, Macro identifiers shall be distinct. 
* The used compilers use more than 31 chars for identifiers.
*
* @section [global]
* Violates MISRA 2012 Required Rule 5.5, Identifiers shall be distinct from macro names.
* The used compilers use more than 31 chars for identifiers.
*
* @section Spi_h_REF_1
* Violates MISRA 2012 Required Directive 4.10,
* Precautions shall be taken in order to prevent the contents of a header file being included more than once.
* This violation is not fixed since the inclusion of <MA>_MemMap.h is as per AUTOSAR requirement [SWS_MemMap_00003].
*
* @section Spi_h_REF_2
* Violates MISRA 2012 Advisory Rule 8.9, An object should be defined at block scope if its identifier only appears in a single function.
* For generated configuration structures: This violation is due to exporting the externally configured initialization structure used by the "<MA>_Init" function.
*
* @section Spi_h_REF_3
* Violates MISRA 2012 Advisory Rule 2.5, A project should not contain unused macro declarations.
* Macros that are used in the code only in some configuration.
*
*/
/*==================================================================================================
*                                        INCLUDE FILES
* 1) system and project includes
* 2) needed interfaces from external units
* 3) internal and external interfaces from this unit
==================================================================================================*/

#include "Std_Types.h"
#include "Mcal.h"
#include "Spi_Cfg.h"
#include "Spi_IPW_Types.h"

/*==================================================================================================
*                              SOURCE FILE VERSION INFORMATION
==================================================================================================*/
/*
* @violates @ref Spi_h_REF_3 A project should not contain unused macro declarations.
* Macros that are used in the code only in some configuration. 
*/
#define SPI_VENDOR_ID                    43
/*
* @violates @ref Spi_h_REF_3 A project should not contain unused macro declarations.
* Macros that are used in the code only in some configuration. 
*/
#define SPI_MODULE_ID                    83
/*
* @violates @ref Spi_h_REF_3 A project should not contain unused macro declarations.
* Macros that are used in the code only in some configuration. 
*/
#define SPI_AR_RELEASE_MAJOR_VERSION     4
/*
* @violates @ref Spi_h_REF_3 A project should not contain unused macro declarations.
* Macros that are used in the code only in some configuration. 
*/
#define SPI_AR_RELEASE_MINOR_VERSION     3
/*
* @violates @ref Spi_h_REF_3 A project should not contain unused macro declarations.
* Macros that are used in the code only in some configuration. 
*/
#define SPI_AR_RELEASE_REVISION_VERSION  1
/*
* @violates @ref Spi_h_REF_3 A project should not contain unused macro declarations.
* Macros that are used in the code only in some configuration. 
*/
#define SPI_SW_MAJOR_VERSION             1
/*
* @violates @ref Spi_h_REF_3 A project should not contain unused macro declarations.
* Macros that are used in the code only in some configuration. 
*/
#define SPI_SW_MINOR_VERSION             0
/*
* @violates @ref Spi_h_REF_3 A project should not contain unused macro declarations.
* Macros that are used in the code only in some configuration. 
*/
#define SPI_SW_PATCH_VERSION             0
/*==================================================================================================
*                                     FILE VERSION CHECKS
==================================================================================================*/

/* Check if this header file and Spi_Cfg.h are of the same vendor */
#if (SPI_VENDOR_ID != SPI_VENDOR_ID_CFG)
    #error "Spi.h and Spi_Cfg.h have different vendor ids"
#endif

/* Check if this header file and Spi_IPW_Types.h are of the same vendor */
#if (SPI_VENDOR_ID != SPI_IPW_TYPES_VENDOR_ID)
    #error "Spi.h and Spi_IPW_Types.h have different vendor ids"
#endif

/* Check if source file and SPI header file are of the same Autosar version */
  #if ((SPI_AR_RELEASE_MAJOR_VERSION != SPI_AR_RELEASE_MAJOR_VERSION_CFG) || \
       (SPI_AR_RELEASE_MINOR_VERSION != SPI_AR_RELEASE_MINOR_VERSION_CFG) || \
       (SPI_AR_RELEASE_REVISION_VERSION != SPI_AR_RELEASE_REVISION_VERSION_CFG))
      #error "AutoSar Version Numbers of Spi.h and Spi_Cfg.h are different"
  #endif

  /* Check if current file and Spi_Cfg header file are of the same Software version */
#if ((SPI_SW_MAJOR_VERSION != SPI_SW_MAJOR_VERSION_CFG) || \
     (SPI_SW_MINOR_VERSION != SPI_SW_MINOR_VERSION_CFG) || \
     (SPI_SW_PATCH_VERSION != SPI_SW_PATCH_VERSION_CFG))
#error "Software Version Numbers of Spi.c and Spi_Cfg.h are different"
#endif

/* Check if current file and Spi_IPW_Types header file are of the same Autosar version */
#if ((SPI_AR_RELEASE_MAJOR_VERSION != SPI_IPW_TYPES_AR_RELEASE_MAJOR_VERSION) || \
     (SPI_AR_RELEASE_MINOR_VERSION != SPI_IPW_TYPES_AR_RELEASE_MINOR_VERSION) || \
     (SPI_AR_RELEASE_REVISION_VERSION != SPI_IPW_TYPES_AR_RELEASE_REVISION_VERSION))
#error "AutoSar Version Numbers of Spi.c and Spi_IPW_Types.h are different"
#endif

  /* Check if current file and Spi_IPW_Types header file are of the same Software version */
#if ((SPI_SW_MAJOR_VERSION != SPI_IPW_TYPES_SW_MAJOR_VERSION) || \
     (SPI_SW_MINOR_VERSION != SPI_IPW_TYPES_SW_MINOR_VERSION) || \
     (SPI_SW_PATCH_VERSION != SPI_IPW_TYPES_SW_PATCH_VERSION))
#error "Software Version Numbers of Spi.c and Spi_IPW_Types.h are different"
#endif

#ifndef DISABLE_MCAL_INTERMODULE_ASR_CHECK
    /* Check if current file and Std_Types header file are of the same Autosar version */
    #if ((SPI_AR_RELEASE_MAJOR_VERSION != STD_AR_RELEASE_MAJOR_VERSION) || \
         (SPI_AR_RELEASE_MINOR_VERSION != STD_AR_RELEASE_MINOR_VERSION))
    #error "AutoSar Version Numbers of Spi.h and Std_Types.h are different"
    #endif
    
    /* Check if current file and Mcal header file are of the same Autosar version */
    #if ((SPI_AR_RELEASE_MAJOR_VERSION != MCAL_AR_RELEASE_MAJOR_VERSION) || \
         (SPI_AR_RELEASE_MINOR_VERSION != MCAL_AR_RELEASE_MINOR_VERSION))
    #error "AutoSar Version Numbers of Spi.h and Mcal.h are different"
    #endif
#endif
/*==================================================================================================
*                                          CONSTANTS
==================================================================================================*/


/*==================================================================================================
*                                      DEFINES AND MACROS
==================================================================================================*/
/*
* @violates @ref Spi_h_REF_3 A project should not contain unused macro declarations.
* Macros that are used in the code only in some configuration. 
*/
#define SPI_PHYUNIT_SYNC_U32        ((uint32)1u)
/*
* @violates @ref Spi_h_REF_3 A project should not contain unused macro declarations.
* Macros that are used in the code only in some configuration. 
*/
#define SPI_PHYUNIT_ASYNC_U32       ((uint32)0u)

/* Error Values */
/**
* @brief API service called with wrong parameter.
*
* @implements Spi_ErrorCodes_define
*/
/*
* @violates @ref Spi_h_REF_3 A project should not contain unused macro declarations.
* Macros that are used in the code only in some configuration. 
*/
#define SPI_E_PARAM_CHANNEL       ((uint8)0x0Au)
/**
* @brief API service called with wrong parameter.
*
* @implements Spi_ErrorCodes_define
*/
/*
* @violates @ref Spi_h_REF_3 A project should not contain unused macro declarations.
* Macros that are used in the code only in some configuration. 
*/
#define SPI_E_PARAM_JOB           ((uint8)0x0Bu)
/**
* @brief API service called with wrong parameter.
*
* @implements Spi_ErrorCodes_define
*/
/*
* @violates @ref Spi_h_REF_3 A project should not contain unused macro declarations.
* Macros that are used in the code only in some configuration. 
*/
#define SPI_E_PARAM_SEQ           ((uint8)0x0Cu)
/**
* @brief API service called with wrong parameter.
*
* @implements Spi_ErrorCodes_define
*/
/*
* @violates @ref Spi_h_REF_3 A project should not contain unused macro declarations.
* Macros that are used in the code only in some configuration. 
*/
#define SPI_E_PARAM_LENGTH        ((uint8)0x0Du)
/**
* @brief API service called with wrong parameter.
*
* @implements Spi_ErrorCodes_define
*/
/*
* @violates @ref Spi_h_REF_3 A project should not contain unused macro declarations.
* Macros that are used in the code only in some configuration. 
*/
#define SPI_E_PARAM_UNIT          ((uint8)0x0Eu)
/**
* @brief API service used without module initialization.
*
* @implements Spi_ErrorCodes_define
*/
/*
* @violates @ref Spi_h_REF_3 A project should not contain unused macro declarations.
* Macros that are used in the code only in some configuration. 
*/
#define SPI_E_UNINIT              ((uint8)0x1Au)
/**
* @brief Services called in a wrong sequence.
*
* @implements Spi_ErrorCodes_define
*/
/*
* @violates @ref Spi_h_REF_3 A project should not contain unused macro declarations.
* Macros that are used in the code only in some configuration. 
*/
#define SPI_E_SEQ_PENDING         ((uint8)0x2Au)
/**
* @brief Synchronous transmission service called at wrong time.
*
* @implements Spi_ErrorCodes_define
*/
/*
* @violates @ref Spi_h_REF_3 A project should not contain unused macro declarations.
* Macros that are used in the code only in some configuration. 
*/
#define SPI_E_SEQ_IN_PROCESS      ((uint8)0x3Au)
/**
* @brief API SPI_Init service called while the SPI driver has already been initialized.
*
* @implements Spi_ErrorCodes_define
*/
/*
* @violates @ref Spi_h_REF_3 A project should not contain unused macro declarations.
* Macros that are used in the code only in some configuration. 
*/
#define SPI_E_ALREADY_INITIALIZED ((uint8)0x4Au)

/**
* @brief   The number of sequences, jobs or channels exceeds precompile time sizes.
* @details The number of sequences, jobs or channels in the configuration
*          exceeds precompile time related sizes:
*          SPI_MAX_SEQUENCE, SPI_MAX_JOB or SPI_MAX_CHANNEL.
*
* @implements Spi_ErrorCodes_define
*/
/*
* @violates @ref Spi_h_REF_3 A project should not contain unused macro declarations.
* Macros that are used in the code only in some configuration. 
*/
#define SPI_E_CONFIG_OUT_OF_RANGE ((uint8)0x5Au)

/**
* @brief   When a sequence contains uninitialized external buffers.
*
* @implements Spi_ErrorCodes_define
*/
/*
* @violates @ref Spi_h_REF_3 A project should not contain unused macro declarations.
* Macros that are used in the code only in some configuration. 
*/
#define SPI_E_PARAM_EB_UNIT       ((uint8)0x5Bu)

/**
* @brief   No job in sequence.
*
* @implements Spi_ErrorCodes_define
*/
/*
* @violates @ref Spi_h_REF_3 A project should not contain unused macro declarations.
* Macros that are used in the code only in some configuration. 
*/
#define SPI_E_SEQ_EMPTY           ((uint8)0x5Cu)

/**
* @brief   No channel in job.
*
* @implements Spi_ErrorCodes_define
*/
/*
* @violates @ref Spi_h_REF_3 A project should not contain unused macro declarations.
* Macros that are used in the code only in some configuration. 
*/
#define SPI_E_JOB_EMPTY           ((uint8)0x5Du)
/**
* @brief   If the parameter versioninfo is NULL_PTR.
*
* @implements Spi_ErrorCodes_define
*/
/*
* @violates @ref Spi_h_REF_3 A project should not contain unused macro declarations.
* Macros that are used in the code only in some configuration. 
*/
#define SPI_E_PARAM_POINTER           ((uint8)0x10u)

/**
* @brief   API service called with wrong parameter
*
* @implements Spi_ErrorCodes_define
*/
/*
* @violates @ref Spi_h_REF_3 A project should not contain unused macro declarations.
* Macros that are used in the code only in some configuration. 
*/
#define SPI_E_TSBJOB              ((uint8)0x5Eu)

/*
* @violates @ref Spi_h_REF_3 A project should not contain unused macro declarations.
* Macros that are used in the code only in some configuration. 
*/
#define SPI_CHANNEL_FLAG_TX_DEFAULT_U8 ((uint8) 0x01u)
/*
* @violates @ref Spi_h_REF_3 A project should not contain unused macro declarations.
* Macros that are used in the code only in some configuration. 
*/
#define SPI_CHANNEL_FLAG_RX_DISCARD_U8 ((uint8) 0x02u)


    /* Service IDs */
/**
* @brief API service ID for SPI Init function.
* @details Parameters used when raising an error or exception.
*
* @implements Spi_ServiceIds_Define
*/
/*
* @violates @ref Spi_h_REF_3 A project should not contain unused macro declarations.
* Macros that are used in the code only in some configuration. 
*/
#define SPI_INIT_ID              ((uint8) 0x00u)
/**
* @brief API service ID for SPI DeInit function.
* @details Parameters used when raising an error or exception.
*
* @implements Spi_ServiceIds_Define
*/
/*
* @violates @ref Spi_h_REF_3 A project should not contain unused macro declarations.
* Macros that are used in the code only in some configuration. 
*/
#define SPI_DEINIT_ID            ((uint8) 0x01u)
/**
* @brief API service ID for SPI write IB function.
* @details Parameters used when raising an error or exception.
*
* @implements Spi_ServiceIds_Define
*/
/*
* @violates @ref Spi_h_REF_3 A project should not contain unused macro declarations.
* Macros that are used in the code only in some configuration. 
*/
#define SPI_WRITEIB_ID           ((uint8) 0x02u)
/**
* @brief API service ID for SPI async transmit function.
* @details Parameters used when raising an error or exception.
*
* @implements Spi_ServiceIds_Define
*/
/*
* @violates @ref Spi_h_REF_3 A project should not contain unused macro declarations.
* Macros that are used in the code only in some configuration. 
*/
#define SPI_ASYNCTRANSMIT_ID     ((uint8) 0x03u)
/**
* @brief API service ID for SPI read IB function.
* @details Parameters used when raising an error or exception.
*
* @implements Spi_ServiceIds_Define
*/
/*
* @violates @ref Spi_h_REF_3 A project should not contain unused macro declarations.
* Macros that are used in the code only in some configuration. 
*/
#define SPI_READIB_ID            ((uint8) 0x04u)
/**
* @brief API service ID for SPI setup EB function.
* @details Parameters used when raising an error or exception.
*
* @implements Spi_ServiceIds_Define
*/
/*
* @violates @ref Spi_h_REF_3 A project should not contain unused macro declarations.
* Macros that are used in the code only in some configuration. 
*/
#define SPI_SETUPEB_ID           ((uint8) 0x05u)
/**
* @brief API service ID for SPI get status function.
* @details Parameters used when raising an error or exception.
*
* @implements Spi_ServiceIds_Define
*/
/*
* @violates @ref Spi_h_REF_3 A project should not contain unused macro declarations.
* Macros that are used in the code only in some configuration. 
*/
#define SPI_GETSTATUS_ID         ((uint8) 0x06u)
/**
* @brief API service ID for SPI get job result function.
* @details Parameters used when raising an error or exception.
*
* @implements Spi_ServiceIds_Define
*/
/*
* @violates @ref Spi_h_REF_3 A project should not contain unused macro declarations.
* Macros that are used in the code only in some configuration. 
*/
#define SPI_GETJOBRESULT_ID      ((uint8) 0x07u)
/**
* @brief API service ID for SPI get sequence result function.
* @details Parameters used when raising an error or exception.
*
* @implements Spi_ServiceIds_Define
*/
/*
* @violates @ref Spi_h_REF_3 A project should not contain unused macro declarations.
* Macros that are used in the code only in some configuration. 
*/
#define SPI_GETSEQUENCERESULT_ID ((uint8) 0x08u)
/**
* @brief API service ID for SPI get version info function.
* @details Parameters used when raising an error or exception.
*
* @implements Spi_ServiceIds_Define
*/
/*
* @violates @ref Spi_h_REF_3 A project should not contain unused macro declarations.
* Macros that are used in the code only in some configuration. 
*/
#define SPI_GETVERSIONINFO_ID    ((uint8) 0x09u)
/**
* @brief API service ID for SPI sync transmit function.
* @details Parameters used when raising an error or exception.
*
* @implements Spi_ServiceIds_Define
*/
/*
* @violates @ref Spi_h_REF_3 A project should not contain unused macro declarations.
* Macros that are used in the code only in some configuration. 
*/
#define SPI_SYNCTRANSMIT_ID      ((uint8) 0x0Au)
/**
* @brief API service ID for SPI get hwunit status function.
* @details Parameters used when raising an error or exception.
*
* @implements Spi_ServiceIds_Define
*/
/*
* @violates @ref Spi_h_REF_3 A project should not contain unused macro declarations.
* Macros that are used in the code only in some configuration. 
*/
#define SPI_GETHWUNITSTATUS_ID   ((uint8) 0x0Bu)
/**
* @brief API service ID for SPI cancel function.
* @details Parameters used when raising an error or exception.
*
* @implements Spi_ServiceIds_Define
*/
/*
* @violates @ref Spi_h_REF_3 A project should not contain unused macro declarations.
* Macros that are used in the code only in some configuration. 
*/
#define SPI_CANCEL_ID            ((uint8) 0x0Cu)
/**
* @brief API service ID for SPI set async mode function.
* @details Parameters used when raising an error or exception.
*
* @implements Spi_ServiceIds_Define
*/
/*
* @violates @ref Spi_h_REF_3 A project should not contain unused macro declarations.
* Macros that are used in the code only in some configuration. 
*/
#define SPI_SETASYNCMODE_ID      ((uint8) 0x0Du)
/**
* @brief API service ID for SPI main function
* @details Parameters used when raising an error or exception
*
* @implements Spi_ServiceIds_Define
*/
/*
* @violates @ref Spi_h_REF_3 A project should not contain unused macro declarations.
* Macros that are used in the code only in some configuration. 
*/
#define SPI_MAINFUNCTION_HANDLING_ID  ((uint8)0x10u)
/**
* @brief API service ID for SPI set HW Unit async mode.
* @details Parameters used when raising an error or exception.
*
* @implements Spi_ServiceIds_Define
*/
/*
* @violates @ref Spi_h_REF_3 A project should not contain unused macro declarations.
* Macros that are used in the code only in some configuration. 
*/
#define SPI_SETHWUNITASYNCMODE_ID  ((uint8)0x80u)
/**
* @brief API service ID for SPI Set Clock Mode.
* @details Parameters used when raising an error or exception.
*
* @implements Spi_ServiceIds_Define
*/
/*
* @violates @ref Spi_h_REF_3 A project should not contain unused macro declarations.
* Macros that are used in the code only in some configuration. 
*/
#define SPI_SETCLOCKMODE_ID  ((uint8)0x81u)
/**
* @brief API service ID for Timed Serial Bus Mode.
* @details Parameters used when raising an error or exception
*
* @implements Spi_ServiceIds_Define
*/
/*
* @violates @ref Spi_h_REF_3 A project should not contain unused macro declarations.
* Macros that are used in the code only in some configuration. 
*/
#define SPI_SETTSBMODE_ID  ((uint8)0x82u)

#if ((SPI_LEVEL_DELIVERED == LEVEL1) || (SPI_LEVEL_DELIVERED == LEVEL2))
/**
* @brief   The number of allowed job priority levels (0..3).
* @details The Priority has to be sint8.
*
*/
/*
* @violates @ref Spi_h_REF_3 A project should not contain unused macro declarations.
* Macros that are used in the code only in some configuration. 
*/
#define SPI_JOB_PRIORITY_LEVELS_COUNT    (4)
#endif /* ((SPI_LEVEL_DELIVERED == LEVEL1) || (SPI_LEVEL_DELIVERED == LEVEL2)) */

/*==================================================================================================
*                                            ENUMS
==================================================================================================*/
/**
* @brief   This type defines a range of specific status for SPI Driver.
*
* @implements Spi_StatusType_enumeration
*/
typedef enum
{
    SPI_UNINIT = 0,          /**< @brief Not initialized or not usable. */
    SPI_IDLE,                /**< @brief Not currently transmitting any jobs. */
    SPI_BUSY                 /**< @brief Is performing a SPI Job(transmit). */
} Spi_StatusType;

/**
* @brief   This type defines a range of specific Jobs status for SPI Driver.
*
* @implements Spi_JobResultType_enumeration
*/
typedef enum
{
    SPI_JOB_OK = 0,     /**< @brief The last transmission of the Job has been finished successfully. */
    SPI_JOB_PENDING,    /**< @brief The SPI handler/Driver is performing a SPI Job. */
    SPI_JOB_FAILED,     /**< @brief The last transmission of the Job has failed. */
    SPI_JOB_QUEUED      /**< @brief An asynchronous transmit Job has been accepted, while actual
                                     transmission for this Job has not started yet. */
} Spi_JobResultType;

/**
* @brief   This type defines a range of specific Sequences status for SPI Driver.
*
* @implements Spi_SeqResultType_enumeration
*/
typedef enum
{
    SPI_SEQ_OK = 0, /**< @brief The last transmission of the Sequence has been finished successfully. */
    SPI_SEQ_PENDING,         /**< @brief The SPI handler/Driver is performing a SPI Sequence. */
    SPI_SEQ_FAILED,          /**< @brief The last transmission of the Sequence has failed. */
    SPI_SEQ_CANCELLED   /**< @brief The last transmission of the Sequence has been cancelled by the user. */
} Spi_SeqResultType;

/**
* @brief   The enumeration containing the designated values for buffer types (internal or external).
*
*/
typedef enum
{
    IB = 0,
    EB
} Spi_BufferType;

/**
* @brief   Specifies the asynchronous mechanism mode for SPI buses handled asynchronously in Level 2
* @details #if (LEVEL2 == SPI_LEVEL_DELIVERED)
*            Specifies the asynchronous mechanism mode for SPI buses handled
*            asynchronously in LEVEL 2. SPI150: This type is available or not
*           according to the pre compile time parameter:
*            SPI_LEVEL_DELIVERED. This is only relevant for LEVEL 2.
*
* @implements Spi_AsyncModeType_enumeration
*/
typedef enum
{
    /* The asynchronous mechanism is ensured by polling, so interrupts
       related to SPI buses handled asynchronously are disabled. */
    SPI_POLLING_MODE = 0,
    /* The asynchronous mechanism is ensured by interrupt, so interrupts
       related to SPI buses handled asynchronously are enabled. */
    SPI_INTERRUPT_MODE
} Spi_AsyncModeType;

#if (SPI_DUAL_CLOCK_MODE == STD_ON)
/**
* @brief   Specifies the Clock Modes.
*
* @implements Spi_DualClockMode_enumeration
*/
typedef enum
{
    SPI_NORMAL = 0,        /**< @brief Clock reference is from SpiClockRef. */
    SPI_ALTERNATE          /**< @brief Clock reference is from SpiAlternateClockRef. */
}Spi_DualClockModeType;
#endif

/**
* @brief   Specifies the operation mode (Master or Slave).
*
* @implements Spi_ModeType_enumeration
*/
typedef enum
{
    SPI_MASTER = 0,        /**< @brief SPI Hardware selected as MASTER. */
    SPI_SLAVE          /**< @brief SPI Hardware selected as SLAVE. */
}Spi_ModeType;
/*==================================================================================================
*                                STRUCTURES AND OTHER TYPEDEFS
==================================================================================================*/

/*---------------------------------------------------------------------------
*                 SPI Driver AUTOSAR Related Type Definitions
-----------------------------------------------------------------------------*/
/**
* @brief   Type of application data buffer elements.
*/
/**
* @implements Spi_DataBufferType_typedef
*/
    typedef uint8 Spi_DataBufferType;

/**
* @brief   Type for defining the number of data elements of the type Spi_DataBufferType.
* @details Type for defining the number of data elements of the type Spi_DataBufferType
*          to send or receive by Channel.
*
* @implements Spi_NumberOfDataType_typedef
*/
typedef uint16 Spi_NumberOfDataType;

#if (SPI_ALLOW_BIGSIZE_COLLECTIONS == STD_ON)

/**
* @brief   Specifies the identification (ID) for a Channel.
*
* @implements Spi_ChannelType_typedef
*/
typedef uint32 Spi_ChannelType;

/**
* @brief   Specifies the identification (ID) for a Job.
*
* @implements Spi_JobType_typedef
*/
typedef uint32 Spi_JobType;

/**
* @brief   Specifies the identification (ID) for a sequence of jobs.
*
* @implements Spi_SequenceType_typedef
*/
typedef uint32 Spi_SequenceType;
#else

/**
* @brief   Specifies the identification (ID) for a Channel.
*
* @implements Spi_ChannelType_typedef
*/
typedef uint8 Spi_ChannelType;

/**
* @brief   Specifies the identification (ID) for a Job.
*
* @implements Spi_JobType_typedef.
*/
typedef uint16 Spi_JobType;

/**
* @brief   Specifies the identification (ID) for a sequence of jobs.
*
* @implements Spi_SequenceType_typedef.
*/
typedef uint8 Spi_SequenceType;
#endif

/**
* @brief     Specifies the ID for a SPI Hardware microcontroller peripheral unit.
* @details  This type is used for specifying the identification (ID) for a SPI
*            Hardware microcontroller peripheral unit.
*
* @implements Spi_HWUnitType_typedef
*/
typedef uint8 Spi_HWUnitType;

/**
* @brief     Contains the ID of an external device.
* @details  This contains the identification (ID) of the external device for which
*            there's a collection of particular settings
*
*/
typedef uint8 Spi_ExternalDeviceType;

typedef void (Spi_NotifyType) (void);

#ifdef SPI_SLAVE_HIGH_SPEED_SUPPORT
#if(SPI_SLAVE_HIGH_SPEED_SUPPORT == STD_ON)
#if ((SPI_DMA_USED == STD_ON) && \
    ((SPI_LEVEL_DELIVERED == LEVEL1) || (SPI_LEVEL_DELIVERED == LEVEL2)))
typedef void (Spi_HPNotifyType) (Spi_NumberOfDataType FrameCnt);
#endif /* ((SPI_DMA_USED == STD_ON) && ((SPI_LEVEL_DELIVERED == LEVEL1) || (SPI_LEVEL_DELIVERED == LEVEL2))) */
#endif /* SPI_SLAVE_HIGH_SPEED_SUPPORT == STD_ON */
#endif /* SPI_SLAVE_HIGH_SPEED_SUPPORT */

/**
* @brief   This structure contains all the needed data to configure one SPI Sequence.
*
* @implements Spi_SequenceConfigType_struct
*/
typedef struct
{
    /**< @brief Define HWUnit type of sequense */
    VAR(uint8, SPI_VAR) u8HWtypeOfSequence;
    /**< @brief Number of jobs in the sequence. */
    VAR(Spi_JobType, SPI_VAR) NumJobs;
    /**< @brief Job index list. */
    P2CONST(Spi_JobType, SPI_VAR, SPI_APPL_CONST) pcJobIndexList;
    /**< @brief Job notification handler. */
    P2FUNC(Spi_NotifyType, SPI_VAR, pfEndNotification);
#ifdef SPI_SLAVE_HIGH_SPEED_SUPPORT
#if(SPI_SLAVE_HIGH_SPEED_SUPPORT == STD_ON)
#if ((SPI_DMA_USED == STD_ON) && \
    ((SPI_LEVEL_DELIVERED == LEVEL1) || (SPI_LEVEL_DELIVERED == LEVEL2)))
    /**< @brief Job notification handler in High Speed Slave mode. */
    P2FUNC(Spi_HPNotifyType, SPI_VAR, pfHPEndNotification);
#endif /* ((SPI_DMA_USED == STD_ON) && ((SPI_LEVEL_DELIVERED == LEVEL1) || (SPI_LEVEL_DELIVERED == LEVEL2))) */
#endif /* SPI_SLAVE_HIGH_SPEED_SUPPORT == STD_ON */
#endif /* SPI_SLAVE_HIGH_SPEED_SUPPORT */    
    /**< @brief Boolean indicating if the Sequence is interruptible or not. */
    VAR(uint8, SPI_VAR) u8Interruptible;
} Spi_SequenceConfigType;

/**
* @brief   Internal structure used to manage the sequence state.
*
* @implements Spi_SequenceStateType_struct
*/
typedef struct
{
    VAR(Spi_SeqResultType, SPI_VAR) Result;             /**< @brief Seq Result. */
#if ((SPI_LEVEL_DELIVERED == LEVEL1) || (SPI_LEVEL_DELIVERED == LEVEL2))
    /**< @brief Pointer to the configuration. */
    P2CONST(Spi_SequenceConfigType, SPI_VAR, SPI_APPL_CONST) pcSequence;
    /**< @brief Position in JobIndexList to the job in transmission of an async sequence. */
    P2CONST(Spi_JobType, SPI_VAR, SPI_APPL_CONST) pcCurrentJobIndexPointer;
    /**< @brief Number of jobs in a pending async sequence, not yet transmitted. */
    VAR(Spi_JobType, SPI_VAR) RemainingJobs;
#endif
} Spi_SequenceStateType;

/**
* @brief   Internal structure used to manage the job state.
*
*/
typedef struct
{
    VAR(Spi_JobResultType, SPI_VAR) Result;             /**< @brief Job Result. */

#if ((SPI_LEVEL_DELIVERED == LEVEL1) || (SPI_LEVEL_DELIVERED == LEVEL2))
    /**< @brief Pointer to the state information of the async sequence. */
    P2VAR(Spi_SequenceStateType, SPI_VAR, SPI_APPL_DATA) pAsyncCrtSequenceState;
    /**< @brief Pointer to the next async job planned for transmission. */
    VAR(Spi_JobType, SPI_VAR) AsyncNextJob;
#endif
} Spi_JobStateType;

/**
* @brief   This is the structure containing all the parameters needed to completely define a Job.
*
* @implements Spi_JobConfigType_struct
*/
typedef struct
{
    /**< @brief Number of channels in the job. */
    VAR(Spi_ChannelType, SPI_VAR) NumChannels;
    /**< @brief Channel index list. */
    P2CONST(Spi_ChannelType, SPI_VAR, SPI_APPL_CONST) pcChannelIndexList;
    /**< @brief Job end notification. */
    P2FUNC(Spi_NotifyType, SPI_VAR, pfEndNotification);
    /**< @brief Job start notification. */
    P2FUNC(Spi_NotifyType, SPI_VAR, pfStartNotification);
    /**< @brief Priority. */
    VAR(sint8, SPI_VAR) s8Priority;
    /**< @brief Implementation specific field referencing the channel internal state. */
    P2VAR(Spi_JobStateType, SPI_VAR, SPI_APPL_DATA) pJobState;
    /**< @brief HWUnit. */
    VAR(Spi_HWUnitType, SPI_VAR) HWUnit;
    /**< @brief HW Unit offset. */
    VAR(uint32, SPI_VAR) u32HWoffset;
    /**< @brief ExternalDevice. */
    VAR(Spi_ExternalDeviceType, SPI_VAR) ExternalDevice;
    /**< @brief Implementation specific field: cached LLD device attributes. */
    P2CONST(Spi_Ipw_DeviceAttributesConfigType, SPI_VAR, SPI_APPL_CONST) ExternalDeviceAttrs;
} Spi_JobConfigType;

/**
* @brief   The structure contains the pointers to the Tx/Rx memory locations for the given buffer (IB or EB).
*
*/
typedef struct
{
    /**< @brief Transmit buffer pointer. */
    P2VAR(Spi_DataBufferType, SPI_VAR, SPI_APPL_DATA) pBufferTX;
    /**< @brief Receive buffer pointer. */
    P2VAR(Spi_DataBufferType, SPI_VAR, SPI_APPL_DATA) pBufferRX;
} Spi_BufferDescriptorType;

/**
* @brief   Internal structure used to manage the channel state.
*
*/
typedef struct
{
    VAR(uint8, SPI_VAR) u8Flags;                 /**< @brief Default Transmit Enabled. */
    VAR(Spi_NumberOfDataType, SPI_VAR) Length; /**< @brief Actual Transfer size for EB. */
} Spi_ChannelStateType;

/**
* @brief   The structure contains the channel configuration parameters.
*
* @implements Spi_ChannelConfigType_struct
*/
typedef struct
{
    /**< @brief Buffer Type IB/EB. */
    VAR(Spi_BufferType, SPI_VAR) BufferType;
    /**< @brief Default Transmit Value. */
    VAR(uint32, SPI_VAR) u32DefaultTransmitValue;
    /**< @brief Data length. */
    VAR(Spi_NumberOfDataType, SPI_VAR) Length;
    /**< @brief Buffer Descriptor. */
    P2VAR(Spi_BufferDescriptorType, SPI_VAR, SPI_APPL_DATA) pcBufferDescriptor;
    /**< @brief Implementation specific field referencing the channel internal state. */
    P2VAR(Spi_ChannelStateType, SPI_VAR, SPI_APPL_DATA) pChannelState;
#ifdef SPI_SLAVE_HIGH_SPEED_SUPPORT
#if(SPI_SLAVE_HIGH_SPEED_SUPPORT == STD_ON)
#if ((SPI_DMA_USED == STD_ON) && \
    ((SPI_LEVEL_DELIVERED == LEVEL1) || (SPI_LEVEL_DELIVERED == LEVEL2)))
    VAR(Spi_NumberOfDataType, SPI_VAR) FrameCnt; /**< @brief Total frame can be stored in EB buffer. */
#endif /* ((SPI_DMA_USED == STD_ON) && ((SPI_LEVEL_DELIVERED == LEVEL1) || (SPI_LEVEL_DELIVERED == LEVEL2))) */
#endif /* SPI_SLAVE_HIGH_SPEED_SUPPORT == STD_ON */
#endif /* SPI_SLAVE_HIGH_SPEED_SUPPORT */     
} Spi_ChannelConfigType;

/*---------------------------------------------------------------------------
*             SPI Driver Low Level Implementation Specific Type Definitions
-----------------------------------------------------------------------------*/

/**
* @brief   This structure holds the HWUnit configuration parameters.
*
* @implements Spi_HWUnitConfigType_struct
*/
typedef struct
{
    /**< @brief DSPI HWunit physical offset on SOC. */
    VAR(uint8, SPI_VAR) u8Offset;
    /**< @brief Define HWUnit type */
    VAR(uint8, SPI_VAR) u8HWtype;
    /**< @brief Indicates the number of CTAR registers available for the DSPI module. */
    VAR(uint8, SPI_VAR) u8NrOfCTAR;
    /**< @brief Slave Mode - enabled  */
    VAR(Spi_ModeType, SPI_VAR) eSpiPhyUnitMode;
    /**< @brief Indicates if the HW unit is configured as Sync or Async. */
    VAR(uint32, SPI_VAR) u32IsSync;
#if ((SPI_LEVEL_DELIVERED == LEVEL1) || (SPI_LEVEL_DELIVERED == LEVEL2))
#if (SPI_DMA_USED == STD_ON)
    /**< @brief Boolean flag indicating if DMA will be used or not for this DSPI unit. */
    VAR(uint16, SPI_VAR) u16UseDma;
    /**< @brief Master TX DMA channel - enabled by the DSPI TX source. */
    VAR(uint8, SPI_VAR) u8TxDmaChannel;
    /**< @brief Auxiliary TX DMA channel - triggered by the master TX Dma. */
    VAR(uint8, SPI_VAR) u8TxDmaChannelAux;
    /**< @brief RX DMA channel - enabled by the DSPI RX source. */
    VAR(uint8, SPI_VAR) u8RxDmaChannel;
#endif
#endif
#ifdef SPI_FLEXIO_USED
#if (SPI_FLEXIO_USED == STD_ON)
    /**< @brief FlexIO TX */
    VAR(uint8, SPI_VAR) u8spiFlexIO_TX;
    /**< @brief FlexIO RX */
    VAR(uint8, SPI_VAR) u8spiFlexIO_RX;
    /**< @brief FlexIO Clock */
    VAR(uint8, SPI_VAR) u8spiFlexIO_CLK;
    /**< @brief FlexIO Chip Select */
    VAR(uint8, SPI_VAR) u8spiFlexIO_CS;
#endif
#endif
} Spi_HWUnitConfigType;


#ifdef TSB_MODE_SUPPORTED
#if (SPI_TSB_MODE == STD_ON)

/**
* @brief   This structure holds the TSB configuration parameters.
*
*/
typedef struct
{
    /**< @brief JobId of the configured TSB job. */
    VAR(Spi_JobType, SPI_VAR) Spi_TSB_Job;
    /**< @brief This structure holds the TSB mode selection on HWUnits. */
    VAR(Spi_Ipw_TSBAttributesConfigType, SPI_VAR) ExternalDeviceTSBAttrs;
} Spi_TSBConfigType;
#endif
#endif

/*---------------------------------------------------------------------------
*             SPI Driver Configuration Main Structure
-----------------------------------------------------------------------------*/
/**
* @brief   This is the top level structure containing all the 
*          needed parameters for the SPI Handler Driver.
*
* @implements Spi_ConfigType_struct
*/
typedef struct
{
    /**< @brief Number of external devices defined in the configuration. */
    VAR(uint16, SPI_VAR) u16MaxExternalDevice;
    /**< @brief Number of channels defined in the configuration. */
    VAR(Spi_ChannelType, SPI_VAR) Spi_Max_Channel;
    /**< @brief Number of jobs defined in the configuration. */
    VAR(Spi_JobType, SPI_VAR) Spi_Max_Job;
    /**< @brief Number of sequences defined in the configuration. */
    VAR(Spi_SequenceType, SPI_VAR) Spi_Max_Sequence;
    /**< @brief Pointer to Array of channels defined in the configuration. */
    P2CONST(Spi_ChannelConfigType, SPI_VAR, SPI_APPL_CONST) pcChannelConfig;
    /**< @brief Pointer to Array of jobs defined in the configuration. */
    P2CONST(Spi_JobConfigType, SPI_VAR, SPI_APPL_CONST) pcJobConfig;
    /**< @brief Pointer to Array of sequences defined in the configuration. */
    P2CONST(Spi_SequenceConfigType, SPI_VAR, SPI_APPL_CONST) pcSequenceConfig;
    /**< @brief Channel & DSPI HW unit attributes. */
    P2CONST(Spi_AttributesConfigType, SPI_VAR, SPI_APPL_CONST) pcAttributesConfig;
    /**< @brief Pointer to Array of LLD DSPI device instances. */
    P2CONST(Spi_HWUnitConfigType, SPI_VAR, SPI_APPL_CONST) pcHWUnitConfig;
    /** 
     * @brief SPI Driver DEM Error: SPI_E_HARDWARE_ERROR
     *
     */
#if (SPI_DISABLE_DEM_REPORT_ERROR_STATUS == STD_OFF)
    CONST(Mcal_DemErrorType, SPI_CONST) Spi_E_Hardware_ErrorCfg;
#endif
    /**< @brief Array of SPI TSB Jobs. */
#ifdef TSB_MODE_SUPPORTED
#if (SPI_TSB_MODE == STD_ON)
    P2CONST(Spi_TSBConfigType, SPI_VAR, SPI_APPL_CONST) pcJobTSBConfig;
#endif
#endif
} Spi_ConfigType;

/*==================================================================================================
*                                GLOBAL VARIABLE DECLARATIONS
==================================================================================================*/

#define SPI_START_SEC_VAR_INIT_UNSPECIFIED
/*
* @violates @ref Spi_h_REF_1 Precautions shall be taken in order to prevent
* the contents of a header file being included more than once.
*/
#include "Spi_MemMap.h"

extern P2CONST(Spi_ConfigType, SPI_VAR, SPI_APPL_CONST) Spi_pcSpiConfigPtr;

#define SPI_STOP_SEC_VAR_INIT_UNSPECIFIED
/*
* @violates @ref Spi_h_REF_1 Precautions shall be taken in order to prevent
* the contents of a header file being included more than once.
*/
#include "Spi_MemMap.h"


#define SPI_START_SEC_VAR_NO_INIT_UNSPECIFIED
/*
* @violates @ref Spi_h_REF_1 Precautions shall be taken in order to prevent
* the contents of a header file being included more than once.
*/
#include "Spi_MemMap.h"

/**
* @brief Spi State
*/
extern VAR(Spi_JobStateType, SPI_VAR) Spi_aSpiJobState[SPI_MAX_JOB];
extern VAR(Spi_ChannelStateType, SPI_VAR) Spi_aSpiChannelState[SPI_MAX_CHANNEL];
extern VAR(Spi_SequenceStateType, SPI_VAR) Spi_aSpiSequenceState[SPI_MAX_SEQUENCE];

#define SPI_STOP_SEC_VAR_NO_INIT_UNSPECIFIED
/*
* @violates @ref Spi_h_REF_1 Precautions shall be taken in order to prevent
* the contents of a header file being included more than once.
*/
#include "Spi_MemMap.h"


#define SPI_START_SEC_CONFIG_DATA_UNSPECIFIED
/*
* @violates @ref Spi_h_REF_1 Precautions shall be taken in order to prevent
* the contents of a header file being included more than once.
*/
#include "Spi_MemMap.h"
 
#if (SPI_PRECOMPILE_SUPPORT == STD_ON)
/*
* @violates @ref Spi_h_REF_2 An object should be defined at block scope if its identifier only 
*  appears in a single function.
*/
extern CONST(Spi_ConfigType, SPI_CONST) Spi_PBCfgVariantPredefined;
#else
SPI_CONF_PB
#endif

#define SPI_STOP_SEC_CONFIG_DATA_UNSPECIFIED
/*
* @violates @ref Spi_h_REF_1 Precautions shall be taken in order to prevent
* the contents of a header file being included more than once.
*/
#include "Spi_MemMap.h"

/*==================================================================================================
*                                    FUNCTION PROTOTYPES
==================================================================================================*/
#define SPI_START_SEC_CODE
/*
* @violates @ref Spi_h_REF_1 Precautions shall be taken in order to prevent
* the contents of a header file being included more than once.
*/
#include "Spi_MemMap.h"

/**
* @brief   End Job transmission notification handler declaration.
* @details The function (global) is implemented in Spi.c (Autosar Driver Layer).
*
* @param[in]    pJobConfig   The just transmitted job pointer.
*/
#if ((LEVEL2 == SPI_LEVEL_DELIVERED) || (LEVEL1 == SPI_LEVEL_DELIVERED))
extern FUNC (void, SPI_CODE) Spi_JobTransferFinished
    (
        P2CONST(Spi_JobConfigType, AUTOMATIC, SPI_APPL_CONST) pcJobConfig
    );
#endif

#if (SPI_VERSION_INFO_API == STD_ON)
FUNC (void, SPI_CODE) Spi_GetVersionInfo
    (
        P2VAR(Std_VersionInfoType, AUTOMATIC, SPI_APPL_DATA) versioninfo
    );
#endif

FUNC (void, SPI_CODE) Spi_Init
    (
        P2CONST(Spi_ConfigType, AUTOMATIC, SPI_APPL_CONST) ConfigPtr
    );

FUNC (Std_ReturnType, SPI_CODE) Spi_DeInit(void);

#if ((USAGE0 == SPI_CHANNEL_BUFFERS_ALLOWED) || (USAGE2 == SPI_CHANNEL_BUFFERS_ALLOWED ))
FUNC (Std_ReturnType, SPI_CODE) Spi_WriteIB
    (
        VAR(Spi_ChannelType, AUTOMATIC) Channel,
        P2CONST(Spi_DataBufferType, AUTOMATIC, SPI_APPL_CONST) DataBufferPtr
    );

FUNC (Std_ReturnType, SPI_CODE) Spi_ReadIB
    (
        VAR(Spi_ChannelType, AUTOMATIC) Channel,
        P2VAR(Spi_DataBufferType, AUTOMATIC, SPI_APPL_DATA) DataBufferPointer
    );
#endif

#if ((LEVEL2 == SPI_LEVEL_DELIVERED) || (LEVEL1 == SPI_LEVEL_DELIVERED))
FUNC (Std_ReturnType, SPI_CODE) Spi_AsyncTransmit
    (
        VAR(Spi_SequenceType, AUTOMATIC) Sequence
    );
#endif

#if ( ( USAGE1 == SPI_CHANNEL_BUFFERS_ALLOWED) || \
        ( USAGE2 == SPI_CHANNEL_BUFFERS_ALLOWED)  )
FUNC (Std_ReturnType, SPI_CODE) Spi_SetupEB
    (
        VAR(Spi_ChannelType, AUTOMATIC) Channel,
        P2CONST(Spi_DataBufferType, AUTOMATIC, SPI_APPL_CONST) SrcDataBufferPtr,
        P2VAR(Spi_DataBufferType, AUTOMATIC, SPI_APPL_DATA) DesDataBufferPtr,
        VAR(Spi_NumberOfDataType, AUTOMATIC) Length
    );
#endif

FUNC (Spi_StatusType, SPI_CODE) Spi_GetStatus(void);

FUNC (Spi_JobResultType, SPI_CODE) Spi_GetJobResult
    (
        VAR(Spi_JobType, AUTOMATIC) Job
    );

FUNC (Spi_SeqResultType, SPI_CODE) Spi_GetSequenceResult
    (
        VAR(Spi_SequenceType, AUTOMATIC) Sequence
    );

#if ((LEVEL2 == SPI_LEVEL_DELIVERED) || (LEVEL0 == SPI_LEVEL_DELIVERED))
FUNC (Std_ReturnType, SPI_CODE) Spi_SyncTransmit
    (
        VAR(Spi_SequenceType, AUTOMATIC) Sequence
    );
#endif

#if (SPI_HW_STATUS_API == STD_ON)
FUNC (Spi_StatusType, SPI_CODE) Spi_GetHWUnitStatus
    (
        VAR(Spi_HWUnitType, AUTOMATIC) HWUnit
    );
#endif

#if (SPI_CANCEL_API == STD_ON)
FUNC (void, SPI_CODE) Spi_Cancel
    (
        VAR(Spi_SequenceType, AUTOMATIC) Sequence
    );
#endif

#if (SPI_LEVEL_DELIVERED == LEVEL2)
FUNC (Std_ReturnType, SPI_CODE) Spi_SetAsyncMode
    (
        VAR(Spi_AsyncModeType, AUTOMATIC) AsyncMode
    );
#endif

#if ((SPI_LEVEL_DELIVERED == LEVEL2) && (SPI_HWUNIT_ASYNC_MODE == STD_ON))
FUNC (Std_ReturnType, SPI_CODE) Spi_SetHWUnitAsyncMode
    (
        VAR(Spi_HWUnitType, AUTOMATIC) HWUnit,
        VAR(Spi_AsyncModeType, AUTOMATIC) AsyncMode
    );
#endif /* (SPI_LEVEL_DELIVERED == LEVEL2) && (SPI_HWUNIT_ASYNC_MODE == STD_ON) */

#if (SPI_DUAL_CLOCK_MODE == STD_ON)

FUNC (Std_ReturnType, SPI_CODE) Spi_SetClockMode
    (
        VAR(Spi_DualClockModeType,AUTOMATIC) ClockMode
    );
#endif

#if ((SPI_LEVEL_DELIVERED == LEVEL1) || (SPI_LEVEL_DELIVERED == LEVEL2))
FUNC (void, SPI_CODE) Spi_MainFunction_Handling(void);
#endif

#ifdef TSB_MODE_SUPPORTED
#if (SPI_TSB_MODE == STD_ON)

FUNC (Std_ReturnType, SPI_CODE) Spi_TSBStart
    (
        VAR(Spi_JobType, AUTOMATIC) TSBJob
    );

FUNC (Std_ReturnType, SPI_CODE) Spi_TSBStop
    (
        VAR(Spi_JobType, AUTOMATIC) TSBJob
    );

FUNC (Std_ReturnType, SPI_CODE) Spi_TSB_ASDR_DataUpdate
    (
        VAR(Spi_JobType, AUTOMATIC) TSBJob,
        P2CONST(uint32, AUTOMATIC,SPI_APPL_DATA) pcASDR_Data
    );

#endif /*(SPI_TSB_MODE == STD_ON)*/
#endif /*TSB_MODE_SUPPORTED*/

#define SPI_STOP_SEC_CODE
/*
* @violates @ref Spi_h_REF_1 Precautions shall be taken in order to prevent
* the contents of a header file being included more than once.
*/
#include "Spi_MemMap.h"

#ifdef __cplusplus
}
#endif

#endif /* SPI_H */

/** @} */

