xmclib/XMCLib/inc/xmc_dsd.h
2024-10-17 17:09:59 +02:00

1185 lines
48 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* @file xmc_dsd.h
* @date 2015-09-18
*
* @cond
*********************************************************************************************************************
* XMClib v2.1.16 - 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-03-30:
* - Initial version
*
* 2015-06-19:
* - Removed version macros and declaration of GetDriverVersion API <BR>
* - Added API XMC_DSD_CH_GetRectifyDelay <BR>
*
* 2015-07-16:
* - Renamed API “XMC_DSD_CH_AuxFilter_SetBoudary()” to “XMC_DSD_CH_AuxFilter_SetBoundary()” <BR>
*
* 2015-09-18:
* - Added APIs "XMC_DSD_SetResultEventFlag()","XMC_DSD_ClearResultEventFlag()"
* "XMC_DSD_SetAlarmEventFlag()" and "XMC_DSD_ClearAlarmEventFlag()" <BR>
* - Support added for XMC4800 microcontroller family <BR>
* @endcond
*
*/
#ifndef XMC_DSD_H
#define XMC_DSD_H
/**********************************************************************************************************************
* HEADER FILES
*********************************************************************************************************************/
#include <xmc_common.h>
#if defined(DSD)
#include <xmc_scu.h>
/**
* @addtogroup XMClib XMC Peripheral Library
* @{
*/
/**
* @addtogroup DSD
* @{
* @brief Delta Sigma Demodulator (DSD) driver for the XMC4500, XMC4400 and XMC4800 microcontroller family <br>
*
* The DSD unit provides a series of digital input channels accepting data streams from external modulators
* using the Delta/Sigma (DS) conversion principle. The on-chip demodulator channels convert these inputs to
* discrete digital values.
* DSD unit can be used for isolated current/voltage measurement and for sensor interfaces.<br>
*
* Driver is divided in six DSD functional blocks -
* - Main Filter (APIs prefixed with XMC_DSD_CH_MainFilter),
* - Aux Filter (APIs prefixed with XMC_DSD_CH_AuxFilter),
* - Integrator (APIs prefixed with XMC_DSD_CH_Integrator),
* - Timestamp (APIs prefixed with XMC_DSD_CH_Timestamp),
* - Rectification (APIs prefixed with XMC_DSD_CH_Rectify),
* - Carrier Generator (APIs prefixed with XMC_DSD_Generator)
*
* DSD driver features:
* -# DSD channel Configuration structure XMC_DSD_CH_CONFIG_t initialization function XMC_DSD_CH_Init() to configure all the functional blocks (except carrier generator)
* -# Configuration structure XMC_DSD_GENERATOR_CONFIG_t and initialization function XMC_DSD_Generator_Init() to configure carrier generator
* -# Configuration structure XMC_DSD_CH_FILTER_CONFIG_t and initialization function XMC_DSD_CH_MainFilter_Init() to configure main filter
* -# Configuration structure XMC_DSD_CH_AUX_FILTER_CONFIG_t and initialization function XMC_DSD_CH_AuxFilter_Init() to configure auxilary filter
* -# Configuration structure XMC_DSD_CH_INTEGRATOR_CONFIG_t and initialization function XMC_DSD_CH_Integrator_Init() to configure integrator
* -# Configuration structure XMC_DSD_CH_TIMESTAMP_CONFIG_t and initialization function XMC_DSD_CH_Timestamp_Init() to configure timestamp
* -# Configuration structure XMC_DSD_CH_RECTIFY_CONFIG_t and initialization function XMC_DSD_CH_Rectify_Init() to configure rectifier
*/
/*********************************************************************************************************************
* MACROS
********************************************************************************************************************/
#define XMC_DSD_CHECK_MODULE_PTR(PTR) ( ((PTR)== DSD))
#define XMC_DSD_CHECK_CHANNEL_PTR(PTR) ( ((PTR) == DSD_CH0) || ((PTR) == DSD_CH1) || ((PTR) == DSD_CH2) || ((PTR) == DSD_CH3))
/**********************************************************************************************************************
* ENUMS
*********************************************************************************************************************/
/**
* DSD Channel
*/
typedef DSD_CH_TypeDef XMC_DSD_CH_t;
/**
* DSD Module
*/
typedef DSD_GLOBAL_TypeDef XMC_DSD_t;
/**
* Return types of the API's.Use type @ref XMC_DSD_STATUS_t for this enum.
*/
typedef enum XMC_DSD_STATUS
{
XMC_DSD_STATUS_OK, /**< API fulfills request */
XMC_DSD_STATUS_ERROR /**< Error detected */
} XMC_DSD_STATUS_t;
/**
* Enumerates the divider factor for the PWM pattern signal generator.
* Use divider factor to derive input frequency of the carrier signal generator(fCG),
* from the selected internal clock source(fCLK).
* Use type @ref XMC_DSD_GENERATOR_CLKDIV_t for this enum.
*/
typedef enum XMC_DSD_GENERATOR_CLKDIV
{
XMC_DSD_GENERATOR_CLKDIV_2048 = 0x00U, /**< fCG = (fCLK/2)/1024 */
XMC_DSD_GENERATOR_CLKDIV_4096 = 0x01U, /**< fCG = (fCLK/4)/1024 */
XMC_DSD_GENERATOR_CLKDIV_6144 = 0x02U, /**< fCG = (fCLK/6)/1024 */
XMC_DSD_GENERATOR_CLKDIV_8192 = 0x03U, /**< fCG = (fCLK/8)/1024 */
XMC_DSD_GENERATOR_CLKDIV_10240 = 0x04U, /**< fCG = (fCLK/10)/1024 */
XMC_DSD_GENERATOR_CLKDIV_12288 = 0x05U, /**< fCG = (fCLK/12)/1024 */
XMC_DSD_GENERATOR_CLKDIV_14336 = 0x06U, /**< fCG = (fCLK/14)/1024 */
XMC_DSD_GENERATOR_CLKDIV_16384 = 0x07U, /**< fCG = (fCLK/16)/1024 */
XMC_DSD_GENERATOR_CLKDIV_18432 = 0x08U, /**< fCG = (fCLK/18)/1024 */
XMC_DSD_GENERATOR_CLKDIV_20480 = 0x09U, /**< fCG = (fCLK/20)/1024 */
XMC_DSD_GENERATOR_CLKDIV_22528 = 0x0AU, /**< fCG = (fCLK/22)/1024 */
XMC_DSD_GENERATOR_CLKDIV_24576 = 0x0BU, /**< fCG = (fCLK/24)/1024 */
XMC_DSD_GENERATOR_CLKDIV_26624 = 0x0CU, /**< fCG = (fCLK/26)/1024 */
XMC_DSD_GENERATOR_CLKDIV_28672 = 0x0DU, /**< fCG = (fCLK/28)/1024 */
XMC_DSD_GENERATOR_CLKDIV_30720 = 0x0EU, /**< fCG = (fCLK/30)/1024 */
XMC_DSD_GENERATOR_CLKDIV_32768 = 0x0FU /**< fCG = (fCLK/32)/1024 */
} XMC_DSD_GENERATOR_CLKDIV_t;
/**
* Enumerates the carrier generator operating mode.
* Use type @ref XMC_DSD_GENERATOR_MODE_t for this enum.
*/
typedef enum XMC_DSD_GENERATOR_MODE
{
XMC_DSD_GENERATOR_MODE_STOPPED = 0x00U, /**< Stopped */
XMC_DSD_GENERATOR_MODE_RECTANGLE = 0x01U, /**< Square wave */
XMC_DSD_GENERATOR_MODE_TRIANGLE = 0x02U, /**< Triangle */
XMC_DSD_GENERATOR_MODE_SINE = 0x03U /**< Sine wave*/
} XMC_DSD_GENERATOR_MODE_t;
/**
* Enumerates the CIC(cyclic integrating comb) filter type.
* Use type @ref XMC_DSD_CH_FILTER_TYPE_t for this enum.
*/
typedef enum XMC_DSD_CH_FILTER_TYPE
{
XMC_DSD_CH_FILTER_TYPE_CIC1, /**< CIC1 filter*/
XMC_DSD_CH_FILTER_TYPE_CIC2, /**< CIC2 filter*/
XMC_DSD_CH_FILTER_TYPE_CIC3, /**< CIC3 filter*/
XMC_DSD_CH_FILTER_TYPE_CICF /**< CICF filter*/
} XMC_DSD_CH_FILTER_TYPE_t;
/**
* Enumerates the input data source select.
* Use type @ref XMC_DSD_CH_DATA_SOURCE_t for this enum.
*/
typedef enum XMC_DSD_CH_DATA_SOURCE
{
XMC_DSD_CH_DATA_SOURCE_DISCONNECT = 0U, /**< Disconnected */
XMC_DSD_CH_DATA_SOURCE_A_DIRECT = 2U, /**< External source, from input A, direct */
XMC_DSD_CH_DATA_SOURCE_A_INVERTED = 3U, /**< External source, from input A, inverted */
XMC_DSD_CH_DATA_SOURCE_B_DIRECT = 4U, /**< External source, from input B, direct */
XMC_DSD_CH_DATA_SOURCE_B_INVERTED = 5U /**< External source, from input B, inverted */
} XMC_DSD_CH_DATA_SOURCE_t;
/**
* Enumerates the sample clock source select.
* Use type @ref XMC_DSD_CH_CLOCK_SOURCE_t for this enum.
*/
typedef enum XMC_DSD_CH_CLOCK_SOURCE
{
XMC_DSD_CH_CLOCK_SOURCE_A = 1U, /**< External source, from input A */
XMC_DSD_CH_CLOCK_SOURCE_B = 2U, /**< External source, from input B */
XMC_DSD_CH_CLOCK_SOURCE_C = 3U, /**< External source, from input C */
XMC_DSD_CH_CLOCK_SOURCE_D = 4U, /**< External source, from input D */
XMC_DSD_CH_CLOCK_SOURCE_INTERN = 15U /**< Internal clock source */
} XMC_DSD_CH_CLOCK_SOURCE_t;
/**
* Enumerates the data strobe generation Mode.
* Use type @ref XMC_DSD_CH_STROBE_t for this enum.
*/
typedef enum XMC_DSD_CH_STROBE
{
XMC_DSD_CH_STROBE_DIRECT_CLOCK_RISE = 1U, /* Direct clock, a sample trigger is generated at each rising clock edge */
XMC_DSD_CH_STROBE_DIRECT_CLOCK_FALL = 2U, /* Direct clock, a sample trigger is generated at each falling clock edge */
XMC_DSD_CH_STROBE_DOUBLE_DATA = 3U, /* Double data, a sample trigger is generated at each rising and falling clock edge */
XMC_DSD_CH_STROBE_DOUBLE_CLOCK_RISE = 5U, /* Double clock, a sample trigger is generated at every 2nd rising clock edge */
XMC_DSD_CH_STROBE_DOUBLE_CLOCK_FALL = 6U /* Double clock, a sample trigger is generated at every 2nd falling clock edge */
} XMC_DSD_CH_STROBE_t;
/**
* Enumerates the divider factor for modulator clock (fMOD).
* Use divider factor to derive modulator clock frequency(fMOD),
* from the selected internal clock source(fCLK).
* Use type @ref XMC_DSD_CH_CLK_t for this enum.
*/
typedef enum XMC_DSD_CH_CLK_DIV
{
XMC_DSD_CH_CLK_DIV_2, /**< fMOD = fCLK/2 */
XMC_DSD_CH_CLK_DIV_4, /**< fMOD = fCLK/4 */
XMC_DSD_CH_CLK_DIV_6, /**< fMOD = fCLK/6 */
XMC_DSD_CH_CLK_DIV_8, /**< fMOD = fCLK/8 */
XMC_DSD_CH_CLK_DIV_10, /**< fMOD = fCLK/10 */
XMC_DSD_CH_CLK_DIV_12, /**< fMOD = fCLK/12 */
XMC_DSD_CH_CLK_DIV_14, /**< fMOD = fCLK/14 */
XMC_DSD_CH_CLK_DIV_16, /**< fMOD = fCLK/16 */
XMC_DSD_CH_CLK_DIV_18, /**< fMOD = fCLK/18 */
XMC_DSD_CH_CLK_DIV_20, /**< fMOD = fCLK/20 */
XMC_DSD_CH_CLK_DIV_22, /**< fMOD = fCLK/22 */
XMC_DSD_CH_CLK_DIV_24, /**< fMOD = fCLK/24 */
XMC_DSD_CH_CLK_DIV_26, /**< fMOD = fCLK/26 */
XMC_DSD_CH_CLK_DIV_28, /**< fMOD = fCLK/28 */
XMC_DSD_CH_CLK_DIV_30, /**< fMOD = fCLK/30 */
XMC_DSD_CH_CLK_DIV_32 /**< fMOD = fCLK/32 */
} XMC_DSD_CH_CLK_t;
/**
* Enumerates the integrator trigger mode.
* Use type @ref XMC_DSD_CH_INTEGRATOR_START_t for this enum.
*/
typedef enum XMC_DSD_CH_INTEGRATOR_START
{
XMC_DSD_CH_INTEGRATOR_START_OFF, /**< No integration trigger */
XMC_DSD_CH_INTEGRATOR_START_TRIGGER_FALL, /**< Trigger event upon a falling edge */
XMC_DSD_CH_INTEGRATOR_START_TRIGGER_RISE, /**< Trigger event upon a rising edge */
XMC_DSD_CH_INTEGRATOR_START_ALLWAYS_ON /**< No trigger, integrator active all the time */
} XMC_DSD_CH_INTEGRATOR_START_t;
/**
* Enumerates the integration enable.
* Use type @ref XMC_DSD_CH_INTEGRATOR_STOP_t for this enum.
*/
typedef enum XMC_DSD_CH_INTEGRATOR_STOP
{
XMC_DSD_CH_INTEGRATOR_STOP_END_OF_LOOPS, /**< Integration stopped upon the inverse trigger event */
XMC_DSD_CH_INTEGRATOR_STOP_ENDLESS_OR_INVERSE_TRIGGER /**< Integration enabled upon the defined trigger event. */
} XMC_DSD_CH_INTEGRATOR_STOP_t;
/**
* Enumerates the trigger signal.
* Use type @ref XMC_DSD_CH_TRIGGER_SOURCE_t for this enum.
*/
typedef enum XMC_DSD_CH_TRIGGER_SOURCE
{
XMC_DSD_CH_TRIGGER_SOURCE_A = 0U, /**< Trigger signal,input A*/
XMC_DSD_CH_TRIGGER_SOURCE_B = 1U, /**< Trigger signal,input B*/
XMC_DSD_CH_TRIGGER_SOURCE_C = 2U, /**< Trigger signal,input C*/
XMC_DSD_CH_TRIGGER_SOURCE_D = 3U, /**< Trigger signal,input D*/
XMC_DSD_CH_TRIGGER_SOURCE_E = 4U, /**< Trigger signal,input E*/
XMC_DSD_CH_TRIGGER_SOURCE_F = 5U, /**< Trigger signal,input F*/
XMC_DSD_CH_TRIGGER_SOURCE_G = 6U, /**< Trigger signal,input G*/
XMC_DSD_CH_TRIGGER_SOURCE_H = 7U /**< Trigger signal,input H*/
} XMC_DSD_CH_TRIGGER_SOURCE_t;
/**
* Enumerates the timestamp trigger mode.
* Use type @ref XMC_DSD_CH_TIMESTAMP_TRIGGER_t for this enum.
*/
typedef enum XMC_DSD_CH_TIMESTAMP_TRIGGER
{
XMC_DSD_CH_TIMESTAMP_TRIGGER_DISABLE, /**< No trigger event*/
XMC_DSD_CH_TIMESTAMP_TRIGGER_FALL, /**< Trigger event upon a falling edge*/
XMC_DSD_CH_TIMESTAMP_TRIGGER_RISE, /**< Trigger event upon a rising edge*/
XMC_DSD_CH_TIMESTAMP_TRIGGER_BOTH_EDGES /**< Trigger event upon both the edge*/
} XMC_DSD_CH_TIMESTAMP_TRIGGER_t;
/**
* Enumerates the carrier generation mode.
* Use type @ref XMC_DSD_CH_SIGN_SOURCE_t for this enum.
*/
typedef enum XMC_DSD_CH_SIGN_SOURCE
{
XMC_DSD_CH_SIGN_SOURCE_ON_CHIP_GENERATOR, /**< Carrier is generated internally by DSD */
XMC_DSD_CH_SIGN_SOURCE_NEXT_CHANNEL, /**< Carrier sign signal is generated internally by next channel*/
XMC_DSD_CH_SIGN_SOURCE_EXTERNAL_A, /**< Carrier is generated externally, External sign signal A*/
XMC_DSD_CH_SIGN_SOURCE_EXTERNAL_B /**< Carrier is generated externally, External sign signal B*/
} XMC_DSD_CH_SIGN_SOURCE_t;
/**
* Enumerates the channel run control bit register value in global run control register.
* Use type @ref XMC_DSD_CH_ID_t for this enum.
*/
typedef enum XMC_DSD_CH_ID
{
XMC_DSD_CH_ID_0 = 1U, /**< Register value for channel 0 */
XMC_DSD_CH_ID_1 = 2U, /**< Register value for channel 1 */
XMC_DSD_CH_ID_2 = 4U, /**< Register value for channel 2 */
XMC_DSD_CH_ID_3 = 8U /**< Register value for channel 3 */
} XMC_DSD_CH_ID_t;
/**
* Enumerates the service request generation mode for auxiliary filter.
* Use type @ref XMC_DSD_CH_AUX_EVENT_t for this enum.
* Note: This is combined ENUM for SRGA + ESEL bit fields
*/
typedef enum XMC_DSD_CH_AUX_EVENT
{
XMC_DSD_CH_AUX_EVENT_DISABLED = 0U, /**< Service request is disabled */
XMC_DSD_CH_AUX_EVENT_EVERY_NEW_RESULT = 1U, /**< Service request generated for aux filter for every new result */
XMC_DSD_CH_AUX_EVENT_CAPTURE_SIGN_DELAY = 2U, /**< Service request generated for alternate source */
XMC_DSD_CH_AUX_EVENT_INSIDE_BOUNDARY = 5U, /**< Service request generated for aux filter if result is inside boundary */
XMC_DSD_CH_AUX_EVENT_OUTSIDE_BOUNDARY = 9U /**< Service request generated for aux filter if result is outside boundary */
} XMC_DSD_CH_AUX_EVENT_t;
/**
* Enumerates the service request generation for main chain filter.
* Use type @ref XMC_DSD_CH_RESULT_EVENT_t for this enum.
*/
typedef enum XMC_DSD_CH_RESULT_EVENT
{
XMC_DSD_CH_RESULT_EVENT_DISABLE = 0U, /**< Disable service request */
XMC_DSD_CH_RESULT_EVENT_ENABLE = 3U /**< Enable service request for each new result value */
} XMC_DSD_CH_RESULT_EVENT_t;
/*********************************************************************************************************************
* DATA STRUCTURES
********************************************************************************************************************/
/*Anonymous structure/union guard start*/
#if defined(__CC_ARM)
#pragma push
#pragma anon_unions
#elif defined(__TASKING__)
#pragma warning 586
#endif
/**
* DSD generator generates several pattern and frequencies.
* Use type @ref XMC_DSD_GENERATOR_CONFIG_t for this data structure.
* Note: Output pins have to be enabled by user.
*/
typedef struct XMC_DSD_GENERATOR_CONFIG
{
union
{
struct
{
uint32_t mode: 2; /**< carrier generator operating mode. This parameter can take a value of XMC_DSD_GENERATOR_MODE_t */
uint32_t bit_reverse: 1; /**< should PWM signal be bit-reversed? 0: Normal mode, 1:Bit-reverse mode */
uint32_t inverted_polarity: 1; /**< should PWM signal start from negative max. 0: Normal, 1: Inverted */
uint32_t frequency: 4; /**< Frequency divider value of PWM signal. This parameter can take a value of XMC_DSD_GENERATOR_CLKDIV_t */
uint32_t :24;
};
uint32_t generator_conf; /**< Carrier generator configuration register(CGCFG)*/
};
} XMC_DSD_GENERATOR_CONFIG_t;
/**
* DSD filter is the basic module of the DSD. It can be used separately or can be combined with the other modules like
* integrator, rectify, auxiliary filter etc.
* The filter demodulates the incoming bit stream from the delta sigma modulator to a 16 bit result.
* Note: Configure or reconfigure filter parameters while the channel is inactive.
*/
typedef struct XMC_DSD_CH_FILTER_CONFIG
{
uint32_t clock_divider: 4; /**< This parameter can take a value of XMC_DSD_CH_CLK_t */
int16_t offset; /**< Offset subtracted from result.This parameter can take a value of int16_t */
union
{
struct
{
uint32_t data_source: 4; /**< This parameter can take a value of XMC_DSD_CH_DATA_SOURCE_t */
uint32_t : 12;
uint32_t clock_source: 4; /**< This parameter can take a value of XMC_DSD_CH_CLOCK_SOURCE_t */
uint32_t strobe: 4; /**< This parameter can take a value of XMC_DSD_CH_STROBE_t */
uint32_t :8;
};
uint32_t demodulator_conf; /*Demodulator Input Configuration Register*/
};
union
{
struct
{
uint32_t : 8;
uint32_t filter_type: 2; /**< This parameter can take a value of XMC_DSD_CH_FILTER_TYPE_t */
uint32_t : 4;
uint32_t result_event : 2; /**< This parameter can take a value of XMC_DSD_CH_RESULT_EVENT_t */
uint32_t : 8;
uint32_t : 8;
};
uint32_t main_filter_conf;
};
uint32_t decimation_factor; /**< This parameter can be in range of 4 - 256[dec] */
uint32_t filter_start_value; /**< This parameter can be in range of 4 - decimation_factor[dec]*/
} XMC_DSD_CH_FILTER_CONFIG_t;
/**
* The integrator is mainly used for high accurate measurement.
* Note:DSD Filter is mandatory to use this block.
*/
typedef struct XMC_DSD_CH_INTEGRATOR_CONFIG
{
union
{
struct
{
uint32_t :8;
uint32_t start_condition: 2; /**< Can take a value of XMC_DSD_CH_INTEGRATOR_START_t.Bitfields \a ITRMODE of \a DICFG.*/
uint32_t :2;
uint32_t trigger_source: 3; /**< Can take a value of XMC_DSD_CH_TRIGGER_SOURCE_t.Bitfields \a TRSEL of \a DICFG. */
uint32_t :17;
};
uint32_t integrator_trigger; /**< Demodulator Input Configuration Register(\a DICFG).*/
};
uint32_t integration_loop; /**< Integration loops to see stop condition. Bitfields \a REPVAL of \a IWCTR.*/
uint32_t discarded_values; /**< Number of mainfilter results,discarded before integration starts.Bitfields \a NVALDIS of \a IWCTR.*/
uint32_t stop_condition; /**< Integrator stop condition. Can take a value of XMC_DSD_CH_INTEGRATOR_STOP_t.Bitfields \a IWS of \a IWCTR.*/
uint32_t counted_values; /**< Number of mainfilter results, integrated to a integrator result.Bitfields \a NVALINT of \a IWCTR.*/
} XMC_DSD_CH_INTEGRATOR_CONFIG_t;
/**
* DSD timestamp saves result, filter counter register and integrator count register.
* Note: Trigger source for timestamp and integrator trigger are shared.
* DSD Filter is mandatory to use this block.
*/
typedef struct XMC_DSD_CH_TIMESTAMP_CONFIG
{
union
{
struct
{
uint32_t :10;
uint32_t trigger_mode:2; /**< This parameter can take a value of XMC_DSD_CH_TIMESTAMP_TRIGGER_t */
uint32_t trigger_source: 3; /**< This parameter can take a value of XMC_DSD_CH_TRIGGER_SOURCE_t */
uint32_t : 17;
};
uint32_t timestamp_conf;
};
} XMC_DSD_CH_TIMESTAMP_CONFIG_t;
/**
* DSD auxiliary Filter is used as fast filter to detect overvoltage or current by defining the boundaries.
*/
typedef struct XMC_DSD_CH_AUX_FILTER_CONFIG
{
union
{
struct
{
uint32_t : 8; /**< This parameter can be in range of 4 - 256[dec] */
uint32_t filter_type : 2; /**< This parameter can take a value of XMC_DSD_CH_FILTER_TYPE_t */
uint32_t result_event_type : 4; /**< Result event for aux filter and the event select configuration.
Use enum XMC_DSD_CH_AUX_EVENT_t */
uint32_t enable_integrator_coupling : 1; /**< Only enable AUX filter when Integrator is enabled*/
uint32_t : 17;
};
uint32_t aux_filter_conf;
};
union
{
struct
{
uint32_t lower_boundary : 16; /**< This parameter can take a value of int16_t */
uint32_t upper_boundary : 16; /**< This parameter can take a value of int16_t */
};
uint32_t boundary_conf;
};
uint32_t decimation_factor; /**< This parameter can be in range of 4 - 256[dec]*/
} XMC_DSD_CH_AUX_FILTER_CONFIG_t;
/**
* DSD Rectify.
* Note: DSD Filter and integrator is mandatory to use this block.
*/
typedef struct XMC_DSD_CH_RECTIFY_CONFIG
{
union
{
struct
{
uint32_t :4;
uint32_t sign_source: 2; /**< Can take a value of XMC_DSD_CH_SIGN_SOURCE_t.Bitfields \a SSRC of \a RECTCFG.*/
uint32_t :26;
};
uint32_t rectify_config; /**< Rectification configuration register(\a RECTCFG)*/
};
uint8_t delay;
uint8_t half_cycle;
} XMC_DSD_CH_RECTIFY_CONFIG_t;
/*Anonymous structure/union guard end*/
#if defined(__CC_ARM)
#pragma pop
#elif defined(__TASKING__)
#pragma warning restore
#endif
/**
* DSD Enable Channel
*/
typedef struct XMC_DSD_CONFIG
{
XMC_DSD_CH_FILTER_CONFIG_t *const filter; /**< Pointer to the filter configuration */
XMC_DSD_CH_INTEGRATOR_CONFIG_t *const integrator; /**< Pointer to the integrator configuration*/
XMC_DSD_CH_TIMESTAMP_CONFIG_t *const timestamp; /**< Pointer to the time stamp configuration*/
XMC_DSD_CH_AUX_FILTER_CONFIG_t *const aux; /**< Pointer to the aux_filter configuration*/
XMC_DSD_CH_RECTIFY_CONFIG_t *const rectify; /**< Pointer to the rectify configuration*/
} XMC_DSD_CH_CONFIG_t;
/**********************************************************************************************************************
* API PROTOTYPES
*********************************************************************************************************************/
#ifdef __cplusplus
extern "C" {
#endif
/**
* @param dsd Pointer to an instance of DSD module of type @ref XMC_DSD_t
* @return None
*
* \par<b>Description</b><br>
* De-asserts the DSD module from reset.\n
* Configures \a PRCLR0 register's \a DSDRS bit field.
* If running on XMC44/XMC48 device then it will ungate the peripheral clock.
*
* \par<b>Note</b><br>
* It is internally called by XMC_DSD_Init().
*
* \par<b>Related APIs:</b><BR>
* XMC_DSD_Disable(),XMC_DSD_Init() \n\n\n
*/
void XMC_DSD_Enable(XMC_DSD_t *const dsd);
/**
* @param dsd Pointer to an instance of DSD module of type @ref XMC_DSD_t
* @return None
*
* \par<b>Description</b><br>
* Asserts the DSD module into reset.\n
* Configures \a PRSET0 register's \a DSDRS bit field.
* If running on XMC44/XMC48 device then it will gate the peripheral clock.
*
* \par<b>Related APIs:</b><BR>
* XMC_DSD_Enable()\n\n\n
*/
void XMC_DSD_Disable(XMC_DSD_t *const dsd);
/**
* @param dsd Pointer to an instance of DSD module of type @ref XMC_DSD_t
* @return None
*
* \par<b>Description</b><br>
* Enable the module clock and internal module clock for DSD.\n
* Configures bit field \a MCSEL of register \a GLOBCFG and bit field \a DISR of register \a CLC.
*
* \par<b>Note</b><br>
* It is internally called by XMC_DSD_Init().
*
* \par<b>Related APIs:</b><BR>
* XMC_DSD_DisableClock(),XMC_DSD_Init() \n\n\n
*/
void XMC_DSD_EnableClock(XMC_DSD_t *const dsd);
/**
* @param dsd Pointer to an instance of DSD module of type @ref XMC_DSD_t
* @return None
*
* \par<b>Description</b><br>
* Stop the module clock and disable internal module clock for DSD.\n
* Configures bit field \a MCSEL of register \a GLOBCFG and bit field \a DISR of register \a CLC.
*
* \par<b>Related APIs:</b><BR>
* XMC_DSD_DisableClock()\n\n\n
*/
void XMC_DSD_DisableClock(XMC_DSD_t *const dsd);
/**
* @param dsd Pointer to an instance of DSD module of type @ref XMC_DSD_t
* @return bool Return 1 if success else 0.
*
* \par<b>Description</b><br>
* Find out if the DSD reset is asserted.\n
* Read \a PRSTAT0 register's \a DSDRS bit field.\n\n\n
*/
bool XMC_DSD_IsEnabled(XMC_DSD_t *const dsd);
/**
* @param dsd Pointer to an instance of DSD module of type @ref XMC_DSD_t
* @return None
*
* \par<b>Description</b><br>
* Enable the DSD module and clock.\n
*
* \par<b>Note</b><br>
* This is the first API which application must invoke to configure DSD.
*
* \par<b>Related APIs:</b><BR>
* XMC_DSD_Enable(),XMC_DSD_EnableClock()\n\n\n
*/
void XMC_DSD_Init(XMC_DSD_t *const dsd);
/**
* @param channel Pointer to an instance of DSD channel of type @ref XMC_DSD_CH_t
* @param init Pointer to an instance of data structure of type @ref XMC_DSD_CH_TIMESTAMP_CONFIG_t
* @return None
*
* \par<b>Description</b><br>
* Initialize timestamp mode of DSD module with \a init.\n
* Configures bits \a TRSEL and \a TSTRMODE of register \a DICFG .
*
* \par<b>Note</b><br>
* Trigger source for timestamp and integrator are shared.
* It is internally called by XMC_DSD_CH_Init().
*
* \par<b>Related APIs:</b><BR>
* XMC_DSD_CH_Init()\n\n\n
*/
void XMC_DSD_CH_Timestamp_Init(XMC_DSD_CH_t *const channel, const XMC_DSD_CH_TIMESTAMP_CONFIG_t *const init);
/**
* @param channel Pointer to an instance of DSD channel of type @ref XMC_DSD_CH_t
* @param init Pointer to an instance of data structure of type @ref XMC_DSD_CH_CONFIG_t
* @return XMC_DSD_STATUS_t if success Returns @ref XMC_DSD_STATUS_OK
* else return @ref XMC_DSD_STATUS_ERROR.
*
* \par<b>Description</b><br>
* Initialize main filter,auxiliary filter,integrator, rectifier and timestamp of DSD module with \a init.\n
* Internally this API invoke main filter, auxiliary filter, integrator, rectifier and timestamp init API.
*
* \par<b>Related APIs:</b><BR>
* XMC_DSD_CH_MainFilter_Init(),XMC_DSD_CH_AuxFilter_Init(),XMC_DSD_CH_Integrator_Init(),
* XMC_DSD_CH_Rectify_Init(),XMC_DSD_CH_Timestamp_Init()\n\n\n
*/
XMC_DSD_STATUS_t XMC_DSD_CH_Init(XMC_DSD_CH_t *const channel, const XMC_DSD_CH_CONFIG_t *const init);
/**
* @param dsd Pointer to an instance of DSD module of type @ref XMC_DSD_t
* @param channel Channel run control bit register value
* @return None
*
* \par<b>Description</b><br>
* Start demodulator channel by enabling run control bit.
* Multiple channel can be start at a time.
* For an example: To start all four channel, call this function as
* XMC_DSD_Start(DSD,(uint32_t)(XMC_DSD_CH_ID_0|XMC_DSD_CH_ID_1|XMC_DSD_CH_ID_2|XMC_DSD_CH_ID_3));
*
* \par<b>Note</b><br>
* All filter blocks are cleared when CHxRUN is set.
*
* \par<b>Related APIs:</b><BR>
* XMC_DSD_Stop(),XMC_DSD_IsChannelStarted()\n\n\n
*/
__STATIC_INLINE void XMC_DSD_Start(XMC_DSD_t *const dsd, const uint32_t channel)
{
XMC_ASSERT("XMC_DSD_Start:Invalid module pointer", XMC_DSD_CHECK_MODULE_PTR(dsd));
dsd->GLOBRC |= channel;
}
/**
* @param dsd Pointer to an instance of DSD module of type @ref XMC_DSD_t\n
* @param channel Channel run control bit register value\n
* @return None\n
*
* \par<b>Description</b><br>
* Stop demodulator channel by resetting run control bit.
* Multiple channel can be stop at a time.
* For an example: To stop all four channel, call this function as
* XMC_DSD_Stop(DSD,(uint32_t)(XMC_DSD_CH_ID_0|XMC_DSD_CH_ID_1|XMC_DSD_CH_ID_2|XMC_DSD_CH_ID_3));
*
*
* \par<b>Related APIs:</b><BR>
* XMC_DSD_Start(),XMC_DSD_IsChannelStarted()\n\n\n
*/
__STATIC_INLINE void XMC_DSD_Stop(XMC_DSD_t *const dsd, const uint32_t channel)
{
XMC_ASSERT("XMC_DSD_Stop:Invalid module pointer", XMC_DSD_CHECK_MODULE_PTR(dsd));
dsd->GLOBRC &= (uint32_t) ~channel;
}
/**
* @param dsd Pointer to an instance of DSD module of type @ref XMC_DSD_t\n
* @param channel Channel run control bit register value of type @ref XMC_DSD_CH_ID_t\n
* @return bool Return 1 if started else 0.\n
*
* \par<b>Description</b><br>
* Find out if particular demodulator channel is started or not.\n
*
* \par<b>Related APIs:</b><BR>
* XMC_DSD_Start(),XMC_DSD_Stop()\n\n\n
*/
__STATIC_INLINE bool XMC_DSD_IsChannelStarted(XMC_DSD_t *const dsd, const XMC_DSD_CH_ID_t channel)
{
bool status;
XMC_ASSERT("XMC_DSD_IsChannelStarted:Invalid module pointer", XMC_DSD_CHECK_MODULE_PTR(dsd));
if (dsd->GLOBRC & (uint32_t)channel)
{
status = true;
}
else
{
status = false;
}
return (status);
}
/**
* @param channel Pointer to an instance of DSD channel of type @ref XMC_DSD_CH_t
* @param dsd_Result pointer point to the address of 16 bit variable
* @return None
*
* \par<b>Description:</b><br>
* Returns the result of most recent conversion associated with this channel.\n
* A call to this API would access the register bit field \a RESMx.RESULT (x = 0 - 3).
*
* \par<b>Related APIs:</b><br>
* XMC_DSD_CH_GetResult_TS()\n\n\n
*/
__STATIC_INLINE void XMC_DSD_CH_GetResult(XMC_DSD_CH_t *const channel, int16_t* dsd_Result)
{
uint16_t result;
result = (uint16_t)((uint32_t)channel->RESM & DSD_CH_RESM_RESULT_Msk);
*dsd_Result = (int16_t)result;
}
/**
* @param channel Pointer to an instance of DSD channel of type @ref XMC_DSD_CH_t\n
* @param dsd_Result pointer point to the address of 16 bit variable holds result value\n
* @param dsd_filter_loop pointer point to the address of 8 bit variable holds decimation counter value\n
* @param dsd_integration_loop pointer point to the address of 8 bit integration counter variable holds value\n
* @return None\n
*
* \par<b>Description:</b><br>
* API to get the result of the last conversion associated with this channel with
* CIC filter decimation counter and number of values counted.\n
* A call to this API would access the register bit field \a TSTMPx.RESULT \a TSTMPx.CFMDCNT and \a TSTMPx.NVALCNT where (x = 0 - 3).
*
* \par<b>Related APIs:</b><br>
* XMC_DSD_CH_GetResult(),XMC_DSD_CH_GetResult_TS_Time()\n\n\n
*/
void XMC_DSD_CH_GetResult_TS(
XMC_DSD_CH_t *const channel,
int16_t* dsd_Result,
uint8_t* dsd_filter_loop,
uint8_t* dsd_integration_loop);
/**
* @param channel Pointer to an instance of DSD channel of type @ref XMC_DSD_CH_t\n
* @param dsd_Result pointer point to the address of 16 bit variable holds result value\n
* @param time pointer point to the address of 32 bit variable holds the time\n
* @return None
*
* \par<b>Description:</b><br>
* API to get the result of the last conversion with the time, associated with this channel.\n
*
* \par<b>Related APIs:</b><br>
* XMC_DSD_CH_GetResult(),XMC_DSD_CH_GetResult_TS()\n\n\n
*/
void XMC_DSD_CH_GetResult_TS_Time(XMC_DSD_CH_t *const channel, int16_t* dsd_Result, uint32_t* time);
/**
* @param channel Pointer to an instance of DSD channel of type @ref XMC_DSD_CH_t
* @param dsd_Result pointer point to the address of 16 bit variable
* @return None
*
* \par<b>Description:</b><br>
* Returns the most recent conversion result values of the auxiliary filter associated with this channel.\n
* A call to this API would access the register bit field \a RESAx.RESULT (x = 0 - 3).
*
* \par<b>Related APIs:</b><br>
* XMC_DSD_CH_GetResult_TS()\n\n\n
*/
__STATIC_INLINE void XMC_DSD_CH_GetResult_AUX(XMC_DSD_CH_t *const channel, int16_t* dsd_Result)
{
uint16_t result;
result = (uint16_t) (channel->RESA & DSD_CH_RESA_RESULT_Msk);
*dsd_Result = (int16_t) (result);
}
/**
* @param dsd Pointer to an instance of DSD module of type @ref XMC_DSD_t
* @param init Pointer to an instance of data structure of type @ref XMC_DSD_GENERATOR_CONFIG_t
* @return None
*
* \par<b>Description</b><br>
* This API initialize generator module with \a init, to generate a wave for a resolver.
* Three types of waveforms can be generated: Rectangle, Triangle and Sine.
*
*/
void XMC_DSD_Generator_Init(XMC_DSD_t *const dsd, const XMC_DSD_GENERATOR_CONFIG_t *const init);
/**
* @param dsd Pointer to an instance of DSD module of type @ref XMC_DSD_t
* @param config Pointer to an instance of data structure of type @ref XMC_DSD_GENERATOR_CONFIG_t
* @return None
*
* \par<b>Description</b><br>
* Start carrier generator by configuring operating mode.
* Configures bit field \a CGMOD of register \a CGCFG.
*
*
* \par<b>Related APIs:</b><BR>
* XMC_DSD_Generator_Stop()\n\n\n
*/
__STATIC_INLINE void XMC_DSD_Generator_Start(XMC_DSD_t *const dsd, const XMC_DSD_GENERATOR_CONFIG_t *const config)
{
XMC_ASSERT("XMC_DSD_Generator_Start:Invalid module pointer", XMC_DSD_CHECK_MODULE_PTR(dsd));
XMC_ASSERT("XMC_DSD_Generator_Start:NULL Pointer", (config != (XMC_DSD_GENERATOR_CONFIG_t *)NULL) );
dsd->CGCFG |= config->mode;
}
/**
* @param dsd Pointer to an instance of DSD module of type @ref XMC_DSD_t
* @return None
*
* \par<b>Description</b><br>
* Stop carrier generator by configuring operating mode.
* Reset bit field \a CGMOD of register \a CGCFG.
*
* \par<b>Note</b><br>
* Stopping the carrier generator terminates the PWM output after completion of the current period.
*
* \par<b>Related APIs:</b><BR>
* XMC_DSD_Generator_Start()\n\n\n
*/
__STATIC_INLINE void XMC_DSD_Generator_Stop(XMC_DSD_t *const dsd)
{
XMC_ASSERT("XMC_DSD_Generator_Stop:Invalid module pointer", XMC_DSD_CHECK_MODULE_PTR(dsd));
dsd->CGCFG &= ~((uint32_t)DSD_CGCFG_CGMOD_Msk);
}
/**
* @param channel Pointer to an instance of DSD channel of type @ref XMC_DSD_CH_t
* @param init Pointer to an instance of data structure of type @ref XMC_DSD_CH_FILTER_CONFIG_t
* @return None
*
* \par<b>Description</b><br>
* This API initialize main filter module with \a init.
* The filter demodulates the incoming bit stream from the delta sigma modulator to a 16 bit result.
*
*
* \par<b>Note</b><br>
* It is internally called by XMC_DSD_CH_Init().
*
* \par<b>Related APIs:</b><BR>
* XMC_DSD_CH_Init()\n\n\n
*/
void XMC_DSD_CH_MainFilter_Init(XMC_DSD_CH_t *const channel, const XMC_DSD_CH_FILTER_CONFIG_t *const init);
/**
* @param channel Pointer to an instance of DSD channel of type @ref XMC_DSD_CH_t
* @param offset Signed Offset value to be set
* @return None
*
* \par<b>Description</b><br>
* API set the signed offset value for this channel.
* This offset value is subtracted from each result before being written to the corresponding result register \a RESMx.
*
* \par<b>Note</b><br>
* The offset value is measured for each channel separately.
*
*/
__STATIC_INLINE void XMC_DSD_CH_MainFilter_SetOffset(XMC_DSD_CH_t *const channel, const int16_t offset)
{
XMC_ASSERT("XMC_DSD_CH_MainFilter_SetOffset:Invalid module pointer", XMC_DSD_CHECK_CHANNEL_PTR(channel));
channel->OFFM = (uint32_t)offset;
}
/**
* @param channel Pointer to an instance of DSD channel of type @ref XMC_DSD_CH_t
* @return None
*
* \par<b>Description</b><br>
* This API enable the service request generation for result of this channel.
* Result events are generated at the output rate of the configured main filter chain.
* Configure bit field \a SRGM of register \a FCFGC
*
*/
__STATIC_INLINE void XMC_DSD_CH_MainFilter_EnableEvent(XMC_DSD_CH_t *const channel)
{
XMC_ASSERT("XMC_DSD_CH_MainFilter_EnableEvent:Invalid module pointer", XMC_DSD_CHECK_CHANNEL_PTR(channel));
channel->FCFGC |= (uint32_t)DSD_CH_FCFGC_SRGM_Msk;
}
/**
* @param channel Pointer to an instance of DSD channel of type @ref XMC_DSD_CH_t
* @return None
*
* \par<b>Description</b><br>
* This API disable the service request generation for result of this channel.
* Configure bit field \a SRGM of register \a FCFGC
*
*/
__STATIC_INLINE void XMC_DSD_CH_MainFilter_DisableEvent(XMC_DSD_CH_t *const channel)
{
XMC_ASSERT("XMC_DSD_CH_MainFilter_DisableEvent:Invalid module pointer", XMC_DSD_CHECK_CHANNEL_PTR(channel));
channel->FCFGC &= ~((uint32_t)DSD_CH_FCFGC_SRGM_Msk);
}
/**
* @param channel Pointer to an instance of DSD channel of type @ref XMC_DSD_CH_t
* @param init Pointer to an instance of data structure of type @ref XMC_DSD_CH_AUX_FILTER_CONFIG_t
* @return None
*
* \par<b>Description</b><br>
* This API initialize auxiliary filter module with \a init. The auxiliary Filter is mainly used as fast filter.\n
* Adding the auxiliary filter to the system structure helps by defining the boundaries and filter configurations.\n
*
*
* \par<b>Note</b><br>
* It is internally called by XMC_DSD_CH_Init().\n
*
* \par<b>Related APIs:</b><BR>
* XMC_DSD_CH_Init()\n\n\n
*/
void XMC_DSD_CH_AuxFilter_Init(XMC_DSD_CH_t *const channel, const XMC_DSD_CH_AUX_FILTER_CONFIG_t *const init);
/**
* @param channel Pointer to an instance of DSD channel of type @ref XMC_DSD_CH_t
* @param lower_boundary lower boundary value for limit checking
* @param upper_boundary upper boundary value for limit checking
* @return None
*
* \par<b>Description</b><br>
* Invoke this API, to set the lower and upper boundary for limit checking for this channel.
* This (twos complement) value is compared to the results of the parallel filter.
* Configure bit fields \a BOUNDARYU and \a BOUNDARYL of register \a BOUNDSEL.
*
* \par<b>Note</b><br>
* Lower and upper boundaries are internally configured by function XMC_DSD_CH_AuxFilter_Init().
*
* \par<b>Related APIs:</b><BR>
* XMC_DSD_CH_AuxFilter_Init()\n\n\n
*/
__STATIC_INLINE void XMC_DSD_CH_AuxFilter_SetBoundary(
XMC_DSD_CH_t *const channel,
const int16_t lower_boundary,
const int16_t upper_boundary)
{
XMC_ASSERT("XMC_DSD_CH_AuxFilter_SetBoundary:Invalid module pointer", XMC_DSD_CHECK_CHANNEL_PTR(channel));
channel->BOUNDSEL = (((uint32_t)upper_boundary << (uint32_t)DSD_CH_BOUNDSEL_BOUNDARYU_Pos)
| ((uint32_t)lower_boundary & (uint32_t)DSD_CH_BOUNDSEL_BOUNDARYL_Msk));
}
/**
* @param channel Pointer to an instance of DSD channel of type @ref XMC_DSD_CH_t
* @param event to select the type of event which will be enabled of type @ref XMC_DSD_CH_AUX_EVENT_t
* @return None
*
* \par<b>Description</b><br>
* This API enable the service request generation for this channel.
* Result events are generated at the output rate of the configured auxiliary filter chain.
* Configure bit field \a SRGA and ESEL of register \a FCFGA
*
*/
__STATIC_INLINE void XMC_DSD_CH_AuxFilter_EnableEvent(XMC_DSD_CH_t *const channel, XMC_DSD_CH_AUX_EVENT_t event)
{
XMC_ASSERT("XMC_DSD_CH_AuxFilter_EnableEvent:Invalid module pointer", XMC_DSD_CHECK_CHANNEL_PTR(channel));
channel->FCFGA &= ~((uint32_t)DSD_CH_FCFGA_ESEL_Msk|(uint32_t)DSD_CH_FCFGA_SRGA_Msk);
channel->FCFGA |= ((uint32_t)event << DSD_CH_FCFGA_SRGA_Pos);
}
/**
* @param channel Pointer to an instance of DSD channel of type @ref XMC_DSD_CH_t
* @return None
*
* \par<b>Description</b><br>
* This API disable the auxiliary filter service request generation for this channel.
* Clear the bit fields \a SRGA and ESEL of register \a FCFGA.
*
*/
__STATIC_INLINE void XMC_DSD_CH_AuxFilter_DisableEvent(XMC_DSD_CH_t *const channel)
{
XMC_ASSERT("XMC_DSD_CH_AuxFilter_DisableEvent:Invalid module pointer", XMC_DSD_CHECK_CHANNEL_PTR(channel));
channel->FCFGA &= ~((uint32_t)DSD_CH_FCFGA_ESEL_Msk|(uint32_t)DSD_CH_FCFGA_SRGA_Msk);
}
/**
* @param channel Pointer to an instance of DSD channel of type @ref XMC_DSD_CH_t
* @param init Pointer to an instance of data structure of type @ref XMC_DSD_CH_INTEGRATOR_CONFIG_t
* @return None
*
* \par<b>Description</b><br>
* Initialize integrator of DSD module.The integrator is mainly used for resolver feedback but can also be used for high accurate measurement.
* This API configures number of integration loops, number of results are discarded before integration starts, integrator stop condition,
* number of integrator loop to get integration result and trigger mode.
*
* \par<b>Note</b><br>
* Trigger source for timestamp and integrator are shared.
* It is internally called by XMC_DSD_CH_Init().
*
* \par<b>Related APIs:</b><BR>
* XMC_DSD_CH_Init()\n\n\n
*/
void XMC_DSD_CH_Integrator_Init(XMC_DSD_CH_t *const channel, const XMC_DSD_CH_INTEGRATOR_CONFIG_t *const init);
/**
* @param channel Pointer to an instance of DSD channel of type @ref XMC_DSD_CH_t
* @param init Pointer to an instance of data structure of type @ref XMC_DSD_CH_RECTIFY_CONFIG_t
* @return None
*
* \par<b>Description</b><br>
* Initialize rectification for this channel.
* In a resolver feedback system, rectifier is used to rectify the result from the integrator.
* Configure bit field \a RFEN and \a SSRC of register \a RECTCFG. Also configure sign delay
* value for positive halfwave(\a SDPOS) and negative halfwave(\a SDNEG).
* \par<b>Note</b><br>
* For the operational capability of rectifier the filter and the integrator is mandatory.
* It is internally called by XMC_DSD_CH_Init().
*
* \par<b>Related APIs:</b><BR>
* XMC_DSD_CH_Init()\n\n\n
*/
void XMC_DSD_CH_Rectify_Init(XMC_DSD_CH_t *const channel, const XMC_DSD_CH_RECTIFY_CONFIG_t *const init);
/**
* @param channel Pointer to an instance of DSD channel of type @ref XMC_DSD_CH_t
* @param delay Captured value
* @return uint8_t
*
* \par<b>Description</b><br>
* This API, capture sign delay value for DSD channel.
* Captured value indicates the values counted between the begin of the positive
* halfwave of the carrier signal and the first received positive value.
* Read bit field \a SDCAP of register \a CGSYNC
*
*/
__STATIC_INLINE void XMC_DSD_CH_GetRectifyDelay(XMC_DSD_CH_t *const channel, uint8_t* delay)
{
XMC_ASSERT("XMC_DSD_CH_GetRectifyDelay:Invalid module pointer", XMC_DSD_CHECK_CHANNEL_PTR(channel));
*delay = (uint8_t)((channel->CGSYNC & DSD_CH_CGSYNC_SDCAP_Msk ) >> DSD_CH_CGSYNC_SDCAP_Pos);
}
/**
* @param dsd Pointer to an instance of DSD module of type @ref XMC_DSD_t
* @param channel_id Channel number register value of type @ref XMC_DSD_CH_ID_t
* @return None
*
* \par<b>Description</b><br>
* Set the result event flag and trigger the corresponding event.\n
* Set bit fields \a RESEVx of register \a EVFLAG.Clearing these bits has no effect.
*
* \par<b>Note</b><br>
* API call for channel-0 : XMC_DSD_SetResultEventFlag(DSD,(uint32_t)XMC_DSD_CH_ID_0);
* API call for channel-0 and 1: XMC_DSD_SetResultEventFlag(DSD,(uint32_t)(XMC_DSD_CH_ID_0|XMC_DSD_CH_ID_1));
*
* \par<b>Related APIs:</b><BR>
* XMC_DSD_ClearResultEventFlag()\n\n\n
*/
__STATIC_INLINE void XMC_DSD_SetResultEventFlag(XMC_DSD_t *const dsd, const uint32_t channel_id)
{
XMC_ASSERT("XMC_DSD_SetResultEventFlag:Invalid module pointer", XMC_DSD_CHECK_MODULE_PTR(dsd));
dsd->EVFLAG = channel_id;
}
/**
* @param dsd Pointer to an instance of DSD module of type @ref XMC_DSD_t
* @param channel_id Channel number register value of type @ref XMC_DSD_CH_ID_t
* @return None
*
* \par<b>Description</b><br>
* Clear the result event flag.\n
* Set bit fields \a RESECx of register \a EVFLAGCLR.Clearing these bits has no effect.
*
* \par<b>Note</b><br>
* API call for channel-0 : XMC_DSD_ClearResultEventFlag(DSD,(uint32_t)XMC_DSD_CH_ID_0);
* API call for channel-0 and 1: XMC_DSD_ClearResultEventFlag(DSD,(uint32_t)(XMC_DSD_CH_ID_0|XMC_DSD_CH_ID_1));
*
* \par<b>Related APIs:</b><BR>
* XMC_DSD_SetResultEventFlag()\n\n\n
*/
__STATIC_INLINE void XMC_DSD_ClearResultEventFlag(XMC_DSD_t *const dsd, const uint32_t channel_id)
{
XMC_ASSERT("XMC_DSD_ClearResultEventFlag:Invalid module pointer", XMC_DSD_CHECK_MODULE_PTR(dsd));
dsd->EVFLAGCLR = channel_id;
}
/**
* @param dsd Pointer to an instance of DSD module of type @ref XMC_DSD_t
* @param channel_id Channel number register value of type @ref XMC_DSD_CH_ID_t
* @return None
*
* \par<b>Description</b><br>
* Set the alarm event flag.\n
* Set bit fields \a ALEVx of register \a EVFLAG.Clearing these bits has no effect.
*
* \par<b>Note</b><br>
* API call for channel-0 : XMC_DSD_SetAlarmEventFlag(DSD,(uint32_t)XMC_DSD_CH_ID_0);
* API call for channel-0 and 1: XMC_DSD_SetAlarmEventFlag(DSD,(uint32_t)(XMC_DSD_CH_ID_0|XMC_DSD_CH_ID_1));
*
* \par<b>Related APIs:</b><BR>
* XMC_DSD_ClearAlarmEventFlag()\n\n\n
*/
__STATIC_INLINE void XMC_DSD_SetAlarmEventFlag(XMC_DSD_t *const dsd, const uint32_t channel_id)
{
XMC_ASSERT("XMC_DSD_SetAlarmEventFlag:Invalid module pointer", XMC_DSD_CHECK_MODULE_PTR(dsd));
dsd->EVFLAG = (channel_id<< DSD_EVFLAGCLR_ALEC0_Pos);
}
/**
* @param dsd Pointer to an instance of DSD module of type @ref XMC_DSD_t
* @param channel_id Channel number register value of type @ref XMC_DSD_CH_ID_t
* @return None
*
* \par<b>Description</b><br>
* Clear the result event flag.\n
* Set bit fields \a ALECx of register \a EVFLAGCLR.Clearing these bits has no effect.
*
* \par<b>Note</b><br>
* API call for channel-0 : XMC_DSD_ClearResultEventFlag(DSD,(uint32_t)XMC_DSD_CH_ID_0);
* API call for channel-0 and 1: XMC_DSD_ClearResultEventFlag(DSD,(uint32_t)(XMC_DSD_CH_ID_0|XMC_DSD_CH_ID_1));
*
* \par<b>Related APIs:</b><BR>
* XMC_DSD_SetAlarmEventFlag()\n\n\n
*/
__STATIC_INLINE void XMC_DSD_ClearAlarmEventFlag(XMC_DSD_t *const dsd, const uint32_t channel_id)
{
XMC_ASSERT("XMC_DSD_ClearAlarmEventFlag:Invalid module pointer", XMC_DSD_CHECK_MODULE_PTR(dsd));
dsd->EVFLAGCLR = (channel_id<<DSD_EVFLAGCLR_ALEC0_Pos);
}
#ifdef __cplusplus
}
#endif
/**
* @}
*/
/**
* @}
*/
#endif /* DSD_PRESENT */
#endif /*XMC_DSD_H */