/** * @file xmc_posif.h * @date 2016-03-09 * * @cond ********************************************************************************** * XMClib v2.1.12 - XMC Peripheral Driver Library * * Copyright (c) 2015-2017, Infineon Technologies AG * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification,are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the copyright holders nor the names of its contributors * may be used to endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY,OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * To improve the quality of the software, users are encouraged to share * modifications, enhancements or bug fixes with Infineon Technologies AG * dave@infineon.com). ********************************************************************************** * * Change History * -------------- * * 2015-02-18: * - Initial version * * 2015-02-20: * - Driver description added
* * 2015-06-19: * - Removed version macros and declaration of GetDriverVersion API
* * 2015-07-02: * - Updated XMC_POSIF_QD_GetDirection API * * 2016-03-09: * - Optimization of write only registers * * @endcond * */ #ifndef XMC_POSIF_H #define XMC_POSIF_H /********************************************************************************************************************* * HEADER FILES ********************************************************************************************************************/ #include #if defined(POSIF0) #include /** * @addtogroup XMClib * @{ */ /** * @addtogroup POSIF * @{ * @brief Position Interface Unit (POSIF) driver for the XMC microcontroller family
* * The POSIF unit is a flexible and powerful component for motor control systems that use * rotary encoders or hall sensors as feedback loop. It provides interface for motor position and velocity measurement. * POSIF unit works with CCU4 and CCU8 to enable position and velocity measurement and to control PWM outputs using multi channel pattern.
* * Driver is divided in three POSIF functional blocks - Hall Sensor Control (POSIF_HSC), Quadrature Decoder (POSIF_QD) and * MultiChannel Mode (POSIF_MCM).
* * POSIF driver features: * -# Configuration structure XMC_POSIF_CONFIG_t and initialization function XMC_POSIF_Init() to configure global settings * -# Allows to change the operating mode using XMC_POSIF_SetMode() * -# Allows the selection of one of the four inputs (A, B, C or D) using XMC_POSIF_SelectInputSource(). In hall sensor control, inputs are * hall0, hall1 and hall2 signals. For quadrature decoder mode, inputs are phase A, phase B and index signals. * -# Hall Sensor Control (APIs prefixed with XMC_POSIF_HSC_)
* - Configuration structure XMC_POSIF_HSC_CONFIG_t and initialization function XMC_POSIF_HSC_Init() * - Update current and expected hall pattern in shadow register using XMC_POSIF_HSC_SetHallPatterns() * - Allows immediate shadow transfer using XMC_POSIF_HSC_UpdateHallPattern() * -# Quadrature Decoder (APIs prefixed with XMC_POSIF_QD_)
* - Configuration structure XMC_POSIF_QD_CONFIG_t and initialization function XMC_POSIF_QD_Init() * - Get direction of rotation using XMC_POSIF_QD_GetDirection() * -# MultiChannel Mode (APIs prefixed with XMC_POSIF_MCM_)
* - Configuration structure XMC_POSIF_MCM_CONFIG_t and initialization function XMC_POSIF_MCM_Init() * - Update multichannel pattern in shadow register using XMC_POSIF_MCM_SetMultiChannelPattern() * - Allows immediate shadow transfer using XMC_POSIF_MCM_UpdateMultiChannelPattern() * -# User need to call respective init functions to configure POSIF operating mode. e.g to configure POSIF in hall sensor control with multichannel mode * call both XMC_POSIF_HSC_Init() and XMC_POSIF_MCM_Init(). * -# Allows to enable and disable interrupt sources and assign to service request node using XMC_POSIF_EnableEvent(), XMC_POSIF_DisableEvent() and XMC_POSIF_SetInterruptNode() */ /* POSIF is not available on XMC11 and XMC12 devices */ /********************************************************************************************************************* * MACROS ********************************************************************************************************************/ #define XMC_POSIF_PCONF_INSEL_Msk (0x3fUL << POSIF_PCONF_INSEL0_Pos) /*< Mask for input pins selection */ #define XMC_POSIF_INSEL_MAX (4U) /*< Maximum possible input selector */ #define XMC_POSIF_HALPS_HALLPAT_Msk (0x3FUL) #if ((UC_SERIES == XMC45) || (UC_SERIES == XMC44) || (UC_SERIES == XMC47) || (UC_SERIES == XMC48) || (UC_SERIES == XMC14)) #define XMC_POSIF_CHECK_MODULE_PTR(PTR) ( ((PTR)== POSIF0) || ((PTR)== POSIF1) ) /*< Check for valid module pointer */ #else #define XMC_POSIF_CHECK_MODULE_PTR(PTR) ( ((PTR)== POSIF0)) /*< Check for valid module pointer */ #endif /********************************************************************************************************************* * ENUMS ********************************************************************************************************************/ /** * Defines the return status, to verify the POSIF related API calls. Use type @ref XMC_POSIF_STATUS_t for this enum. */ typedef enum XMC_POSIF_STATUS { XMC_POSIF_STATUS_OK = 0U, /**< API fulfills request */ XMC_POSIF_STATUS_ERROR /**< API cannot fulfill request */ } XMC_POSIF_STATUS_t; /** * Defines POSIF configurable modes.Use type @ref XMC_POSIF_MODE_t for this enum. * The members defines the function selector(FSEL) bitfields of \a PCONF register. */ typedef enum XMC_POSIF_MODE { XMC_POSIF_MODE_HALL_SENSOR = 0U, /**< Hall sensor mode */ XMC_POSIF_MODE_QD , /**< Quadrature Decoder mode */ XMC_POSIF_MODE_MCM , /**< Standalone Multichannel mode */ XMC_POSIF_MODE_MCM_QD /**< Quadrature Decoder + Standalone Multichannel mode */ } XMC_POSIF_MODE_t; /** * Defines POSIF configurable input ports.Use type @ref XMC_POSIF_INPUT_PORT_t for this enum. * The member defines the respective input selector(INSELX) bitfields of \a PCONF register. * It selects, which input is used for the phase or Hall input function (depending on the module is set for * Quadrature Decoder or Hall Sensor Mode). Same enum can be used to configure pattern update signal select by configuring * \a PCONF register's \a MSETS bit field. */ typedef enum XMC_POSIF_INPUT_PORT { XMC_POSIF_INPUT_PORT_A = 0U, /**< INPUT-A */ XMC_POSIF_INPUT_PORT_B , /**< INPUT-B */ XMC_POSIF_INPUT_PORT_C , /**< INPUT-C */ XMC_POSIF_INPUT_PORT_D , /**< INPUT-D */ XMC_POSIF_INPUT_PORT_E , /**< INPUT-E */ XMC_POSIF_INPUT_PORT_F , /**< INPUT-F */ XMC_POSIF_INPUT_PORT_G , /**< INPUT-G */ XMC_POSIF_INPUT_PORT_H /**< INPUT-H */ } XMC_POSIF_INPUT_PORT_t; /** * Defines active level of an input signal.Use type @ref XMC_POSIF_INPUT_ACTIVE_LEVEL_t for this enum. */ typedef enum XMC_POSIF_INPUT_ACTIVE_LEVEL { XMC_POSIF_INPUT_ACTIVE_LEVEL_HIGH = 0U, /**< Input - Active High */ XMC_POSIF_INPUT_ACTIVE_LEVEL_LOW /**< Input - Active Low */ } XMC_POSIF_INPUT_ACTIVE_LEVEL_t; /** * Defines POSIF input debounce filter configuration.POSIF inputs are connected to low pass filter and * this enum is used to configure low pass filters cut off frequency. * Use type @ref XMC_POSIF_FILTER_t for this enum. * The member defines the low pass filter configuration(LPC) bitfield of \a PCONF register. */ typedef enum XMC_POSIF_FILTER { XMC_POSIF_FILTER_DISABLED = 0U, /**< No filtering */ XMC_POSIF_FILTER_1_CLOCK_CYCLE , /**< Filter of 1 Clock Cycle */ XMC_POSIF_FILTER_2_CLOCK_CYCLE , /**< Filter of 2 Clock Cycles */ XMC_POSIF_FILTER_4_CLOCK_CYCLE , /**< Filter of 4 Clock Cycles */ XMC_POSIF_FILTER_8_CLOCK_CYCLE , /**< Filter of 8 Clock Cycles */ XMC_POSIF_FILTER_16_CLOCK_CYCLE , /**< Filter of 16 Clock Cycles */ XMC_POSIF_FILTER_32_CLOCK_CYCLE , /**< Filter of 32 Clock Cycles */ XMC_POSIF_FILTER_64_CLOCK_CYCLE /**< Filter of 64 Clock Cycles */ } XMC_POSIF_FILTER_t; /** * Defines POSIF events.Use type @ref XMC_POSIF_IRQ_EVENT_t for this enum. * The member defines available event sources.It is used to configure which event to be used for * interrupt generation using \a PFLGE register. [ PFLG,SPFLG,RPFLG] */ typedef enum XMC_POSIF_IRQ_EVENT { XMC_POSIF_IRQ_EVENT_CHE = 0U, /**< Hall Mode : Correct Hall Event */ XMC_POSIF_IRQ_EVENT_WHE = 1U, /**< Hall Mode : Wrong Hall Event */ XMC_POSIF_IRQ_EVENT_HALL_INPUT = 2U, /**< Hall Mode : Hall Input update */ XMC_POSIF_IRQ_EVENT_MCP_SHADOW_TRANSFER = 4U, /**< Hall Mode + MCM Mode : MC Pattern shadow transfer */ XMC_POSIF_IRQ_EVENT_INDX = 8U, /**< Quadrature Mode : Index event detection */ XMC_POSIF_IRQ_EVENT_ERR = 9U, /**< Quadrature Mode : Quadrature Phase Error */ XMC_POSIF_IRQ_EVENT_CNT = 10U, /**< Quadrature Mode : Quadrature Clock event */ XMC_POSIF_IRQ_EVENT_DIR = 11U, /**< Quadrature Mode : Quadrature Direction change event */ XMC_POSIF_IRQ_EVENT_PCLK = 12U /**< Quadrature Mode : Quadrature period clock generation event */ } XMC_POSIF_IRQ_EVENT_t; /** * Defines POSIF service request lines.Use type @ref XMC_POSIF_SR_ID_t for this enum. * It used to connect POSIF event to required service request line. * in \a PFLGE register for interrupt generation. */ typedef enum XMC_POSIF_SR_ID { XMC_POSIF_SR_ID_0 = 0U, /**< SR-0 */ XMC_POSIF_SR_ID_1 /**< SR-1 */ } XMC_POSIF_SR_ID_t; /** * Defines position decoder mode selection.Use type @ref XMC_POSIF_QD_MODE_t for this enum. * The member defines configuration for the operation of the quadrature decoder mode. * It used to configure \a QDC register. */ typedef enum XMC_POSIF_QD_MODE { XMC_POSIF_QD_MODE_QUADRATURE = 0U, /**< Standard Quadrature Mode */ XMC_POSIF_QD_MODE_DIRECTION_COUNT /**< Direction Count Mode */ } XMC_POSIF_QD_MODE_t; /** * Defines motor rotation direction.Use type @ref XMC_POSIF_QD_DIR_t for this enum. * The member defines the direction in quadrature mode. */ typedef enum XMC_POSIF_QD_DIR { XMC_POSIF_QD_DIR_COUNTERCLOCKWISE = 0U, /**< Counter Clockwise */ XMC_POSIF_QD_DIR_CLOCKWISE /**< Clockwise */ } XMC_POSIF_QD_DIR_t; /** * Defines frequency of index signal generation.Use type @ref XMC_POSIF_QD_INDEX_GENERATION_t for this enum. * Member represents available configuration for index marker generation using \a ICM bit field in \a QDC register. */ typedef enum XMC_POSIF_QD_INDEX_GENERATION { XMC_POSIF_QD_INDEX_GENERATION_NEVER = 0U, /**< Never generate the index marker signal */ XMC_POSIF_QD_INDEX_GENERATION_ONCE , /**< Generate only once after the first revolution */ XMC_POSIF_QD_INDEX_GENERATION_ALWAYS /**< Index marker generated upon every revolution */ } XMC_POSIF_QD_INDEX_GENERATION_t; /** * Defines trigger edge in hall sensor mode.Use type @ref XMC_POSIF_HSC_TRIGGER_EDGE_t for this enum. * It can be used to configure \a PCONF register's \a SPES and \a MSES bit fields. */ typedef enum XMC_POSIF_HSC_TRIGGER_EDGE { XMC_POSIF_HSC_TRIGGER_EDGE_RISING = 0U, /**< Rising edge */ XMC_POSIF_HSC_TRIGGER_EDGE_FALLING /**< Falling edge */ } XMC_POSIF_HSC_TRIGGER_EDGE_t; /********************************************************************************************************************* * DATA STRUCTURES ********************************************************************************************************************/ /*Anonymous structure/union guard start*/ #if defined(__CC_ARM) #pragma push #pragma anon_unions #elif defined(__TASKING__) #pragma warning 586 #endif /** * * Defines POSIF peripheral register structure.Use type @ref XMC_POSIF_t for this data structure. */ typedef POSIF_GLOBAL_TypeDef XMC_POSIF_t; /** * Defines POSIF quadrature decoder initialization data structure. * Use type @ref XMC_POSIF_QD_CONFIG_t for this data structure. * It used to configure Quadrature mode using \a QDC register. */ typedef struct XMC_POSIF_QD_CONFIG { XMC_POSIF_QD_MODE_t mode; /**< Operational Mode of the quadrature encoder and decoder */ union { struct { uint32_t phase_a: 1; /**< Phase-A active level configuration */ uint32_t phase_b: 1; /**< Phase-B active level configuration */ uint32_t phase_leader: 1; /**< Which of the two phase signals[Phase A or Phase B] leads the other? */ uint32_t : 1; uint32_t index: 2; /**< Index signal generation control. Use @ref XMC_POSIF_QD_INDEX_GENERATION_t to configure this field.*/ uint32_t : 26; }; uint32_t qdc; }; } XMC_POSIF_QD_CONFIG_t; /** * Defines POSIF hall sensor control initialization data structure. * Use type @ref XMC_POSIF_HSC_CONFIG_t for this data structure. * It used to initialize hall sensor mode configuration using \a PCONF register. */ typedef struct XMC_POSIF_HSC_CONFIG { union { struct { uint32_t : 4; uint32_t disable_idle_signal: 1; /**< Should idle signal be disabled upon wrong hall event? */ uint32_t : 11; uint32_t sampling_trigger: 1; /**< Of HSDA and HSDB, which one is to be used to trigger POSIF to sample hall pattern? */ uint32_t sampling_trigger_edge: 1; /**< Which edge of the sampling trigger signal is to be considered? */ uint32_t : 6; uint32_t external_error_port: 2; /**< Of the 4 external error ports, which one is to be considered? */ uint32_t external_error_enable: 1; /**< Should external errors lead to Wrong Hall event? */ uint32_t external_error_level: 1; /**< What should be the active level of external error signal? */ uint32_t: 4; }; uint32_t hall_config; }; } XMC_POSIF_HSC_CONFIG_t; /** * Defines POSIF multi-channel mode initialization data structure. * Use type @ref XMC_POSIF_MCM_CONFIG_t for this data structure. * It used to initialize multi channel mode configuration using \a PCONF register. */ typedef struct XMC_POSIF_MCM_CONFIG { union { struct { uint32_t : 5; uint32_t pattern_sw_update: 1; /**< should multi channel pattern updated by SW ? */ uint32_t : 12; uint32_t pattern_update_trigger: 3; /**< Of the 8 update triggers, which one is to be considered? */ uint32_t pattern_trigger_edge: 1; /**< Which edge of the pattern update trigger is to be considered? */ uint32_t pwm_sync: 2; /**< Of the 4 pwm sync inputs, which one is to be considered? */ uint32_t : 8; }; uint32_t mcm_config; }; }XMC_POSIF_MCM_CONFIG_t; /** * Defines POSIF module initialization data structure. * Use type @ref XMC_POSIF_CONFIG_t for this data structure. * It is used to initialize POSIF module using \a PCONF register. */ typedef struct XMC_POSIF_CONFIG { union { struct { uint32_t mode: 2; /**< POSIF Operational mode. Use @ref XMC_POSIF_MODE_t to configure */ uint32_t :6; uint32_t input0: 2; /**< Choice of input for Input-1 */ uint32_t input1: 2; /**< Choice of input for Input-2 */ uint32_t input2: 2; /**< Choice of input for Input-3 */ uint32_t :14; uint32_t filter: 3; /**< Input filter configuration */ uint32_t: 1; }; uint32_t pconf; }; } XMC_POSIF_CONFIG_t; /*Anonymous structure/union guard end*/ #if defined(__CC_ARM) #pragma pop #elif defined(__TASKING__) #pragma warning restore #endif /********************************************************************************************************************* * API Prototypes ********************************************************************************************************************/ #ifdef __cplusplus extern "C" { #endif /** * @param peripheral Pointer to an instance of POSIF module of type @ref XMC_POSIF_t * @retval None * * \parDescription
* De-asserts the POSIF module from reset and enables the clock.\n * Configures \a PRCLR0 register's \a POSIF0RS or \a POSIF1RS bit field depends upon \a peripheral. * If running on other than XMC45 device then it will ungate the peripheral clock. * * \parNote
* This is the first API which application must invoke to configure POSIF. * It is internally called by XMC_POSIF_Init(). * * \parRelated APIs:
* XMC_POSIF_Disable(),XMC_POSIF_Init() \n\n\n */ void XMC_POSIF_Enable(XMC_POSIF_t *const peripheral); /** * @param peripheral Pointer to an instance of POSIF module of type @ref XMC_POSIF_t * @retval None * * \parDescription
* Asserts the POSIF module into reset and disables the clock.\n * If running on other than XMC45 device then in addition it will gate the peripheral clock. * Configures \a PRCLR0 register's \a POSIF0RS or \a POSIF1RS bitfield depends upon \a peripheral. * * \parRelated APIs:
* XMC_POSIF_Enable()\n\n\n */ void XMC_POSIF_Disable(XMC_POSIF_t *const peripheral); /** * @param peripheral Pointer to an instance of POSIF module of type @ref XMC_POSIF_t * @param config Pointer to POSIF configuration data(operation mode,input selection and filter configuration) * @retval None * * \parDescription
* Initialize POSIF module with \a config.\n * Configures POSIF global registers.This is the first API which application must invoke to configure POSIF. * It sets up parameters common to all the POSIF modes - hall sensor,quadrature decoder and multi-channel modes of operation. * Configures \a PCONF register with mode of operation,input selection and filter configuration. * * \parRelated APIs:
* XMC_POSIF_HSC_Init(),XMC_POSIF_QD_Init(),XMC_POSIF_MCM_Init() \n\n\n */ void XMC_POSIF_Init(XMC_POSIF_t *const peripheral, const XMC_POSIF_CONFIG_t * const config); /** * @param peripheral Pointer to an instance of POSIF module * @param config Pointer to hall sensor control initialization data of type @ref XMC_POSIF_HSC_CONFIG_t * @retval XMC_POSIF_STATUS_t Returns @ref XMC_POSIF_STATUS_OK if configured in Hall Sensor Mode * else return @ref XMC_POSIF_STATUS_ERROR. * * \parDescription
* Initializes hall sensor control mode.\n * Configures \a PCONF register with which POSIF input trigger to be used for * sampling hall pattern.Configures \a PCONF register for idle signal generation for wrong hall event. * * \parNote
* It is necessary to have called XMC_POSIF_Init first with Hall sensor mode before invocation of this API. * * \parRelated APIs:
* XMC_POSIF_Init() \n\n\n */ XMC_POSIF_STATUS_t XMC_POSIF_HSC_Init(XMC_POSIF_t *const peripheral, const XMC_POSIF_HSC_CONFIG_t * const config); /** * @param peripheral Pointer to an instance of POSIF module * @param config Pointer to quadrature decoder initialization data * @retval XMC_POSIF_STATUS_t Returns quadrature mode initialization status of type @ref XMC_POSIF_STATUS_t * * \parDescription
* Initializes quadrature decoder control mode.\n * Configures \a PCONF register with quadrature mode using @ref XMC_POSIF_QD_MODE_t data structure. * Initializes \a QDC register with quadrature mode configuration using @ref XMC_POSIF_QD_CONFIG_t structure. * * \parNote
* It is necessary to have called XMC_POSIF_Init first with Quadrature decoder mode before invocation of this API. * * \parRelated APIs:
* XMC_POSIF_Init() \n\n\n */ XMC_POSIF_STATUS_t XMC_POSIF_QD_Init(XMC_POSIF_t *const peripheral, const XMC_POSIF_QD_CONFIG_t * const config); /** * @param peripheral Pointer to an instance of POSIF module * @param config Pointer to quadrature decoder initialization data * @retval XMC_POSIF_STATUS_t Returns multi channel pattern initialization status of type @ref XMC_POSIF_STATUS_t * * \parDescription
* Initializes multi channel mode in Hall mode, standalone multi-channel mode and quadrature with multi-channel mode.\n * Configures \a PCONF register with multi channel mode using @ref XMC_POSIF_MCM_CONFIG_t data structure. * * \parNote
* It is necessary to call XMC_POSIF_Init first before invocation of this API. * For XMC_POSIF_MODE_HALL_SENSOR, it is necessary to have called XMC_POSIF_HSC_Init before invocation of this API. * For XMC_POSIF_MODE_MCM_QD, it is necessary to have called XMC_POSIF_QD_Init before invocation of this API. * * \parRelated APIs:
* XMC_POSIF_Init(),XMC_POSIF_HSC_Init(),XMC_POSIF_QD_Init() \n\n\n */ XMC_POSIF_STATUS_t XMC_POSIF_MCM_Init(XMC_POSIF_t *const peripheral, const XMC_POSIF_MCM_CONFIG_t * const config); /** * @param peripheral Pointer to an instance of POSIF module * @param mode POSIF operating mode of type @ref XMC_POSIF_MODE_t * @retval None * * \parDescription
* Configures POSIF module for \a mode.\n * Configures \a PCONF register's a\ FSEL bitfield with \a mode. * Refer @ref XMC_POSIF_MODE_t for available options. * * \parNote
* POSIF module should be in stopped state while changing the operating mode. * * \parRelated APIs:
* XMC_POSIF_Stop() \n\n\n */ __STATIC_INLINE void XMC_POSIF_SetMode(XMC_POSIF_t *const peripheral, const XMC_POSIF_MODE_t mode) { peripheral->PCONF = ((peripheral->PCONF & ~(uint32_t)(POSIF_PCONF_FSEL_Msk)) | (((uint32_t)mode << POSIF_PCONF_FSEL_Pos) & (uint32_t)POSIF_PCONF_FSEL_Msk)); } /** * @param peripheral Pointer to an instance of POSIF module * @param input0 Choice of input for input 0 [0-3] * @param input1 Choice of input for input 1 [0-3] * @param input2 Choice of input for input 2 [0-3] * @retval None * * \parDescription
* Configures which input to be connected to POSIF module. \n * Configures \a PCONF register's INSEL0,INSEL1,INSEL2 bit fields with source for the input connection for \a input0 * \a input1, \a input2 respectively. * * \parNote
* Configures which input is used for the Phase X or Hall input X function depending upon the module is * set for Quadrature Decoder or Hall Sensor Mode. * * \parRelated APIs:
* XMC_POSIF_Init() \n\n\n */ void XMC_POSIF_SelectInputSource(XMC_POSIF_t *const peripheral, const XMC_POSIF_INPUT_PORT_t input0, const XMC_POSIF_INPUT_PORT_t input1, const XMC_POSIF_INPUT_PORT_t input2); /** * @param peripheral Pointer to an instance of POSIF module * @retval None * * \parDescription
* Starts POSIF \a peripheral functional state machine.\n * Starts POSIF state machine for \a peripheral.Configures \a PRUNS register's \a SRB bit field with 1. * * \parNote
* Global properties of POSIF along with mode specific properties should have been initialized before starting of POSIF * FSM. * * \parRelated APIs:
* XMC_POSIF_Stop(),XMC_POSIF_IsRunning() \n\n\n */ __STATIC_INLINE void XMC_POSIF_Start(XMC_POSIF_t *const peripheral) { peripheral->PRUNS = (uint32_t)POSIF_PRUNS_SRB_Msk; } /** * @param peripheral Pointer to an instance of POSIF module * @retval None * * \parDescription
* Stops POSIF \a peripheral functional state machine.\n * Stop POSIF functional state machine and clears current internal status of the \a peripheral. * Configures \a PRUNC register's \a CRB bit field with 1. * * \parRelated APIs:
* XMC_POSIF_Start(),XMC_POSIF_IsRunning() \n\n\n */ __STATIC_INLINE void XMC_POSIF_Stop(XMC_POSIF_t *const peripheral) { peripheral->PRUNC = (uint32_t)(POSIF_PRUNC_CRB_Msk | POSIF_PRUNC_CSM_Msk); } /** * @param peripheral Pointer to an instance of POSIF module * @retval bool Returns false: IDLE, true:RUNNING * * \parDescription
* Returns the status of POSIF module - Running or IDLE.\n * Retrieves the status from \a PRUN register's \a SRB bit. * * \parRelated APIs:
* XMC_POSIF_Start(),XMC_POSIF_Stop() \n\n\n */ __STATIC_INLINE bool XMC_POSIF_IsRunning(XMC_POSIF_t *const peripheral) { return ((bool)peripheral->PRUN); } /** * @param peripheral Pointer to an instance of POSIF module * @retval uint8_t Returns last sampled hall sensor pattern. Range : [0-7] * * \parDescription
* Returns last sampled hall sensor pattern of \a peripheral.\n * Retrieves the last sampled hall sensor pattern from \a PDBG register's \a HSP bit field of \a peripheral. * Applications can at any point in time retrieve the last sampled hall sensor pattern by invoking this API. * * \parNote
* This is applicable only to the hall sensor mode of operation. * * \parRelated APIs:
* XMC_POSIF_HSC_GetCurrentPattern(),XMC_POSIF_HSC_GetExpectedPattern() \n\n\n */ __STATIC_INLINE uint8_t XMC_POSIF_HSC_GetLastSampledPattern(XMC_POSIF_t *const peripheral) { return ((uint8_t)((peripheral->PDBG) & POSIF_PDBG_HSP_Msk) >> POSIF_PDBG_HSP_Pos); } /** * @param peripheral Pointer to an instance of POSIF module * @retval uint8_t Returns current hall sensor pattern. Range : [0-7] * * \parDescription
* Returns current sampled hall sensor pattern of \a peripheral.\n * Retrieves the current hall sensor pattern from \a HALP register's \a HCP bit field of \a peripheral. * Applications can at any point in time retrieve the current hall sensor pattern by invoking this API. * * \parNote
* This is applicable only to the hall sensor mode of operation. * * \parRelated APIs:
* XMC_POSIF_HSC_GetLastSampledPattern(),XMC_POSIF_HSC_GetExpectedPattern() \n\n\n */ __STATIC_INLINE uint8_t XMC_POSIF_HSC_GetCurrentPattern(XMC_POSIF_t *const peripheral) { return ((uint8_t)((peripheral->HALP & POSIF_HALP_HCP_Msk) >> POSIF_HALP_HCP_Pos)); } /** * @param peripheral Pointer to an instance of POSIF module * @retval uint8_t Returns expected hall sensor pattern. Range : [0-7] * * \parDescription
* Returns expected hall sensor pattern of \a peripheral.\n * Retrieves the expected hall sensor pattern from \a HALP register's \a HEP bit field of \a peripheral. * Applications can at any point in time retrieve the expected hall sensor pattern by invoking this API. * * \parNote
* This is applicable only to the hall sensor mode of operation. * * \parRelated APIs:
* XMC_POSIF_HSC_GetLastSampledPattern(),XMC_POSIF_HSC_GetCurrentPattern() \n\n\n */ __STATIC_INLINE uint8_t XMC_POSIF_HSC_GetExpectedPattern(XMC_POSIF_t *const peripheral) { return ((uint8_t)((peripheral->HALP & POSIF_HALP_HEP_Msk) >> POSIF_HALP_HEP_Pos)); } /** * @param peripheral Pointer to an instance of POSIF module * @param pattern The hall sensor pattern to be programmed into current pattern [0-7] * @retval None * * \parDescription
* Configures current Hall sensor \a pattern of \a peripheral.\n * Configures the Current hall sensor pattern on \a HALPS shadow register's \a HCPS bit field of \a peripheral. * Applications can set at any point in time program the current hall sensor pattern by invoking this API. * * \parNote
* This is applicable only to the hall sensor mode of operation. It may be noted that the pattern is merely * written to the shadow register. Transfer from the shadow register is based on a hardware transfer trigger * or software trigger through API @ref XMC_POSIF_HSC_UpdateHallPattern(). * * \parRelated APIs:
* XMC_POSIF_HSC_GetCurrentPattern(),XMC_POSIF_HSC_SetExpectedPattern() \n\n\n */ __STATIC_INLINE void XMC_POSIF_HSC_SetCurrentPattern(XMC_POSIF_t *const peripheral, const uint8_t pattern) { peripheral->HALPS = ((peripheral->HALPS & ~(uint32_t)(POSIF_HALPS_HCPS_Msk)) | (((uint32_t)pattern << POSIF_HALPS_HCPS_Pos) & (uint32_t)POSIF_HALPS_HCPS_Msk)); } /** * @param peripheral Pointer to an instance of POSIF module * @param pattern The hall sensor pattern to be programmed into expected pattern [0-7] * @retval None * * \parDescription
* Configures the expected hall sensor \a pattern of \a peripheral.\n * Applications can set at any point in time program the hall sensor expected patterns by invoking this API. * Configures the expected hall sensor pattern on \a HALPS shadow register's \a HEPS bit field of \a peripheral. * * \parNote
* This is applicable only to the hall sensor mode of operation.It may be noted that the pattern is merely * written to the shadow register. Transfer from the shadow register is based on a hardware transfer trigger * or software trigger through API @ref XMC_POSIF_HSC_UpdateHallPattern(). * * \parRelated APIs:
* XMC_POSIF_HSC_GetExpectedPattern() \n\n\n */ __STATIC_INLINE void XMC_POSIF_HSC_SetExpectedPattern(XMC_POSIF_t *const peripheral, const uint8_t pattern) { peripheral->HALPS = ((peripheral->HALPS & ~(uint32_t)(POSIF_HALPS_HEPS_Msk)) | (((uint32_t)pattern << POSIF_HALPS_HEPS_Pos) & (uint32_t)POSIF_HALPS_HEPS_Msk)); } /** * @param peripheral Pointer to an instance of POSIF module * @param pattern_mask The hall sensor pattern mask [0-63] Format of mask: (expected_pattern << 3) | (current_pattern) * @retval None * * \parDescription
* Configures current and expected hall pattern of \a peripheral. \n * Configures \a HALPS register with the Current and Expected hall sensor patterns in one operation. * Applications can at any point in time program the current and expected hall sensor pattern by invoking this API. * * \parNote
* This is applicable only to the hall sensor mode of operation. It may be noted that the pattern is merely * written to the shadow register. Transfer from the shadow register is based on a hardware transfer trigger * or software trigger through API @ref XMC_POSIF_HSC_UpdateHallPattern(). * * \parRelated APIs:
* XMC_POSIF_HSC_SetExpectedPattern(),XMC_POSIF_HSC_SetCurrentPattern() \n\n\n */ __STATIC_INLINE void XMC_POSIF_HSC_SetHallPatterns(XMC_POSIF_t *const peripheral, const uint8_t pattern_mask) { peripheral->HALPS = (uint32_t)(pattern_mask & (POSIF_HALPS_HCPS_Msk | POSIF_HALPS_HEPS_Msk)); } /** * @param peripheral Pointer to an instance of POSIF module * @retval None * * \parDescription
* Manually performs shadow transfer of hall sensor patterns.\n * Configures \a MCMS register's \a STHR bit field with 1. * Setting this bit to 1 leads to an immediate update of the fields \a HALP.HCP(Current pattern) and \a HALP.HEP(Expected pattern). * * \parNote
* The transfer of hall sensor pattern shadow registers content to the sensor pattern register happens under two * conditions. A hardware trigger starts the shadow transfer. Alternatively, the shadow transfer can be initiated * by application software by means of invocation of this API. * * \parRelated APIs:
* XMC_POSIF_HSC_SetHallPatterns() \n\n\n */ __STATIC_INLINE void XMC_POSIF_HSC_UpdateHallPattern(XMC_POSIF_t *const peripheral) { peripheral->MCMS = (uint32_t)POSIF_MCMS_STHR_Msk; } /** * @param peripheral Pointer to an instance of POSIF module * @param pattern The 16b multi-channel pattern [0-65535] * @retval None * * \parDescription
* Configures \a MCSM register with Multi-Channel Pattern.\n * This 16b multi-channel pattern which controls the 16 outputs of all slices of a CCU8 module. * Transfer from the shadow register is based on a hardware transfer trigger * or software trigger through API @ref XMC_POSIF_MCM_UpdateMultiChannelPattern(). * Every time that a Multi-Channel pattern transfer is triggered, this value is passed into the field \a MCM.MCMP of \a peripheral * * \parNote
* It may be noted that the pattern is merely written to the shadow register. * * \parRelated APIs:
* XMC_POSIF_MCM_GetMultiChannelPattern() \n\n\n */ __STATIC_INLINE void XMC_POSIF_MCM_SetMultiChannelPattern(XMC_POSIF_t *const peripheral, const uint16_t pattern) { peripheral->MCSM = pattern; } /** * @param peripheral Pointer to an instance of POSIF module * @retval uint16_t Returns configured multi channel pattern * * \parDescription
* Returns configured multi channel pattern of \a peripheral. \n * Retrieves the Multi-Channel Pattern from \a MCM register's MCMP bit field of \a peripheral * Applications can at any point in time retrieve the multi-channel pattern by invoking this API. * * \parRelated APIs:
* XMC_POSIF_MCM_SetMultiChannelPattern() \n\n\n */ __STATIC_INLINE uint16_t XMC_POSIF_MCM_GetMultiChannelPattern(XMC_POSIF_t *const peripheral) { return ((uint16_t)(peripheral->MCM & (uint32_t)POSIF_MCM_MCMP_Msk)); } /** * @param peripheral Pointer to an instance of POSIF module * @retval uint16_t Returns configured multi channel pattern present in shadow transfer register * * \parDescription
* Returns configured multi channel pattern in shadow register of \a peripheral. \n * Retrieves the Multi-Channel Pattern from \a MCSM shadow register's \a MCMPS bit field. * Applications can at any point in time retrieve the multi-channel pattern by invoking this API. * * It can be used when MCM is enabled. * * \parRelated APIs:
* XMC_POSIF_MCM_SetMultiChannelPattern() \n\n\n */ __STATIC_INLINE uint16_t XMC_POSIF_MCM_GetShadowMultiChannelPattern(XMC_POSIF_t *const peripheral) { return ((uint16_t)(peripheral->MCSM & (uint32_t)POSIF_MCSM_MCMPS_Msk)); } /** * @param peripheral Pointer to an instance of POSIF module * @retval None * * \parDescription
* Performs shadow transfer of the Multi-Channel Pattern register by configuring \a MCMS register's \a STMR bit field. * * \parNote
* Transfer multi-channel pattern shadow registers content to the actual pattern register of \a peripheral. \n * The transfer of multi-channel pattern shadow registers content to the actual pattern register happens under two * conditions. A hardware trigger starts the shadow transfer. Alternatively, the shadow transfer can be initiated * by application software by means of invocation of this API. * * \parRelated APIs:
* XMC_POSIF_MCM_SetMultiChannelPattern() \n\n\n */ __STATIC_INLINE void XMC_POSIF_MCM_UpdateMultiChannelPattern(XMC_POSIF_t *const peripheral) { peripheral->MCMS |= (uint32_t)POSIF_MCMS_STMR_Msk; } /** * @param peripheral Pointer to an instance of POSIF module * @retval None * * \parDescription
* Enables update of the Multi-Channel Pattern by software in standalone multi-channel mode.\n * Enabling update of multi-channel pattern happens under two conditions. A hardware trigger enables this update. * Alternatively, this can be enabled by software by means of invocation of this API. * * \parNote
* The update is not done immediately due to the fact that the trigger that synchronizes the update with the PWM is * still needed. * * \parRelated APIs:
* XMC_POSIF_MCM_UpdateMultiChannelPattern() \n\n\n */ __STATIC_INLINE void XMC_POSIF_MCM_EnableMultiChannelPatternUpdate(XMC_POSIF_t *const peripheral) { peripheral->MCMS |= (uint32_t)POSIF_MCMS_MNPS_Msk; } /** * @param peripheral Pointer to an instance of POSIF module * @retval XMC_POSIF_QD_DIR_t Return direction of revolution of the motor of type @ref XMC_POSIF_QD_DIR_t * * \parDescription
* Returns the direction of revolution of the motor.\n * Retrieves direction from \a QDC register's \a DVAL bit field in quadrature mode. * Applications can at any point in time retrieve the direction of rotation by invoking this API. * * \parNote
* This is applicable only to the quadrature decoder mode of operation. * */ __STATIC_INLINE XMC_POSIF_QD_DIR_t XMC_POSIF_QD_GetDirection(XMC_POSIF_t *const peripheral) { return ((XMC_POSIF_QD_DIR_t)((peripheral->QDC & POSIF_QDC_DVAL_Msk) >> POSIF_QDC_DVAL_Pos)); } /** * @param peripheral Pointer to an instance of POSIF module * @retval uint8_t Returns current state of quadrature decoder[Phase B,Phase A] * * \parDescription
* Returns the current state of phase signals in quadrature decoder mode of \a peripheral. \n * Retrieves current state of the quadrature decoder from \a PDBG register's \a QCSV bit fields. * Applications can at any point in time retrieve the current state of Phase A and Phase B signals * by invoking this API. * * \parNote
* This is applicable only to the quadrature decoder mode of operation. * * \parRelated APIs:
* XMC_POSIF_QD_GetPreviousState() \n\n\n */ __STATIC_INLINE uint8_t XMC_POSIF_QD_GetCurrentState(XMC_POSIF_t *const peripheral) { return ((uint8_t)((peripheral->PDBG & POSIF_PDBG_QCSV_Msk) >> POSIF_PDBG_QCSV_Pos)); } /** * @param peripheral Pointer to an instance of POSIF module * @retval uint8_t Returns previous state of quadrature decoder[Phase B,Phase A] * * \parDescription
* Returns the previous state of phase signals in quadrature decoder mode of \a peripheral. \n * Retrieves previous state of the quadrature decoder from \a PDBG register's \a QPSV bit fields. * Applications can at any point in time retrieve the previous state of Phase A and Phase B signals * by invoking this API. * * \parNote
* This is applicable only to the quadrature decoder mode of operation. * * \parRelated APIs:
* XMC_POSIF_QD_GetCurrentState() \n\n\n */ __STATIC_INLINE uint8_t XMC_POSIF_QD_GetPreviousState(XMC_POSIF_t *const peripheral) { return ((uint8_t)((peripheral->PDBG & POSIF_PDBG_QPSV_Msk) >> POSIF_PDBG_QPSV_Pos)); } /** * @param peripheral Pointer to an instance of POSIF module * @retval uint8_t Returns the index value.[1 - New rotation started, 0 - In-between] * * \parDescription
* Returns the current index value in quadrature decoder mode of \a peripheral. \n * Retrieves current index signal value of the quadrature decoder from \a PDBG register's \a IVAL bit field. * Applications can at any point in time retrieve the current index signal value of the quadrature decoder by * invoking this API. * * \parNote
* This is applicable only to the quadrature decoder mode of operation. * */ __STATIC_INLINE uint8_t XMC_POSIF_QD_GetCurrentIndexValue(XMC_POSIF_t *const peripheral) { return ((uint8_t)((peripheral->PDBG & POSIF_PDBG_IVAL_Msk) >> POSIF_PDBG_IVAL_Pos)); } /** * @param peripheral Pointer to an instance of POSIF module * @param event Event to be enabled * @retval None * * \parDescription
* Enables \a event generation of \a peripheral. \n * Enables an IRQ generation capable \a event by configuring 1 to \a PFLGE register's \a event bit field. * * \parRelated APIs:
* XMC_POSIF_DisableEvent() \n\n\n */ __STATIC_INLINE void XMC_POSIF_EnableEvent(XMC_POSIF_t *const peripheral, const XMC_POSIF_IRQ_EVENT_t event) { peripheral->PFLGE |= (uint32_t)1 << (uint8_t)event; } /** * @brief Disables an IRQ generation capable event * @param peripheral Pointer to an instance of POSIF module * @param event Event to be disabled * @retval None * * \parDescription
* Disables \a event generation of \a peripheral.\n * Disables an IRQ generation capable \a event by configuring 0 to \a PFLGE register's \a event bit field. * * \parRelated APIs:
* XMC_POSIF_EnableEvent() \n\n\n */ __STATIC_INLINE void XMC_POSIF_DisableEvent(XMC_POSIF_t *const peripheral, const XMC_POSIF_IRQ_EVENT_t event) { peripheral->PFLGE &= ~((uint32_t)1 << (uint8_t)event); } /** * @param peripheral Pointer to an instance of POSIF module * @param event Event to be manually asserted * @retval None * * \parDescription
* Manually generates \a event of \a peripheral. \n * Manually asserts an IRQ generation capable event by configuring 1 to \a SPFLG register's \a event bit field. * * \parRelated APIs:
* XMC_POSIF_ClearEvent() \n\n\n */ __STATIC_INLINE void XMC_POSIF_SetEvent(XMC_POSIF_t *const peripheral, const XMC_POSIF_IRQ_EVENT_t event) { peripheral->SPFLG = (uint32_t)1 << (uint8_t)event; } /** * @param peripheral Pointer to an instance of POSIF module * @param event Event to be acknowledged * @retval None * * \parDescription
* Clears \a event by acknowledgment of \a peripheral. \n * Acknowledges an IRQ event by configuring 1 to \a RPFLG register's \a event bit field. * * \parRelated APIs:
* XMC_POSIF_SetEvent() \n\n\n */ __STATIC_INLINE void XMC_POSIF_ClearEvent(XMC_POSIF_t *const peripheral, const XMC_POSIF_IRQ_EVENT_t event) { peripheral->RPFLG = (uint32_t)1 << (uint8_t)event; } /** * @param peripheral Pointer to an instance of POSIF module * @param event Event ID to be checked for status * @retval uint8_t Returns event status * * \parDescription
* Returns \a event status of \a peripheral. \n * Determines if IRQ event is asserted by retrieving data from \a PFLG register's \a event bit field. * * \parRelated APIs:
* XMC_POSIF_SetEvent(),XMC_POSIF_ClearEvent() \n\n\n */ __STATIC_INLINE uint8_t XMC_POSIF_GetEventStatus(XMC_POSIF_t *const peripheral, const XMC_POSIF_IRQ_EVENT_t event) { return ((uint8_t)((peripheral->PFLG >> (uint8_t)event) & 1U)); } /** * @param peripheral Pointer to an instance of POSIF module * @param event Event to be acknowledged of type @ref XMC_POSIF_IRQ_EVENT_t * @param sr Service request line of type @ref XMC_POSIF_SR_ID_t * @retval None * * \parDescription
* Configures \a event to generate \a sr (service request) of \a peripheral. \n * Binds an IRQ event to a service request line by configuring \a PFLGE register's \a event bit field. */ void XMC_POSIF_SetInterruptNode(XMC_POSIF_t *const peripheral, const XMC_POSIF_IRQ_EVENT_t event, const XMC_POSIF_SR_ID_t sr); #ifdef __cplusplus } #endif /* #if defined(POSIF0) */ /** * @} */ /** * @} */ #endif #endif /* XMC_POSIF_H */