1185 lines
48 KiB
C
1185 lines
48 KiB
C
/**
|
||
* @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 (two’s 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 */
|