//#############################################################################
//
// FILE: cla_ex4_pwm_control.c
//
// TITLE: Controlling PWM output using CLA
//
//! \addtogroup driver_example_list
//!
Controlling PWM output using CLA
//!
//! This example showcases how to update PWM signal output using CLA.
//! EPWM1 is configured to generate complementary signals on both of its
//! channels of fixed frequency 100 KHz. EPWM4 is configured to trigger
//! a periodic CLA control task of frequency 10 KHz. The CLA task implements
//! a very simple logic to vary the duty of the EPWM1 outputs by increasing it
//! by 0.1 in every iteration and maintaining it in the range of 0.1-0.9. For
//! actual use-cases, the control logic could be modified to much more complex
//! depending upon the application. The other CLA task (CLA task 8) is
//! triggered by software at beginning to initialize the CLA global variables
//!
//! \b External \b Connections \n
//! - Observe GPIO0 (EPWM1A) on oscilloscope
//! - Observe GPIO1 (EPWM1B) on oscilloscope
//!
//! \b Watch \b Variables \n
//! - duty
//!
//
//#############################################################################
//
//
// $Copyright:
// Copyright (C) 2023 Texas Instruments Incorporated - http://www.ti.com/
//
// 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 Texas Instruments Incorporated 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
// OWNER 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.
// $
//#############################################################################
//
// Included Files
//
//#############################################################################
//
// FILE: cla_ex4_pwm_control_shared.h
//
// TITLE: Controlling PWM output using CLA
//
// This header file contains defines, variables and prototypes that are shared
// among the C28x and the CLA
//
//#############################################################################
//
//
// $Copyright:
// Copyright (C) 2023 Texas Instruments Incorporated - http://www.ti.com/
//
// 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 Texas Instruments Incorporated 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
// OWNER 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.
// $
//#############################################################################
//
// Included Files
//
//#############################################################################
//
// FILE: driverlib.h
//
// TITLE: Device setup for examples.
//
//#############################################################################
//
//
// $Copyright:
// Copyright (C) 2023 Texas Instruments Incorporated - http://www.ti.com/
//
// 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 Texas Instruments Incorporated 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
// OWNER 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.
// $
//#############################################################################
//###########################################################################
//
// FILE: hw_memmap.h
//
// TITLE: Macros defining the memory map of the C28x.
//
//###########################################################################
// $Copyright:
// Copyright (C) 2023 Texas Instruments Incorporated - http://www.ti.com/
//
// 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 Texas Instruments Incorporated 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
// OWNER 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.
// $
//###########################################################################
//*****************************************************************************
//
// The following are defines for the base address of the memories and
// peripherals.
//
//*****************************************************************************
//###########################################################################
//
// FILE: adc.h
//
// TITLE: C28x ADC driver.
//
//###########################################################################
// $Copyright:
// Copyright (C) 2023 Texas Instruments Incorporated - http://www.ti.com/
//
// 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 Texas Instruments Incorporated 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
// OWNER 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.
// $
//###########################################################################
//*****************************************************************************
//
// If building with a C++ compiler, make all of the definitions in this header
// have a C binding.
//
//*****************************************************************************
//*****************************************************************************
//
//! \addtogroup adc_api ADC
//! @{
//
//*****************************************************************************
/*
* Copyright (c) 2000 Jeroen Ruigrok van der Werven
* All rights reserved.
*
* Copyright (c) 2014-2014 Texas Instruments Incorporated
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. 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.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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.
*
* $FreeBSD: release/10.0.0/include/stdbool.h 228878 2011-12-25 20:15:41Z ed $
*/
/* If this file is included in C99 mode, _Bool is a builtin, so no definition. */
/* If this is C89 mode and this file is included, _Bool is pre-defined in C89 */
/* relaxed mode by the EDG parser, so it needs to be defined in strict mode. */
/*****************************************************************************/
/* _ti_config.h */
/* */
/* Copyright (c) 2017 Texas Instruments Incorporated */
/* http://www.ti.com/ */
/* */
/* 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 Texas Instruments Incorporated 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 */
/* OWNER 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. */
/* */
/*****************************************************************************/
/*Unsupported pragmas are omitted */
# pragma diag_push
# pragma CHECK_MISRA("-19.7")
# pragma CHECK_MISRA("-19.4")
# pragma CHECK_MISRA("-19.1")
# pragma CHECK_MISRA("-19.15")
# pragma diag_pop
_Pragma("diag_push")
_Pragma("CHECK_MISRA(\"-19.4\")")
_Pragma("CHECK_MISRA(\"-19.1\")")
_Pragma("CHECK_MISRA(\"-19.6\")")
/* Hide uses of the TI proprietary macros behind other macros.
Implementations that don't implement these features should leave
these macros undefined. */
/* Common definitions */
/* C */
/* C89/C99 */
/* _TI_NOEXCEPT_CPP14 is defined to noexcept only when compiling for C++14. It
is intended to be used for functions like abort and atexit that are supposed
to be declared noexcept only in C++14 mode. */
/* Target-specific definitions */
/*****************************************************************************/
/* linkage.h */
/* */
/* Copyright (c) 1998 Texas Instruments Incorporated */
/* http://www.ti.com/ */
/* */
/* 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 Texas Instruments Incorporated 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 */
/* OWNER 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. */
/* */
/*****************************************************************************/
#pragma diag_push
#pragma CHECK_MISRA("-19.4") /* macros required for implementation */
/* No modifiers needed to access code */
/*--------------------------------------------------------------------------*/
/* Define _DATA_ACCESS ==> how to access RTS global or static data */
/*--------------------------------------------------------------------------*/
/*--------------------------------------------------------------------------*/
/* Define _OPTIMIZE_FOR_SPACE ==> Always optimize for space. */
/*--------------------------------------------------------------------------*/
/*--------------------------------------------------------------------------*/
/* Define _IDECL ==> how inline functions are declared */
/*--------------------------------------------------------------------------*/
#pragma diag_pop
_Pragma("diag_pop")
_Pragma("diag_push")
_Pragma("CHECK_MISRA(\"-19.4\")")
_Pragma("CHECK_MISRA(\"-19.11\")")
_Pragma("diag_pop")
/*****************************************************************************/
/* STDINT.H */
/* */
/* Copyright (c) 2002 Texas Instruments Incorporated */
/* http://www.ti.com/ */
/* */
/* 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 Texas Instruments Incorporated 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 */
/* OWNER 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. */
/* */
/*****************************************************************************/
_Pragma("diag_push")
_Pragma("CHECK_MISRA(\"-19.1\")") /* no code before #include */
_Pragma("CHECK_MISRA(\"-19.7\")") /* prefer functions to macros */
/*****************************************************************************/
/* _STDINT40.H */
/* */
/* Copyright (c) 2018 Texas Instruments Incorporated */
/* http://www.ti.com/ */
/* */
/* 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 Texas Instruments Incorporated 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 */
/* OWNER 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. */
/* */
/*****************************************************************************/
_Pragma("diag_push")
_Pragma("CHECK_MISRA(\"-19.7\")") /* prefer functions to macros */
/*
According to footnotes in the 1999 C standard, "C++ implementations
should define these macros only when __STDC_LIMIT_MACROS is defined
before is included."
*/
_Pragma("diag_pop")
/*-
* SPDX-License-Identifier: BSD-2-Clause-FreeBSD
*
* Copyright (c) 2001 Mike Barcroft
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. 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.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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.
*
* $FreeBSD$
*/
/*-
* SPDX-License-Identifier: BSD-3-Clause
*
* Copyright (c) 1991, 1993
* The Regents of the University of California. All rights reserved.
*
* This code is derived from software contributed to Berkeley by
* Berkeley Software Design, Inc.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. 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.
* 3. Neither the name of the University 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 REGENTS 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 REGENTS 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.
*
* @(#)cdefs.h 8.8 (Berkeley) 1/9/95
* $FreeBSD$
*/
_Pragma("diag_push")
_Pragma("CHECK_MISRA(\"none\")")
/*
* Testing against Clang-specific extensions.
*/
/*
* This code has been put in place to help reduce the addition of
* compiler specific defines in FreeBSD code. It helps to aid in
* having a compiler-agnostic source tree.
*/
/*
* Macro to test if we're using a specific version of gcc or later.
*/
/*
* The __CONCAT macro is used to concatenate parts of symbol names, e.g.
* with "#define OLD(foo) __CONCAT(old,foo)", OLD(foo) produces oldfoo.
* The __CONCAT macro is a bit tricky to use if it must work in non-ANSI
* mode -- there must be no spaces between its arguments, and for nested
* __CONCAT's, all the __CONCAT's must be at the left. __CONCAT can also
* concatenate double-quoted strings produced by the __STRING macro, but
* this only works with ANSI C.
*
* __XSTRING is like __STRING, but it expands any macros in its argument
* first. It is only available with ANSI C.
*/
/*
* Compiler-dependent macros to help declare dead (non-returning) and
* pure (no side effects) functions, and unused variables. They are
* null except for versions of gcc that are known to support the features
* properly (old versions of gcc-2 supported the dead and pure features
* in a different (wrong) way). If we do not provide an implementation
* for a given compiler, let the compile fail if it is told to use
* a feature that we cannot live without.
*/
/*
* TI ADD - check that __GNUC__ is defined before referencing it to avoid
* generating an error when __GNUC__ treated as zero warning is
* promoted to an error via -pdse195 option.
*/
/*
* Keywords added in C11.
*/
/*
* No native support for _Atomic(). Place object in structure to prevent
* most forms of direct non-atomic access.
*/
/*
* XXX: Some compilers (Clang 3.3, GCC 4.7) falsely announce C++11 mode
* without actually supporting the thread_local keyword. Don't check for
* the presence of C++11 when defining _Thread_local.
*/
/*
* Emulation of C11 _Generic(). Unlike the previously defined C11
* keywords, it is not possible to implement this using exactly the same
* syntax. Therefore implement something similar under the name
* __generic(). Unlike _Generic(), this macro can only distinguish
* between a single type, so it requires nested invocations to
* distinguish multiple cases.
*/
/*
* C99 Static array indices in function parameter declarations. Syntax such as:
* void bar(int myArray[static 10]);
* is allowed in C99 but not in C++. Define __min_size appropriately so
* headers using it can be compiled in either language. Use like this:
* void bar(int myArray[__min_size(10)]);
*/
/* XXX: should use `#if __STDC_VERSION__ < 199901'. */
/* C++11 exposes a load of C99 stuff */
/*
* GCC 2.95 provides `__restrict' as an extension to C90 to support the
* C99-specific `restrict' type qualifier. We happen to use `__restrict' as
* a way to define the `restrict' type qualifier without disturbing older
* software that is unaware of C99 keywords.
* The TI compiler supports __restrict in all compilation modes.
*/
/*
* GNU C version 2.96 adds explicit branch prediction so that
* the CPU back-end can hint the processor and also so that
* code blocks can be reordered such that the predicted path
* sees a more linear flow, thus improving cache behavior, etc.
*
* The following two macros provide us with a way to utilize this
* compiler feature. Use __predict_true() if you expect the expression
* to evaluate to true, and __predict_false() if you expect the
* expression to evaluate to false.
*
* A few notes about usage:
*
* * Generally, __predict_false() error condition checks (unless
* you have some _strong_ reason to do otherwise, in which case
* document it), and/or __predict_true() `no-error' condition
* checks, assuming you want to optimize for the no-error case.
*
* * Other than that, if you don't know the likelihood of a test
* succeeding from empirical or other `hard' evidence, don't
* make predictions.
*
* * These are meant to be used in places that are run `a lot'.
* It is wasteful to make predictions in code that is run
* seldomly (e.g. at subsystem initialization time) as the
* basic block reordering that this affects can often generate
* larger code.
*/
/*
* We define this here since , , and
* require it.
*/
/*
* Given the pointer x to the member m of the struct s, return
* a pointer to the containing structure. When using GCC, we first
* assign pointer x to a local variable, to check that its type is
* compatible with member m.
*/
/*
* Compiler-dependent macros to declare that functions take printf-like
* or scanf-like arguments. They are null except for versions of gcc
* that are known to support the features properly (old versions of gcc-2
* didn't permit keeping the keywords out of the application namespace).
*/
/* Compiler-dependent macros that rely on FreeBSD-specific extensions. */
/*
* The following definition might not work well if used in header files,
* but it should be better than nothing. If you want a "do nothing"
* version, then it should generate some harmless declaration, such as:
* #define __IDSTRING(name,string) struct __hack
*/
/*
* Embed the rcs id of a source file in the resulting library. Note that in
* more recent ELF binutils, we use .ident allowing the ID to be stripped.
* Usage:
* __FBSDID("$FreeBSD$");
*/
/*-
* The following definitions are an extension of the behavior originally
* implemented in , but with a different level of granularity.
* POSIX.1 requires that the macros we test be defined before any standard
* header file is included.
*
* Here's a quick run-down of the versions:
* defined(_POSIX_SOURCE) 1003.1-1988
* _POSIX_C_SOURCE == 1 1003.1-1990
* _POSIX_C_SOURCE == 2 1003.2-1992 C Language Binding Option
* _POSIX_C_SOURCE == 199309 1003.1b-1993
* _POSIX_C_SOURCE == 199506 1003.1c-1995, 1003.1i-1995,
* and the omnibus ISO/IEC 9945-1: 1996
* _POSIX_C_SOURCE == 200112 1003.1-2001
* _POSIX_C_SOURCE == 200809 1003.1-2008
*
* In addition, the X/Open Portability Guide, which is now the Single UNIX
* Specification, defines a feature-test macro which indicates the version of
* that specification, and which subsumes _POSIX_C_SOURCE.
*
* Our macros begin with two underscores to avoid namespace screwage.
*/
/* Deal with IEEE Std. 1003.1-1990, in which _POSIX_C_SOURCE == 1. */
/* Deal with IEEE Std. 1003.2-1992, in which _POSIX_C_SOURCE == 2. */
/* Deal with various X/Open Portability Guides and Single UNIX Spec. */
/*
* Deal with all versions of POSIX. The ordering relative to the tests above is
* important.
*/
/*-
* Deal with _ANSI_SOURCE:
* If it is defined, and no other compilation environment is explicitly
* requested, then define our internal feature-test macros to zero. This
* makes no difference to the preprocessor (undefined symbols in preprocessing
* expressions are defined to have value zero), but makes it more convenient for
* a test program to print out the values.
*
* If a program mistakenly defines _ANSI_SOURCE and some other macro such as
* _POSIX_C_SOURCE, we will assume that it wants the broader compilation
* environment (and in fact we will never get here).
*/
/* User override __EXT1_VISIBLE */
/*
* Old versions of GCC use non-standard ARM arch symbols; acle-compat.h
* translates them to __ARM_ARCH and the modern feature symbols defined by ARM.
*/
/*
* Nullability qualifiers: currently only supported by Clang.
*/
/*
* Type Safety Checking
*
* Clang provides additional attributes to enable checking type safety
* properties that cannot be enforced by the C type system.
*/
/*
* Lock annotations.
*
* Clang provides support for doing basic thread-safety tests at
* compile-time, by marking which locks will/should be held when
* entering/leaving a functions.
*
* Furthermore, it is also possible to annotate variables and structure
* members to enforce that they are only accessed when certain locks are
* held.
*/
/* Structure implements a lock. */
/* Function acquires an exclusive or shared lock. */
/* Function attempts to acquire an exclusive or shared lock. */
/* Function releases a lock. */
/* Function asserts that an exclusive or shared lock is held. */
/* Function requires that an exclusive or shared lock is or is not held. */
/* Function should not be analyzed. */
/* Guard variables and structure members by lock. */
_Pragma("diag_pop")
/*-
* SPDX-License-Identifier: BSD-2-Clause-FreeBSD
*
* Copyright (c) 2002 Mike Barcroft
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. 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.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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.
*
* $FreeBSD$
*/
/*****************************************************************************/
/* _TYPES.H */
/* */
/* Copyright (c) 2017 Texas Instruments Incorporated */
/* http://www.ti.com/ */
/* */
/* 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 Texas Instruments Incorporated 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 */
/* OWNER 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. */
/* */
/*****************************************************************************/
#pragma diag_push
/* This file is required to use base types */
#pragma CHECK_MISRA("-6.3")
/*
* Basic types upon which most other types are built.
*/
typedef int __int16_t;
typedef unsigned int __uint16_t;
typedef long __int32_t;
typedef unsigned long __uint32_t;
/* LONGLONG */
typedef long long __int64_t;
/* LONGLONG */
typedef unsigned long long __uint64_t;
/*
* Standard type definitions.
*/
typedef __uint32_t __clock_t; /* clock()... */
typedef __int32_t __critical_t;
typedef double __double_t;
typedef float __float_t;
typedef __int32_t __intfptr_t;
typedef __int64_t __intmax_t;
typedef __int32_t __intptr_t;
typedef __int16_t __int_fast8_t;
typedef __int16_t __int_fast16_t;
typedef __int32_t __int_fast32_t;
typedef __int64_t __int_fast64_t;
typedef __int16_t __int_least8_t;
typedef __int16_t __int_least16_t;
typedef __int32_t __int_least32_t;
typedef __int64_t __int_least64_t;
typedef long __ptrdiff_t; /* ptr1 - ptr2 */
typedef __int16_t __register_t;
typedef __int32_t __segsz_t; /* segment size (in pages) */
typedef unsigned long __size_t; /* sizeof() */
typedef __int32_t __ssize_t; /* byte count or error */
typedef __int64_t __time_t; /* time()... */
typedef __uint32_t __uintfptr_t;
typedef __uint64_t __uintmax_t;
typedef __uint32_t __uintptr_t;
typedef __uint16_t __uint_fast8_t;
typedef __uint16_t __uint_fast16_t;
typedef __uint32_t __uint_fast32_t;
typedef __uint64_t __uint_fast64_t;
typedef __uint16_t __uint_least8_t;
typedef __uint16_t __uint_least16_t;
typedef __uint32_t __uint_least32_t;
typedef __uint64_t __uint_least64_t;
typedef __uint16_t __u_register_t;
typedef __uint32_t __vm_offset_t;
typedef __uint32_t __vm_paddr_t;
typedef __uint32_t __vm_size_t;
typedef unsigned long ___wchar_t;
/*
* POSIX target specific _off_t type definition
*/
typedef long int _off_t;
/*
* Unusual type definitions.
*/
typedef char* __va_list;
#pragma diag_pop
_Pragma("diag_push")
/* This file is required to use types without size and signedness */
_Pragma("CHECK_MISRA(\"-6.3\")")
/*
* Standard type definitions.
*/
typedef __int32_t __blksize_t; /* file block size */
typedef __int64_t __blkcnt_t; /* file block count */
typedef __int32_t __clockid_t; /* clock_gettime()... */
typedef __uint32_t __fflags_t; /* file flags */
typedef __uint64_t __fsblkcnt_t;
typedef __uint64_t __fsfilcnt_t;
typedef __uint32_t __gid_t;
typedef __int64_t __id_t; /* can hold a gid_t, pid_t, or uid_t */
typedef __uint64_t __ino_t; /* inode number */
typedef long __key_t; /* IPC key (for Sys V IPC) */
typedef __int32_t __lwpid_t; /* Thread ID (a.k.a. LWP) */
typedef __uint16_t __mode_t; /* permissions */
typedef int __accmode_t; /* access permissions */
typedef int __nl_item;
typedef __uint64_t __nlink_t; /* link count */
typedef _off_t __off_t; /* file offset (target-specific) */
typedef __int64_t __off64_t; /* file offset (always 64-bit) */
typedef __int32_t __pid_t; /* process [group] */
typedef __int64_t __rlim_t; /* resource limit - intentionally */
/* signed, because of legacy code */
/* that uses -1 for RLIM_INFINITY */
typedef __uint16_t __sa_family_t;
typedef __uint32_t __socklen_t;
typedef long __suseconds_t; /* microseconds (signed) */
typedef struct __timer *__timer_t; /* timer_gettime()... */
typedef struct __mq *__mqd_t; /* mq_open()... */
typedef __uint32_t __uid_t;
typedef unsigned int __useconds_t; /* microseconds (unsigned) */
typedef int __cpuwhich_t; /* which parameter for cpuset. */
typedef int __cpulevel_t; /* level parameter for cpuset. */
typedef int __cpusetid_t; /* cpuset identifier. */
/*
* Unusual type definitions.
*/
/*
* rune_t is declared to be an ``int'' instead of the more natural
* ``unsigned long'' or ``long''. Two things are happening here. It is not
* unsigned so that EOF (-1) can be naturally assigned to it and used. Also,
* it looks like 10646 will be a 31 bit standard. This means that if your
* ints cannot hold 32 bits, you will be in trouble. The reason an int was
* chosen over a long is that the is*() and to*() routines take ints (says
* ANSI C), but they use __ct_rune_t instead of int.
*
* NOTE: rune_t is not covered by ANSI nor other standards, and should not
* be instantiated outside of lib/libc/locale. Use wchar_t. wint_t and
* rune_t must be the same type. Also, wint_t should be able to hold all
* members of the largest character set plus one extra value (WEOF), and
* must be at least 16 bits.
*/
typedef unsigned long __ct_rune_t; /* arg type for ctype funcs */
typedef __ct_rune_t __rune_t; /* rune_t (see above) */
typedef __ct_rune_t __wint_t; /* wint_t (see above) */
/* Clang already provides these types as built-ins, but only in C++ mode. */
typedef __uint_least16_t __char16_t;
typedef __uint_least32_t __char32_t;
/* In C++11, char16_t and char32_t are built-in types. */
typedef struct {
long long __max_align1 __attribute__((aligned(__alignof__(long long))));
long double __max_align2 __attribute__((aligned(__alignof__(long double))));
} __max_align_t;
typedef __uint64_t __dev_t; /* device number */
typedef __uint32_t __fixpt_t; /* fixed point number */
/*
* mbstate_t is an opaque object to keep conversion state during multibyte
* stream conversions.
*/
typedef int _Mbstatet;
typedef _Mbstatet __mbstate_t;
typedef __uintmax_t __rman_res_t;
/*
* When the following macro is defined, the system uses 64-bit inode numbers.
* Programs can use this to avoid including , with its associated
* namespace pollution.
*/
_Pragma("diag_pop")
/*****************************************************************************/
/* _STDINT.H */
/* */
/* Copyright (c) 2019 Texas Instruments Incorporated */
/* http://www.ti.com/ */
/* */
/* 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 Texas Instruments Incorporated 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 */
/* OWNER 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. */
/* */
/*****************************************************************************/
/*-
* SPDX-License-Identifier: BSD-2-Clause-NetBSD
*
* Copyright (c) 2001, 2002 Mike Barcroft
* Copyright (c) 2001 The NetBSD Foundation, Inc.
* All rights reserved.
*
* This code is derived from software contributed to The NetBSD Foundation
* by Klaus Klein.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. 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.
*
* THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. 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 FOUNDATION 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.
*
* $FreeBSD$
*/
#pragma diag_push
/* 19.4 is issued for macros that are defined in terms of other macros. */
#pragma CHECK_MISRA("-19.4")
#pragma CHECK_MISRA("-19.7")
#pragma CHECK_MISRA("-19.13")
/*
* ISO/IEC 9899:1999
* 7.18.2.1 Limits of exact-width integer types
*/
/* Minimum values of exact-width signed integer types. */
/* Maximum values of exact-width signed integer types. */
/* Maximum values of exact-width unsigned integer types. */
/*
* ISO/IEC 9899:1999
* 7.18.2.2 Limits of minimum-width integer types
*/
/* Minimum values of minimum-width signed integer types. */
/* Maximum values of minimum-width signed integer types. */
/* Maximum values of minimum-width unsigned integer types. */
/*
* ISO/IEC 9899:1999
* 7.18.2.3 Limits of fastest minimum-width integer types
*/
/* Minimum values of fastest minimum-width signed integer types. */
/* Maximum values of fastest minimum-width signed integer types. */
/* Maximum values of fastest minimum-width unsigned integer types. */
/*
* ISO/IEC 9899:1999
* 7.18.2.4 Limits of integer types capable of holding object pointers
*/
/*
* ISO/IEC 9899:1999
* 7.18.2.5 Limits of greatest-width integer types
*/
/*
* ISO/IEC 9899:1999
* 7.18.3 Limits of other integer types
*/
/* Limits of ptrdiff_t. */
/* Limits of sig_atomic_t. */
/* Limit of size_t. */
/* Limits of wint_t. */
#pragma diag_pop
/*-
* SPDX-License-Identifier: BSD-2-Clause-FreeBSD
*
* Copyright (c) 2011 David E. O'Brien
* Copyright (c) 2001 Mike Barcroft
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. 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.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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.
*
* $FreeBSD$
*/
typedef __int16_t int16_t;
typedef __int32_t int32_t;
typedef __int64_t int64_t;
typedef __uint16_t uint16_t;
typedef __uint32_t uint32_t;
typedef __uint64_t uint64_t;
typedef __intptr_t intptr_t;
typedef __uintptr_t uintptr_t;
typedef __intmax_t intmax_t;
typedef __uintmax_t uintmax_t;
typedef __int_least8_t int_least8_t;
typedef __int_least16_t int_least16_t;
typedef __int_least32_t int_least32_t;
typedef __int_least64_t int_least64_t;
typedef __uint_least8_t uint_least8_t;
typedef __uint_least16_t uint_least16_t;
typedef __uint_least32_t uint_least32_t;
typedef __uint_least64_t uint_least64_t;
typedef __int_fast8_t int_fast8_t;
typedef __int_fast16_t int_fast16_t;
typedef __int_fast32_t int_fast32_t;
typedef __int_fast64_t int_fast64_t;
typedef __uint_fast8_t uint_fast8_t;
typedef __uint_fast16_t uint_fast16_t;
typedef __uint_fast32_t uint_fast32_t;
typedef __uint_fast64_t uint_fast64_t;
_Pragma("diag_push")
_Pragma("CHECK_MISRA(\"-10.1\")")
/* GNU and Darwin define this and people seem to think it's portable */
_Pragma("diag_pop")
_Pragma("diag_push")
_Pragma("CHECK_MISRA(\"-19.4\")")
/* Limits of wchar_t. */
_Pragma("diag_pop")
/* ISO/IEC 9899:2011 K.3.4.4 */
_Pragma("diag_pop")
//###########################################################################
//
// FILE: hw_adc.h
//
// TITLE: Definitions for the ADC registers.
//
//###########################################################################
// $Copyright:
// Copyright (C) 2023 Texas Instruments Incorporated - http://www.ti.com/
//
// 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 Texas Instruments Incorporated 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
// OWNER 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.
// $
//###########################################################################
//*************************************************************************************************
//
// The following are defines for the ADC register offsets
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the ADCCTL1 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the ADCCTL2 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the ADCBURSTCTL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the ADCINTFLG register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the ADCINTFLGCLR register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the ADCINTOVF register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the ADCINTOVFCLR register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the ADCINTSEL1N2 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the ADCINTSEL3N4 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the ADCSOCPRICTL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the ADCINTSOCSEL1 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the ADCINTSOCSEL2 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the ADCSOCFLG1 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the ADCSOCFRC1 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the ADCSOCOVF1 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the ADCSOCOVFCLR1 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the ADCSOC0CTL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the ADCSOC1CTL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the ADCSOC2CTL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the ADCSOC3CTL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the ADCSOC4CTL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the ADCSOC5CTL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the ADCSOC6CTL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the ADCSOC7CTL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the ADCSOC8CTL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the ADCSOC9CTL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the ADCSOC10CTL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the ADCSOC11CTL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the ADCSOC12CTL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the ADCSOC13CTL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the ADCSOC14CTL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the ADCSOC15CTL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the ADCEVTSTAT register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the ADCEVTCLR register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the ADCEVTSEL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the ADCEVTINTSEL register
//
//*************************************************************************************************
// Enable
// Enable
// Enable
// Enable
//*************************************************************************************************
//
// The following are defines for the bit fields in the ADCOSDETECT register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the ADCCOUNTER register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the ADCREV register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the ADCOFFTRIM register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the ADCPPB1CONFIG register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the ADCPPB1STAMP register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the ADCPPB1OFFCAL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the ADCPPB1TRIPHI register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the ADCPPB1TRIPLO register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the ADCPPB2CONFIG register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the ADCPPB2STAMP register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the ADCPPB2OFFCAL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the ADCPPB2TRIPHI register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the ADCPPB2TRIPLO register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the ADCPPB3CONFIG register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the ADCPPB3STAMP register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the ADCPPB3OFFCAL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the ADCPPB3TRIPHI register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the ADCPPB3TRIPLO register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the ADCPPB4CONFIG register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the ADCPPB4STAMP register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the ADCPPB4OFFCAL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the ADCPPB4TRIPHI register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the ADCPPB4TRIPLO register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the ADCPPB1RESULT register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the ADCPPB2RESULT register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the ADCPPB3RESULT register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the ADCPPB4RESULT register
//
//*************************************************************************************************
//###########################################################################
//
// FILE: hw_asysctl.h
//
// TITLE: Definitions for the ASYSCTL registers.
//
//###########################################################################
// $Copyright:
// Copyright (C) 2023 Texas Instruments Incorporated - http://www.ti.com/
//
// 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 Texas Instruments Incorporated 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
// OWNER 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.
// $
//###########################################################################
//*************************************************************************************************
//
// The following are defines for the ASYSCTL register offsets
//
//*************************************************************************************************
// inputs. Refer to Pimux diagram for details.
// inputs. Refer to Pimux diagram for details.
// inputs. Refer to Pimux diagram for details.
// inputs. Refer to Pimux diagram for details.
//*************************************************************************************************
//
// The following are defines for the bit fields in the CONFIGLOCK register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the TSNSCTL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the ANAREFCTL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the VMONCTL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the CMPHPMXSEL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the CMPLPMXSEL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the CMPHNMXSEL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the CMPLNMXSEL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the ADCDACLOOPBACK register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the LOCK register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the AGPIOCTRLA register
//
//*************************************************************************************************
//###########################################################################
//
// FILE: hw_types.h
//
// TITLE: Type definitions used in driverlib functions.
//
//###########################################################################
// $Copyright:
// Copyright (C) 2023 Texas Instruments Incorporated - http://www.ti.com/
//
// 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 Texas Instruments Incorporated 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
// OWNER 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.
// $
//###########################################################################
//*****************************************************************************
//
// Macros for hardware access
//
//*****************************************************************************
//*****************************************************************************
//
// SUCCESS and FAILURE for API return value
//
//*****************************************************************************
//*****************************************************************************
//
// Definition of 8 bit types for USB Driver code to maintain portability
// between byte and word addressable cores of C2000 Devices.
//
//*****************************************************************************
typedef uint16_t uint8_t;
typedef int16_t int8_t;
//****************************************************************************
//
// For checking NULL pointers
//
//****************************************************************************
//*****************************************************************************
//
// 32-bit and 64-bit float type
//
//*****************************************************************************
typedef float float32_t;
typedef double float64_t;
//*****************************************************************************
//
// Extern compiler intrinsic prototypes. See compiler User's Guide for details.
// These are provided to satisfy static analysis tools. The #ifndef is required
// because the '&' is for a C++-style reference, and although it is the correct
// prototype, it will not build in C code.
//
//*****************************************************************************
//
// C++ Bool Compatibility
//
/* To fix Misra-C errors */
//###########################################################################
//
// FILE: cpu.h
//
// TITLE: Useful C28x CPU defines.
//
//###########################################################################
// $Copyright:
// Copyright (C) 2023 Texas Instruments Incorporated - http://www.ti.com/
//
// 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 Texas Instruments Incorporated 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
// OWNER 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.
// $
//###########################################################################
//*****************************************************************************
//
// If building with a C++ compiler, make all of the definitions in this header
// have a C binding.
//
//*****************************************************************************
//
// External reference to the interrupt flag register (IFR) register
//
extern __cregister volatile uint16_t IFR;
//
// External reference to the interrupt enable register (IER) register
//
extern __cregister volatile uint16_t IER;
//
// Define to enable interrupts
//
//
// Define to disable interrupts
//
//
// Define to enable debug events
//
//
// Define to disable debug events
//
//
// Define to allow writes to protected registers
//
//
// Define to disable writes to protected registers
//
//
// Define for emulation stop
//
//
// Define for emulation stop
//
//
// Define for no operation
//
//
// Define for putting processor into a low-power mode
//
//*****************************************************************************
//
// Extern compiler intrinsic prototypes. See compiler User's Guide for details.
//
//*****************************************************************************
extern void __eallow(void);
extern void __edis(void);
//*****************************************************************************
//
// Mark the end of the C bindings section for C++ compilers.
//
//*****************************************************************************
//###########################################################################
//
// FILE: debug.h
//
// TITLE: Assert definition macro for debug.
//
//###########################################################################
// $Copyright:
// Copyright (C) 2023 Texas Instruments Incorporated - http://www.ti.com/
//
// 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 Texas Instruments Incorporated 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
// OWNER 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.
// $
//###########################################################################
//*****************************************************************************
//
// Prototype for the function that is called when an invalid argument is passed
// to an API. This is only used when doing a DEBUG build. It is the
// application's responsibility to define the __error__ function.
//
//*****************************************************************************
extern void __error__(const char *filename, uint32_t line);
//*****************************************************************************
//
// The ASSERT macro, which does the actual assertion checking. Typically, this
// will be for procedure arguments.
//
//*****************************************************************************
//*****************************************************************************
//
// Useful defines used within the driver functions. Not intended for use by
// application code.
//
//*****************************************************************************
//*****************************************************************************
//
// Values that can be passed to ADC_enablePPBEvent(), ADC_disablePPBEvent(),
// ADC_enablePPBEventInterrupt(), ADC_disablePPBEventInterrupt(), and
// ADC_clearPPBEventStatus() as the intFlags and evtFlags parameters. They also
// make up the enumerated bit field returned by ADC_getPPBEventStatus().
//
//*****************************************************************************
//*****************************************************************************
//
// Values that can be passed to ADC_forceMultipleSOC() as socMask parameter.
// These values can be OR'd together to trigger multiple SOCs at a time.
//
//*****************************************************************************
//*****************************************************************************
//
//! Values that can be passed to ADC_setPrescaler() as the \e clkPrescale
//! parameter.
//
//*****************************************************************************
typedef enum
{
ADC_CLK_DIV_1_0 = 0U, //!< ADCCLK = (input clock) / 1.0
ADC_CLK_DIV_2_0 = 2U, //!< ADCCLK = (input clock) / 2.0
ADC_CLK_DIV_3_0 = 4U, //!< ADCCLK = (input clock) / 3.0
ADC_CLK_DIV_4_0 = 6U, //!< ADCCLK = (input clock) / 4.0
ADC_CLK_DIV_5_0 = 8U, //!< ADCCLK = (input clock) / 5.0
ADC_CLK_DIV_6_0 = 10U, //!< ADCCLK = (input clock) / 6.0
ADC_CLK_DIV_7_0 = 12U, //!< ADCCLK = (input clock) / 7.0
ADC_CLK_DIV_8_0 = 14U //!< ADCCLK = (input clock) / 8.0
} ADC_ClkPrescale;
//*****************************************************************************
//
//! Values that can be passed to ADC_setupSOC() as the \e trigger
//! parameter to specify the event that will trigger a conversion to start.
//! It is also used with ADC_setBurstModeConfig() and
//! ADC_triggerRepeaterSelect().
//
//*****************************************************************************
typedef enum
{
ADC_TRIGGER_SW_ONLY = 0U, //!< Software only
ADC_TRIGGER_CPU1_TINT0 = 1U, //!< CPU1 Timer 0, TINT0
ADC_TRIGGER_CPU1_TINT1 = 2U, //!< CPU1 Timer 1, TINT1
ADC_TRIGGER_CPU1_TINT2 = 3U, //!< CPU1 Timer 2, TINT2
ADC_TRIGGER_GPIO = 4U, //!< GPIO, ADCEXTSOC
ADC_TRIGGER_EPWM1_SOCA = 5U, //!< ePWM1, ADCSOCA
ADC_TRIGGER_EPWM1_SOCB = 6U, //!< ePWM1, ADCSOCB
ADC_TRIGGER_EPWM2_SOCA = 7U, //!< ePWM2, ADCSOCA
ADC_TRIGGER_EPWM2_SOCB = 8U, //!< ePWM2, ADCSOCB
ADC_TRIGGER_EPWM3_SOCA = 9U, //!< ePWM3, ADCSOCA
ADC_TRIGGER_EPWM3_SOCB = 10U, //!< ePWM3, ADCSOCB
ADC_TRIGGER_EPWM4_SOCA = 11U, //!< ePWM4, ADCSOCA
ADC_TRIGGER_EPWM4_SOCB = 12U, //!< ePWM4, ADCSOCB
ADC_TRIGGER_EPWM5_SOCA = 13U, //!< ePWM5, ADCSOCA
ADC_TRIGGER_EPWM5_SOCB = 14U, //!< ePWM5, ADCSOCB
ADC_TRIGGER_EPWM6_SOCA = 15U, //!< ePWM6, ADCSOCA
ADC_TRIGGER_EPWM6_SOCB = 16U, //!< ePWM6, ADCSOCB
ADC_TRIGGER_EPWM7_SOCA = 17U, //!< ePWM7, ADCSOCA
ADC_TRIGGER_EPWM7_SOCB = 18U, //!< ePWM7, ADCSOCB
ADC_TRIGGER_EPWM8_SOCA = 19U, //!< ePWM8, ADCSOCA
ADC_TRIGGER_EPWM8_SOCB = 20U //!< ePWM8, ADCSOCB
} ADC_Trigger;
//*****************************************************************************
//
//! Values that can be passed to ADC_setupSOC() as the \e channel
//! parameter. This is the input pin on which the signal to be converted is
//! located.
//
//*****************************************************************************
typedef enum
{
ADC_CH_ADCIN0 = 0U, //!< ADCIN0 is converted
ADC_CH_ADCIN1 = 1U, //!< ADCIN1 is converted
ADC_CH_ADCIN2 = 2U, //!< ADCIN2 is converted
ADC_CH_ADCIN3 = 3U, //!< ADCIN3 is converted
ADC_CH_ADCIN4 = 4U, //!< ADCIN4 is converted
ADC_CH_ADCIN5 = 5U, //!< ADCIN5 is converted
ADC_CH_ADCIN6 = 6U, //!< ADCIN6 is converted
ADC_CH_ADCIN7 = 7U, //!< ADCIN7 is converted
ADC_CH_ADCIN8 = 8U, //!< ADCIN8 is converted
ADC_CH_ADCIN9 = 9U, //!< ADCIN9 is converted
ADC_CH_ADCIN10 = 10U, //!< ADCIN10 is converted
ADC_CH_ADCIN11 = 11U, //!< ADCIN11 is converted
ADC_CH_ADCIN12 = 12U, //!< ADCIN12 is converted
ADC_CH_ADCIN13 = 13U, //!< ADCIN13 is converted
ADC_CH_ADCIN14 = 14U, //!< ADCIN14 is converted
ADC_CH_ADCIN15 = 15U //!< ADCIN15 is converted
} ADC_Channel;
//*****************************************************************************
//
//! Values that can be passed to ADC_setInterruptPulseMode() as the
//! \e pulseMode parameter.
//
//*****************************************************************************
typedef enum
{
//! Occurs at the end of the acquisition window
ADC_PULSE_END_OF_ACQ_WIN = 0x00U,
//! Occurs at the end of the conversion
ADC_PULSE_END_OF_CONV = 0x04U
} ADC_PulseMode;
//*****************************************************************************
//
//! Values that can be passed to ADC_enableInterrupt(), ADC_disableInterrupt(),
//! and ADC_getInterruptStatus() as the \e adcIntNum parameter.
//
//*****************************************************************************
typedef enum
{
ADC_INT_NUMBER1 = 0U, //!< ADCINT1 Interrupt
ADC_INT_NUMBER2 = 1U, //!< ADCINT2 Interrupt
ADC_INT_NUMBER3 = 2U, //!< ADCINT3 Interrupt
ADC_INT_NUMBER4 = 3U //!< ADCINT4 Interrupt
} ADC_IntNumber;
//*****************************************************************************
//
//! Values that can be passed in as the \e ppbNumber parameter for several
//! functions.
//
//*****************************************************************************
typedef enum
{
ADC_PPB_NUMBER1 = 0U, //!< Post-processing block 1
ADC_PPB_NUMBER2 = 1U, //!< Post-processing block 2
ADC_PPB_NUMBER3 = 2U, //!< Post-processing block 3
ADC_PPB_NUMBER4 = 3U //!< Post-processing block 4
} ADC_PPBNumber;
//*****************************************************************************
//
//! Values that can be passed in as the \e socNumber parameter for several
//! functions. This value identifies the start-of-conversion (SOC) that a
//! function is configuring or accessing. Note that in some cases (for example,
//! ADC_setInterruptSource()) \e socNumber is used to refer to the
//! corresponding end-of-conversion (EOC).
//
//*****************************************************************************
typedef enum
{
ADC_SOC_NUMBER0 = 0U, //!< SOC/EOC number 0
ADC_SOC_NUMBER1 = 1U, //!< SOC/EOC number 1
ADC_SOC_NUMBER2 = 2U, //!< SOC/EOC number 2
ADC_SOC_NUMBER3 = 3U, //!< SOC/EOC number 3
ADC_SOC_NUMBER4 = 4U, //!< SOC/EOC number 4
ADC_SOC_NUMBER5 = 5U, //!< SOC/EOC number 5
ADC_SOC_NUMBER6 = 6U, //!< SOC/EOC number 6
ADC_SOC_NUMBER7 = 7U, //!< SOC/EOC number 7
ADC_SOC_NUMBER8 = 8U, //!< SOC/EOC number 8
ADC_SOC_NUMBER9 = 9U, //!< SOC/EOC number 9
ADC_SOC_NUMBER10 = 10U, //!< SOC/EOC number 10
ADC_SOC_NUMBER11 = 11U, //!< SOC/EOC number 11
ADC_SOC_NUMBER12 = 12U, //!< SOC/EOC number 12
ADC_SOC_NUMBER13 = 13U, //!< SOC/EOC number 13
ADC_SOC_NUMBER14 = 14U, //!< SOC/EOC number 14
ADC_SOC_NUMBER15 = 15U //!< SOC/EOC number 15
} ADC_SOCNumber;
//*****************************************************************************
//
//! Values that can be passed in as the \e trigger parameter for the
//! ADC_setInterruptSOCTrigger() function.
//
//*****************************************************************************
typedef enum
{
ADC_INT_SOC_TRIGGER_NONE = 0U, //!< No ADCINT will trigger the SOC
ADC_INT_SOC_TRIGGER_ADCINT1 = 1U, //!< ADCINT1 will trigger the SOC
ADC_INT_SOC_TRIGGER_ADCINT2 = 2U //!< ADCINT2 will trigger the SOC
} ADC_IntSOCTrigger;
//*****************************************************************************
//
//! Values that can be passed to ADC_setSOCPriority() as the \e priMode
//! parameter.
//
//*****************************************************************************
typedef enum
{
ADC_PRI_ALL_ROUND_ROBIN = 0U, //!< Round robin mode is used for all
ADC_PRI_SOC0_HIPRI = 1U, //!< SOC 0 hi pri, others in round robin
ADC_PRI_THRU_SOC1_HIPRI = 2U, //!< SOC 0-1 hi pri, others in round robin
ADC_PRI_THRU_SOC2_HIPRI = 3U, //!< SOC 0-2 hi pri, others in round robin
ADC_PRI_THRU_SOC3_HIPRI = 4U, //!< SOC 0-3 hi pri, others in round robin
ADC_PRI_THRU_SOC4_HIPRI = 5U, //!< SOC 0-4 hi pri, others in round robin
ADC_PRI_THRU_SOC5_HIPRI = 6U, //!< SOC 0-5 hi pri, others in round robin
ADC_PRI_THRU_SOC6_HIPRI = 7U, //!< SOC 0-6 hi pri, others in round robin
ADC_PRI_THRU_SOC7_HIPRI = 8U, //!< SOC 0-7 hi pri, others in round robin
ADC_PRI_THRU_SOC8_HIPRI = 9U, //!< SOC 0-8 hi pri, others in round robin
ADC_PRI_THRU_SOC9_HIPRI = 10U, //!< SOC 0-9 hi pri, others in round robin
ADC_PRI_THRU_SOC10_HIPRI = 11U, //!< SOC 0-10 hi pri, others in round robin
ADC_PRI_THRU_SOC11_HIPRI = 12U, //!< SOC 0-11 hi pri, others in round robin
ADC_PRI_THRU_SOC12_HIPRI = 13U, //!< SOC 0-12 hi pri, others in round robin
ADC_PRI_THRU_SOC13_HIPRI = 14U, //!< SOC 0-13 hi pri, others in round robin
ADC_PRI_THRU_SOC14_HIPRI = 15U, //!< SOC 0-14 hi pri, SOC15 in round robin
ADC_PRI_ALL_HIPRI = 16U //!< All priorities based on SOC number
} ADC_PriorityMode;
//*****************************************************************************
//
//! Values that can be passed to ADC_getTemperatureC(), ADC_getTemperatureK(),
//! ADC_setVREF() and ADC_setOffsetTrimAll() as the \e refMode parameter.
//
//*****************************************************************************
typedef enum
{
ADC_REFERENCE_INTERNAL = 0U,
ADC_REFERENCE_EXTERNAL = 1U
} ADC_ReferenceMode;
//*****************************************************************************
//
//! Values that can be passed to ADC_setVREF() and ADC_setOffsetTrimAll() as the
//! \e refVoltage parameter.
//!
//
//*****************************************************************************
typedef enum
{
ADC_REFERENCE_3_3V = 0U,
ADC_REFERENCE_2_5V = 1U
} ADC_ReferenceVoltage;
//*****************************************************************************
//
//! Values that can be passed to ADC_configOSDetectMode() as the \e modeVal
//! parameter.
//
//*****************************************************************************
typedef enum
{
ADC_OSDETECT_MODE_DISABLED = 0x0U,//!< Open/Shorts detection cir-
//!< cuit(O/S DC) is disabled
ADC_OSDETECT_MODE_VSSA = 0x1U,//!< O/S DC is enabled at zero
//!< scale
ADC_OSDETECT_MODE_VDDA = 0x2U,//!< O/S DC is enabled at full
//!< scale
ADC_OSDETECT_MODE_5BY12_VDDA = 0x3U,//!< O/S DC is enabled at 5/12
//!< scale
ADC_OSDETECT_MODE_7BY12_VDDA = 0x4U,//!< O/S DC is enabled at 7/12
//!< scale
ADC_OSDETECT_MODE_5K_PULLDOWN_TO_VSSA = 0x5U,//!< O/S DC is enabled at 5K
//!< pulldown to VSSA
ADC_OSDETECT_MODE_5K_PULLUP_TO_VDDA = 0x6U,//!< O/S DC is enabled at 5K
//!< pullup to VDDA
ADC_OSDETECT_MODE_7K_PULLDOWN_TO_VSSA = 0x7U //!< O/S DC is enabled at 7K
//!< pulldown to VSSA
} ADC_OSDetectMode;
//*****************************************************************************
//
// Prototypes for the APIs.
//
//*****************************************************************************
//*****************************************************************************
//
//! \internal
//! Checks an ADC base address.
//!
//! \param base specifies the ADC module base address.
//!
//! This function determines if a ADC module base address is valid.
//!
//! \return Returns \b true if the base address is valid and \b false
//! otherwise.
//
//*****************************************************************************
//*****************************************************************************
//
//! Configures the analog-to-digital converter module prescaler.
//!
//! \param base is the base address of the ADC module.
//! \param clkPrescale is the ADC clock prescaler.
//!
//! This function configures the ADC module's ADCCLK.
//!
//! The \e clkPrescale parameter specifies the value by which the input clock
//! is divided to make the ADCCLK. The clkPrescale value can be specified with
//! any of the following enum values:
//! \b ADC_CLK_DIV_1_0, \b ADC_CLK_DIV_2_0, \b ADC_CLK_DIV_3_0, ...,
//! \b ADC_CLK_DIV_6_0, \b ADC_CLK_DIV_7_0, or \b ADC_CLK_DIV_8_0.
//!
//! \return None.
//
//*****************************************************************************
static inline void
ADC_setPrescaler(uint32_t base, ADC_ClkPrescale clkPrescale)
{
//
// Check the arguments.
//
;
//
// Set the configuration of the ADC module prescaler.
//
__eallow();
(*((volatile uint16_t *)(base + 0x1U))) = ((*((volatile uint16_t *)(base + 0x1U))) &
~0xFU) | (uint16_t)clkPrescale;
__edis();
}
//*****************************************************************************
//
//! Configures a start-of-conversion (SOC) in the ADC.
//!
//! \param base is the base address of the ADC module.
//! \param socNumber is the number of the start-of-conversion.
//! \param trigger the source that will cause the SOC.
//! \param channel is the number associated with the input signal.
//! \param sampleWindow is the acquisition window duration.
//!
//! This function configures the a start-of-conversion (SOC) in the ADC module.
//!
//! The \e socNumber number is a value \b ADC_SOC_NUMBERX where X is a number
//! from 0 to 15 specifying which SOC is to be configured on the ADC module
//! specified by \e base.
//!
//! The \e trigger specifies the event that causes the SOC such as software, a
//! timer interrupt, an ePWM event, or an ADC interrupt. It should be a value
//! in the format of \b ADC_TRIGGER_XXXX where XXXX is the event such as
//! \b ADC_TRIGGER_SW_ONLY, \b ADC_TRIGGER_CPU1_TINT0, \b ADC_TRIGGER_GPIO,
//! \b ADC_TRIGGER_EPWM1_SOCA, and so on.
//!
//! The \e channel parameter specifies the channel to be converted. In
//! single-ended mode this is a single pin given by \b ADC_CH_ADCINx where x is
//! the number identifying the pin between 0 and 15 inclusive.
//!
//! The \e sampleWindow parameter is the acquisition window duration in SYSCLK
//! cycles. It should be a value between 1 and 512 cycles inclusive. The
//! selected duration must be at least as long as one ADCCLK cycle. Also, the
//! datasheet will specify a minimum window duration requirement in
//! nanoseconds.
//!
//! \return None.
//
//*****************************************************************************
static inline void
ADC_setupSOC(uint32_t base, ADC_SOCNumber socNumber, ADC_Trigger trigger,
ADC_Channel channel, uint32_t sampleWindow)
{
uint32_t ctlRegAddr;
//
// Check the arguments.
//
;
;
//
// Calculate address for the SOC control register.
//
ctlRegAddr = base + 0x10U + ((uint32_t)socNumber * 2U);
//
// Set the configuration of the specified SOC.
//
__eallow();
(*((volatile uint32_t *)(ctlRegAddr))) = ((uint32_t)channel << 15U) |
((uint32_t)trigger << 20U) |
(sampleWindow - 1U);
__edis();
}
//*****************************************************************************
//
//! Configures the interrupt SOC trigger of an SOC.
//!
//! \param base is the base address of the ADC module.
//! \param socNumber is the number of the start-of-conversion.
//! \param trigger the interrupt source that will cause the SOC.
//!
//! This function configures the interrupt start-of-conversion trigger in
//! the ADC module.
//!
//! The \e socNumber number is a value \b ADC_SOC_NUMBERX where X is a number
//! from 0 to 15 specifying which SOC is to be configured on the ADC module
//! specified by \e base.
//!
//! The \e trigger specifies the interrupt that causes a start of conversion or
//! none. It should be one of the following values.
//!
//! - \b ADC_INT_SOC_TRIGGER_NONE
//! - \b ADC_INT_SOC_TRIGGER_ADCINT1
//! - \b ADC_INT_SOC_TRIGGER_ADCINT2
//!
//! This functionality is useful for creating continuous conversions.
//!
//! \return None.
//
//*****************************************************************************
static inline void
ADC_setInterruptSOCTrigger(uint32_t base, ADC_SOCNumber socNumber,
ADC_IntSOCTrigger trigger)
{
uint16_t shiftVal;
//
// Check the arguments.
//
;
//
// Each SOC has a 2-bit field in this register.
//
shiftVal = (uint16_t)socNumber << 1U;
//
// Set the configuration of the specified SOC. Not that we're treating
// ADCINTSOCSEL1 and ADCINTSOCSEL2 as one 32-bit register here.
//
__eallow();
(*((volatile uint32_t *)(base + 0xAU))) = ((*((volatile uint32_t *)(base + 0xAU))) &
~((uint32_t)0x3U <<
shiftVal)) |
((uint32_t)trigger << shiftVal);
__edis();
}
//*****************************************************************************
//
//! Sets the timing of the end-of-conversion pulse
//!
//! \param base is the base address of the ADC module.
//! \param pulseMode is the generation mode of the EOC pulse.
//!
//! This function configures the end-of-conversion (EOC) pulse generated by ADC.
//! This pulse will be generated either at the end of the acquisition window
//! plus a number of SYSCLK cycles configured by ADC_setInterruptCycleOffset()
//! (pass \b ADC_PULSE_END_OF_ACQ_WIN into \e pulseMode) or at the end of the
//! voltage conversion, one cycle prior to the ADC result latching into it's
//! result register (pass \b ADC_PULSE_END_OF_CONV into \e pulseMode).
//!
//! \return None.
//
//*****************************************************************************
static inline void
ADC_setInterruptPulseMode(uint32_t base, ADC_PulseMode pulseMode)
{
//
// Check the arguments.
//
;
//
// Set the position of the pulse.
//
__eallow();
(*((volatile uint16_t *)(base + 0x0U))) = ((*((volatile uint16_t *)(base + 0x0U))) &
~0x4U) | (uint16_t)pulseMode;
__edis();
}
//*****************************************************************************
//
//! Sets the timing of early interrupt generation.
//!
//! \param base is the base address of the ADC module.
//! \param cycleOffset is the cycles from an SOC falling edge to an early
//! interrupt pulse.
//!
//! This function configures cycle offset between the negative edge of a sample
//! pulse and an early interrupt pulse being generated. This number of cycles
//! is specified with the \e cycleOffset parameter.
//!
//! This function only applies when early interrupt generation is enabled. That
//! means the ADC_setInterruptPulseMode() function \e pulseMode parameter is
//! configured as \b ADC_PULSE_END_OF_ACQ_WIN.
//!
//! \return None.
//
//*****************************************************************************
static inline void
ADC_setInterruptCycleOffset(uint32_t base, uint16_t cycleOffset)
{
//
// Check the arguments.
//
;
//
// Set the position of the pulse.
//
__eallow();
(*((volatile uint16_t *)(base + 0x6FU))) = cycleOffset;
__edis();
}
//*****************************************************************************
//
//! Powers up the analog-to-digital converter core.
//!
//! \param base is the base address of the ADC module.
//!
//! This function powers up the analog circuitry inside the analog core.
//!
//! \note Allow at least a 500us delay before sampling after calling this API.
//! If you enable multiple ADCs, you can delay after they all have begun
//! powering up.
//!
//! \return None.
//
//*****************************************************************************
static inline void
ADC_enableConverter(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Set the bit that powers up the analog circuitry.
//
__eallow();
(*((volatile uint16_t *)(base + 0x0U))) |= 0x80U;
__edis();
}
//*****************************************************************************
//
//! Powers down the analog-to-digital converter module.
//!
//! \param base is the base address of the ADC module.
//!
//! This function powers down the analog circuitry inside the analog core.
//!
//! \return None.
//
//*****************************************************************************
static inline void
ADC_disableConverter(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Clear the bit that powers down the analog circuitry.
//
__eallow();
(*((volatile uint16_t *)(base + 0x0U))) &= ~0x80U;
__edis();
}
//*****************************************************************************
//
//! Forces a SOC flag to a 1 in the analog-to-digital converter.
//!
//! \param base is the base address of the ADC module.
//! \param socNumber is the number of the start-of-conversion.
//!
//! This function forces the SOC flag associated with the SOC specified by
//! \e socNumber. This initiates a conversion once that SOC is given
//! priority. This software trigger can be used whether or not the SOC has been
//! configured to accept some other specific trigger.
//!
//! \return None.
//
//*****************************************************************************
static inline void
ADC_forceSOC(uint32_t base, ADC_SOCNumber socNumber)
{
//
// Check the arguments.
//
;
//
// Write to the register that will force a 1 to the corresponding SOC flag
//
(*((volatile uint16_t *)(base + 0xDU))) = ((uint16_t)1U << (uint16_t)socNumber);
}
//*****************************************************************************
//
//! Forces multiple SOC flags to 1 in the analog-to-digital converter.
//!
//! \param base is the base address of the ADC module.
//! \param socMask is the SOCs to be forced through software
//!
//! This function forces the SOCFRC1 flags associated with the SOCs specified
//! by \e socMask. This initiates a conversion once the desired SOCs are given
//! priority. This software trigger can be used whether or not the SOC has been
//! configured to accept some other specific trigger.
//! Valid values for \e socMask parameter can be any of the individual
//! ADC_FORCE_SOCx values or any of their OR'd combination to trigger multiple
//! SOCs.
//!
//! \note To trigger SOC0, SOC1 and SOC2, value (ADC_FORCE_SOC0 |
//! ADC_FORCE_SOC1 | ADC_FORCE_SOC2) should be passed as socMask.
//!
//! \return None.
//
//*****************************************************************************
static inline void
ADC_forceMultipleSOC(uint32_t base, uint16_t socMask)
{
//
// Check the arguments.
//
;
//
// Write to the register that will force a 1 to desired SOCs
//
(*((volatile uint16_t *)(base + 0xDU))) = socMask;
}
//*****************************************************************************
//
//! Gets the current ADC interrupt status.
//!
//! \param base is the base address of the ADC module.
//! \param adcIntNum is interrupt number within the ADC wrapper.
//!
//! This function returns the interrupt status for the analog-to-digital
//! converter.
//!
//! \e adcIntNum takes a one of the values \b ADC_INT_NUMBER1,
//! \b ADC_INT_NUMBER2, \b ADC_INT_NUMBER3 or \b ADC_INT_NUMBER4 to get
//! the interrupt status for the given interrupt number of the ADC module.
//!
//! \return \b true if the interrupt flag for the specified interrupt number is
//! set and \b false if it is not.
//
//*****************************************************************************
static inline _Bool
ADC_getInterruptStatus(uint32_t base, ADC_IntNumber adcIntNum)
{
//
// Check the arguments.
//
;
//
// Get the specified ADC interrupt status.
//
return(((*((volatile uint16_t *)(base + 0x3U))) & (1U << (uint16_t)adcIntNum)) != 0U);
}
//*****************************************************************************
//
//! Clears ADC interrupt sources.
//!
//! \param base is the base address of the ADC module.
//! \param adcIntNum is interrupt number within the ADC wrapper.
//!
//! This function clears the specified ADC interrupt sources so that they no
//! longer assert. If not in continuous mode, this function must be called
//! before any further interrupt pulses may occur.
//!
//! \e adcIntNum takes a one of the values \b ADC_INT_NUMBER1,
//! \b ADC_INT_NUMBER2, \b ADC_INT_NUMBER3 or \b ADC_INT_NUMBER4 to express
//! which of the four interrupts of the ADC module should be cleared.
//!
//! \return None.
//
//*****************************************************************************
static inline void
ADC_clearInterruptStatus(uint32_t base, ADC_IntNumber adcIntNum)
{
//
// Check the arguments.
//
;
//
// Clear the specified interrupt.
//
(*((volatile uint16_t *)(base + 0x4U))) = (uint16_t)1U << (uint16_t)adcIntNum;
}
//*****************************************************************************
//
//! Gets the current ADC interrupt overflow status.
//!
//! \param base is the base address of the ADC module.
//! \param adcIntNum is interrupt number within the ADC wrapper.
//!
//! This function returns the interrupt overflow status for the
//! analog-to-digital converter. An overflow condition is generated
//! irrespective of the continuous mode.
//!
//! \e adcIntNum takes a one of the values \b ADC_INT_NUMBER1,
//! \b ADC_INT_NUMBER2, \b ADC_INT_NUMBER3 or \b ADC_INT_NUMBER4 to get
//! the interrupt overflow status for the given interrupt number.
//!
//! \return \b true if the interrupt overflow flag for the specified interrupt
//! number is set and \b false if it is not.
//
//*****************************************************************************
static inline _Bool
ADC_getInterruptOverflowStatus(uint32_t base, ADC_IntNumber adcIntNum)
{
//
// Check the arguments.
//
;
//
// Get the specified ADC interrupt status.
//
return(((*((volatile uint16_t *)(base + 0x5U))) & (1U << (uint16_t)adcIntNum)) != 0U);
}
//*****************************************************************************
//
//! Clears ADC interrupt overflow sources.
//!
//! \param base is the base address of the ADC module.
//! \param adcIntNum is interrupt number within the ADC wrapper.
//!
//! This function clears the specified ADC interrupt overflow sources so that
//! they no longer assert. If software tries to clear the overflow in the same
//! cycle that hardware tries to set the overflow, then hardware has priority.
//!
//! \e adcIntNum takes a one of the values \b ADC_INT_NUMBER1,
//! \b ADC_INT_NUMBER2, \b ADC_INT_NUMBER3 or \b ADC_INT_NUMBER4 to express
//! which of the four interrupt overflow status of the ADC module
//! should be cleared.
//!
//! \return None.
//
//*****************************************************************************
static inline void
ADC_clearInterruptOverflowStatus(uint32_t base, ADC_IntNumber adcIntNum)
{
//
// Check the arguments.
//
;
//
// Clear the specified interrupt overflow bit.
//
(*((volatile uint16_t *)(base + 0x6U))) = (uint16_t)1U << (uint16_t)adcIntNum;
}
//*****************************************************************************
//
//! Reads the conversion result.
//!
//! \param resultBase is the base address of the ADC results.
//! \param socNumber is the number of the start-of-conversion.
//!
//! This function returns the conversion result that corresponds to the base
//! address passed into \e resultBase and the SOC passed into \e socNumber.
//!
//! The \e socNumber number is a value \b ADC_SOC_NUMBERX where X is a number
//! from 0 to 15 specifying which SOC's result is to be read.
//!
//! \note Take care that you are using a base address for the result registers
//! (ADCxRESULT_BASE) and not a base address for the control registers.
//!
//! \return Returns the conversion result.
//
//*****************************************************************************
static inline uint16_t
ADC_readResult(uint32_t resultBase, ADC_SOCNumber socNumber)
{
//
// Check the arguments.
//
;
//
// Return the ADC result for the selected SOC.
//
return((*((volatile uint16_t *)(resultBase + (uint32_t)0x0U + (uint32_t)socNumber))));
}
//*****************************************************************************
//
//! Determines whether the ADC is busy or not.
//!
//! \param base is the base address of the ADC.
//!
//! This function allows the caller to determine whether or not the ADC is
//! busy and can sample another channel.
//!
//! \return Returns \b true if the ADC is sampling or \b false if all
//! samples are complete.
//
//*****************************************************************************
static inline _Bool
ADC_isBusy(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Determine if the ADC is busy.
//
return(((*((volatile uint16_t *)(base + 0x0U))) & 0x2000U) != 0U);
}
//*****************************************************************************
//
//! Set SOC burst mode.
//!
//! \param base is the base address of the ADC.
//! \param trigger the source that will cause the burst conversion sequence.
//! \param burstSize is the number of SOCs converted during a burst sequence.
//!
//! This function configures the burst trigger and burstSize of an ADC module.
//! Burst mode allows a single trigger to walk through the round-robin SOCs one
//! or more at a time. When burst mode is enabled, the trigger selected by the
//! ADC_setupSOC() API will no longer have an effect on the SOCs in round-robin
//! mode. Instead, the source specified through the \e trigger parameter will
//! cause a burst of \e burstSize conversions to occur.
//!
//! The \e trigger parameter takes the same values as the ADC_setupSOC() API
//! The \e burstSize parameter should be a value between 1 and 16 inclusive.
//!
//! \return None.
//
//*****************************************************************************
static inline void
ADC_setBurstModeConfig(uint32_t base, ADC_Trigger trigger, uint16_t burstSize)
{
uint16_t regValue;
//
// Check the arguments.
//
;
;
;
//
// Write the burst mode configuration to the register.
//
__eallow();
regValue = (uint16_t)trigger | ((burstSize - 1U) <<
8U);
(*((volatile uint16_t *)(base + 0x2U))) = ((*((volatile uint16_t *)(base + 0x2U))) &
~((uint16_t)0x3FU |
0xF00U)) | regValue;
__edis();
}
//*****************************************************************************
//
//! Enables SOC burst mode.
//!
//! \param base is the base address of the ADC.
//!
//! This function enables SOC burst mode operation of the ADC. Burst mode
//! allows a single trigger to walk through the round-robin SOCs one or more at
//! a time. When burst mode is enabled, the trigger selected by the
//! ADC_setupSOC() API will no longer have an effect on the SOCs in round-robin
//! mode. Use ADC_setBurstMode() to configure the burst trigger and size.
//!
//! \return None.
//
//*****************************************************************************
static inline void
ADC_enableBurstMode(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Enable burst mode.
//
__eallow();
(*((volatile uint16_t *)(base + 0x2U))) |= 0x8000U;
__edis();
}
//*****************************************************************************
//
//! Disables SOC burst mode.
//!
//! \param base is the base address of the ADC.
//!
//! This function disables SOC burst mode operation of the ADC. SOCs in
//! round-robin mode will be triggered by the trigger configured using the
//! ADC_setupSOC() API.
//!
//! \return None.
//
//*****************************************************************************
static inline void
ADC_disableBurstMode(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Disable burst mode.
//
__eallow();
(*((volatile uint16_t *)(base + 0x2U))) &= ~0x8000U;
__edis();
}
//*****************************************************************************
//
//! Sets the priority mode of the SOCs.
//!
//! \param base is the base address of the ADC.
//! \param priMode is the priority mode of the SOCs.
//!
//! This function sets the priority mode of the SOCs. There are three main
//! modes that can be passed in the \e priMode parameter
//!
//! - All SOCs are in round-robin mode. This means no SOC has an inherent
//! higher priority over another. This is selected by passing in the value
//! \b ADC_PRI_ALL_ROUND_ROBIN.
//! - All priorities are in high priority mode. This means that the priority of
//! the SOC is determined by its SOC number. This option is selected by passing
//! in the value \b ADC_PRI_ALL_HIPRI.
//! - A range of SOCs are assigned high priority, with all others in round
//! robin mode. High priority mode means that an SOC with high priority will
//! interrupt the round robin wheel and insert itself as the next conversion.
//! Passing in the value \b ADC_PRI_SOC0_HIPRI will make SOC0 highest priority,
//! \b ADC_PRI_THRU_SOC1_HIPRI will put SOC0 and SOC 1 in high priority, and so
//! on up to \b ADC_PRI_THRU_SOC14_HIPRI where SOCs 0 through 14 are in high
//! priority.
//!
//! \return None.
//
//*****************************************************************************
static inline void
ADC_setSOCPriority(uint32_t base, ADC_PriorityMode priMode)
{
//
// Check the arguments.
//
;
__eallow();
(*((volatile uint16_t *)(base + 0x9U))) = ((*((volatile uint16_t *)(base + 0x9U))) &
~0x1FU) |
(uint16_t)priMode;
__edis();
}
//*****************************************************************************
//
//! Configures Open/Shorts Detection Circuit Mode.
//!
//! \param base is the base address of the ADC.
//! \param modeVal is the desired open/shorts detection circuit mode.
//!
//! This function configures the open/shorts detection circuit mode of the ADC.
//!
//! \return None.
//
//*****************************************************************************
static inline void
ADC_configOSDetectMode(uint32_t base, ADC_OSDetectMode modeVal)
{
//
// Configure open/shorts detection circuit mode.
//
__eallow();
(*((volatile uint16_t *)(base + 0x38U))) = (((*((volatile uint16_t *)(base + 0x38U))) &
(~0x7U)) |
(uint16_t)modeVal);
__edis();
}
//*****************************************************************************
//
//! Configures a post-processing block (PPB) in the ADC.
//!
//! \param base is the base address of the ADC module.
//! \param ppbNumber is the number of the post-processing block.
//! \param socNumber is the number of the start-of-conversion.
//!
//! This function associates a post-processing block with a SOC.
//!
//! The \e ppbNumber is a value \b ADC_PPB_NUMBERX where X is a value from 1 to
//! 4 inclusive that identifies a PPB to be configured. The \e socNumber
//! number is a value \b ADC_SOC_NUMBERX where X is a number from 0 to 15
//! specifying which SOC is to be configured on the ADC module specified by
//! \e base.
//!
//! \note You can have more that one PPB associated with the same SOC, but a
//! PPB can only be configured to correspond to one SOC at a time. Also note
//! that when you have multiple PPBs for the same SOC, the calibration offset
//! that actually gets applied will be that of the PPB with the highest number.
//! Since SOC0 is the default for all PPBs, look out for unintentional
//! overwriting of a lower numbered PPB's offset.
//!
//! \return None.
//
//*****************************************************************************
static inline void
ADC_setupPPB(uint32_t base, ADC_PPBNumber ppbNumber, ADC_SOCNumber socNumber)
{
uint32_t ppbOffset;
//
// Check the arguments.
//
;
//
// Get the offset to the appropriate PPB configuration register.
//
ppbOffset = ((0x48U - 0x40U) * (uint32_t)ppbNumber) + 0x40U;
//
// Write the configuration to the register.
//
__eallow();
(*((volatile uint16_t *)(base + ppbOffset))) = ((*((volatile uint16_t *)(base + ppbOffset))) &
~0xFU) |
((uint16_t)socNumber & 0xFU);
__edis();
}
//*****************************************************************************
//
//! Enables individual ADC PPB event sources.
//!
//! \param base is the base address of the ADC module.
//! \param ppbNumber is the number of the post-processing block.
//! \param evtFlags is a bit mask of the event sources to be enabled.
//!
//! This function enables the indicated ADC PPB event sources. This will allow
//! the specified events to propagate through the X-BAR to a pin or to an ePWM
//! module. The \e evtFlags parameter can be any of the \b ADC_EVT_TRIPHI,
//! \b ADC_EVT_TRIPLO, or \b ADC_EVT_ZERO values.
//!
//! \return None.
//
//*****************************************************************************
static inline void
ADC_enablePPBEvent(uint32_t base, ADC_PPBNumber ppbNumber, uint16_t evtFlags)
{
//
// Check the arguments.
//
;
;
//
// Enable the specified event.
//
__eallow();
(*((volatile uint16_t *)(base + 0x34U))) |= evtFlags << ((uint16_t)ppbNumber * 4U);
__edis();
}
//*****************************************************************************
//
//! Disables individual ADC PPB event sources.
//!
//! \param base is the base address of the ADC module.
//! \param ppbNumber is the number of the post-processing block.
//! \param evtFlags is a bit mask of the event sources to be enabled.
//!
//! This function disables the indicated ADC PPB event sources. This will stop
//! the specified events from propagating through the X-BAR to other modules.
//! The \e evtFlags parameter can be any of the \b ADC_EVT_TRIPHI,
//! \b ADC_EVT_TRIPLO, or \b ADC_EVT_ZERO values.
//!
//! \return None.
//
//*****************************************************************************
static inline void
ADC_disablePPBEvent(uint32_t base, ADC_PPBNumber ppbNumber, uint16_t evtFlags)
{
//
// Check the arguments.
//
;
;
//
// Disable the specified event.
//
__eallow();
(*((volatile uint16_t *)(base + 0x34U))) &= ~(evtFlags << ((uint16_t)ppbNumber * 4U));
__edis();
}
//*****************************************************************************
//
//! Enables individual ADC PPB event interrupt sources.
//!
//! \param base is the base address of the ADC module.
//! \param ppbNumber is the number of the post-processing block.
//! \param intFlags is a bit mask of the interrupt sources to be enabled.
//!
//! This function enables the indicated ADC PPB interrupt sources. Only the
//! sources that are enabled can be reflected to the processor interrupt.
//! Disabled sources have no effect on the processor. The \e intFlags
//! parameter can be any of the \b ADC_EVT_TRIPHI, \b ADC_EVT_TRIPLO, or
//! \b ADC_EVT_ZERO values.
//!
//! \return None.
//
//*****************************************************************************
static inline void
ADC_enablePPBEventInterrupt(uint32_t base, ADC_PPBNumber ppbNumber,
uint16_t intFlags)
{
//
// Check the arguments.
//
;
;
//
// Enable the specified event interrupts.
//
__eallow();
(*((volatile uint16_t *)(base + 0x36U))) |= intFlags << ((uint16_t)ppbNumber * 4U);
__edis();
}
//*****************************************************************************
//
//! Disables individual ADC PPB event interrupt sources.
//!
//! \param base is the base address of the ADC module.
//! \param ppbNumber is the number of the post-processing block.
//! \param intFlags is a bit mask of the interrupt source to be disabled.
//!
//! This function disables the indicated ADC PPB interrupt sources. Only the
//! sources that are enabled can be reflected to the processor interrupt.
//! Disabled sources have no effect on the processor. The \e intFlags
//! parameter can be any of the \b ADC_EVT_TRIPHI, \b ADC_EVT_TRIPLO, or
//! \b ADC_EVT_ZERO values.
//!
//! \return None.
//
//*****************************************************************************
static inline void
ADC_disablePPBEventInterrupt(uint32_t base, ADC_PPBNumber ppbNumber,
uint16_t intFlags)
{
//
// Check the arguments.
//
;
;
//
// Disable the specified event interrupts.
//
__eallow();
(*((volatile uint16_t *)(base + 0x36U))) &= ~(intFlags <<
((uint16_t)ppbNumber * 4U));
__edis();
}
//*****************************************************************************
//
//! Gets the current ADC event status.
//!
//! \param base is the base address of the ADC module.
//! \param ppbNumber is the number of the post-processing block.
//!
//! This function returns the event status for the analog-to-digital converter.
//!
//! \return Returns the current event status, enumerated as a bit field of
//! \b ADC_EVT_TRIPHI, \b ADC_EVT_TRIPLO, and \b ADC_EVT_ZERO.
//
//*****************************************************************************
static inline uint16_t
ADC_getPPBEventStatus(uint32_t base, ADC_PPBNumber ppbNumber)
{
//
// Check the arguments.
//
;
//
// Get the event status for the specified post-processing block.
//
return(((*((volatile uint16_t *)(base + 0x30U))) >> ((uint16_t)ppbNumber * 4U)) &
0x7U);
}
//*****************************************************************************
//
//! Clears ADC event flags.
//!
//! \param base is the base address of the ADC module.
//! \param ppbNumber is the number of the post-processing block.
//! \param evtFlags is a bit mask of the event source to be cleared.
//!
//! This function clears the indicated ADC PPB event flags. After an event
//! occurs this function must be called to allow additional events to be
//! produced. The \e evtFlags parameter can be any of the \b ADC_EVT_TRIPHI,
//! \b ADC_EVT_TRIPLO, or \b ADC_EVT_ZERO values.
//!
//! \return None.
//
//*****************************************************************************
static inline void
ADC_clearPPBEventStatus(uint32_t base, ADC_PPBNumber ppbNumber,
uint16_t evtFlags)
{
//
// Check the arguments.
//
;
;
//
// Clear the specified event interrupts.
//
(*((volatile uint16_t *)(base + 0x32U))) |= evtFlags << ((uint16_t)ppbNumber * 4U);
}
//*****************************************************************************
//
//! Enables cycle-by-cycle clear of ADC PPB event flags.
//!
//! \param base is the base address of the ADC module.
//! \param ppbNumber is the number of the post-processing block.
//!
//! This function enables the automatic cycle-by-cycle clear of ADC PPB event
//! flags. When enabled, the desired PPB event flags are automatically cleared
//! on the next PPBxRESULT load, unless a set condition is also occurring at
//! the same time, in which case the set takes precedence.
//!
//! \return None.
//
//*****************************************************************************
static inline void
ADC_enablePPBEventCBCClear(uint32_t base, ADC_PPBNumber ppbNumber)
{
uint32_t ppbOffset;
//
// Check the arguments.
//
;
//
// Get the offset to the appropriate PPB configuration register.
//
ppbOffset = ((0x48U - 0x40U) * (uint32_t)ppbNumber) + 0x40U;
//
// Set automatic cycle-by-cycle flag clear bit
//
__eallow();
(*((volatile uint16_t *)(base + ppbOffset))) |= 0x20U;
__edis();
}
//*****************************************************************************
//
//! Disables cycle-by-cycle clear of ADC PPB event flags.
//!
//! \param base is the base address of the ADC module.
//! \param ppbNumber is the number of the post-processing block.
//!
//! This function disables the cycle-by-cycle clear of ADC PPB event flags. When
//! disabled, the desired PPB event flags are to be cleared explicitly in
//! software inorder to generate next set of interrupts/events.
//!
//! \return None.
//
//*****************************************************************************
static inline void
ADC_disablePPBEventCBCClear(uint32_t base, ADC_PPBNumber ppbNumber)
{
uint32_t ppbOffset;
//
// Check the arguments.
//
;
//
// Get the offset to the appropriate PPB configuration register.
//
ppbOffset = ((0x48U - 0x40U) * (uint32_t)ppbNumber) + 0x40U;
//
// Clear automatic cycle-by-cycle flag clear bit
//
__eallow();
(*((volatile uint16_t *)(base + ppbOffset))) &= ~0x20U;
__edis();
}
//*****************************************************************************
//
//! Reads the processed conversion result from the PPB.
//!
//! \param resultBase is the base address of the ADC results.
//! \param ppbNumber is the number of the post-processing block.
//!
//! This function returns the processed conversion result that corresponds to
//! the base address passed into \e resultBase and the PPB passed into
//! \e ppbNumber.
//!
//! \note Take care that you are using a base address for the result registers
//! (ADCxRESULT_BASE) and not a base address for the control registers.
//!
//! \return Returns the signed 32-bit conversion result.
//
//*****************************************************************************
static inline int32_t
ADC_readPPBResult(uint32_t resultBase, ADC_PPBNumber ppbNumber)
{
//
// Check the arguments.
//
;
//
// Return the result of selected PPB.
//
return((int32_t)(*((volatile uint32_t *)(resultBase + (uint32_t)0x10U + ((uint32_t)ppbNumber * 2UL)))));
}
//*****************************************************************************
//
//! Reads sample delay time stamp from a PPB.
//!
//! \param base is the base address of the ADC module.
//! \param ppbNumber is the number of the post-processing block.
//!
//! This function returns the sample delay time stamp. This delay is the number
//! of system clock cycles between the SOC being triggered and when it began
//! converting.
//!
//! \return Returns the delay time stamp.
//
//*****************************************************************************
static inline uint16_t
ADC_getPPBDelayTimeStamp(uint32_t base, ADC_PPBNumber ppbNumber)
{
uint32_t ppbOffset;
//
// Check the arguments.
//
;
//
// Get the offset to the appropriate delay.
//
ppbOffset = ((0x49U - 0x41U) * (uint32_t)ppbNumber) + 0x41U;
//
// Return the delay time stamp.
//
return((*((volatile uint16_t *)(base + ppbOffset))) & 0xFFFU);
}
//*****************************************************************************
//
//! Sets the post processing block offset correction.
//!
//! \param base is the base address of the ADC module.
//! \param ppbNumber is the number of the post-processing block.
//! \param offset is the 10-bit signed value subtracted from ADC the output.
//!
//! This function sets the PPB offset correction value. This value can be used
//! to digitally remove any system-level offset inherent in the ADCIN circuit
//! before it is stored in the appropriate result register. The \e offset
//! parameter is \b subtracted from the ADC output and is a signed value from
//! -512 to 511 inclusive. For example, when \e offset = 1, ADCRESULT = ADC
//! output - 1. When \e offset = -512, ADCRESULT = ADC output - (-512) or ADC
//! output + 512.
//!
//! Passing a zero in to the \e offset parameter will effectively disable the
//! calculation, allowing the raw ADC result to be passed unchanged into the
//! result register.
//!
//! \note If multiple PPBs are applied to the same SOC, the offset that will be
//! applied will be that of the PPB with the highest number.
//!
//! \return None
//
//*****************************************************************************
static inline void
ADC_setPPBCalibrationOffset(uint32_t base, ADC_PPBNumber ppbNumber,
int16_t offset)
{
uint32_t ppbOffset;
//
// Check the arguments.
//
;
//
// Get the offset to the appropriate offset register.
//
ppbOffset = ((0x4AU - 0x42U) * (uint32_t)ppbNumber) + 0x42U;
//
// Write the offset amount.
//
__eallow();
(*((volatile uint16_t *)(base + ppbOffset))) = ((*((volatile uint16_t *)(base + ppbOffset))) &
~0x3FFU) |
((uint16_t)offset & 0x3FFU);
__edis();
}
//*****************************************************************************
//
//! Sets the post processing block reference offset.
//!
//! \param base is the base address of the ADC module.
//! \param ppbNumber is the number of the post-processing block.
//! \param offset is the 16-bit unsigned value subtracted from ADC the output.
//!
//! This function sets the PPB reference offset value. This can be used to
//! either calculate the feedback error or convert a unipolar signal to bipolar
//! by subtracting a reference value. The result will be stored in the
//! appropriate PPB result register which can be read using ADC_readPPBResult().
//!
//! Passing a zero in to the \e offset parameter will effectively disable the
//! calculation and will pass the ADC result to the PPB result register
//! unchanged.
//!
//! \note If in 12-bit mode, you may only pass a 12-bit value into the \e offset
//! parameter.
//!
//! \return None
//
//*****************************************************************************
static inline void
ADC_setPPBReferenceOffset(uint32_t base, ADC_PPBNumber ppbNumber,
uint16_t offset)
{
uint32_t ppbOffset;
//
// Check the arguments.
//
;
//
// Get the offset to the appropriate offset register.
//
ppbOffset = ((0x4BU - 0x43U) * (uint32_t)ppbNumber) + 0x43U;
//
// Write the offset amount.
//
(*((volatile uint16_t *)(base + ppbOffset))) = offset;
}
//*****************************************************************************
//
//! Enables two's complement capability in the PPB.
//!
//! \param base is the base address of the ADC module.
//! \param ppbNumber is the number of the post-processing block.
//!
//! This function enables two's complement in the post-processing block
//! specified by the \e ppbNumber parameter. When enabled, a two's complement
//! will be performed on the output of the offset subtraction before it is
//! stored in the appropriate PPB result register. In other words, the PPB
//! result will be the reference offset value minus the the ADC result value
//! (ADCPPBxRESULT = ADCSOCxOFFREF - ADCRESULTx).
//!
//! \return None
//
//*****************************************************************************
static inline void
ADC_enablePPBTwosComplement(uint32_t base, ADC_PPBNumber ppbNumber)
{
uint32_t ppbOffset;
//
// Check the arguments.
//
;
//
// Get the offset to the appropriate PPB configuration register.
//
ppbOffset = ((0x48U - 0x40U) * (uint32_t)ppbNumber) + 0x40U;
//
// Enable PPB two's complement.
//
__eallow();
(*((volatile uint16_t *)(base + ppbOffset))) |= 0x10U;
__edis();
}
//*****************************************************************************
//
//! Disables two's complement capability in the PPB.
//!
//! \param base is the base address of the ADC module.
//! \param ppbNumber is the number of the post-processing block.
//!
//! This function disables two's complement in the post-processing block
//! specified by the \e ppbNumber parameter. When disabled, a two's complement
//! will \b NOT be performed on the output of the offset subtraction before it
//! is stored in the appropriate PPB result register. In other words, the PPB
//! result will be the ADC result value minus the reference offset value
//! (ADCPPBxRESULT = ADCRESULTx - ADCSOCxOFFREF).
//!
//! \return None
//
//*****************************************************************************
static inline void
ADC_disablePPBTwosComplement(uint32_t base, ADC_PPBNumber ppbNumber)
{
uint32_t ppbOffset;
//
// Check the arguments.
//
;
//
// Get the offset to the appropriate PPB configuration register.
//
ppbOffset = ((0x48U - 0x40U) * (uint32_t)ppbNumber) + 0x40U;
//
// Disable PPB two's complement.
//
__eallow();
(*((volatile uint16_t *)(base + ppbOffset))) &= ~0x10U;
__edis();
}
//*****************************************************************************
//
//! Enables an ADC interrupt source.
//!
//! \param base is the base address of the ADC module.
//! \param adcIntNum is interrupt number within the ADC wrapper.
//!
//! This function enables the indicated ADC interrupt source. Only the
//! sources that are enabled can be reflected to the processor interrupt.
//! Disabled sources have no effect on the processor.
//!
//! \e adcIntNum can take the value \b ADC_INT_NUMBER1,
//! \b ADC_INT_NUMBER2, \b ADC_INT_NUMBER3 or \b ADC_INT_NUMBER4 to express
//! which of the four interrupts of the ADC module should be enabled.
//!
//! \return None.
//
//*****************************************************************************
static inline void
ADC_enableInterrupt(uint32_t base, ADC_IntNumber adcIntNum)
{
uint32_t intRegAddr;
uint16_t shiftVal;
//
// Check the arguments.
//
;
//
// Each INTSEL register manages two interrupts. If the interrupt number is
// even, we'll be accessing the upper byte and will need to shift.
//
intRegAddr = base + 0x7U + ((uint32_t)adcIntNum >> 1);
shiftVal = ((uint16_t)adcIntNum & 0x1U) << 3U;
//
// Enable the specified ADC interrupt.
//
__eallow();
(*((volatile uint16_t *)(intRegAddr))) |= 0x20U << shiftVal;
__edis();
}
//*****************************************************************************
//
//! Disables an ADC interrupt source.
//!
//! \param base is the base address of the ADC module.
//! \param adcIntNum is interrupt number within the ADC wrapper.
//!
//! This function disables the indicated ADC interrupt source.
//! Only the sources that are enabled can be reflected to the processor
//! interrupt. Disabled sources have no effect on the processor.
//!
//! \e adcIntNum can take the value \b ADC_INT_NUMBER1,
//! \b ADC_INT_NUMBER2, \b ADC_INT_NUMBER3 or \b ADC_INT_NUMBER4 to express
//! which of the four interrupts of the ADC module should be disabled.
//!
//! \return None.
//
//*****************************************************************************
static inline void
ADC_disableInterrupt(uint32_t base, ADC_IntNumber adcIntNum)
{
uint32_t intRegAddr;
uint16_t shiftVal;
//
// Check the arguments.
//
;
//
// Each INTSEL register manages two interrupts. If the interrupt number is
// even, we'll be accessing the upper byte and will need to shift.
//
intRegAddr = base + 0x7U + ((uint32_t)adcIntNum >> 1);
shiftVal = ((uint16_t)adcIntNum & 0x1U) << 3U;
//
// Disable the specified ADC interrupt.
//
__eallow();
(*((volatile uint16_t *)(intRegAddr))) &= ~(0x20U << shiftVal);
__edis();
}
//*****************************************************************************
//
//! Sets the source EOC for an analog-to-digital converter interrupt.
//!
//! \param base is the base address of the ADC module.
//! \param adcIntNum is interrupt number within the ADC wrapper.
//! \param socNumber is the number of the start-of-conversion.
//!
//! This function sets which conversion is the source of an ADC interrupt.
//!
//! The \e intTrigger number is a value \b ADC_SOC_NUMBERX where X is a number
//! from 0 to 15 specifying which EOC is to be configured on the ADC module
//! specified by \e base. Refer \b ADC_SOCNumber enum for valid values for
//! this input.
//!
//! \e adcIntNum can take the value \b ADC_INT_NUMBER1,
//! \b ADC_INT_NUMBER2, \b ADC_INT_NUMBER3 or \b ADC_INT_NUMBER4 to express
//! which of the four interrupts of the ADC module is being configured.
//!
//! \return None.
//
//*****************************************************************************
static inline void
ADC_setInterruptSource(uint32_t base, ADC_IntNumber adcIntNum,
uint16_t intTrigger)
{
uint32_t intRegAddr;
uint16_t shiftVal;
//
// Check the arguments.
//
;
;
//
// Each INTSEL register manages two interrupts. If the interrupt number is
// even, we'll be accessing the upper byte and will need to shift.
//
intRegAddr = base + 0x7U + ((uint32_t)adcIntNum >> 1);
shiftVal = ((uint16_t)adcIntNum & 0x1U) << 3U;
//
// Set the specified ADC interrupt source.
//
__eallow();
(*((volatile uint16_t *)(intRegAddr))) =
((*((volatile uint16_t *)(intRegAddr))) & ~(0xFU << shiftVal)) |
((uint16_t)intTrigger << shiftVal);
__edis();
}
//*****************************************************************************
//
//! Enables continuous mode for an ADC interrupt.
//!
//! \param base is the base address of the ADC.
//! \param adcIntNum is interrupt number within the ADC wrapper.
//!
//! This function enables continuous mode for the ADC interrupt passed into
//! \e adcIntNum. This means that pulses will be generated for the specified
//! ADC interrupt whenever an EOC pulse is generated irrespective of whether or
//! not the flag bit is set.
//!
//! \e adcIntNum can take the value \b ADC_INT_NUMBER1,
//! \b ADC_INT_NUMBER2, \b ADC_INT_NUMBER3 or \b ADC_INT_NUMBER4 to express
//! which of the four interrupts of the ADC module is being configured.
//!
//! \return None.
//
//*****************************************************************************
static inline void
ADC_enableContinuousMode(uint32_t base, ADC_IntNumber adcIntNum)
{
uint32_t intRegAddr;
uint16_t shiftVal;
//
// Check the arguments.
//
;
//
// Each INTSEL register manages two interrupts. If the interrupt number is
// even, we'll be accessing the upper byte and will need to shift.
//
intRegAddr = base + 0x7U + ((uint32_t)adcIntNum >> 1);
shiftVal = ((uint16_t)adcIntNum & 0x1U) << 3U;
//
// Enable continuous mode for the specified ADC interrupt.
//
__eallow();
(*((volatile uint16_t *)(intRegAddr))) |= 0x40U << shiftVal;
__edis();
}
//*****************************************************************************
//
//! Disables continuous mode for an ADC interrupt.
//!
//! \param base is the base address of the ADC.
//! \param adcIntNum is interrupt number within the ADC wrapper.
//!
//! This function disables continuous mode for the ADC interrupt passed into
//! \e adcIntNum. This means that pulses will not be generated for the
//! specified ADC interrupt until the corresponding interrupt flag for the
//! previous interrupt occurrence has been cleared using
//! ADC_clearInterruptStatus().
//!
//! \e adcIntNum can take the value \b ADC_INT_NUMBER1,
//! \b ADC_INT_NUMBER2, \b ADC_INT_NUMBER3 or \b ADC_INT_NUMBER4 to express
//! which of the four interrupts of the ADC module is being configured.
//!
//! \return None.
//
//*****************************************************************************
static inline void
ADC_disableContinuousMode(uint32_t base, ADC_IntNumber adcIntNum)
{
uint32_t intRegAddr;
uint16_t shiftVal;
//
// Check the arguments.
//
;
//
// Each INTSEL register manages two interrupts. If the interrupt number is
// even, we'll be accessing the upper byte and will need to shift.
//
intRegAddr = base + 0x7U + ((uint32_t)adcIntNum >> 1);
shiftVal = ((uint16_t)adcIntNum & 0x1U) << 3U;
//
// Disable continuous mode for the specified ADC interrupt.
//
__eallow();
(*((volatile uint16_t *)(intRegAddr))) &= ~(0x40U << shiftVal);
__edis();
}
//*****************************************************************************
//
//! Converts temperature from sensor reading to degrees C
//!
//! \param tempResult is the raw ADC A conversion result from the temp sensor.
//! \param vref is the reference voltage being used (for example 3.3 for 3.3V).
//! \param refMode is the reference mode being used (\b ADC_REFERENCE_INTERNAL
//! or \b ADC_REFERENCE_EXTERNAL).
//!
//! This function converts temperature from temp sensor reading to degrees C.
//! Temp sensor values in production test are derived with 2.5V reference.
//! The \b vref argument in the function is used to scale the temp sensor
//! reading accordingly if temp sensor value is read at a different VREF
//! setting.
//!
//! \return Returns the temperature sensor reading converted to degrees C.
//
//*****************************************************************************
static inline int16_t
ADC_getTemperatureC(uint16_t tempResult, ADC_ReferenceMode refMode,
float32_t vref)
{
float32_t temp;
//
// Read temp sensor slope and offset locations from OTP and convert
//
temp = (float32_t)tempResult * (vref / 2.5F);
if(refMode == ADC_REFERENCE_INTERNAL)
{
return((int16_t)((((int32_t)temp - (*(int16_t *)((uintptr_t)0x701CB))) * 4096) /
(*(int16_t *)((uintptr_t)0x701CA))));
}
else
{
return((int16_t)((((int32_t)temp - (*(int16_t *)((uintptr_t)0x701C9))) * 4096) /
(*(int16_t *)((uintptr_t)0x701C8))));
}
}
//*****************************************************************************
//
//! Converts temperature from sensor reading to degrees K
//!
//! \param tempResult is the raw ADC A conversion result from the temp sensor.
//! \param vref is the reference voltage being used (for example 3.3 for 3.3V).
//! \param refMode is the reference mode being used (\b ADC_REFERENCE_INTERNAL
//! or \b ADC_REFERENCE_EXTERNAL).
//!
//! This function converts temperature from temp sensor reading to degrees K.
//! Temp sensor values in production test are derived with 2.5V reference.
//! The \b vref argument in the function is used to scale the temp sensor
//! reading accordingly if temp sensor value is read at a different VREF
//! setting.
//!
//! \return Returns the temperature sensor reading converted to degrees K.
//
//*****************************************************************************
static inline int16_t
ADC_getTemperatureK(uint16_t tempResult, ADC_ReferenceMode refMode,
float32_t vref)
{
float32_t temp;
//
// Read temp sensor slope and offset locations from OTP and convert
//
temp = (float32_t)tempResult * (vref / 2.5F);
if(refMode == ADC_REFERENCE_INTERNAL)
{
return((int16_t)(((((int32_t)temp - (*(int16_t *)((uintptr_t)0x701CB))) * 4096) /
(*(int16_t *)((uintptr_t)0x701CA))) + 273));
}
else
{
return((int16_t)(((((int32_t)temp - (*(int16_t *)((uintptr_t)0x701C9))) * 4096) /
(*(int16_t *)((uintptr_t)0x701C8))) + 273));
}
}
//*****************************************************************************
//
//! Configures the ADC module's reference mode and offset trim
//!
//! \param base is the base address of the ADC module.
//! \param refMode is the reference mode being used (\b ADC_REFERENCE_INTERNAL
//! or \b ADC_REFERENCE_EXTERNAL).
//! \param refVoltage is the reference voltage being used
//! (\b ADC_REFERENCE_2_5V or \b ADC_REFERENCE_3_3V). This is ignored
//! when the reference mode is external.
//!
//! This function configures the ADC module's reference mode and loads the
//! corresponding offset trims.
//!
//! \note In this device, the bandgaps are common for all the ADC instances,
//! hence common Vref configuration needs to be done for all the ADCs. This
//! API configures same Vref configuration for all the supported ADCs in the
//! device.
//!
//! \note When the \e refMode parameter is \b ADC_REFERENCE_EXTERNAL, the value
//! of the \e refVoltage parameter has no effect on the operation of the ADC.
//!
//! \return None.
//
//*****************************************************************************
extern void
ADC_setVREF(uint32_t base, ADC_ReferenceMode refMode,
ADC_ReferenceVoltage refVoltage);
//*****************************************************************************
//
//! Configures the offset trim for all the ADC instances in a device
//!
//! \param refMode is the reference mode being used (\b ADC_REFERENCE_INTERNAL
//! or \b ADC_REFERENCE_EXTERNAL).
//! \param refVoltage is the reference voltage being used
//! (\b ADC_REFERENCE_2_5V or \b ADC_REFERENCE_3_3V). This is ignored
//! when the reference mode is external.
//!
//! This function loads the offset trims of all the ADC instances available in
//! a device.
//!
//! \note When the \e refMode parameter is \b ADC_REFERENCE_EXTERNAL, the value
//! of the \e refVoltage parameter has no effect on the operation of the ADC.
//!
//! \return None.
//
//*****************************************************************************
extern void
ADC_setOffsetTrimAll(ADC_ReferenceMode refMode,
ADC_ReferenceVoltage refVoltage);
//*****************************************************************************
//
//! Configures the offset trim for the desired ADC instance
//!
//! \param base is the base address of the ADC module.
//!
//! This function loads the offset trims for the desired ADC instance.
//!
//! \return None.
//
//*****************************************************************************
extern void
ADC_setOffsetTrim(uint32_t base);
//*****************************************************************************
//
//! Configures the INL trim for the desired ADC instance
//!
//! \param base is the base address of the ADC module.
//!
//! This function loads the INL trims for the desired ADC instance.
//!
//! \return None.
//
//*****************************************************************************
extern void
ADC_setINLTrim(uint32_t base);
//*****************************************************************************
//
//! Sets the windowed trip limits for a PPB.
//!
//! \param base is the base address of the ADC module.
//! \param ppbNumber is the number of the post-processing block.
//! \param tripHiLimit is the value is the digital comparator trip high limit.
//! \param tripLoLimit is the value is the digital comparator trip low limit.
//!
//! This function sets the windowed trip limits for a PPB. These values set
//! the digital comparator so that when one of the values is exceeded, either a
//! high or low trip event will occur.
//!
//! The \e ppbNumber is a value \b ADC_PPB_NUMBERX where X is a value from 1 to
//! 4 inclusive that identifies a PPB to be configured.
//!
//! If using 16-bit mode, you may pass a 17-bit number into the \e tripHiLimit
//! and \e tripLoLimit parameters where the 17th bit is the sign bit (that is
//! a value from -65536 and 65535). In 12-bit mode, only bits 12:0 will be
//! compared against bits 12:0 of the PPB result.
//!
//!
//! \return None.
//
//*****************************************************************************
extern void
ADC_setPPBTripLimits(uint32_t base, ADC_PPBNumber ppbNumber,
int32_t tripHiLimit, int32_t tripLoLimit);
//*****************************************************************************
//
// Close the Doxygen group.
//! @}
//
//*****************************************************************************
//*****************************************************************************
//
// Mark the end of the C bindings section for C++ compilers.
//
//*****************************************************************************
//###########################################################################
//
// FILE: aes.h
//
// TITLE: Driver for the AES module.
//
//###########################################################################
// $Copyright:
// Copyright (C) 2023 Texas Instruments Incorporated - http://www.ti.com/
//
// 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 Texas Instruments Incorporated 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
// OWNER 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.
// $
//###########################################################################
//*****************************************************************************
//
// If building with a C++ compiler, make all of the definitions in this header
// have a C binding.
//
//*****************************************************************************
//*****************************************************************************
//
//! \addtogroup aes_api AES
//! @{
//
//*****************************************************************************
//###########################################################################
//
// FILE: interrupt.h
//
// TITLE: C28x Interrupt (PIE) driver.
//
//###########################################################################
// $Copyright:
// Copyright (C) 2023 Texas Instruments Incorporated - http://www.ti.com/
//
// 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 Texas Instruments Incorporated 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
// OWNER 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.
// $
//###########################################################################
//*****************************************************************************
//
// If building with a C++ compiler, make all of the definitions in this header
// have a C binding.
//
//*****************************************************************************
//*****************************************************************************
//
//! \addtogroup interrupt_api Interrupt
//! @{
//
//*****************************************************************************
//###########################################################################
//
// FILE: hw_ints.h
//
// TITLE: Definitions of interrupt numbers for use with interrupt.c.
//
//###########################################################################
// $Copyright:
// Copyright (C) 2023 Texas Instruments Incorporated - http://www.ti.com/
//
// 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 Texas Instruments Incorporated 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
// OWNER 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.
// $
//###########################################################################
//*****************************************************************************
//
// PIE Interrupt Numbers
//
// 0x00FF = PIE Table Row #
// 0xFF00 = PIE Table Column #
// 0xFFFF0000 = PIE Vector ID
//
//*****************************************************************************
//###########################################################################
//
// FILE: hw_pie.h
//
// TITLE: Definitions for the PIE registers.
//
//###########################################################################
// $Copyright:
// Copyright (C) 2023 Texas Instruments Incorporated - http://www.ti.com/
//
// 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 Texas Instruments Incorporated 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
// OWNER 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.
// $
//###########################################################################
//*************************************************************************************************
//
// The following are defines for the PIE register offsets
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the PIECTRL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the PIEACK register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the PIEIER1 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the PIEIFR1 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the PIEIER2 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the PIEIFR2 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the PIEIER3 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the PIEIFR3 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the PIEIER4 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the PIEIFR4 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the PIEIER5 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the PIEIFR5 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the PIEIER6 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the PIEIFR6 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the PIEIER7 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the PIEIFR7 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the PIEIER8 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the PIEIFR8 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the PIEIER9 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the PIEIFR9 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the PIEIER10 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the PIEIFR10 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the PIEIER11 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the PIEIFR11 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the PIEIER12 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the PIEIFR12 register
//
//*************************************************************************************************
//*****************************************************************************
//
// The following are values that can be passed to the Interrupt_enableInCPU()
// and Interrupt_disableInCPU() functions as the cpuInterrupt parameter.
//
//*****************************************************************************
//*****************************************************************************
//
// The following are values that can be passed to the Interrupt_clearACKGroup()
// function as the group parameter.
//
//*****************************************************************************
//*****************************************************************************
//
// Prototypes for the APIs.
//
//*****************************************************************************
//*****************************************************************************
//
//! \internal
//! The default interrupt handler.
//!
//! This is the default interrupt handler. The Interrupt_initVectorTable()
//! function sets all vectors to this function. Also, when an interrupt is
//! unregistered using the Interrupt_unregister() function, this handler takes
//! its place. This should never be called during normal operation.
//!
//! The ESTOP0 statement is for debug purposes only. Remove and replace with an
//! appropriate error handling routine for your program.
//!
//! \return None.
//
//*****************************************************************************
extern void
Interrupt_defaultHandler(void);
//*****************************************************************************
//
//! \internal
//! The default illegal instruction trap interrupt handler.
//!
//! This is the default interrupt handler for an illegal instruction trap
//! (ITRAP). The Interrupt_initVectorTable() function sets the appropriate
//! vector to this function. This should never be called during normal
//! operation.
//!
//! The ESTOP0 statement is for debug purposes only. Remove and replace with
//! an appropriate error handling routine for your program.
//!
//! \return None.
//
//*****************************************************************************
extern void
Interrupt_illegalOperationHandler(void);
//*****************************************************************************
//
//! \internal
//! The default non-maskable interrupt handler.
//!
//! This is the default interrupt handler for a non-maskable interrupt (NMI).
//! The Interrupt_initVectorTable() function sets the appropriate vector to
//! this function. This should never be called during normal operation.
//!
//! The ESTOP0 statement is for debug purposes only. Remove and replace with an
//! appropriate error handling routine for your program.
//!
//! \return None.
//
//*****************************************************************************
extern void
Interrupt_nmiHandler(void);
//*****************************************************************************
//
//! Allows the CPU to process interrupts.
//!
//! This function clears the global interrupt mask bit (INTM) in the CPU,
//! allowing the processor to respond to interrupts.
//!
//! \return Returns \b true if interrupts were disabled when the function was
//! called or \b false if they were initially enabled.
//
//*****************************************************************************
static inline _Bool
Interrupt_enableGlobal(void)
{
//
// Enable processor interrupts.
//
return(((__enable_interrupts() & 0x1U) != 0U) ? 1 : 0);
}
//*****************************************************************************
//
//! Stops the CPU from processing interrupts.
//!
//! This function sets the global interrupt mask bit (INTM) in the CPU,
//! preventing the processor from receiving maskable interrupts.
//!
//! \return Returns \b true if interrupts were already disabled when the
//! function was called or \b false if they were initially enabled.
//
//*****************************************************************************
static inline _Bool
Interrupt_disableGlobal(void)
{
//
// Disable processor interrupts.
//
return(((__disable_interrupts() & 0x1U) != 0U) ? 1 : 0);
}
//*****************************************************************************
//
//! Registers a function to be called when an interrupt occurs.
//!
//! \param interruptNumber specifies the interrupt in question.
//! \param handler is a pointer to the function to be called.
//!
//! This function is used to specify the handler function to be called when the
//! given interrupt is asserted to the processor. When the interrupt occurs,
//! if it is enabled (via Interrupt_enable()), the handler function will be
//! called in interrupt context. Since the handler function can preempt other
//! code, care must be taken to protect memory or peripherals that are accessed
//! by the handler and other non-handler code.
//!
//! The available \e interruptNumber values are supplied in
//! inc/hw_ints.h.
//!
//! \note This function assumes that the PIE has been enabled. See
//! Interrupt_initModule().
//!
//! \return None.
//
//*****************************************************************************
static inline void
Interrupt_register(uint32_t interruptNumber, void (*handler)(void))
{
uint32_t address;
//
// Calculate appropriate address for the interrupt number
//
address = (uint32_t)0x00000D00U +
(((interruptNumber & 0xFFFF0000U) >> 16U) * 2U);
//
// Copy ISR address into PIE table
//
__eallow();
(*((volatile uint32_t *)(address))) = (uint32_t)handler;
__edis();
}
//*****************************************************************************
//
//! Unregisters the function to be called when an interrupt occurs.
//!
//! \param interruptNumber specifies the interrupt in question.
//!
//! This function is used to indicate that a default handler
//! Interrupt_defaultHandler() should be called when the given interrupt is
//! asserted to the processor. Call Interrupt_disable() to disable
//! the interrupt before calling this function.
//!
//! The available \e interruptNumber values are supplied in
//! inc/hw_ints.h.
//!
//! \sa Interrupt_register() for important information about registering
//! interrupt handlers.
//!
//! \return None.
//
//*****************************************************************************
static inline void
Interrupt_unregister(uint32_t interruptNumber)
{
uint32_t address;
//
// Calculate appropriate address for the interrupt number
//
address = (uint32_t)0x00000D00U +
(((interruptNumber & 0xFFFF0000U) >> 16U) * 2U);
//
// Copy default ISR address into PIE table
//
__eallow();
(*((volatile uint32_t *)(address))) = (uint32_t)Interrupt_defaultHandler;
__edis();
}
//*****************************************************************************
//
//! Enables CPU interrupt channels
//!
//! \param cpuInterrupt specifies the CPU interrupts to be enabled.
//!
//! This function enables the specified interrupts in the CPU. The
//! \e cpuInterrupt parameter is a logical OR of the values
//! \b INTERRUPT_CPU_INTx where x is the interrupt number between 1 and 14,
//! \b INTERRUPT_CPU_DLOGINT, and \b INTERRUPT_CPU_RTOSINT.
//!
//! \note Note that interrupts 1-12 correspond to the PIE groups with those
//! same numbers.
//!
//! \return None.
//
//*****************************************************************************
static inline void
Interrupt_enableInCPU(uint16_t cpuInterrupt)
{
//
// Set the interrupt bits in the CPU.
//
IER |= cpuInterrupt;
}
//*****************************************************************************
//
//! Disables CPU interrupt channels
//!
//! \param cpuInterrupt specifies the CPU interrupts to be disabled.
//!
//! This function disables the specified interrupts in the CPU. The
//! \e cpuInterrupt parameter is a logical OR of the values
//! \b INTERRUPT_CPU_INTx where x is the interrupt number between 1 and 14,
//! \b INTERRUPT_CPU_DLOGINT, and \b INTERRUPT_CPU_RTOSINT.
//!
//! \note Note that interrupts 1-12 correspond to the PIE groups with those
//! same numbers.
//!
//! \return None.
//
//*****************************************************************************
static inline void
Interrupt_disableInCPU(uint16_t cpuInterrupt)
{
//
// Clear the interrupt bits in the CPU.
//
IER &= ~cpuInterrupt;
}
//*****************************************************************************
//
//! Acknowledges PIE Interrupt Group
//!
//! \param group specifies the interrupt group to be acknowledged.
//!
//! The specified interrupt group is acknowledged and clears any interrupt
//! flag within that respective group.
//!
//! The \e group parameter must be a logical OR of the following:
//! \b INTERRUPT_ACK_GROUP1, \b INTERRUPT_ACK_GROUP2, \b INTERRUPT_ACK_GROUP3
//! \b INTERRUPT_ACK_GROUP4, \b INTERRUPT_ACK_GROUP5, \b INTERRUPT_ACK_GROUP6
//! \b INTERRUPT_ACK_GROUP7, \b INTERRUPT_ACK_GROUP8, \b INTERRUPT_ACK_GROUP9
//! \b INTERRUPT_ACK_GROUP10, \b INTERRUPT_ACK_GROUP11,
//! \b INTERRUPT_ACK_GROUP12.
//!
//! \return None.
//
//*****************************************************************************
static inline void
Interrupt_clearACKGroup(uint16_t group)
{
//
// Set interrupt group acknowledge bits
//
(*((volatile uint16_t *)(0x00000CE0U + 0x1U))) = group;
}
//*****************************************************************************
//
//! Enables the PIE block.
//!
//! This function enables the vector fetching for the peripheral interrupts by
//! enabling the PIE block.
//!
//! \return None.
//
//*****************************************************************************
static inline void
Interrupt_enablePIE(void)
{
(*((volatile uint16_t *)(0x00000CE0U + 0x0U))) |= 0x1U;
}
//*****************************************************************************
//
//! Disables the PIE block.
//!
//! This function disables the vector fetching for the peripheral interrupts by
//! disabling the PIE block. PIEACK, PIEIFR, and PIEIER registers can be
//! accessed even when the PIE block is disabled.
//!
//! \return None.
//
//*****************************************************************************
static inline void
Interrupt_disablePIE(void)
{
(*((volatile uint16_t *)(0x00000CE0U + 0x0U))) &= ~0x1U;
}
//*****************************************************************************
//
//! Initializes the PIE control registers by setting them to a known state.
//!
//! This function initializes the PIE control registers. After globally
//! disabling interrupts and enabling the PIE, it clears all of the PIE
//! interrupt enable bits and interrupt flags.
//!
//! \return None.
//
//*****************************************************************************
extern void
Interrupt_initModule(void);
//*****************************************************************************
//
//! Initializes the PIE vector table by setting all vectors to a default
//! handler function.
//!
//! \return None.
//
//*****************************************************************************
extern void
Interrupt_initVectorTable(void);
//*****************************************************************************
//
//! Enables an interrupt.
//!
//! \param interruptNumber specifies the interrupt to be enabled.
//!
//! The specified interrupt is enabled in the interrupt controller. Other
//! enables for the interrupt (such as at the peripheral level) are unaffected
//! by this function.
//!
//! The available \e interruptNumber values are supplied in
//! inc/hw_ints.h.
//!
//! \return None.
//
//*****************************************************************************
extern void
Interrupt_enable(uint32_t interruptNumber);
//*****************************************************************************
//
//! Disables an interrupt.
//!
//! \param interruptNumber specifies the interrupt to be disabled.
//!
//! The specified interrupt is disabled in the interrupt controller. Other
//! enables for the interrupt (such as at the peripheral level) are unaffected
//! by this function.
//!
//! The available \e interruptNumber values are supplied in
//! inc/hw_ints.h.
//!
//! \return None.
//
//*****************************************************************************
extern void
Interrupt_disable(uint32_t interruptNumber);
//*****************************************************************************
//
// Extern compiler intrinsic prototypes. See compiler User's Guide for details.
//
//*****************************************************************************
extern uint16_t __disable_interrupts(void);
extern uint16_t __enable_interrupts(void);
//*****************************************************************************
//
// Close the Doxygen group.
//! @}
//
//*****************************************************************************
//*****************************************************************************
//
// Mark the end of the C bindings section for C++ compilers.
//
//*****************************************************************************
//###########################################################################
//
// FILE: hw_aes.h
//
// TITLE: Definitions for the AES registers.
//
//###########################################################################
// $Copyright:
// Copyright (C) 2023 Texas Instruments Incorporated - http://www.ti.com/
//
// 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 Texas Instruments Incorporated 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
// OWNER 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.
// $
//###########################################################################
//*************************************************************************************************
//
// The following are defines for the AES register offsets
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the AES_CTRL register
//
//*************************************************************************************************
// Enable
// operations
//*************************************************************************************************
//
// The following are defines for the bit fields in the AES_SYSCONFIG register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the AES_SYSSTATUS register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the AES_IRQSTATUS register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the AES_IRQENABLE register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the AES_DIRTY_BITS register
//
//*************************************************************************************************
//###########################################################################
//
// FILE: hw_aes_ss.h
//
// TITLE: Definitions for the AES_SS registers.
//
//###########################################################################
// $Copyright:
// Copyright (C) 2023 Texas Instruments Incorporated - http://www.ti.com/
//
// 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 Texas Instruments Incorporated 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
// OWNER 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.
// $
//###########################################################################
//*************************************************************************************************
//
// The following are defines for the AES_SS register offsets
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the AES_GLB_INT_FLG register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the AES_GLB_INT_CLR register
//
//*************************************************************************************************
// Interrupt
//*****************************************************************************
//
// Interrupt flags for use with AES_enableInterrupt(), AES_disableInterrupt(),
// AES_clearInterruptStatus() & AES_getInterruptStatus() functions.
//
//*****************************************************************************
//*****************************************************************************
//
// Mask to specify AES-core related interrupts. It is the logical OR of all the
// AES only interrupts.
//
//*****************************************************************************
//*****************************************************************************
//
// Defines that can be used for enabling and disabling DMA requests in the
// AES_enableDMARequest() and AES_disableDMARequest() functions.
//
//*****************************************************************************
//*****************************************************************************
//
// Mask to specify all the possible DMA requests. It is the logical OR
// of all the individual DMA requests..
//
//*****************************************************************************
//*****************************************************************************
//
// Define to specify the mask for the AES configurations related fields.
//
//*****************************************************************************
//*****************************************************************************
//
//! Values that can be passed to AES_configureModule() as the \e config
//! parameter's \e direction member.
//
//*****************************************************************************
typedef enum
{
AES_DIRECTION_DECRYPT = 0x00000000U, //!< Select Decryption Mode
AES_DIRECTION_ENCRYPT = 0x00000004U //!< Select Encryption Mode
} AES_Direction;
//*****************************************************************************
//
//! Values that can be passed to AES_configureModule() as the \e config
//! parameter's \e keySize member.
//
//*****************************************************************************
typedef enum
{
AES_KEY_SIZE_128BIT = 0x00000008U, //!< Select 128-bit key
AES_KEY_SIZE_192BIT = 0x00000010U, //!< Select 192-bit key
AES_KEY_SIZE_256BIT = 0x00000018U //!< Select 256-bit key
} AES_KeySize;
//*****************************************************************************
//
//! Values that can be passed to AES_configureModule() as the \e config
//! parameter's \e opMode member.
//
//*****************************************************************************
typedef enum
{
AES_OPMODE_ECB = 0x00000000U, //!< Select ECB mode
AES_OPMODE_CBC = 0x00000020U, //!< Select CBC mode
AES_OPMODE_CTR = 0x00000040U, //!< Select CTR mode
AES_OPMODE_ICM = 0x00000200U, //!< Select ICM mode
AES_OPMODE_CFB = 0x00000400U, //!< Select CFB mode
AES_OPMODE_XTS_TWEAKJL = 0x00000800U, //!< Select XTS TWEAKJL mode
AES_OPMODE_XTS_K2NJL = 0x00001000U, //!< Select XTS K2IJL mode
AES_OPMODE_XTS_K2NLJ0 = 0x00001800U, //!< Select XTS K2ILJ0 mode
AES_OPMODE_F8 = 0x00002000U, //!< Select F8 mode
AES_OPMODE_F9 = 0x20004000U, //!< Select F9 mode
AES_OPMODE_CBCMAC = 0x20008000U, //!< Select CBC-MAC mode
AES_OPMODE_GCM_HLY0ZERO = 0x20010000U, //!< Select GCM HLY0ZERO mode
AES_OPMODE_GCM_HLY0CALC = 0x20020040U, //!< Select GCM HLY0CALC mode
AES_OPMODE_GCM_HY0CALC = 0x20030040U, //!< Select GCM HY0CALC mode
AES_OPMODE_CCM = 0x20040040U //!< Select CCM mode
} AES_OpMode;
//*****************************************************************************
//
//! Values that can be passed to AES_configureModule() as the \e config
//! parameter's \e ctrWidth member.
//
//*****************************************************************************
typedef enum
{
AES_CTR_WIDTH_32BIT = 0x00000000U, //!< Select 32-bit counter
AES_CTR_WIDTH_64BIT = 0x00000080U, //!< Select 64-bit counter
AES_CTR_WIDTH_96BIT = 0x00000100U, //!< Select 96-bit counter
AES_CTR_WIDTH_128BIT = 0x00000180U //!< Select 128-bit counter
} AES_CounterWidth;
//*****************************************************************************
//
//! Values that can be passed to AES_configureModule() as the \e config
//! parameter's \e ccmLenWidth member.
//
//*****************************************************************************
typedef enum
{
AES_CCM_L_1 = 0x00000000U, //!< CCM Length width = 1 byte
AES_CCM_L_2 = 0x00080000U, //!< CCM Length width = 2 bytes
AES_CCM_L_4 = 0x00180000U, //!< CCM Length width = 4 bytes
AES_CCM_L_8 = 0x00380000U //!< CCM Length width = 8 bytes
} AES_CCMLenWidth;
//*****************************************************************************
//
//! Values that can be passed to AES_configureModule() as the \e config
//! parameter's \e ccmAuthLenWidth member.
//
//*****************************************************************************
typedef enum
{
AES_CCM_M_0 = 0x00000000U, //!< CCM Auth Length width at reset
AES_CCM_M_4 = 0x00400000U, //!< CCM Auth Length width = 4 bytes
AES_CCM_M_6 = 0x00800000U, //!< CCM Auth Length width = 6 bytes
AES_CCM_M_8 = 0x00C00000U, //!< CCM Auth Length width = 8 bytes
AES_CCM_M_10 = 0x01000000U, //!< CCM Auth Length width = 10 bytes
AES_CCM_M_12 = 0x01400000U, //!< CCM Auth Length width = 12 bytes
AES_CCM_M_14 = 0x01800000U, //!< CCM Auth Length width = 14 bytes
AES_CCM_M_16 = 0x01C00000U //!< CCM Auth Length width = 16 bytes
} AES_CCMAuthLenWidth;
//*****************************************************************************
//
//! Values that can be passed to AES_configureModule() as the \e config
//! parameter.
//
//*****************************************************************************
typedef struct
{
AES_Direction direction; //!< AES Direction Mode
AES_KeySize keySize; //!< AES Key Size
AES_OpMode opMode; //!< AES Mode
AES_CounterWidth ctrWidth; //!< Counter Width (for CTR Mode)
AES_CCMLenWidth ccmLenWidth; //!< Length Width (for CCM Mode)
AES_CCMAuthLenWidth ccmAuthLenWidth; //!< Auth Length Width (for CCM Mode)
} AES_ConfigParams;
//*****************************************************************************
//
// Prototypes for the APIs.
//
//*****************************************************************************
//*****************************************************************************
//
//! \internal
//! Checks the AES module base address.
//!
//! \param base is the base address of the AES instance used.
//!
//! This function determines if AES module base address is valid.
//!
//! \return Returns \b true if the base address is valid and \b false
//! otherwise.
//
//*****************************************************************************
//*****************************************************************************
//
//! \internal
//! Checks AES module wrapper base address.
//!
//! \param configBase is the base address of the used AES wrapper instance.
//!
//! This function determines if AES wrapper base address is valid.
//!
//! \return Returns \b true if the wrapper address is valid and \b false
//! otherwise.
//
//*****************************************************************************
//*****************************************************************************
//
//! Resets the AES module.
//!
//! \param base is the base address of the AES module.
//!
//! This function performs a soft-reset of the AES module.
//!
//! \return None.
//
//*****************************************************************************
static inline void
AES_performSoftReset(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Trigger the reset.
//
__byte_peripheral_32((uint32_t *)(base + 0x42U)) |= 0x2U;
//
// Wait for the reset to finish.
//
while((__byte_peripheral_32((uint32_t *)(base + 0x44U)) &
0x1U) != 0x1U)
{
}
}
//*****************************************************************************
//
//! Used to set the write crypto data length in the AES module.
//!
//! \param base is the base address of the AES module.
//! \param length is the crypto data length in bytes.
//!
//! This function stores the cryptographic data length in blocks for all modes.
//! Data lengths up to (2^61 - 1) bytes are allowed. For GCM, any value up
//! to (2^36 - 32) bytes are allowed because a 32-bit block counter is used.
//! For basic modes (ECB/CBC/CTR/ICM/CFB128), zero can be programmed into the
//! length field, indicating that the length is infinite.
//!
//! When this function is called, the engine is triggered to start using
//! this context.
//!
//! \note This length does not include the authentication-only data used in
//! some modes. Use the AES_setAuthDataLength() function to specify the
//! authentication data length.
//!
//! \return None
//
//*****************************************************************************
static inline void
AES_setDataLength(uint32_t base, uint64_t length)
{
//
// Check the arguments.
//
;
//
// Write the length register by shifting the 64-bit length.
//
__byte_peripheral_32((uint32_t *)(base + 0x2AU)) = (uint32_t)(length);
__byte_peripheral_32((uint32_t *)(base + 0x2CU)) = (uint32_t)(length >> 32U);
}
//*****************************************************************************
//
//! Sets the authentication data length in the AES module.
//!
//! \param base is the base address of the AES module.
//! \param authLength is the authentication data length in bytes.
//!
//! This function is only used to write the authentication data length in the
//! combined modes (GCM or CCM) and XTS mode. Supported AAD lengths for CCM
//! are from 0 to (2^16 - 2^8) bytes. For GCM, any value up to (2^32 - 1) can
//! be used. For XTS mode, this register is used to load j. Loading of j is
//! only required if j != 0. j represents the sequential number of the 128-bit
//! blocks inside the data unit. Consequently, j must be multiplied by 16
//! before it is passed to this function, thereby placing the block number in
//! bits [31:4] of the register.
//!
//! When this function is called, the engine is triggered to start using
//! this context for GCM and CCM.
//!
//! \return None
//
//*****************************************************************************
static inline void
AES_setAuthDataLength(uint32_t base, uint32_t authLength)
{
//
// Check the arguments.
//
;
//
// Write the length into the register.
//
__byte_peripheral_32((uint32_t *)(base + 0x2EU)) = authLength;
}
//*****************************************************************************
//
//! Enables AES core interrupts.
//!
//! \param base is the base address of the AES module.
//! \param intFlags is a bit mask of the interrupt sources to enable.
//!
//! This function enables the core interrupts in the AES module. The
//! \e intFlags parameter is the logical OR of any of the following:
//!
//! - \b AES_INT_CONTEXT_IN - Context interrupt
//! - \b AES_INT_CONTEXT_OUT - Authentication tag (and IV) interrupt
//! - \b AES_INT_DATA_IN - Data input interrupt
//! - \b AES_INT_DATA_OUT - Data output interrupt
//!
//! \note Interrupts that have been previously been enabled are not disabled
//! when this function is called.
//!
//! \sa AES_enableGlobalInterrupt() to enable global interrupt at wrapper level.
//! Global interrupt needs to be enabled along with core level interrupts to
//! enable interrupts at module level.
//!
//! \return None.
//
//*****************************************************************************
static inline void
AES_enableInterrupt(uint32_t base, uint32_t intFlags)
{
//
// Check the arguments.
//
;
;
//
// Enable the Interrupts.
//
__byte_peripheral_32((uint32_t *)(base + 0x48U)) |= (intFlags & (0x00000001U | 0x00000008U | 0x00000002U | 0x00000004U));
}
//*****************************************************************************
//
//! Disables AES core interrupts.
//!
//! \param base is the base address of the AES module.
//! \param intFlags is a bit mask of the interrupt sources to disable.
//!
//! This function disables the core interrupt sources in the AES module. The
//! \e intFlags parameter is the logical OR of any of the following:
//!
//! - \b AES_INT_CONTEXT_IN - Context interrupt
//! - \b AES_INT_CONTEXT_OUT - Authentication tag (and IV) interrupt
//! - \b AES_INT_DATA_IN - Data input interrupt
//! - \b AES_INT_DATA_OUT - Data output interrupt
//!
//! \sa AES_disableGlobalInterrupt() to disable global interrupt at wrapper
//! level.
//!
//! \return None.
//
//*****************************************************************************
static inline void
AES_disableInterrupt(uint32_t base, uint32_t intFlags)
{
//
// Check the arguments.
//
;
;
//
// Disable the Interrupts.
//
__byte_peripheral_32((uint32_t *)(base + 0x48U)) &= ~(intFlags & (0x00000001U | 0x00000008U | 0x00000002U | 0x00000004U));
}
//*****************************************************************************
//
//! Enables AES module global interrupt.
//!
//! \param wrapperBase is the base address of the AES module wrapper.
//!
//! This function enables the global interrupt in the AES module at wrappper
//! level.
//!
//! \note Global interrupts needs to be enabled along with individual AES
//! core interrupts like AES_INT_CONTEXT_IN, AES_INT_CONTEXT_OUT,
//! AES_INT_DATA_IN and AES_INT_DATA_OUT.
//!
//! \return None.
//
//*****************************************************************************
static inline void
AES_enableGlobalInterrupt(uint32_t wrapperBase)
{
//
// Check the arguments.
//
;
//
// Enable the AES global interrupt at wrapper level.
//
__byte_peripheral_32((uint32_t *)(wrapperBase + 0x2U)) |=
0x1U;
}
//*****************************************************************************
//
//! Disables AES module global interrupt.
//!
//! \param wrapperBase is the base address of the AES module wrapper.
//!
//! This function disables the global interrupt in the AES module at wrapper
//! level.
//!
//! \note Global interrupts needs to be enabled along with individual AES
//! interrupts like AES_INT_CONTEXT_IN, AES_INT_CONTEXT_OUT, AES_INT_DATA_IN,
//! and AES_INT_DATA_OUT.
//!
//! \return None.
//
//*****************************************************************************
static inline void
AES_disableGlobalInterrupt(uint32_t wrapperBase)
{
//
// Check the arguments.
//
;
//
// Disable the AES global interrupt at wrapper level.
//
__byte_peripheral_32((uint32_t *)(wrapperBase + 0x2U)) &=
~0x1U;
}
//*****************************************************************************
//
//! Clears AES module global interrupt flag.
//!
//! \param wrapperBase is the base address of the AES module wrapper.
//!
//! This function clears the global interrupt flag in the AES module at wrapper
//! level.
//!
//! \return None.
//
//*****************************************************************************
static inline void
AES_clearGlobalInterrupt(uint32_t wrapperBase)
{
//
// Check the arguments.
//
;
//
// Clear the AES global interrupt flag at wrapper level.
//
__byte_peripheral_32((uint32_t *)(wrapperBase + 0x4U)) |=
0x1U;
}
//*****************************************************************************
//
//! Returns the AES module global interrupt status.
//!
//! \param wrapperBase is the base address of the AES module wrapper.
//!
//! This function returns the AES global interrupt status flag at wrapper level.
//!
//! \return Returns the global interrupt status.
//! - \b true - Global interrupt is flagged
//! - \b false - Global interrupt is not flagged
//
//*****************************************************************************
static inline _Bool
AES_getGlobalInterruptStatus(uint32_t wrapperBase)
{
//
// Check the arguments.
//
;
//
// Return the AES wrapper level global interrupt status.
//
return((__byte_peripheral_32((uint32_t *)(wrapperBase + 0x2U)) &
0x1U) == 0x1U);
}
//*****************************************************************************
//
//! Registers an interrupt handler for the AES module.
//!
//! \param base is the base address of AES peripheral.
//! \param fnHandler is a pointer to the function to be called when the
//! enabled AES interrupts occur.
//!
//! This function registers the interrupt handler in the interrupt vector
//! table, and enables AES interrupts on the interrupt controller; specific AES
//! interrupt sources must be enabled using AES_enableInterrupt(). The interrupt
//! handler being registered must clear the source of the interrupt using
//! AES_clearInterruptStatus().
//!
//! If the application is using a static interrupt vector table stored in
//! flash, then it is not necessary to register the interrupt handler this way.
//! Instead, Interrupt_enable() is used to enable AES interrupts on the
//! interrupt controller.
//!
//! The \e base parameter can take following value: AESA_BASE
//!
//! \sa Interrupt_registerHandler() for important information about registering
//! interrupt handlers.
//!
//! \return None.
//
//*****************************************************************************
static inline void
AES_registerInterrupt(uint32_t base, void (*fnHandler)(void))
{
//
// Register the interrupt handler.
//
;
Interrupt_register(0x00DC0C0DU, fnHandler);
//
// Enable the interrupt
//
Interrupt_enable(0x00DC0C0DU);
}
//*****************************************************************************
//
//! Unregisters an interrupt handler for the AES module.
//!
//! \param intNum is the interrupt number for AES interrupt.
//!
//! This function unregisters the previously registered interrupt handler and
//! disables the interrupt in the interrupt controller.
//!
//! The \e intNum parameter can take following value: AES_INT
//!
//! \sa Interrupt_registerHandler() for important information about registering
//! interrupt handlers.
//!
//! \return None.
//
//*****************************************************************************
static inline void
AES_unregisterInterrupt(uint32_t intNum)
{
//
// Disable the interrupt.
//
Interrupt_disable(intNum);
//
// Unregister the interrupt handler.
//
Interrupt_unregister(intNum);
}
//*****************************************************************************
//
//! Enables uDMA requests for the AES module.
//!
//! \param base is the base address of the AES module.
//! \param reqFlags is a bit mask of the uDMA requests to be enabled.
//!
//! This function enables the uDMA request sources in the AES module.
//! The \e reqFlags parameter is the logical OR of any of the following:
//!
//! - \b AES_DMA_EN_DATA_IN
//! - \b AES_DMA_EN_DATA_OUT
//! - \b AES_DMA_EN_CONTEXT_IN
//! - \b AES_DMA_EN_CONTEXT_OUT
//!
//! \return None.
//
//*****************************************************************************
static inline void
AES_enableDMARequest(uint32_t base, uint32_t reqFlags)
{
//
// Check the arguments.
//
;
;
//
// Enable DMA requests.
//
__byte_peripheral_32((uint32_t *)(base + 0x42U)) |= reqFlags;
}
//*****************************************************************************
//
//! Disables uDMA requests for the AES module.
//!
//! \param base is the base address of the AES module.
//! \param reqFlags is a bit mask of the uDMA requests to be disabled.
//!
//! This function disables the uDMA request sources in the AES module.
//! The \e reqFlags parameter is the logical OR of any of the
//! following:
//!
//! - \b AES_DMA_EN_DATA_IN
//! - \b AES_DMA_EN_DATA_OUT
//! - \b AES_DMA_EN_CONTEXT_IN
//! - \b AES_DMA_EN_CONTEXT_OUT
//!
//! \return None.
//
//*****************************************************************************
static inline void
AES_disableDMARequest(uint32_t base, uint32_t reqFlags)
{
//
// Check the arguments.
//
;
;
//
// Disable DMA requests.
//
__byte_peripheral_32((uint32_t *)(base + 0x42U)) &= ~reqFlags;
}
//*****************************************************************************
//
//! Configures the AES module.
//!
//! \param base is the base address of the AES module.
//! \param config is the configuration of the AES module.
//!
//! This function configures the AES module based on the specified parameters.
//! It does not change any DMA- or interrupt-related parameters.
//!
//! The config parameter is a structure with members specifying valid AES mode
//! configurations.
//!
//! The direction of the operation is specified with following enum members:
//!
//! - \b AES_DIRECTION_ENCRYPT - Encryption mode
//! - \b AES_DIRECTION_DECRYPT - Decryption mode
//!
//! The key size is specified with following enum members:
//!
//! - \b AES_KEY_SIZE_128BIT - Key size of 128 bits
//! - \b AES_KEY_SIZE_192BIT - Key size of 192 bits
//! - \b AES_KEY_SIZE_256BIT - Key size of 256 bits
//!
//! The mode of operation is specified with following enum members:
//!
//! - \b AES_OPMODE_ECB - Electronic codebook mode
//! - \b AES_OPMODE_CBC - Cipher-block chaining mode
//! - \b AES_OPMODE_CFB - Cipher feedback mode
//! - \b AES_OPMODE_CTR - Counter mode
//! - \b AES_OPMODE_ICM - Integer counter mode
//! - \b AES_OPMODE_XTS_TWEAKJL - XEX-based tweaked-codebook mode with
//! ciphertext stealing with previous/intermediate tweak value and j loaded
//! - \b AES_OPMODE_XTS_K2IJL - XEX-based tweaked-codebook mode with
//! ciphertext stealing with key2, i and j loaded
//! - \b AES_OPMODE_XTS_K2ILJ0 - XEX-based tweaked-codebook mode with
//! ciphertext stealing with key2 and i loaded, j = 0
//! - \b AES_OPMODE_F8 - F8 mode
//! - \b AES_OPMODE_F9 - F9 mode
//! - \b AES_OPMODE_CBCMAC - Cipher block chaining message authentication
//! code mode
//! - \b AES_OPMODE_GCM_HLY0ZERO - Galois/counter mode with GHASH with H
//! loaded, Y0-encrypted forced to zero and counter is not enabled.
//! - \b AES_OPMODE_GCM_HLY0CALC - Galois/counter mode with GHASH with H
//! loaded, Y0-encrypted calculated internally and counter is enabled.
//! - \b AES_OPMODE_GCM_HY0CALC - Galois/Counter mode with autonomous GHASH
//! (both H and Y0-encrypted calculated internally) and counter is enabled.
//! - \b AES_OPMODE_CCM - Counter with CBC-MAC mode
//!
//! The following enums are used to specify the counter width. It is only
//! required to be defined when using CTR, CCM, or GCM modes, only one of the
//! following defines must be used to specify the counter width length:
//!
//! - \b AES_CTR_WIDTH_32BIT - Counter is 32 bits
//! - \b AES_CTR_WIDTH_64BIT - Counter is 64 bits
//! - \b AES_CTR_WIDTH_96BIT - Counter is 96 bits
//! - \b AES_CTR_WIDTH_128BIT - Counter is 128 bits
//!
//! Only one of the following defines must be used to specify the length field
//! for CCM operations (L):
//!
//! - \b AES_CCM_L_1 - 1 byte
//! - \b AES_CCM_L_2 - 2 bytes
//! - \b AES_CCM_L_4 - 4 bytes
//! - \b AES_CCM_L_8 - 8 bytes
//!
//! Only one of the following enum members must be used to specify the length
//! of authentication field for CCM operations (M) through the \e config
//! argument member in the AES_configureModule() function:
//!
//! - \b AES_CCM_M_0 - reset value
//! - \b AES_CCM_M_4 - 4 bytes
//! - \b AES_CCM_M_6 - 6 bytes
//! - \b AES_CCM_M_8 - 8 bytes
//! - \b AES_CCM_M_10 - 10 bytes
//! - \b AES_CCM_M_12 - 12 bytes
//! - \b AES_CCM_M_14 - 14 bytes
//! - \b AES_CCM_M_16 - 16 bytes
//!
//! \note When performing a basic GHASH operation for used with GCM mode, use
//! the \b AES_OPMODE_GCM_HLY0ZERO and do not specify a direction.
//!
//! \return None.
//
//*****************************************************************************
extern void
AES_configureModule(uint32_t base, const AES_ConfigParams *config);
//*****************************************************************************
//
//! Writes the key 1 configuration registers, which are used for encryption or
//! decryption.
//!
//! \param base is the base address for the AES module.
//! \param key is an array of 32-bit words, containing the key to be
//! configured. The least significant word is at the 0th index. The key array
//! data values are expected to be in big-endian format.
//! \param keySize is the size of the key, which must be one of the
//! following enum values: \b AES_KEY_SIZE_128BIT, \b AES_KEY_SIZE_192BIT, or
//! \b AES_KEY_SIZE_256BIT.
//!
//! This function writes key 1 configuration registers based on the key
//! size. This function is used in all modes.
//!
//! \return None.
//
//*****************************************************************************
extern void
AES_setKey1(uint32_t base, const uint32_t key[], AES_KeySize keySize);
//*****************************************************************************
//
//! Writes the key 2 configuration registers, which are used for encryption or
//! decryption.
//!
//! \param base is the base address for the AES module.
//! \param key is an array of 32-bit words, containing the key to be
//! configured. The least significant word in the 0th index. The key array
//! data values are expected to be in big-endian format.
//! \param keySize is the size of the key, which must be one of the
//! following enum values: \b AES_KEY_SIZE_128BIT, \b AES_KEY_SIZE_192BIT, or
//! \b AES_KEY_SIZE_256BIT.
//!
//! This function writes the key 2 configuration registers based on the key
//! size. This function is used in the F8, F9, XTS, CCM, and CBC-MAC modes.
//!
//! \return None.
//
//*****************************************************************************
extern void
AES_setKey2(uint32_t base, const uint32_t key[], AES_KeySize keySize);
//*****************************************************************************
//
//! Writes key 3 configuration registers, which are used for encryption or
//! decryption.
//!
//! \param base is the base address for the AES module.
//! \param key is a pointer to an array of 4 words (128 bits), containing
//! the key to be configured. The least significant word is in the 0th index.
//! The key array data values are expected to be in big-endian format.
//!
//! This function writes the key 2 configuration registers with key 3 data
//! used in CBC-MAC and F8 modes. This key is always 128 bits.
//!
//! \return None.
//
//*****************************************************************************
extern void
AES_setKey3(uint32_t base, const uint32_t key[]);
//*****************************************************************************
//
//! Writes the Initial Vector (IV) register, needed in some of the AES Modes.
//!
//! \param base is the base address of the AES module.
//! \param iniVector is an array of 4 words (128 bits), containing the IV
//! value to be configured. The least significant word is in the 0th index.
//! The IV array data values are expected to be in big-endian format.
//!
//! This function writes the initial vector registers in the AES module.
//!
//! \return None.
//
//*****************************************************************************
extern void
AES_setInitializationVector(uint32_t base, const uint32_t iniVector[]);
//*****************************************************************************
//
//! Saves the Initial Vector (IV) registers to a user-defined location.
//!
//! \param base is the base address of the AES module.
//! \param iniVector is pointer to the location that stores the IV data. The
//! least significant word is in the 0th index. The IV data values are
//! expected to be in big-endian format.
//!
//! This function stores the IV for use in authenticated encryption and
//! decryption operations. It is assumed that the AES_CTRL_SAVE_CONTEXT
//! bit is set in the AES_CTRL register.
//!
//! \return None.
//
//*****************************************************************************
extern void
AES_readInitializationVector(uint32_t base, uint32_t iniVector[]);
//*****************************************************************************
//
//! Saves the tag registers to a user-defined location.
//!
//! \param base is the base address of the AES module.
//! \param tagData is pointer to the location that stores the tag data. The
//! least significant word is in the 0th index. The tag array data values are
//! expected to be in big-endian format.
//!
//! This function stores the tag data for use in authenticated encryption and
//! decryption operations. It is assumed that the AES_CTRL_SAVE_CONTEXT
//! bit is set in the AES_CTRL register.
//!
//! \return None.
//
//*****************************************************************************
extern void
AES_readTag(uint32_t base, uint32_t tagData[]);
//*****************************************************************************
//
//! Reads plaintext/ciphertext from data registers without blocking.
//!
//! \param base is the base address of the AES module.
//! \param destArray is a pointer to an array of words of data. The least
//! significant word is in the 0th index. The read data values are expected to
//! be in big-endian format.
//!
//! This function reads a block of either plaintext or ciphertext out of the
//! AES module. If the output data is not ready, the function returns
//! false. If the read completed successfully, the function returns true.
//! A block is 16 bytes or 4 words.
//!
//! \return Returns true or false.
//
//*****************************************************************************
extern _Bool
AES_readDataNonBlocking(uint32_t base, uint32_t destArray[]);
//*****************************************************************************
//
//! Reads plaintext/ciphertext from data registers with blocking.
//!
//! \param base is the base address of the AES module.
//! \param destArray is a pointer to an array of words. The least significant
//! word is in the 0th index. The read data values are expected to
//! be in big-endian format.
//!
//! This function reads a block of either plaintext or ciphertext out of the
//! AES module. If the output is not ready, the function waits until it is
//! ready. A block is 16 bytes or 4 words.
//!
//! \return None.
//
//*****************************************************************************
extern void
AES_readDataBlocking(uint32_t base, uint32_t destArray[]);
//*****************************************************************************
//
//! Writes plaintext/ciphertext to data registers without blocking.
//!
//! \param base is the base address of the AES module.
//! \param srcArray is a pointer to an array of words of data. The least
//! significant word is in the 0th index. The input data values are expected to
//! be in big-endian format.
//!
//! This function writes a block of either plaintext or ciphertext into the
//! AES module. If the input is not ready, the function returns false. If the
//! write completed successfully, the function returns true. A block is 16
//! bytes or 4 words.
//!
//! \return True or false.
//
//*****************************************************************************
extern _Bool
AES_writeDataNonBlocking(uint32_t base, const uint32_t srcArray[]);
//*****************************************************************************
//
//! Writes plaintext/ciphertext to data registers with blocking.
//!
//! \param base is the base address of the AES module.
//! \param srcArray is a pointer to an array of bytes. The least significant
//! word is in the 0th index. The input data values are expected to
//! be in big-endian format.
//!
//! This function writes a block of either plaintext or ciphertext into the
//! AES module. If the input is not ready, the function waits until it is
//! ready before performing the write. A block is 16 bytes or 4 words.
//!
//! \return None.
//
//*****************************************************************************
extern void
AES_writeDataBlocking(uint32_t base, const uint32_t srcArray[]);
//*****************************************************************************
//
//! Used to process(transform) blocks of data, either encrypt or decrypt it.
//!
//! \param base is the base address of the AES module.
//! \param srcArray is a pointer to the memory location where the input data
//! is stored. The data must be padded to the 16-byte boundary. The input data
//! values are expected to be in big-endian format.
//! \param destArray is a pointer to the memory location output is written.
//! The space for written data must be rounded up to the 16-byte boundary. The
//! output data values are expected to be in big-endian format.
//! \param dataLength is the length of the cryptographic data in bytes.
//!
//! This function iterates the encryption or decryption mechanism number over
//! the data length. Before calling this function, ensure that the AES
//! module is properly configured the key, data size, mode, and so on. Only
//! ECB, CBC, CTR, ICM, CFB, XTS and F8 operating modes should be used. The
//! data is processed in 4-word (16-byte) blocks.
//!
//! \return Returns true if data was processed successfully. Returns false
//! if data processing failed.
//
//*****************************************************************************
extern _Bool
AES_processData(uint32_t base, const uint32_t srcArray[], uint32_t destArray[],
uint64_t dataLength);
//*****************************************************************************
//
//! Used to authenticate blocks of data by generating a hash tag.
//!
//! \param base is the base address of the AES module.
//! \param srcArray is a pointer to the memory location where the input data
//! is stored. The data must be padded to the 16-byte boundary. The input data
//! values are expected to be in big-endian format.
//! \param dataLength is the length of the cryptographic data in bytes.
//! \param tagArray is a pointer to a 4-word array where the hash tag is
//! written. The output data values are to be expected in big-endian format.
//!
//! This function processes data to produce a hash tag that can be used tor
//! authentication. Before calling this function, ensure that the AES
//! module is properly configured the key, data size, mode, and so on. Only
//! CBC-MAC and F9 modes should be used.
//!
//! \return Returns true if data was processed successfully. Returns false
//! if data processing failed.
//
//*****************************************************************************
extern _Bool
AES_authenticateData(uint32_t base, const uint32_t srcArray[],
uint64_t dataLength, uint32_t tagArray[]);
//*****************************************************************************
//
//! Processes and authenticates blocks of data, either encrypts it or decrypts
//! it.
//!
//! \param base is the base address of the AES module.
//! \param srcArray is a pointer to the memory location where the input data
//! is stored. The data must be padded to the 16-byte boundary. The input data
//! values are expected to be in big-endian format.
//! \param destArray is a pointer to the memory location where the output is
//! written. The space for written data must be rounded up to the 16-byte
//! boundary. The output data values are to be expected in big-endian format.
//! \param dataLength is the length of the cryptographic data in bytes.
//! \param authDataArray is a pointer to the memory location where the
//! additional authentication data is stored. The data must be padded to the
//! 16-byte boundary. The output data values are to be expected in big-endian
//! format.
//! \param authDataLength is the length of the additional authentication
//! data in bytes.
//! \param tagArray is a pointer to a 4-word array where the hash tag is
//! written. The output data values are to be expected in big-endian format.
//!
//! This function encrypts or decrypts blocks of data in addition to
//! authentication data. A hash tag is also produced. Before calling this
//! function, ensure that the AES module is properly configured the key,
//! data size, mode, and so on. Only CCM and GCM modes should be used.
//!
//! \return Returns true if data was processed successfully. Returns false
//! if data processing failed.
//
//*****************************************************************************
extern _Bool
AES_processDatainAuthMode(uint32_t base, const uint32_t srcArray[],
uint32_t destArray[], uint64_t dataLength,
const uint32_t authDataArray[],
uint32_t authDataLength, uint32_t tagArray[]);
//*****************************************************************************
//
//! Returns the current AES module core interrupt status.
//!
//! \param base is the base address of the AES module.
//! \param intMask is \b false if the raw interrupt status is required and
//! \b true if the masked interrupt status is required.
//!
//! \return Returns a bit mask of the core interrupt sources, which is a logical
//! OR of any of the following:
//!
//! - \b AES_INT_CONTEXT_IN - Context interrupt
//! - \b AES_INT_CONTEXT_OUT - Authentication tag (and IV) interrupt.
//! - \b AES_INT_DATA_IN - Data input interrupt
//! - \b AES_INT_DATA_OUT - Data output interrupt
//
//*****************************************************************************
extern uint32_t
AES_getInterruptStatus(uint32_t base, _Bool intMask);
//*****************************************************************************
//
// Close the Doxygen group.
//! @}
//
//*****************************************************************************
//*****************************************************************************
//
// Mark the end of the C bindings section for C++ compilers.
//
//*****************************************************************************
//###########################################################################
//
// FILE: asysctl.h
//
// TITLE: C28x driver for Analog System Control.
//
//###########################################################################
// $Copyright:
// Copyright (C) 2023 Texas Instruments Incorporated - http://www.ti.com/
//
// 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 Texas Instruments Incorporated 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
// OWNER 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.
// $
//###########################################################################
//*****************************************************************************
//
// If building with a C++ compiler, make all of the definitions in this header
// have a C binding.
//
//*****************************************************************************
//*****************************************************************************
//
//! \addtogroup asysctl_api ASysCtl
//! @{
//
//*****************************************************************************
//*****************************************************************************
//
// Defines used for setting AnalogReference functions.
// ASysCtl_setAnalogReferenceInternal()
// ASysCtl_setAnalogReferenceExternal()
// ASysCtl_setAnalogReference2P5()
// ASysCtl_setAnalogReference1P65()
//
//*****************************************************************************
//*****************************************************************************
//
// Values used for function ASysCtl_selectCMPHNMux() and
// ASysCtl_selectCMPHNMuxValue(). These values can be OR-ed together and
// passed to ASysCtl_selectCMPHNMux().
//
//*****************************************************************************
//*****************************************************************************
//
// Values used for function ASysCtl_selectCMPLNMux() and
// ASysCtl_selectCMPLNMuxValue(). These values can be OR-ed together and
// passed to ASysCtl_selectCMPLNMux().
//
//*****************************************************************************
//*****************************************************************************
//
//! ASysCtl_CMPHPMuxSelect used for function ASysCtl_selectCMPHPMux().
//
//*****************************************************************************
typedef enum
{
ASYSCTL_CMPHPMUX_SELECT_1 = 0U, //!< CMPHPMUX select 1
ASYSCTL_CMPHPMUX_SELECT_2 = 3U, //!< CMPHPMUX select 2
ASYSCTL_CMPHPMUX_SELECT_3 = 6U, //!< CMPHPMUX select 3
ASYSCTL_CMPHPMUX_SELECT_4 = 9U //!< CMPHPMUX select 4
} ASysCtl_CMPHPMuxSelect;
//*****************************************************************************
//
//! ASysCtl_CMPLPMuxSelect used for function ASysCtl_selectCMPLPMux().
//
//*****************************************************************************
typedef enum
{
ASYSCTL_CMPLPMUX_SELECT_1 = 0U, //!< CMPLPMUX select 1
ASYSCTL_CMPLPMUX_SELECT_2 = 3U, //!< CMPLPMUX select 2
ASYSCTL_CMPLPMUX_SELECT_3 = 6U, //!< CMPLPMUX select 3
ASYSCTL_CMPLPMUX_SELECT_4 = 9U //!< CMPLPMUX select 4
} ASysCtl_CMPLPMuxSelect;
//*****************************************************************************
//
// Prototypes for the APIs.
//
//*****************************************************************************
//*****************************************************************************
//
//! Enable temperature sensor.
//!
//! This function enables the temperature sensor output to the ADC.
//!
//! \return None.
//
//*****************************************************************************
static inline void
ASysCtl_enableTemperatureSensor(void)
{
__eallow();
//
// Set the temperature sensor enable bit.
//
(*((volatile uint16_t *)(0x0005D700U + 0x60U))) |= 0x1U;
__edis();
}
//*****************************************************************************
//
//! Disable temperature sensor.
//!
//! This function disables the temperature sensor output to the ADC.
//!
//! \return None.
//
//*****************************************************************************
static inline void
ASysCtl_disableTemperatureSensor(void)
{
__eallow();
//
// Clear the temperature sensor enable bit.
//
(*((volatile uint16_t *)(0x0005D700U + 0x60U))) &= ~(0x1U);
__edis();
}
//*****************************************************************************
//
//! Set the analog voltage reference selection to internal.
//!
//! \param reference is the analog reference.
//!
//! The parameter \e reference can be a combination of the following values:
//!
//! - \b ASYSCTL_VREFHI
//!
//! \return None.
//
//*****************************************************************************
static inline void
ASysCtl_setAnalogReferenceInternal(uint16_t reference)
{
;
__eallow();
//
// Write selection to the Analog Internal Reference Select bit.
//
(*((volatile uint16_t *)(0x0005D700U + 0x68U))) &= ~reference;
__edis();
}
//*****************************************************************************
//
//! Set the analog voltage reference selection to external.
//!
//! \param reference is the analog reference.
//!
//! The parameter \e reference can be a combination of the following values:
//!
//! - \b ASYSCTL_VREFHI
//!
//! \return None.
//
//*****************************************************************************
static inline void
ASysCtl_setAnalogReferenceExternal(uint16_t reference)
{
;
__eallow();
//
// Write selection to the Analog External Reference Select bit.
//
(*((volatile uint16_t *)(0x0005D700U + 0x68U))) |= reference;
__edis();
}
//*****************************************************************************
//
//! Set the internal analog voltage reference selection to 2.5V.
//!
//! \param reference is the analog reference.
//!
//! The parameter \e reference can be a combination of the following values:
//!
//! - \b ASYSCTL_VREFHI
//!
//! \return None.
//
//*****************************************************************************
static inline void ASysCtl_setAnalogReference2P5(uint16_t reference)
{
;
__eallow();
//
// Write selection to the Analog Voltage Reference Select bit.
//
(*((volatile uint16_t *)(0x0005D700U + 0x68U))) |= (reference << 8U);
__edis();
}
//*****************************************************************************
//
//! Set the internal analog voltage reference selection to 1.65V.
//!
//! \param reference is the analog reference.
//!
//! The parameter \e reference can be a combination of the following values:
//!
//! - \b ASYSCTL_VREFHI
//!
//! \return None.
//
//*****************************************************************************
static inline void ASysCtl_setAnalogReference1P65(uint16_t reference)
{
;
__eallow();
//
// Write selection to the Analog Voltage Reference Select bit.
//
(*((volatile uint16_t *)(0x0005D700U + 0x68U))) &= ~(reference << 8U);
__edis();
}
//*****************************************************************************
//
//! Select the value for CMPHNMXSEL.
//!
//! \param select is a combination of CMPHNMXSEL values.
//!
//! The parameter \e select can be a bitwise OR of the below values:
//!
//! - \b ASYSCTL_CMPHNMUX_SELECT_1
//! - \b ASYSCTL_CMPHNMUX_SELECT_2
//! - \b ASYSCTL_CMPHNMUX_SELECT_3
//! - \b ASYSCTL_CMPHNMUX_SELECT_4
//!
//! \return None.
//
//*****************************************************************************
static inline void ASysCtl_selectCMPHNMux(uint16_t select)
{
;
__eallow();
//
// Write a select to the mux select bit.
//
(*((volatile uint16_t *)(0x0005D700U + 0x86U))) = select;
__edis();
}
//*****************************************************************************
//
//! Select the value for individual CMPxHNMXSEL.
//!
//! \param select is the CMPxHNMXSEL to be set.
//! \param value is 0 or 1.
//!
//! The parameter \e select can be one of the below values:
//!
//! - \b ASYSCTL_CMPHNMUX_SELECT_1
//! - \b ASYSCTL_CMPHNMUX_SELECT_2
//! - \b ASYSCTL_CMPHNMUX_SELECT_3
//! - \b ASYSCTL_CMPHNMUX_SELECT_4
//!
//! \return None.
//
//*****************************************************************************
static inline void ASysCtl_selectCMPHNMuxValue(uint16_t select, uint16_t value)
{
;
;
__eallow();
//
// Write a select to the mux select bit.
//
if(value == 0U)
{
(*((volatile uint16_t *)(0x0005D700U + 0x86U))) &= ~select;
}
else if(value == 1U)
{
(*((volatile uint16_t *)(0x0005D700U + 0x86U))) |= select;
}
else
{
//Do nothing. Not a valid value
}
__edis();
}
//*****************************************************************************
//
//! Select the value for individual CMPxLNMXSEL.
//!
//! \param select is a combination of CMPLNMXSEL values.
//!
//! The parameter \e select can be the bitwise OR of the below values:
//!
//! - \b ASYSCTL_CMPLNMUX_SELECT_1
//! - \b ASYSCTL_CMPLNMUX_SELECT_2
//! - \b ASYSCTL_CMPLNMUX_SELECT_3
//! - \b ASYSCTL_CMPLNMUX_SELECT_4
//!
//! \return None.
//
//*****************************************************************************
static inline void ASysCtl_selectCMPLNMux(uint16_t select)
{
;
__eallow();
//
// Write a select to the mux select bit.
//
(*((volatile uint16_t *)(0x0005D700U + 0x87U))) = select;
__edis();
}
//*****************************************************************************
//
//! Select the value for CMPLNMXSEL.
//!
//! \param select is the CMPxHNMXSEL to be set.
//! \param value is 0 or 1.
//!
//! The parameter \e select can be one of the below values:
//!
//! - \b ASYSCTL_CMPLNMUX_SELECT_1
//! - \b ASYSCTL_CMPLNMUX_SELECT_2
//! - \b ASYSCTL_CMPLNMUX_SELECT_3
//! - \b ASYSCTL_CMPLNMUX_SELECT_4
//!
//! \return None.
//
//*****************************************************************************
static inline void ASysCtl_selectCMPLNMuxValue(uint16_t select, uint16_t value)
{
;
;
__eallow();
//
// Write a select to the mux select bit.
//
if(value == 0U)
{
(*((volatile uint16_t *)(0x0005D700U + 0x87U))) &= ~select;
}
else if(value == 1U)
{
(*((volatile uint16_t *)(0x0005D700U + 0x87U))) |= select;
}
else
{
//Do nothing. Not a valid value
}
__edis();
}
//*****************************************************************************
//
//! Select the value for CMPHPMXSEL.
//!
//! \param select is of type ASysCtl_CMPHPMuxSelect.
//! \param value is 0, 1, 2, 3, 4 or 5.
//!
//! This function is used to write a value to one mux select at a time.
//! The parameter \e select can be one of the following values:
//!
//! - \b ASYSCTL_CMPHPMUX_SELECT_1
//! - \b ASYSCTL_CMPHPMUX_SELECT_2
//! - \b ASYSCTL_CMPHPMUX_SELECT_3
//! - \b ASYSCTL_CMPHPMUX_SELECT_4
//!
//! \return None.
//
//*****************************************************************************
static inline void
ASysCtl_selectCMPHPMux(ASysCtl_CMPHPMuxSelect select, uint32_t value)
{
;
__eallow();
//
// Set the value for the appropriate Mux Select.
//
(*((volatile uint32_t *)(0x0005D700U + 0x82U))) =
((*((volatile uint32_t *)(0x0005D700U + 0x82U))) &
~((uint32_t)0x7U << (uint32_t)select)) |
(value << (uint32_t)select);
__edis();
}
//*****************************************************************************
//
//! Select the value for CMPLPMXSEL.
//!
//! \param select is of type ASysCtl_CMPLPMuxSelect.
//! \param value is 0, 1, 2, 3, 4 or 5.
//!
//! This function is used to write a value to one mux select at a time.
//! The parameter \e select can be one of the following values:
//!
//! - \b ASYSCTL_CMPLPMUX_SELECT_1
//! - \b ASYSCTL_CMPLPMUX_SELECT_2
//! - \b ASYSCTL_CMPLPMUX_SELECT_3
//! - \b ASYSCTL_CMPLPMUX_SELECT_4
//!
//! \return None.
//
//*****************************************************************************
static inline void
ASysCtl_selectCMPLPMux(ASysCtl_CMPLPMuxSelect select, uint32_t value)
{
;
__eallow();
//
// Set the value for the appropriate Mux Select.
//
(*((volatile uint32_t *)(0x0005D700U + 0x84U))) =
((*((volatile uint32_t *)(0x0005D700U + 0x84U))) &
~((uint32_t)0x7U << (uint32_t)select)) |
(value << (uint32_t)select);
__edis();
}
//*****************************************************************************
//
//! Locks the temperature sensor control register.
//!
//! \return None.
//
//*****************************************************************************
static inline void ASysCtl_lockTemperatureSensor(void)
{
__eallow();
//
// Write a 1 to the lock bit in the LOCK register.
//
(*((volatile uint16_t *)(0x0005D700U + 0x8EU))) |= 0x1U;
__edis();
}
//*****************************************************************************
//
//! Locks the analog reference control register.
//!
//! \return None.
//
//*****************************************************************************
static inline void ASysCtl_lockANAREF(void)
{
__eallow();
//
// Write a 1 to the lock bit in the LOCK register.
//
(*((volatile uint16_t *)(0x0005D700U + 0x8EU))) |= 0x2U;
__edis();
}
//*****************************************************************************
//
//! Locks the voltage monitor control register.
//!
//! \return None.
//
//*****************************************************************************
static inline void ASysCtl_lockVMON(void)
{
__eallow();
//
// Write a 1 to the lock bit in the LOCK register.
//
(*((volatile uint16_t *)(0x0005D700U + 0x8EU))) |= 0x4U;
__edis();
}
//*****************************************************************************
//
//! Locks the CMPHPMXSEL control register.
//!
//! \return None.
//
//*****************************************************************************
static inline void ASysCtl_lockCMPHPMux(void)
{
__eallow();
//
// Write a 1 to the lock bit in the LOCK register.
//
(*((volatile uint16_t *)(0x0005D700U + 0x8EU))) |= 0x20U;
__edis();
}
//*****************************************************************************
//
//! Locks the CMPLPMXSEL control register.
//!
//! \return None.
//
//*****************************************************************************
static inline void ASysCtl_lockCMPLPMux(void)
{
__eallow();
//
// Write a 1 to the lock bit in the LOCK register.
//
(*((volatile uint16_t *)(0x0005D700U + 0x8EU))) |= 0x40U;
__edis();
}
//*****************************************************************************
//
//! Locks the CMPHNMXSEL control register.
//!
//! \return None.
//
//*****************************************************************************
static inline void ASysCtl_lockCMPHNMux(void)
{
__eallow();
//
// Write a 1 to the lock bit in the LOCK register.
//
(*((volatile uint16_t *)(0x0005D700U + 0x8EU))) |= 0x80U;
__edis();
}
//*****************************************************************************
//
//! Locks the CMPLNMXSEL control register.
//!
//! \return None.
//
//*****************************************************************************
static inline void ASysCtl_lockCMPLNMux(void)
{
__eallow();
//
// Write a 1 to the lock bit in the LOCK register.
//
(*((volatile uint16_t *)(0x0005D700U + 0x8EU))) |= 0x100U;
__edis();
}
//*****************************************************************************
//
//! Locks the VREG control register.
//!
//! \return None.
//
//*****************************************************************************
static inline void ASysCtl_lockVREG(void)
{
__eallow();
//
// Write a 1 to the lock bit in the LOCK register.
//
(*((volatile uint16_t *)(0x0005D700U + 0x8EU))) |= 0x200U;
__edis();
}
//*****************************************************************************
//
//! Enable loopback from DAC to ADCs.
//!
//! \param config can be bitwise OR of the following values:
//! - ASYSCTL_ADCDACLOOPBACK_ENLB2ADCA
//! - ASYSCTL_ADCDACLOOPBACK_ENLB2ADCB
//! - ASYSCTL_ADCDACLOOPBACK_ENLB2ADCC
//!
//! \return None
//
//*****************************************************************************
static inline void ASysCtl_enableADCDACLoopback(uint32_t config)
{
(*((volatile uint32_t *)(0x0005D700U + 0x88U))) =
((*((volatile uint32_t *)(0x0005D700U + 0x88U))) | config) |
(0xA5A5UL << 16U);
}
//*****************************************************************************
//
//! Disable loopback from DAC to ADCs.
//!
//! \param config can be bitwise OR of the following values:
//! - ASYSCTL_ADCDACLOOPBACK_ENLB2ADCA
//! - ASYSCTL_ADCDACLOOPBACK_ENLB2ADCB
//! - ASYSCTL_ADCDACLOOPBACK_ENLB2ADCC
//!
//! \return None
//
//*****************************************************************************
static inline void ASysCtl_disableADCDACLoopback(uint32_t config)
{
(*((volatile uint32_t *)(0x0005D700U + 0x88U))) =
((*((volatile uint32_t *)(0x0005D700U + 0x88U))) & ~config) |
(0xA5A5UL << 16U);
}
//*****************************************************************************
//
// Close the Doxygen group.
//! @}
//
//*****************************************************************************
//*****************************************************************************
//
// Mark the end of the C bindings section for C++ compilers.
//
//*****************************************************************************
//###########################################################################
//
// FILE: bgcrc.h
//
// TITLE: C28x BGCRC driver.
//
//###########################################################################
// $Copyright:
// Copyright (C) 2023 Texas Instruments Incorporated - http://www.ti.com/
//
// 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 Texas Instruments Incorporated 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
// OWNER 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.
// $
//###########################################################################
//*****************************************************************************
//
// If building with a C++ compiler, make all of the definitions in this header
// have a C binding.
//
//*****************************************************************************
//*****************************************************************************
//
//! \addtogroup bgcrc_api BGCRC
//! \brief This module is used for configuring BGCRC.
//! @{
//
//*****************************************************************************
//###########################################################################
//
// FILE: hw_bgcrc.h
//
// TITLE: Definitions for the BGCRC registers.
//
//###########################################################################
// $Copyright:
// Copyright (C) 2023 Texas Instruments Incorporated - http://www.ti.com/
//
// 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 Texas Instruments Incorporated 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
// OWNER 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.
// $
//###########################################################################
//*************************************************************************************************
//
// The following are defines for the BGCRC register offsets
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the BGCRC_EN register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the BGCRC_CTRL1 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the BGCRC_CTRL2 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the BGCRC_WD_CFG register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the BGCRC_NMIFLG register
//
//*************************************************************************************************
// read.
// data read.
// BGCRC_WD_MAX
//*************************************************************************************************
//
// The following are defines for the bit fields in the BGCRC_NMICLR register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the BGCRC_NMIFRC register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the BGCRC_INTEN register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the BGCRC_INTFLG register
//
//*************************************************************************************************
// read.
// data read.
// BGCRC_WD_MAX
//*************************************************************************************************
//
// The following are defines for the bit fields in the BGCRC_INTCLR register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the BGCRC_INTFRC register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the BGCRC_LOCK register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the BGCRC_COMMIT register
//
//*************************************************************************************************
//*****************************************************************************
//
//! Values that can be passed to BGCRC_setConfig() as the \e nmiConfig
//! parameter
//
//*****************************************************************************
//! EXTSYNCOUT
SYSCTL_SYNC_OUT_SRC_EPWM2SYNCOUT = 0X1U, //!< EPWM2SYNCOUT --> EXTSYNCOUT
SYSCTL_SYNC_OUT_SRC_EPWM3SYNCOUT = 0X2U, //!< EPWM3SYNCOUT --> EXTSYNCOUT
SYSCTL_SYNC_OUT_SRC_EPWM4SYNCOUT = 0X3U, //!< EPWM4SYNCOUT --> EXTSYNCOUT
SYSCTL_SYNC_OUT_SRC_EPWM5SYNCOUT = 0X4U, //!< EPWM5SYNCOUT --> EXTSYNCOUT
SYSCTL_SYNC_OUT_SRC_EPWM6SYNCOUT = 0X5U, //!< EPWM6SYNCOUT --> EXTSYNCOUT
SYSCTL_SYNC_OUT_SRC_EPWM7SYNCOUT = 0X6U, //!< EPWM7SYNCOUT --> EXTSYNCOUT
SYSCTL_SYNC_OUT_SRC_ECAP1SYNCOUT = 0x18, //!< ECAP1SYNCOUT --> EXTSYNCOUT
SYSCTL_SYNC_OUT_SRC_ECAP2SYNCOUT = 0x19, //!< ECAP2SYNCOUT --> EXTSYNCOUT
SYSCTL_SYNC_OUT_SRC_ECAP3SYNCOUT = 0x20, //!< ECAP3SYNCOUT --> EXTSYNCOUT
} SysCtl_SyncOutputSource;
//*****************************************************************************
//
//! The following values define the \e parametric parameter for
//! SysCtl_getDeviceParametric().
//
//*****************************************************************************
typedef enum
{
SYSCTL_DEVICE_QUAL, //!< Device Qualification Status
SYSCTL_DEVICE_PINCOUNT, //!< Device Pin Count
SYSCTL_DEVICE_INSTASPIN, //!< Device InstaSPIN Feature Set
SYSCTL_DEVICE_FLASH, //!< Device Flash size (KB)
SYSCTL_DEVICE_FAMILY, //!< Device Family
SYSCTL_DEVICE_PARTNO, //!< Device Part Number
SYSCTL_DEVICE_CLASSID //!< Device Class ID
} SysCtl_DeviceParametric;
//*****************************************************************************
//
//! The following are values that can be passed to SysCtl_configureType()
//! as the \e peripheral parameter.
//
//*****************************************************************************
typedef enum
{
//! Configure ECAP Type :
//! - Type 0 : No EALLOW protection for ECAP registers
//! - Type 1 : ECAP registers are EALLOW protected
SYSCTL_ECAPTYPE = 0x1,
//! Configure SDFM Type :
//! - Type 0 : Data Ready conditions combined with the fault conditions
//! on the interrupt line.
//! Data ready interrupts from individual filters are not
//! generated.
//! - Type 1 : Data Ready conditions do not generate the SDFMINT.
//! Each filter generates a separate data ready interrupts.
SYSCTL_SDFMTYPE = 0x2,
}SysCtl_SelType;
//*****************************************************************************
//
//! The following are values that can be passed to
//! SysCtl_setXClk() as \e divider parameter.
//
//*****************************************************************************
typedef enum
{
SYSCTL_XCLKOUT_DIV_1 = 0, //!< XCLKOUT = XCLKOUT / 1
SYSCTL_XCLKOUT_DIV_2 = 1, //!< XCLKOUT = XCLKOUT / 2
SYSCTL_XCLKOUT_DIV_4 = 2, //!< XCLKOUT = XCLKOUT / 4
SYSCTL_XCLKOUT_DIV_8 = 3 //!< XCLKOUT = XCLKOUT / 8
}SysCtl_XClkDivider;
//*****************************************************************************
//
//! The following are values that can be passed to
//! SysCtl_setMCANClk() as \e divider parameter.
//
//*****************************************************************************
typedef enum
{
SYSCTL_MCANCLK_DIV_1 = 0x0, //!< MCAN clock = MCAN clock / 1
SYSCTL_MCANCLK_DIV_2 = 0x1, //!< MCAN clock = MCAN clock / 2
SYSCTL_MCANCLK_DIV_3 = 0x2, //!< MCAN clock = MCAN clock / 3
SYSCTL_MCANCLK_DIV_4 = 0x3, //!< MCAN clock = MCAN clock / 4
SYSCTL_MCANCLK_DIV_5 = 0x4, //!< MCAN clock = MCAN clock / 5
SYSCTL_MCANCLK_DIV_6 = 0x5, //!< MCAN clock = MCAN clock / 6
SYSCTL_MCANCLK_DIV_7 = 0x6, //!< MCAN clock = MCAN clock / 7
SYSCTL_MCANCLK_DIV_8 = 0x7, //!< MCAN clock = MCAN clock / 8
SYSCTL_MCANCLK_DIV_9 = 0x8, //!< MCAN clock = MCAN clock / 9
SYSCTL_MCANCLK_DIV_10 = 0x9, //!< MCAN clock = MCAN clock / 10
SYSCTL_MCANCLK_DIV_11 = 0xA, //!< MCAN clock = MCAN clock / 11
SYSCTL_MCANCLK_DIV_12 = 0xB, //!< MCAN clock = MCAN clock / 12
SYSCTL_MCANCLK_DIV_13 = 0xC, //!< MCAN clock = MCAN clock / 13
SYSCTL_MCANCLK_DIV_14 = 0xD, //!< MCAN clock = MCAN clock / 14
SYSCTL_MCANCLK_DIV_15 = 0xE, //!< MCAN clock = MCAN clock / 15
SYSCTL_MCANCLK_DIV_16 = 0xF, //!< MCAN clock = MCAN clock / 16
SYSCTL_MCANCLK_DIV_17 = 0x10, //!< MCAN clock = MCAN clock / 17
SYSCTL_MCANCLK_DIV_18 = 0x11, //!< MCAN clock = MCAN clock / 18
SYSCTL_MCANCLK_DIV_19 = 0x12, //!< MCAN clock = MCAN clock / 19
SYSCTL_MCANCLK_DIV_20 = 0x13 //!< MCAN clock = MCAN clock / 20
}SysCtl_MCANClkDivider;
//*****************************************************************************
//
//! The following are values that can be passed to
//! SysCtl_setCputimer2Clk() as \e divider parameter.
//
//*****************************************************************************
typedef enum
{
SYSCTL_TMR2CLKPRESCALE_1, //!< Cputimer2 clock = Cputimer2 clock / 1
SYSCTL_TMR2CLKPRESCALE_2, //!< Cputimer2 clock = Cputimer2 clock / 2
SYSCTL_TMR2CLKPRESCALE_4, //!< Cputimer2 clock = Cputimer2 clock / 4
SYSCTL_TMR2CLKPRESCALE_8, //!< Cputimer2 clock = Cputimer2 clock / 8
SYSCTL_TMR2CLKPRESCALE_16 //!< Cputimer2 clock = Cputimer2 clock / 16
}SysCtl_Cputimer2ClkDivider;
//*****************************************************************************
//
//! The following are values that can be passed to SysCtl_setCputimer2Clk()
//! as \e source parameter.
//
//*****************************************************************************
typedef enum
{
SYSCTL_TMR2CLKSRCSEL_SYSCLK = 0U, //!< System Clock
SYSCTL_TMR2CLKSRCSEL_INTOSC1 = 1U, //!< Internal Oscillator 1
SYSCTL_TMR2CLKSRCSEL_INTOSC2 = 2U, //!< Internal Oscillator 2
SYSCTL_TMR2CLKSRCSEL_XTAL = 3U, //!< Crystal oscillator
SYSCTL_TMR2CLKSRCSEL_AUXPLLCLK = 6U //!< Aux PLL CLock
}SysCtl_Cputimer2ClkSource;
//*****************************************************************************
//
//! The following are values that can be passed to SysCtl_lockClkConfig()
//! as the \e peripheral parameter.
//
//*****************************************************************************
typedef enum
{
SYSCTL_REG_SEL_CLKSRCCTL1 = 0x0000, //!< CLKSRCCTL1 lock
SYSCTL_REG_SEL_CLKSRCCTL2 = 0x0100, //!< CLKSRCCTL2 lock
SYSCTL_REG_SEL_CLKSRCCTL3 = 0x0200, //!< CLKSRCCTL3 lock
SYSCTL_REG_SEL_SYSPLLCTL1 = 0x0300, //!< SYSPLLCTL1 lock
SYSCTL_REG_SEL_SYSPLLMULT = 0x0600, //!< SYSPLLMULT lock
SYSCTL_REG_SEL_SYSCLKDIVSEL = 0x0B00, //!< SYSCLKDIVSEL lock
SYSCTL_REG_SEL_AUXCLKDIVSEL = 0x0C00, //!< AUXCLKDIVSEL lock
SYSCTL_REG_SEL_LOSPCP = 0x0F00, //!< LOSPCP lock
SYSCTL_REG_SEL_XTALCR = 0x1000 //!< XTALCR lock
} SysCtl_ClkRegSel;
//*****************************************************************************
//
//! The following are values that can be passed to SysCtl_lockSysConfig()
//! as the \e peripheral parameter.
//
//*****************************************************************************
typedef enum
{
SYSCTL_REG_SEL_PIEVERRADDR = 0x0200, //!< PIEVERRADDR lock
SYSCTL_REG_SEL_PCLKCR0 = 0x0300, //!< PCLKCR0 lock
SYSCTL_REG_SEL_PCLKCR2 = 0x0500, //!< PCLKCR2 lock
SYSCTL_REG_SEL_PCLKCR3 = 0x0600, //!< PCLKCR3 lock
SYSCTL_REG_SEL_PCLKCR4 = 0x0700, //!< PCLKCR4 lock
SYSCTL_REG_SEL_PCLKCR6 = 0x0900, //!< PCLKCR6 lock
SYSCTL_REG_SEL_PCLKCR7 = 0x0A00, //!< PCLKCR7 lock
SYSCTL_REG_SEL_PCLKCR8 = 0x0B00, //!< PCLKCR8 lock
SYSCTL_REG_SEL_PCLKCR9 = 0x0C00, //!< PCLKCR9 lock
SYSCTL_REG_SEL_PCLKCR10 = 0x0D00, //!< PCLKCR10 lock
SYSCTL_REG_SEL_PCLKCR13 = 0x1000, //!< PCLKCR13 lock
SYSCTL_REG_SEL_PCLKCR14 = 0x1100, //!< PCLKCR14 lock
SYSCTL_REG_SEL_PCLKCR16 = 0x1300, //!< PCLKCR16 lock
SYSCTL_REG_SEL_LPMCR = 0x1500, //!< LPMCR lock
SYSCTL_REG_SEL_GPIOLPMSEL0 = 0x1600, //!< GPIOLPMSEL0 lock
SYSCTL_REG_SEL_GPIOLPMSEL1 = 0x1700, //!< GPIOLPMSEL1 lock
SYSCTL_REG_SEL_PCLKCR17 = 0x1800, //!< PCLKCR17 lock
SYSCTL_REG_SEL_PCLKCR18 = 0x1900, //!< PCLKCR18 lock
SYSCTL_REG_SEL_PCLKCR19 = 0x1A00, //!< PCLKCR19 lock
SYSCTL_REG_SEL_PCLKCR20 = 0x1B00, //!< PCLKCR20 lock
SYSCTL_REG_SEL_PCLKCR21 = 0x1C00, //!< PCLKCR21 lock
SYSCTL_REG_SEL_PCLKCR22 = 0x1D00, //!< PCLKCR22 lock
SYSCTL_REG_SEL_PCLKCR25 = 0x0101, //!< PCLKCR25 lock
SYSCTL_REG_SEL_PCLKCR26 = 0x0201, //!< PCLKCR26 lock
SYSCTL_REG_SEL_PCLKCR27 = 0x0301 //!< PCLKCR27 lock
} SysCtl_CpuRegSel;
//*****************************************************************************
//
//! The following are values that can be passed to SysCtl_setLFUUserRegister()
//! and SysCtl_getLFUUserRegister() as the \e reg parameter.
//
//*****************************************************************************
typedef enum
{
SYSCTL_LFU_USER_REG1_SYSRSN = 0U, //!< User register reset by SYSRSn
SYSCTL_LFU_USER_REG2_SYSRSN = 1U, //!< User register reset by SYSRSn
SYSCTL_LFU_USER_REG1_XRSN = 2U, //!< User register reset by XRSn
SYSCTL_LFU_USER_REG2_XRSN = 3U, //!< User register reset by XRSn
SYSCTL_LFU_USER_REG1_PORESETN = 4U, //!< User register reset by PORESETn
SYSCTL_LFU_USER_REG2_PORESETN = 5U, //!< User register reset by PORESETn
}SysCtl_LFUUserRegister;
//*****************************************************************************
//
// Prototypes for the APIs.
//
//*****************************************************************************
//*****************************************************************************
//
//! Wrapper function for Device_cal function
//!
//! \param None
//!
//! This is a wrapper function for the Device_cal function available in the OTP
//! memory.
//!
//! \return None.
//
//*****************************************************************************
static inline void
SysCtl_deviceCal(void)
{
//
// Call the Device_cal function
//
((void (*)(void))((uintptr_t)0x003fce6c))();
}
//*****************************************************************************
//
//! Resets a peripheral
//!
//! \param peripheral is the peripheral to reset.
//!
//! This function uses the SOFTPRESx registers to reset a specified peripheral.
//! Module registers will be returned to their reset states.
//!
//! \note This includes registers containing trim values.The peripheral
//! software reset needed by CPU2 can be communicated to CPU1 via
//! IPC for all shared peripherals.
//!
//! \return None.
//
//*****************************************************************************
static inline void
SysCtl_resetPeripheral(SysCtl_PeripheralSOFTPRES peripheral)
{
uint16_t regIndex;
uint16_t bitIndex;
//
// Decode the peripheral variable.
//
regIndex = (uint16_t)2U * ((uint16_t)peripheral &
(uint16_t)0x001FU);
bitIndex = ((uint16_t)peripheral & 0x1F00U) >>
0x0008U;
__eallow();
//
// Sets the appropriate reset bit and then clears it.
//
(*((volatile uint32_t *)(0x0005D000U + 0x82U + regIndex))) |= (1UL << bitIndex);
(*((volatile uint32_t *)(0x0005D000U + 0x82U + regIndex))) &= ~(1UL << bitIndex);
//
// Call Device_cal function
//
if((((uint16_t)peripheral & 0x001FU) == 0xDU) || // ADCx
(((uint16_t)peripheral & 0x001FU) == 0x10U) // DACx
)
{
SysCtl_deviceCal();
}
__edis();
}
//*****************************************************************************
//
//! Enables a peripheral.
//!
//! \param peripheral is the peripheral to enable.
//!
//! Peripherals are enabled with this function. At power-up, all peripherals
//! are disabled; they must be enabled in order to operate or respond to
//! register reads/writes.
//!
//! \note Note that there should be atleast 5 cycles delay between enabling the
//! peripheral clock and accessing the peripheral registers. The delay should be
//! added by the user if the peripheral is accessed immediately after this
//! function call.
//! Use asm(" RPT #5 || NOP"); to add 5 cycle delay post this function call.
//!
//! \return None.
//
//*****************************************************************************
static inline void
SysCtl_enablePeripheral(SysCtl_PeripheralPCLOCKCR peripheral)
{
uint16_t regIndex;
uint16_t bitIndex;
//
// Decode the peripheral variable.
//
regIndex = (uint16_t)2U * ((uint16_t)peripheral &
(uint16_t)0x001FU);
bitIndex = ((uint16_t)peripheral & 0x1F00U) >>
0x0008U;
__eallow();
//
// Turn on the module clock.
//
(*((volatile uint32_t *)(0x0005D300U + 0x22U + regIndex))) |= (1UL << bitIndex);
__edis();
}
//*****************************************************************************
//
//! Disables a peripheral.
//!
//! \param peripheral is the peripheral to disable.
//!
//! Peripherals are disabled with this function. Once disabled, they will not
//! operate or respond to register reads/writes.
//!
//! \return None.
//
//*****************************************************************************
static inline void
SysCtl_disablePeripheral(SysCtl_PeripheralPCLOCKCR peripheral)
{
uint16_t regIndex;
uint16_t bitIndex;
//
// Decode the peripheral variable.
//
regIndex = (uint16_t)2U * ((uint16_t)peripheral &
(uint16_t)0x001FU);
bitIndex = ((uint16_t)peripheral & 0x1F00U) >>
0x0008U;
__eallow();
//
// Turn off the module clock.
//
(*((volatile uint32_t *)(0x0005D300U + 0x22U + regIndex))) &= ~(1UL << bitIndex);
__edis();
}
//*****************************************************************************
//
//! Resets the device.
//!
//! This function performs a watchdog reset of the device.
//!
//! \return This function does not return.
//
//*****************************************************************************
static inline void
SysCtl_resetDevice(void)
{
//
// Write an incorrect check value to the watchdog control register
// This will cause a device reset
//
__eallow();
//
// Enable the watchdog
//
(*((volatile uint16_t *)(0x00007000U + 0x29U))) = 0x0028U;
//
// Write a bad check value
//
(*((volatile uint16_t *)(0x00007000U + 0x29U))) = 0U;
__edis();
//
// The device should have reset, so this should never be reached. Just in
// case, loop forever.
//
while((_Bool)1)
{
}
}
//*****************************************************************************
//
//! Gets the reason for a reset.
//!
//! This function will return the reason(s) for a reset. Since the reset
//! reasons are sticky until either cleared by software or an external reset,
//! multiple reset reasons may be returned if multiple resets have occurred.
//! The reset reason will be a logical OR of
//! - \b SYSCTL_CAUSE_POR - Power-on reset
//! - \b SYSCTL_CAUSE_XRS - External reset pin
//! - \b SYSCTL_CAUSE_WDRS - Watchdog reset
//! - \b SYSCTL_CAUSE_NMIWDRS - NMI watchdog reset
//! - \b SYSCTL_CAUSE_SCCRESET - SCCRESETn reset from DCSM
//! - \b SYSCTL_CAUSE_HWBISTN - HWBISTn Reset
//! - \b SYSCTL_CAUSE_SIMRESET_CPU1RSN - SIMRESET_CPU1RSn
//! - \b SYSCTL_CAUSE_SIMRESET_XRSN - SIMRESET_XRSn
//!
//! \note If you re-purpose the reserved boot ROM RAM, the POR and XRS reset
//! statuses won't be accurate.
//!
//! \return Returns the reason(s) for a reset.
//
//*****************************************************************************
static inline uint32_t
SysCtl_getResetCause(void)
{
uint32_t resetCauses;
//
// Read CPU reset register
//
resetCauses = (*((volatile uint32_t *)(0x0005D300U + 0x80U))) &
((uint32_t)0x1U | (uint32_t)0x2U |
(uint32_t)0x4U |
(uint32_t)0x8U |
(uint32_t)0x100U
| (uint32_t)0x00000020U
| (uint32_t)0x00000400U
| (uint32_t)0x00000800U
);
//
// Set POR and XRS Causes from boot ROM Status
//
if(((*((volatile uint32_t *)(0x0002U))) & (uint32_t)0x2000U) ==
(uint32_t)0x2000U)
{
resetCauses |= 0x1U;
}
if(((*((volatile uint32_t *)(0x0002U))) & (uint32_t)0x1000U) ==
(uint32_t)0x1000U)
{
resetCauses |= 0x2U;
}
//
// Return the reset reasons.
//
return(resetCauses);
}
//*****************************************************************************
//
//! Clears reset reasons.
//!
//! \param rstCauses are the reset causes to be cleared; must be a logical
//! OR of
//! - \b SYSCTL_CAUSE_POR - Power-on reset
//! - \b SYSCTL_CAUSE_XRS - External reset pin
//! - \b SYSCTL_CAUSE_WDRS - Watchdog reset
//! - \b SYSCTL_CAUSE_NMIWDRS - NMI watchdog reset
//! - \b SYSCTL_CAUSE_SCCRESET - SCCRESETn reset from DCSM
//! - \b SYSCTL_CAUSE_HWBISTN - HWBISTn Reset
//! - \b SYSCTL_CAUSE_SIMRESET_CPU1RSN - SIMRESET_CPU1RSn
//! - \b SYSCTL_CAUSE_SIMRESET_XRSN - SIMRESET_XRSn
//!
//! This function clears the specified sticky reset reasons. Once cleared,
//! another reset for the same reason can be detected, and a reset for a
//! different reason can be distinguished (instead of having two reset causes
//! set). If the reset reason is used by an application, all reset causes
//! should be cleared after they are retrieved with SysCtl_getResetCause().
//!
//! \note Some reset causes are cleared by the boot ROM.
//!
//! \return None.
//
//*****************************************************************************
static inline void
SysCtl_clearResetCause(uint32_t rstCauses)
{
//
// Clear the given reset reasons.
//
(*((volatile uint32_t *)(0x0005D300U + 0x7EU))) = rstCauses;
}
//*****************************************************************************
//
//! Sets the low speed peripheral clock rate prescaler.
//!
//! \param prescaler is the LSPCLK rate relative to SYSCLK
//!
//! This function configures the clock rate of the low speed peripherals. The
//! \e prescaler parameter is the value by which the SYSCLK rate is divided to
//! get the LSPCLK rate. For example, a \e prescaler of
//! \b SYSCTL_LSPCLK_PRESCALE_4 will result in a LSPCLK rate that is a quarter
//! of the SYSCLK rate.
//!
//! \return None.
//
//*****************************************************************************
static inline void
SysCtl_setLowSpeedClock(SysCtl_LSPCLKPrescaler prescaler)
{
//
// Write the divider selection to the appropriate register.
//
__eallow();
(*((volatile uint32_t *)(0x0005D200U + 0x2CU))) =
((*((volatile uint32_t *)(0x0005D200U + 0x2CU))) &
~(uint32_t)0x7U) | (uint32_t)prescaler;
__edis();
}
//*****************************************************************************
//
//! Selects a clock source to mux to an external GPIO pin (XCLKOUT).
//!
//! \param source is the internal clock source to be configured.
//!
//! This function configures the specified clock source to be muxed to an
//! external clock out (XCLKOUT) GPIO pin. The \e source parameter may take a
//! value of one of the following values:
//! - \b SYSCTL_CLOCKOUT_PLLSYS
//! - \b SYSCTL_CLOCKOUT_PLLRAW
//! - \b SYSCTL_CLOCKOUT_SYSCLK
//! - \b SYSCTL_CLOCKOUT_INTOSC1
//! - \b SYSCTL_CLOCKOUT_INTOSC2
//! - \b SYSCTL_CLOCKOUT_XTALOSC
//!
//! \return None.
//
//*****************************************************************************
static inline void
SysCtl_selectClockOutSource(SysCtl_ClockOut source)
{
__eallow();
//
// Clear clock out source
//
(*((volatile uint16_t *)(0x0005D200U + 0xCU))) &=
~0xFU;
//
// Set clock out source
//
(*((volatile uint16_t *)(0x0005D200U + 0xCU))) |= (uint16_t)source;
__edis();
}
//*****************************************************************************
//
//! Set the external oscillator mode.
//!
//! \param mode is the external oscillator mode to be configured.
//!
//! This function sets the external oscillator mode specified by the \e mode
//! parameter which may take one of two values:
//! - \b SYSCTL_XTALMODE_CRYSTAL - Crystal Mode
//! - \b SYSCTL_XTALMODE_SINGLE - Single-Ended Mode
//!
//! \note The external oscillator must be powered off before this configuration
//! can be performed.
//!
//! \return None.
//
//*****************************************************************************
static inline void
SysCtl_setExternalOscMode(SysCtl_ExternalOscMode mode)
{
__eallow();
switch(mode)
{
case SYSCTL_XTALMODE_CRYSTAL:
//
// Set mode to Crystal
//
(*((volatile uint32_t *)(0x0005D200U + 0x32U))) &= ~(uint32_t)0x2U;
break;
case SYSCTL_XTALMODE_SINGLE:
//
// Set mode to Single-Ended
//
(*((volatile uint32_t *)(0x0005D200U + 0x32U))) |= 0x2U;
break;
default:
//
// Do nothing. Not a valid mode value.
//
break;
}
__edis();
}
//*****************************************************************************
//
//! Gets the external oscillator counter value.
//!
//! This function returns the X1 clock counter value. When the return value
//! reaches 0x3FF, it freezes. Before switching from INTOSC2 to an external
//! oscillator (XTAL), an application should call this function to make sure
//! the counter is saturated.
//!
//! \return Returns the value of the 10-bit X1 clock counter.
//
//*****************************************************************************
static inline uint16_t
SysCtl_getExternalOscCounterValue(void)
{
return((*((volatile uint16_t *)(0x0005D200U + 0x30U))) & 0x7FFU);
}
//*****************************************************************************
//
//! Clears the external oscillator counter value.
//!
//! \return None.
//
//*****************************************************************************
static inline void
SysCtl_clearExternalOscCounterValue(void)
{
(*((volatile uint32_t *)(0x0005D200U + 0x30U))) |= 0x10000U;
}
//*****************************************************************************
//
//! Turns on the specified oscillator sources.
//!
//! \param oscSource is the oscillator source to be configured.
//!
//! This function turns on the oscillator specified by the \e oscSource
//! parameter which may take a value of \b SYSCTL_OSCSRC_XTAL
//! or \b SYSCTL_OSCSRC_OSC2.
//!
//! \note \b SYSCTL_OSCSRC_OSC1 is not a valid value for \e oscSource.
//!
//! \return None.
//
//*****************************************************************************
static inline void
SysCtl_turnOnOsc(uint32_t oscSource)
{
;
__eallow();
switch(oscSource)
{
case 0x00000000UL:
//
// Turn on INTOSC2
//
(*((volatile uint16_t *)(0x0005D200U + 0x8U))) &=
~0x8U;
break;
case 0x00010000U:
//
// Turn on XTALOSC
//
(*((volatile uint16_t *)(0x0005D200U + 0x32U))) &= ~0x1U;
break;
default:
//
// Do nothing. Not a valid oscSource value.
//
break;
}
__edis();
}
//*****************************************************************************
//
//! Turns off the specified oscillator sources.
//!
//! \param oscSource is the oscillator source to be configured.
//!
//! This function turns off the oscillator specified by the \e oscSource
//! parameter which may take a value of \b SYSCTL_OSCSRC_XTAL
//! or \b SYSCTL_OSCSRC_OSC2.
//!
//! \note \b SYSCTL_OSCSRC_OSC1 is not a valid value for \e oscSource.
//!
//! \return None.
//
//*****************************************************************************
static inline void
SysCtl_turnOffOsc(uint32_t oscSource)
{
;
__eallow();
switch(oscSource)
{
case 0x00000000UL:
//
// Turn off INTOSC2
//
(*((volatile uint16_t *)(0x0005D200U + 0x8U))) |=
0x8U;
break;
case 0x00010000U:
//
// Turn off XTALOSC
//
(*((volatile uint16_t *)(0x0005D200U + 0x32U))) |= 0x1U;
break;
default:
//
// Do nothing. Not a valid oscSource value.
//
break;
}
__edis();
}
//*****************************************************************************
//
//! Enters IDLE mode.
//!
//! This function puts the device into IDLE mode. The CPU clock is gated while
//! all peripheral clocks are left running. Any enabled interrupt will wake the
//! CPU up from IDLE mode.
//!
//! \return None.
//
//*****************************************************************************
static inline void
SysCtl_enterIdleMode(void)
{
__eallow();
//
// Configure the device to go into IDLE mode when IDLE is executed.
//
(*((volatile uint32_t *)(0x0005D300U + 0x76U))) =
((*((volatile uint32_t *)(0x0005D300U + 0x76U))) &
~(uint32_t)0x3U) | 0x0000U;
__edis();
__asm(" IDLE");
}
//*****************************************************************************
//
//! Enters STANDBY mode.
//!
//! This function puts the device into STANDBY mode. This will gate both the
//! CPU clock and any peripheral clocks derived from SYSCLK. The watchdog is
//! left active, and an NMI or an optional watchdog interrupt will wake the
//! CPU subsystem from STANDBY mode.
//!
//! GPIOs may be configured to wake the CPU subsystem. See
//! SysCtl_enableLPMWakeupPin().
//!
//! The CPU will receive an interrupt (WAKEINT) on wakeup.
//!
//! \return None.
//
//*****************************************************************************
static inline void
SysCtl_enterStandbyMode(void)
{
__eallow();
//
// Configure the device to go into STANDBY mode when IDLE is executed.
//
(*((volatile uint32_t *)(0x0005D300U + 0x76U))) =
((*((volatile uint32_t *)(0x0005D300U + 0x76U))) &
~(uint32_t)0x3U) | 0x0001U;
__edis();
__asm(" IDLE");
}
//*****************************************************************************
//
//! Enters HALT mode.
//!
//! This function puts the device into HALT mode. This will gate almost all
//! systems and clocks and allows for the power-down of oscillators and analog
//! blocks. The watchdog may be left clocked to produce a reset. See
//! SysCtl_enableWatchdogInHalt() to enable this. GPIOs should be
//! configured to wake the CPU subsystem. See SysCtl_enableLPMWakeupPin().
//!
//!
//! The CPU will receive an interrupt (WAKEINT) on wakeup.
//!
//! \return None.
//
//*****************************************************************************
static inline void
SysCtl_enterHaltMode(void)
{
__eallow();
//
// Configure the device to go into HALT mode when IDLE is executed.
//
(*((volatile uint32_t *)(0x0005D300U + 0x76U))) =
((*((volatile uint32_t *)(0x0005D300U + 0x76U))) &
~(uint32_t)0x3U) | 0x0002U;
__edis();
__asm(" IDLE");
}
//*****************************************************************************
//! Enables a pin to wake up the device from the following mode(s):
//! - STANDBY
//! - HALT
//!
//! \param pin is the identifying number of the pin.
//!
//! This function connects a pin to the LPM circuit, allowing an event on the
//! pin to wake up the device when when it is in following mode(s):
//! - STANDBY
//! - HALT
//!
//! The pin is specified by its numerical value. For example, GPIO34 is
//! specified by passing 34 as \e pin. Only GPIOs 0 through 63 are capable of
//! being connected to the LPM circuit.
//!
//! \return None.
//
//*****************************************************************************
static inline void
SysCtl_enableLPMWakeupPin(uint32_t pin)
{
uint32_t pinMask;
//
// Check the arguments.
//
;
pinMask = 1UL << (pin % 32U);
__eallow();
if(pin < 32U)
{
(*((volatile uint32_t *)(0x0005D300U + 0x78U))) |= pinMask;
}
else
{
(*((volatile uint32_t *)(0x0005D300U + 0x7AU))) |= pinMask;
}
__edis();
}
//*****************************************************************************
//! Disables a pin to wake up the device from the following mode(s):
//! - STANDBY
//! - HALT
//!
//! \param pin is the identifying number of the pin.
//!
//! This function disconnects a pin to the LPM circuit, disallowing an event on
//! the pin to wake up the device when when it is in following mode(s):
//! - STANDBY
//! - HALT
//!
//! The pin is specified by its numerical value. For example, GPIO34 is
//! specified by passing 34 as \e pin. Only GPIOs 0 through 63 are valid.
//!
//! \return None.
//
//*****************************************************************************
static inline void
SysCtl_disableLPMWakeupPin(uint32_t pin)
{
uint32_t pinMask;
//
// Check the arguments.
//
;
pinMask = 1UL << (pin % 32U);
__eallow();
if(pin < 32U)
{
(*((volatile uint32_t *)(0x0005D300U + 0x78U))) &= ~pinMask;
}
else
{
(*((volatile uint32_t *)(0x0005D300U + 0x7AU))) &= ~pinMask;
}
__edis();
}
//*****************************************************************************
//
//! Sets the number of cycles to qualify an input on waking from STANDBY mode.
//!
//! \param cycles is the number of OSCCLK cycles.
//!
//! This function sets the number of OSCCLK clock cycles used to qualify the
//! selected inputs when waking from STANDBY mode. The \e cycles parameter
//! should be passed a cycle count between 2 and 65 cycles inclusive.
//!
//! \return None.
//
//*****************************************************************************
static inline void
SysCtl_setStandbyQualificationPeriod(uint16_t cycles)
{
//
// Check the arguments.
//
;
__eallow();
(*((volatile uint16_t *)(0x0005D300U + 0x76U))) =
((*((volatile uint16_t *)(0x0005D300U + 0x76U))) &
~(uint16_t)0xFCU) |
((cycles - 2U) << 2U);
__edis();
}
//*****************************************************************************
//
//! Enable the device to wake from STANDBY mode upon a watchdog interrupt.
//!
//! \note In order to use this option, you must configure the watchdog to
//! generate an interrupt using SysCtl_setWatchdogMode().
//!
//! \return None.
//
//*****************************************************************************
static inline void
SysCtl_enableWatchdogStandbyWakeup(void)
{
__eallow();
//
// Set the bit enables the watchdog to wake up the device from STANDBY.
//
(*((volatile uint16_t *)(0x0005D300U + 0x76U))) |= 0x8000U;
__edis();
}
//*****************************************************************************
//
//! Disable the device from waking from STANDBY mode upon a watchdog interrupt.
//!
//! \return None.
//
//*****************************************************************************
static inline void
SysCtl_disableWatchdogStandbyWakeup(void)
{
__eallow();
//
// Clear the bit enables the watchdog to wake up the device from STANDBY.
//
(*((volatile uint16_t *)(0x0005D300U + 0x76U))) &= ~0x8000U;
__edis();
}
//*****************************************************************************
//
//! Enable the watchdog to run while in HALT mode.
//!
//! This function configures the watchdog to continue to run while in HALT
//! mode. Additionally, INTOSC1 and INTOSC2 are not powered down when the
//! system enters HALT mode. By default the watchdog is gated when the system
//! enters HALT.
//!
//! \return None.
//
//*****************************************************************************
static inline void
SysCtl_enableWatchdogInHalt(void)
{
__eallow();
//
// Set the watchdog HALT mode ignore bit.
//
(*((volatile uint16_t *)(0x0005D200U + 0x8U))) |= 0x20U;
__edis();
}
//*****************************************************************************
//
//! Disable the watchdog from running while in HALT mode.
//!
//! This function gates the watchdog when the system enters HALT mode. INTOSC1
//! and INTOSC2 will be powered down. This is the default behavior of the
//! device.
//!
//! \return None.
//
//*****************************************************************************
static inline void
SysCtl_disableWatchdogInHalt(void)
{
__eallow();
//
// Clear the watchdog HALT mode ignore bit.
//
(*((volatile uint16_t *)(0x0005D200U + 0x8U))) &= ~0x20U;
__edis();
}
//*****************************************************************************
//
//! Configures whether the watchdog generates a reset or an interrupt signal.
//!
//! \param mode is a flag to select the watchdog mode.
//!
//! This function configures the action taken when the watchdog counter reaches
//! its maximum value. When the \e mode parameter is
//! \b SYSCTL_WD_MODE_INTERRUPT, the watchdog is enabled to generate a watchdog
//! interrupt signal and disables the generation of a reset signal. This will
//! allow the watchdog module to wake up the device from IDLE
//! or STANDBY if desired (see SysCtl_enableWatchdogStandbyWakeup()).
//!
//! When the \e mode parameter is \b SYSCTL_WD_MODE_RESET, the watchdog will
//! be put into reset mode and generation of a watchdog interrupt signal will
//! be disabled. This is how the watchdog is configured by default.
//!
//! \note Check the status of the watchdog interrupt using
//! SysCtl_isWatchdogInterruptActive() before calling this function. If the
//! interrupt is still active, switching from interrupt mode to reset mode will
//! immediately reset the device.
//!
//! \return None.
//
//*****************************************************************************
static inline void
SysCtl_setWatchdogMode(SysCtl_WDMode mode)
{
__eallow();
//
// Either set or clear the WDENINT bit to that will determine whether the
// watchdog will generate a reset signal or an interrupt signal. Take care
// not to write a 1 to WDOVERRIDE.
//
if(mode == SYSCTL_WD_MODE_INTERRUPT)
{
(*((volatile uint16_t *)(0x00007000U + 0x22U))) =
((*((volatile uint16_t *)(0x00007000U + 0x22U))) & ~0x1U) |
0x2U;
}
else
{
(*((volatile uint16_t *)(0x00007000U + 0x22U))) &= ~(0x2U |
0x1U);
}
__edis();
}
//*****************************************************************************
//
//! Gets the status of the watchdog interrupt signal.
//!
//! This function returns the status of the watchdog interrupt signal. If the
//! interrupt is active, this function will return \b true. If \b false, the
//! interrupt is NOT active.
//!
//! \note Make sure to call this function to ensure that the interrupt is not
//! active before making any changes to the configuration of the watchdog to
//! prevent any unexpected behavior. For instance, switching from interrupt
//! mode to reset mode while the interrupt is active will immediately reset the
//! device.
//!
//! \return \b true if the interrupt is active and \b false if it is not.
//
//*****************************************************************************
static inline _Bool
SysCtl_isWatchdogInterruptActive(void)
{
//
// If the status bit is cleared, the WDINTn signal is active.
//
return(((*((volatile uint16_t *)(0x00007000U + 0x22U))) & 0x4U) == 0U);
}
//*****************************************************************************
//
//! Disables the watchdog.
//!
//! This function disables the watchdog timer. Note that the watchdog timer is
//! enabled on reset.
//!
//! \return None.
//
//*****************************************************************************
static inline void
SysCtl_disableWatchdog(void)
{
__eallow();
//
// Set the disable bit.
//
(*((volatile uint16_t *)(0x00007000U + 0x29U))) |= 0x0028U | 0x40U;
__edis();
}
//*****************************************************************************
//
//! Enables the watchdog.
//!
//! This function enables the watchdog timer. Note that the watchdog timer is
//! enabled on reset.
//!
//! \return None.
//
//*****************************************************************************
static inline void
SysCtl_enableWatchdog(void)
{
__eallow();
//
// Clear the disable bit.
//
(*((volatile uint16_t *)(0x00007000U + 0x29U))) = ((*((volatile uint16_t *)(0x00007000U + 0x29U))) &
~0x40U) | 0x0028U;
__edis();
}
//*****************************************************************************
//
//! Checks if the watchdog is enabled or not
//!
//! This function returns the watchdog status whether it is enabled or disabled
//!
//! \return \b true if the watchdog is enabled & \b false if the watchdog is
//! disabled
//
//*****************************************************************************
static inline _Bool
SysCtl_isWatchdogEnabled(void)
{
//
// Get the watchdog enable status
//
return (((*((volatile uint16_t *)(0x00007000U + 0x29U))) & 0x40U) == 0U);
}
//*****************************************************************************
//
//! Services the watchdog.
//!
//! This function resets the watchdog.
//!
//! \return None.
//
//*****************************************************************************
static inline void
SysCtl_serviceWatchdog(void)
{
__eallow();
//
// Enable the counter to be reset and then reset it.
//
(*((volatile uint16_t *)(0x00007000U + 0x25U))) = 0x0055U;
(*((volatile uint16_t *)(0x00007000U + 0x25U))) = 0x00AAU;
__edis();
}
//*****************************************************************************
//
//! Writes the first key to enter the watchdog reset.
//!
//! This function writes the first key to enter the watchdog reset.
//!
//! \return None.
//
//*****************************************************************************
static inline void
SysCtl_enableWatchdogReset(void)
{
__eallow();
//
// Enable the counter to be reset
//
(*((volatile uint16_t *)(0x00007000U + 0x25U))) = 0x0055U;
__edis();
}
//*****************************************************************************
//
//! Writes the second key to reset the watchdog.
//!
//! This function writes the second key to reset the watchdog.
//!
//! \return None.
//
//*****************************************************************************
static inline void
SysCtl_resetWatchdog(void)
{
__eallow();
//
// Reset the watchdog counter
//
(*((volatile uint16_t *)(0x00007000U + 0x25U))) = 0x00AAU;
__edis();
}
//*****************************************************************************
//
//! Sets up watchdog clock (WDCLK) pre-divider.
//!
//! \param predivider is the value that configures the pre-divider.
//!
//! This function sets up the watchdog clock (WDCLK) pre-divider. There are two
//! dividers that scale INTOSC1 to WDCLK. The \e predivider parameter divides
//! INTOSC1 down to PREDIVCLK and the prescaler (set by the
//! SysCtl_setWatchdogPrescaler() function) divides PREDIVCLK down to WDCLK.
//!
//! \return None.
//
//*****************************************************************************
static inline void
SysCtl_setWatchdogPredivider(SysCtl_WDPredivider predivider)
{
uint16_t regVal;
regVal = (uint16_t)predivider | 0x0028U;
__eallow();
//
// Write the predivider to the appropriate register.
//
(*((volatile uint16_t *)(0x00007000U + 0x29U))) = ((*((volatile uint16_t *)(0x00007000U + 0x29U))) &
~(0xF00U)) | regVal;
__edis();
}
//*****************************************************************************
//
//! Sets up watchdog clock (WDCLK) prescaler.
//!
//! \param prescaler is the value that configures the watchdog clock relative
//! to the value from the pre-divider.
//!
//! This function sets up the watchdog clock (WDCLK) prescaler. There are two
//! dividers that scale INTOSC1 to WDCLK. The predivider (set with the
//! SysCtl_setWatchdogPredivider() function) divides INTOSC1 down to PREDIVCLK
//! and the \e prescaler parameter divides PREDIVCLK down to WDCLK.
//!
//! \return None.
//
//*****************************************************************************
static inline void
SysCtl_setWatchdogPrescaler(SysCtl_WDPrescaler prescaler)
{
uint16_t regVal;
regVal = (uint16_t)prescaler | (uint16_t)0x0028U;
__eallow();
//
// Write the prescaler to the appropriate register.
//
(*((volatile uint16_t *)(0x00007000U + 0x29U))) = ((*((volatile uint16_t *)(0x00007000U + 0x29U))) &
~(0x7U)) | regVal;
__edis();
}
//*****************************************************************************
//
//! Gets the watchdog counter value.
//!
//! \return Returns the current value of the 8-bit watchdog counter. If this
//! count value overflows, a watchdog output pulse is generated.
//
//*****************************************************************************
static inline uint16_t
SysCtl_getWatchdogCounterValue(void)
{
//
// Read and return the value of the watchdog counter.
//
return((*((volatile uint16_t *)(0x00007000U + 0x23U))));
}
//*****************************************************************************
//
//! Gets the watchdog reset status.
//!
//! This function returns the watchdog reset status. If this function returns
//! \b true, that indicates that a watchdog reset generated the last reset
//! condition. Otherwise, it was an external device or power-up reset
//! condition.
//!
//! \return Returns \b true if the watchdog generated the last reset condition.
//
//*****************************************************************************
static inline _Bool
SysCtl_getWatchdogResetStatus(void)
{
//
// Read and return the status of the watchdog reset status flag.
//
return(((*((volatile uint16_t *)(0x0005D300U + 0x80U))) & 0x4U) != 0U);
}
//*****************************************************************************
//
//! Clears the watchdog reset status.
//!
//! This function clears the watchdog reset status. To check if it was set
//! first, see SysCtl_getWatchdogResetStatus().
//!
//! \return None.
//
//*****************************************************************************
static inline void
SysCtl_clearWatchdogResetStatus(void)
{
__eallow();
//
// Read and return the status of the watchdog reset status flag.
//
(*((volatile uint16_t *)(0x0005D300U + 0x7EU))) = 0x4U;
__edis();
}
//*****************************************************************************
//
//! Set the minimum threshold value for windowed watchdog
//!
//! \param value is the value to set the window threshold
//!
//! This function sets the minimum threshold value used to define the lower
//! limit of the windowed watchdog functionality.
//!
//! \return None.
//
//*****************************************************************************
static inline void
SysCtl_setWatchdogWindowValue(uint16_t value)
{
__eallow();
//
// Clear the windowed value
//
(*((volatile uint16_t *)(0x00007000U + 0x2AU))) &= ~0xFFU;
//
// Set the windowed value
//
(*((volatile uint16_t *)(0x00007000U + 0x2AU))) |= (value & 0xFFU);
__edis();
}
//*****************************************************************************
//
//! Clears the watchdog override.
//!
//! This function clears the watchdog override and locks the watchdog timer
//! module to remain in its prior state which could be either enable /disable.
//! The watchdog timer will remain in this state until the next system reset.
//!
//! \return None.
//
//*****************************************************************************
static inline void
SysCtl_clearWatchdogOverride(void)
{
__eallow();
(*((volatile uint16_t *)(0x00007000U + 0x22U))) |= 0x1U;
__edis();
}
//*****************************************************************************
//
//! Enable the NMI Global interrupt bit
//!
//! \b Note: This bit should be set after the device security related
//! initialization is complete.
//!
//! \return None.
//
//*****************************************************************************
static inline void
SysCtl_enableNMIGlobalInterrupt(void)
{
__eallow();
(*((volatile uint16_t *)(0x00007060U + 0x0U))) |= 0x1U;
__edis();
}
//*****************************************************************************
//
//! Read NMI interrupts.
//!
//! Read the current state of NMI interrupt.
//!
//! \return \b true if NMI interrupt is triggered, \b false if not.
//
//*****************************************************************************
static inline _Bool
SysCtl_getNMIStatus(void)
{
//
// Read and return the current value of the NMI flag register, masking out
// all but the NMI bit.
//
return(((*((volatile uint16_t *)(0x00007060U + 0x1U))) & 0x1U) != 0U);
}
//*****************************************************************************
//
//! Read NMI Flags.
//!
//! Read the current state of individual NMI interrupts
//!
//! \return Value of NMIFLG register. These defines are provided to decode
//! the value:
//! - \b SYSCTL_NMI_NMIINT - NMI Interrupt Flag
//! - \b SYSCTL_NMI_CLOCKFAIL - Clock Fail Interrupt Flag
//! - \b SYSCTL_NMI_RAMUNCERR - RAM Uncorrectable Error NMI Flag
//! - \b SYSCTL_NMI_FLUNCERR - Flash Uncorrectable Error NMI Flag
//! - \b SYSCTL_NMI_CPU1HWBISTERR - HW BIST Error NMI Flag
//! - \b SYSCTL_NMI_SYSDBGNMI - System Debug Module NMI Flag
//! - \b SYSCTL_NMI_CLBNMI - Reconfigurable Logic NMI Flag
//! - \b SYSCTL_NMI_SWERR - SW Error Force NMI Flag
//! - \b SYSCTL_NMI_CRC_FAIL - BGCRC calculation failed.
//
//*****************************************************************************
static inline uint16_t
SysCtl_getNMIFlagStatus(void)
{
//
// Read and return the current value of the NMI flag register.
//
return((*((volatile uint16_t *)(0x00007060U + 0x1U))));
}
//*****************************************************************************
//
//! Check if the individual NMI interrupts are set.
//!
//! \param nmiFlags Bit mask of the NMI interrupts that user wants to clear.
//! The bit format of this parameter is same as of the NMIFLG register. These
//! defines are provided:
//! - \b SYSCTL_NMI_NMIINT - NMI Interrupt Flag
//! - \b SYSCTL_NMI_CLOCKFAIL - Clock Fail Interrupt Flag
//! - \b SYSCTL_NMI_RAMUNCERR - RAM Uncorrectable Error NMI Flag
//! - \b SYSCTL_NMI_FLUNCERR - Flash Uncorrectable Error NMI Flag
//! - \b SYSCTL_NMI_CPU1HWBISTERR - HW BIST Error NMI Flag
//! - \b SYSCTL_NMI_SYSDBGNMI - System Debug Module NMI Flag
//! - \b SYSCTL_NMI_CLBNMI - Reconfigurable Logic NMI Flag
//! - \b SYSCTL_NMI_SWERR - SW Error Force NMI Flag
//! - \b SYSCTL_NMI_CRC_FAIL - BGCRC calculation failed.
//!
//! Check if interrupt flags corresponding to the passed in bit mask are
//! asserted.
//!
//! \return \b true if any of the NMI asked for in the parameter bit mask
//! is set. \b false if none of the NMI requested in the parameter bit mask are
//! set.
//
//*****************************************************************************
static inline _Bool
SysCtl_isNMIFlagSet(uint16_t nmiFlags)
{
//
// Check the arguments.
// Make sure if reserved bits are not set in nmiFlags.
//
;
//
// Read the flag register and return true if any of them are set.
//
return(((*((volatile uint16_t *)(0x00007060U + 0x1U))) & nmiFlags) != 0U);
}
//*****************************************************************************
//
//! Function to clear individual NMI interrupts.
//!
//! \param nmiFlags Bit mask of the NMI interrupts that user wants to clear.
//! The bit format of this parameter is same as of the NMIFLG register. These
//! defines are provided:
//! - \b SYSCTL_NMI_NMIINT - NMI Interrupt Flag
//! - \b SYSCTL_NMI_CLOCKFAIL - Clock Fail Interrupt Flag
//! - \b SYSCTL_NMI_RAMUNCERR - RAM Uncorrectable Error NMI Flag
//! - \b SYSCTL_NMI_FLUNCERR - Flash Uncorrectable Error NMI Flag
//! - \b SYSCTL_NMI_CPU1HWBISTERR - HW BIST Error NMI Flag
//! - \b SYSCTL_NMI_SYSDBGNMI - System Debug Module NMI Flag
//! - \b SYSCTL_NMI_CLBNMI - Reconfigurable Logic NMI Flag
//! - \b SYSCTL_NMI_SWERR - SW Error Force NMI Flag
//! - \b SYSCTL_NMI_CRC_FAIL - BGCRC calculation failed.
//!
//! Clear NMI interrupt flags that correspond with the passed in bit mask.
//!
//! \b Note: The NMI Interrupt flag is always cleared by default and
//! therefore doesn't have to be included in the bit mask.
//!
//! \return None.
//
//*****************************************************************************
static inline void
SysCtl_clearNMIStatus(uint16_t nmiFlags)
{
//
// Check the arguments.
// Make sure if reserved bits are not set in nmiFlags.
//
;
__eallow();
//
// Clear the individual flags as well as NMI Interrupt flag
//
(*((volatile uint16_t *)(0x00007060U + 0x2U))) = nmiFlags;
(*((volatile uint16_t *)(0x00007060U + 0x2U))) = 0x1U;
__edis();
}
//*****************************************************************************
//
//! Clear all the NMI Flags that are currently set.
//!
//! \return None.
//
//*****************************************************************************
static inline void
SysCtl_clearAllNMIFlags(void)
{
uint16_t nmiFlags;
//
// Read the flag status register and then write to the clear register,
// clearing all the flags that were returned plus the NMI flag.
//
__eallow();
nmiFlags = SysCtl_getNMIFlagStatus();
(*((volatile uint16_t *)(0x00007060U + 0x2U))) = nmiFlags;
(*((volatile uint16_t *)(0x00007060U + 0x2U))) = 0x1U;
__edis();
}
//*****************************************************************************
//
//! Function to force individual NMI interrupt fail flags
//!
//! \param nmiFlags Bit mask of the NMI interrupts that user wants to clear.
//! The bit format of this parameter is same as of the NMIFLG register. These
//! defines are provided:
//! - \b SYSCTL_NMI_NMIINT - NMI Interrupt Flag
//! - \b SYSCTL_NMI_CLOCKFAIL - Clock Fail Interrupt Flag
//! - \b SYSCTL_NMI_RAMUNCERR - RAM Uncorrectable Error NMI Flag
//! - \b SYSCTL_NMI_FLUNCERR - Flash Uncorrectable Error NMI Flag
//! - \b SYSCTL_NMI_CPU1HWBISTERR - HW BIST Error NMI Flag
//! - \b SYSCTL_NMI_SYSDBGNMI - System Debug Module NMI Flag
//! - \b SYSCTL_NMI_CLBNMI - Reconfigurable Logic NMI Flag
//! - \b SYSCTL_NMI_SWERR - SW Error Force NMI Flag
//! - \b SYSCTL_NMI_CRC_FAIL - BGCRC calculation failed.
//!
//! \return None.
//
//*****************************************************************************
static inline void
SysCtl_forceNMIFlags(uint16_t nmiFlags)
{
//
// Check the arguments.
// Make sure if reserved bits are not set in nmiFlags.
//
;
__eallow();
//
// Set the Flags for the individual interrupts in the NMI flag
// force register
//
(*((volatile uint16_t *)(0x00007060U + 0x3U))) |= nmiFlags;
__edis();
}
//*****************************************************************************
//
//! Gets the NMI watchdog counter value.
//!
//! \b Note: The counter is clocked at the SYSCLKOUT rate.
//!
//! \return Returns the NMI watchdog counter register's current value.
//
//*****************************************************************************
static inline uint16_t
SysCtl_getNMIWatchdogCounter(void)
{
//
// Read and return the NMI watchdog counter register's value.
//
return((*((volatile uint16_t *)(0x00007060U + 0x4U))));
}
//*****************************************************************************
//
//! Sets the NMI watchdog period value.
//!
//! \param wdPeriod is the 16-bit value at which a reset is generated.
//!
//! This function writes to the NMI watchdog period register that holds the
//! value to which the NMI watchdog counter is compared. When the two registers
//! match, a reset is generated. By default, the period is 0xFFFF.
//!
//! \note If a value smaller than the current counter value is passed into the
//! \e wdPeriod parameter, a NMIRSn will be forced.
//!
//! \return None.
//
//*****************************************************************************
static inline void
SysCtl_setNMIWatchdogPeriod(uint16_t wdPeriod)
{
__eallow();
//
// Write to the period register.
//
(*((volatile uint16_t *)(0x00007060U + 0x5U))) = wdPeriod;
__edis();
}
//*****************************************************************************
//
//! Gets the NMI watchdog period value.
//!
//! \return Returns the NMI watchdog period register's current value.
//
//*****************************************************************************
static inline uint16_t
SysCtl_getNMIWatchdogPeriod(void)
{
//
// Read and return the NMI watchdog period register's value.
//
return((*((volatile uint16_t *)(0x00007060U + 0x5U))));
}
//*****************************************************************************
//
//! Read NMI Shadow Flags.
//!
//! Read the current state of individual NMI interrupts
//!
//! \return Value of NMISHDFLG register. These defines are provided to decode
//! the value:
//! - \b SYSCTL_NMI_NMIINT - NMI Interrupt Flag
//! - \b SYSCTL_NMI_CLOCKFAIL - Clock Fail Interrupt Flag
//! - \b SYSCTL_NMI_RAMUNCERR - RAM Uncorrectable Error NMI Flag
//! - \b SYSCTL_NMI_FLUNCERR - Flash Uncorrectable Error NMI Flag
//! - \b SYSCTL_NMI_CPU1HWBISTERR - HW BIST Error NMI Flag
//! - \b SYSCTL_NMI_SYSDBGNMI - System Debug Module NMI Flag
//! - \b SYSCTL_NMI_CLBNMI - Reconfigurable Logic NMI Flag
//! - \b SYSCTL_NMI_SWERR - SW Error Force NMI Flag
//! - \b SYSCTL_NMI_CRC_FAIL - BGCRC calculation failed.
//
//*****************************************************************************
static inline uint32_t
SysCtl_getNMIShadowFlagStatus(void)
{
//
// Read and return the current value of the NMI shadow flag register.
//
return((*((volatile uint16_t *)(0x00007060U + 0x6U))));
}
//*****************************************************************************
//
//! Check if the individual NMI shadow flags are set.
//!
//! \param nmiFlags Bit mask of the NMI interrupts that user wants to clear.
//! The bit format of this parameter is same as of the NMIFLG register. These
//! defines are provided:
//! - \b SYSCTL_NMI_NMIINT - NMI Interrupt Flag
//! - \b SYSCTL_NMI_CLOCKFAIL - Clock Fail Interrupt Flag
//! - \b SYSCTL_NMI_RAMUNCERR - RAM Uncorrectable Error NMI Flag
//! - \b SYSCTL_NMI_FLUNCERR - Flash Uncorrectable Error NMI Flag
//! - \b SYSCTL_NMI_CPU1HWBISTERR - HW BIST Error NMI Flag
//! - \b SYSCTL_NMI_SYSDBGNMI - System Debug Module NMI Flag
//! - \b SYSCTL_NMI_CLBNMI - Reconfigurable Logic NMI Flag
//! - \b SYSCTL_NMI_SWERR - SW Error Force NMI Flag
//! - \b SYSCTL_NMI_CRC_FAIL - BGCRC calculation failed.
//!
//! Check if interrupt flags corresponding to the passed in bit mask are
//! asserted.
//!
//! \return \b true if any of the NMI asked for in the parameter bit mask
//! is set. \b false if none of the NMI requested in the parameter bit mask are
//! set.
//
//*****************************************************************************
static inline _Bool
SysCtl_isNMIShadowFlagSet(uint16_t nmiFlags)
{
//
// Check the arguments.
// Make sure if reserved bits are not set in nmiFlags.
//
;
//
// Read the flag register and return true if any of them are set.
//
return(((*((volatile uint16_t *)(0x00007060U + 0x6U))) & nmiFlags) != 0U);
}
//*****************************************************************************
//
//! Enable the missing clock detection (MCD) Logic
//!
//! \return None.
//
//*****************************************************************************
static inline void
SysCtl_enableMCD(void)
{
__eallow();
(*((volatile uint16_t *)(0x0005D200U + 0x2EU))) &= ~(0x4U);
__edis();
}
//*****************************************************************************
//
//! Disable the missing clock detection (MCD) Logic
//!
//! \return None.
//
//*****************************************************************************
static inline void
SysCtl_disableMCD(void)
{
__eallow();
(*((volatile uint16_t *)(0x0005D200U + 0x2EU))) |= 0x4U;
__edis();
}
//*****************************************************************************
//
//! Get the missing clock detection Failure Status
//!
//! \note A failure means the oscillator clock is missing
//!
//! \return Returns \b true if a failure is detected or \b false if a
//! failure isn't detected
//
//*****************************************************************************
static inline _Bool
SysCtl_isMCDClockFailureDetected(void)
{
//
// Check the status bit to determine failure
//
return(((*((volatile uint16_t *)(0x0005D200U + 0x2EU))) & 0x1U) != 0U);
}
//*****************************************************************************
//
//! Reset the missing clock detection logic after clock failure
//!
//! \return None.
//
//*****************************************************************************
static inline void
SysCtl_resetMCD(void)
{
__eallow();
(*((volatile uint16_t *)(0x0005D200U + 0x2EU))) |= 0x2U;
__edis();
}
//*****************************************************************************
//
//! Re-connect missing clock detection clock source to stop simulating clock
//! failure
//!
//! \return None.
//
//*****************************************************************************
static inline void
SysCtl_connectMCDClockSource(void)
{
__eallow();
(*((volatile uint16_t *)(0x0005D200U + 0x2EU))) &= ~(0x8U);
__edis();
}
//*****************************************************************************
//
//! Disconnect missing clock detection clock source to simulate clock failure.
//! This is for testing the MCD functionality.
//!
//! \return None.
//
//*****************************************************************************
static inline void
SysCtl_disconnectMCDClockSource(void)
{
__eallow();
(*((volatile uint16_t *)(0x0005D200U + 0x2EU))) |= 0x8U;
__edis();
}
//*****************************************************************************
//
//! Lock the Access Control Registers
//!
//! This function locks the access control registers and puts them in a
//! read-only state.
//!
//! \note Only a reset can unlock the access control registers.
//!
//! \return None.
//
//*****************************************************************************
static inline void
SysCtl_lockAccessControlRegs(void)
{
__eallow();
(*((volatile uint16_t *)(0x0005D500U + 0x1FEU))) |=
0x1U;
__edis();
}
//*****************************************************************************
//
//! Set the peripheral access control permissions
//!
//! \param peripheral is the selected peripheral
//! \param controller is the selected controller
//! \param permission is the selected access permissions
//!
//! This function sets the specified peripheral access control permissions for
//! the the specified controller
//!
//! The \e peripheral parameter can have one enumerated value in the format of
//! \b SYSCTL_ACCESS_X where X is the name of the peripheral instance to be
//! configured such as \b SYSCTL_ACCESS_ADCA.
//!
//! The \e controller parameter can have one the following enumerated values:
//! - \b SYSCTL_ACCESS_CPU1
//! - \b SYSCTL_ACCESS_CLA1
//! - \b SYSCTL_ACCESS_DMA1
//! - \b SYSCTL_ACCESS_HIC
//!
//! The \e permission parameter can have one the following enumerated values:
//! - \b SYSCTL_ACCESS_FULL - Full Access for both read and write
//! - \b SYSCTL_ACCESS_PROTECTED - Protected read access such that FIFOs, clear
//! on read registers are not changed, and no
//! write access
//! - \b SYSCTL_ACCESS_NONE - No read or write access
//!
//! \return None.
//
//*****************************************************************************
static inline void
SysCtl_setPeripheralAccessControl(SysCtl_AccessPeripheral peripheral,
SysCtl_AccessController controller,
SysCtl_AccessPermission permission)
{
//
// Set controller permissions for specified peripheral. Each controller has
// two bits dedicated to its permission setting.
//
__eallow();
(*((volatile uint16_t *)(0x0005D500U + (uint16_t)peripheral))) =
((*((volatile uint16_t *)(0x0005D500U + (uint16_t)peripheral))) &
~(0x3U << (uint16_t)controller)) |
((uint16_t)permission << (uint16_t)controller);
__edis();
}
//*****************************************************************************
//
//! Get the peripheral access control permissions
//!
//! \param peripheral is the selected peripheral
//! \param controller is the selected controller
//!
//! This function gets the specified peripheral access control permissions for
//! the the specified controller
//!
//! The \e peripheral parameter can have one enumerated value in the format of
//! \b SYSCTL_ACCESS_X where X is the name of the peripheral instance to be
//! configured such as \b SYSCTL_ACCESS_ADCA.
//!
//! The \e controller parameter can have one the following enumerated values:
//! - \b SYSCTL_ACCESS_CPU1
//! - \b SYSCTL_ACCESS_CLA1
//! - \b SYSCTL_ACCESS_DMA1
//! - \b SYSCTL_ACCESS_HIC
//!
//! \return Returns one of the following enumerated permission values:
//! - \b SYSCTL_ACCESS_FULL - Full Access for both read and write
//! - \b SYSCTL_ACCESS_PROTECTED - Protected read access such that FIFOs, clear
//! on read registers are not changed, and no
//! write access
//! - \b SYSCTL_ACCESS_NONE - No read or write access
//
//*****************************************************************************
static inline uint16_t
SysCtl_getPeripheralAccessControl(SysCtl_AccessPeripheral peripheral,
SysCtl_AccessController controller)
{
//
// Read controller permissions for specified peripheral. Each controller has
// two bits dedicated to its permission setting.
//
return(((*((volatile uint16_t *)(0x0005D500U + (uint16_t)peripheral))) >>
(uint16_t)controller) & 0x3U);
}
//*****************************************************************************
//
//! Configures the sync output source.
//!
//! \param syncSrc is sync output source selection.
//!
//! This function configures the sync output source from the ePWM modules. The
//! \e syncSrc parameter is a value \b SYSCTL_SYNC_OUT_SRC_XXXX, where XXXX is
//! a sync signal coming from an ePWM such as SYSCTL_SYNC_OUT_SRC_EPWM1SYNCOUT
//!
//! \return None.
//
//*****************************************************************************
static inline void
SysCtl_setSyncOutputConfig(SysCtl_SyncOutputSource syncSrc)
{
//
// Write the sync output source selection to the appropriate register.
//
__eallow();
(*((volatile uint32_t *)(0x00007940U + 0x0U))) =
((*((volatile uint32_t *)(0x00007940U + 0x0U))) &
~((uint32_t)0x1F000000U)) |
((uint32_t)syncSrc << 24U);
__edis();
}
//*****************************************************************************
//
//! Enables ePWM SOC signals to drive an external (off-chip) ADCSOC signal.
//!
//! \param adcsocSrc is a bit field of the selected signals to be enabled
//!
//! This function configures which ePWM SOC signals are enabled as a source for
//! either ADCSOCAO or ADCSOCBO. The \e adcsocSrc parameter takes a logical OR
//! of \b SYSCTL_ADCSOC_SRC_PWMxSOCA/B values that correspond to different
//! signals.
//!
//! \return None.
//
//*****************************************************************************
static inline void
SysCtl_enableExtADCSOCSource(uint32_t adcsocSrc)
{
//
// Set the bits that correspond to signal to be enabled.
//
__eallow();
(*((volatile uint32_t *)(0x00007940U + 0x2U))) |= adcsocSrc;
__edis();
}
//*****************************************************************************
//
//! Disables ePWM SOC signals from driving an external ADCSOC signal.
//!
//! \param adcsocSrc is a bit field of the selected signals to be disabled
//!
//! This function configures which ePWM SOC signals are disabled as a source
//! for either ADCSOCAO or ADCSOCBO. The \e adcsocSrc parameter takes a logical
//! OR of \b SYSCTL_ADCSOC_SRC_PWMxSOCA/B values that correspond to different
//! signals.
//!
//! \return None.
//
//*****************************************************************************
static inline void
SysCtl_disableExtADCSOCSource(uint32_t adcsocSrc)
{
//
// Clear the bits that correspond to signal to be disabled.
//
__eallow();
(*((volatile uint32_t *)(0x00007940U + 0x2U))) &= ~adcsocSrc;
__edis();
}
//*****************************************************************************
//
//! Locks the SOC Select of the Trig X-BAR.
//!
//! This function locks the external ADC SOC select of the Trig X-BAR.
//!
//! \return None.
//
//*****************************************************************************
static inline void
SysCtl_lockExtADCSOCSelect(void)
{
//
// Lock the ADCSOCOUTSELECT bit of the SYNCSOCLOCK register.
//
__eallow();
(*((volatile uint32_t *)(0x00007940U + 0x4U))) =
0x2U;
__edis();
}
//*****************************************************************************
//
//! Locks the Sync Select of the Trig X-BAR.
//!
//! This function locks Sync Input and Output Select of the Trig X-BAR.
//!
//! \return None.
//
//*****************************************************************************
static inline void
SysCtl_lockSyncSelect(void)
{
//
// Lock the SYNCSELECT register.
//
__eallow();
(*((volatile uint32_t *)(0x00007940U + 0x4U))) = 0x1U;
__edis();
}
//*****************************************************************************
//
//! Get the Device Silicon Revision ID
//!
//! This function returns the silicon revision ID for the device.
//!
//! \note This API is applicable only for the CPU1 subsystem.
//!
//! \return Returns the silicon revision ID value.
//
//*****************************************************************************
static inline uint32_t
SysCtl_getDeviceRevision(void)
{
//
// Returns the device silicon revision ID
//
return((*((volatile uint32_t *)(0x0005D000U + 0xCU))));
}
//*****************************************************************************
//
//! Gets the error status of the Efuse
//!
//! The function provides both the Efuse Autoload & the Efuse Self Test
//! Error Status.
//!
//! \note This API is applicable only for the CPU1 subsystem.
//!
//! \return Fuse Error status.
//
//*****************************************************************************
static inline uint16_t
SysCtl_getEfuseError(void)
{
return((*((volatile uint16_t *)(0x0005D000U + 0x74U))));
}
//*****************************************************************************
//
//! Sets up XCLK divider.
//!
//! \param divider is the value that configures the divider.
//!
//! This function sets up the XCLK divider. There is only one
//! divider that scales INTOSC1 to XCLK.
//!
//! The \e divider parameter can have one enumerated value from
//! SysCtl_XClkDivider
//!
//! \return None.
//
//*****************************************************************************
static inline void
SysCtl_setXClk(SysCtl_XClkDivider divider)
{
//
// Clears the divider then configures it.
//
__eallow();
(*((volatile uint16_t *)(0x0005D200U + 0x28U))) =
((*((volatile uint16_t *)(0x0005D200U + 0x28U))) &
~(0x3U)) |
(uint16_t)divider;
__edis();
}
//*****************************************************************************
//
//! Sets up PLLSYSCLK divider.
//!
//! \param divider is the value that configures the divider.
//!
//! This function sets up the PLLSYSCLK divider. There is only one
//! divider that scales PLLSYSCLK to generate the system clock.
//!
//! The \e divider parameter can have any value (even/odd) from 1-126
//!
//! \return None.
//!
//! \note Please make sure to check if the PLL is locked and valid using the
//! SysCtl_isPLLValid() before setting the divider.
//
//*****************************************************************************
static inline void
SysCtl_setPLLSysClk(uint16_t divider)
{
//
// Clears the divider then configures it.
//
__eallow();
if(divider == 1U)
{
(*((volatile uint16_t *)(0x0005D200U + 0x22U))) = 0U;
}
else
{
(*((volatile uint16_t *)(0x0005D200U + 0x22U))) = (divider / 2U) |
((divider % 2U) * 0x100U);
}
__edis();
}
//*****************************************************************************
//
//! Sets up MCAN Clk divider.
//!
//! \param divider is the value that configures the divider.
//!
//! This function sets up the MCANCLK divider. There is only one
//! divider that scales MCAN clock.
//!
//! The \e divider parameter can have one enumerated value from
//! SysCtl_MCANClkDivider
//!
//! \return None.
//
//*****************************************************************************
static inline void
SysCtl_setMCANClk(SysCtl_MCANClkDivider divider)
{
//
// Clears the divider then configures it.
//
__eallow();
(*((volatile uint16_t *)(0x0005D200U + 0x24U))) =
((*((volatile uint16_t *)(0x0005D200U + 0x24U))) &
~(0x1F00U)) |
((uint16_t)divider << 8U);
__edis();
}
//*****************************************************************************
//
//! Sets up CPU Timer 2 CLK source & divider.
//!
//! \param divider is the value that configures the divider.
//! \param source is the source for the clock divider
//!
//! This function sets up the CPU Timer 2 CLK divider based on the source that
//! is selected. There is only one divider that scales the "source" to
//! CPU Timer 2 CLK.
//!
//! The \e divider parameter can have one enumerated value from
//! SysCtl_Cputimer2ClkDivider
//! The \e source parameter can have one enumerated value from
//! SysCtl_Cputimer2ClkSource
//!
//! \return None.
//
//*****************************************************************************
static inline void
SysCtl_setCputimer2Clk(SysCtl_Cputimer2ClkDivider divider,
SysCtl_Cputimer2ClkSource source)
{
//
// Clears the divider & the source, then configures it.
//
__eallow();
(*((volatile uint16_t *)(0x0005D300U + 0x7CU))) =
((*((volatile uint16_t *)(0x0005D300U + 0x7CU))) &
~(0x7U |
0x38U));
(*((volatile uint16_t *)(0x0005D300U + 0x7CU))) |=
((uint16_t)divider << 3U) |
((uint16_t)source << 0U);
__edis();
}
//*****************************************************************************
//
//! Gets the PIE Vector Fetch Error Handler Routine Address.
//!
//! The function indicates the address of the PIE Vector Fetch Error
//! handler routine.
//!
//! \return Error Handler Address.
//!
//! \note Its the responsibility of user to initialize this register. If this
//! register is not initialized, a default error handler at address
//! 0x3fffbe will get executed.
//
//*****************************************************************************
static inline uint32_t
SysCtl_getPIEVErrAddr(void)
{
return((*((volatile uint32_t *)(0x0005D300U + 0xAU))));
}
//*****************************************************************************
//
//! Simulates a reset to the CPU1
//!
//! \param rstCauses is the cause for the reset.
//!
//! The \e rstCauses parameter can be one/ more of these values:
//! SYSCTL_SIMRESET_CPU1RSN or SYSCTL_SIMRESET_XRSN
//!
//! \return None.
//!
//! \note This API exists only on CPU1
//
//*****************************************************************************
static inline void
SysCtl_simulateReset(uint32_t rstCauses)
{
;
//
//Write will succeed only if a matching key value is written
//to the KEY field
//Sets the appropriate reset bit.
//
(*((volatile uint32_t *)(0x0005D300U + 0x70U))) = (rstCauses |
(0xA5A50000U &
0xFFFF0000U));
}
//*****************************************************************************
//
//! Gets the status of interrupts due to multiple different
//! errors in the system.
//!
//! \return the Interrupt generated on the system.
//! The values can be one/ more from:
//! - SYSCTL_STATUS_AES_BUS_ERROR
//! - SYSCTL_STATUS_EPG1_INT
//
//*****************************************************************************
static inline uint32_t
SysCtl_getInterruptStatus(void)
{
return((*((volatile uint32_t *)(0x0005D400U + 0x10U))));
}
//*****************************************************************************
//
//! Clears the interrupts due to multiple different errors in the system.
//!
//! \param intFlags is the interrupt that needs to be cleared.
//!
//! The \e intFlags parameter are the Interrupts generated on errors in
//! the system that need to be cleared. The values can be one or more from:
//! - SYSCTL_STATUS_GINT
//! - SYSCTL_STATUS_AES_BUS_ERROR
//! - SYSCTL_STATUS_EPG1_INT
//!
//! \return None.
//
//*****************************************************************************
static inline void
SysCtl_clearInterruptStatus(uint32_t intFlags)
{
(*((volatile uint16_t *)(0x0005D400U + 0x12U))) |= (uint16_t)intFlags;
}
//*****************************************************************************
//
//! Sets the interrupts for the multiple different errors in the system.
//!
//! \param intFlags is the interrupt that needs to be set.
//!
//! The \e intFlags parameter are the Interrupts that can be set
//! for the errors in the system. The values can be one/ more from:
//! - SYSCTL_STATUS_AES_BUS_ERROR
//! - SYSCTL_STATUS_EPG1_INT
//!
//! \return None.
//!
//! \note This API is present only on CPU1.
//
//*****************************************************************************
static inline void
SysCtl_setInterruptStatus(uint32_t intFlags)
{
__eallow();
(*((volatile uint32_t *)(0x0005D400U + 0x14U))) =
(intFlags | (0xA5A50000U & 0xFF000000U));
__edis();
}
//*****************************************************************************
//
//! Gets the masked interrupts due to multiple different
//! errors in the system.
//!
//! \return the Interrupt generated on the system.
//! The values can be one/ more from:
//! - SYSCTL_STATUS_AES_BUS_ERROR
//! - SYSCTL_STATUS_EPG1_INT
//
//*****************************************************************************
static inline uint32_t
SysCtl_getInterruptStatusMask(void)
{
return((*((volatile uint32_t *)(0x0005D400U + 0x16U))));
}
//*****************************************************************************
//
//! Masks the interrupts for the multiple different errors in the system.
//!
//! \param intFlags is the interrupt that needs to be set.
//!
//! The \e intFlags parameter are the Interrupts that can be masked
//! for the errors in the system. The values can be one/ more from:
//! - SYSCTL_STATUS_AES_BUS_ERROR
//! - SYSCTL_STATUS_EPG1_INT
//!
//! \return None.
//!
//! \note This API is present only on CPU1.
//
//*****************************************************************************
static inline void
SysCtl_setInterruptStatusMask(uint32_t intFlags)
{
__eallow();
(*((volatile uint32_t *)(0x0005D400U + 0x16U))) =
(intFlags | (0xA5A50000U & 0xFF000000U));
__edis();
}
//*****************************************************************************
//
//! Check if One or more of the error sources triggered
//!
//! Following are the events/triggers that can indicate an error:
//!1. nmi interrupt on C28x
//!2. Watchdog reset
//!3. Error on a Pie vector fetch
//!4. Efuse error
//!5. nmi interrupt on CM
//!
//! \return \b true if the error is triggered
//! \b false if the error is not triggered
//
//*****************************************************************************
static inline _Bool
SysCtl_isErrorTriggered(void)
{
return(((*((volatile uint16_t *)(0x00007060U + 0x7U))) & 0x1U) != 0U);
}
//*****************************************************************************
//
//! Check if Error status pin is high or not
//!
//! \return \b true if the error status pin is high
//! \b false if the error status pin is low
//
//*****************************************************************************
static inline _Bool
SysCtl_getErrorPinStatus(void)
{
//
// Read and return the status of the ErrorPin
//
return(((*((volatile uint16_t *)(0x00007060U + 0x7U))) & 0x2U) != 0U);
}
//*****************************************************************************
//
//! Forces an error flag to set to indicate an error being generated.
//!
//! \return None.
//
//*****************************************************************************
static inline void
SysCtl_forceError(void)
{
__eallow();
(*((volatile uint16_t *)(0x00007060U + 0x9U))) |= 0x1U;
__edis();
}
//*****************************************************************************
//
//! Clears any error flag set due to error generated.
//!
//! \return None.
//
//*****************************************************************************
static inline void
SysCtl_clearError(void)
{
__eallow();
(*((volatile uint16_t *)(0x00007060U + 0x8U))) |= 0x1U;
__edis();
}
//*****************************************************************************
//
//! Selects the polarity of the error pin
//!
//! \param pol is the ERROR pin polarity
//!
//! The \e pol parameter can take any of the below values:
//! 0x0U: If an error is already triggered, Error pin will be driven
//! with a value of 0, else 1.
//! 0x1U: If an error is already triggered, Error pin will be driven
//! with a value of 1, else 0.
//!
//! \return None.
//
//*****************************************************************************
static inline void
SysCtl_selectErrPinPolarity(uint16_t pol)
{
__eallow();
//
//Configures the error pin polarity based on the provided polarity
//
if(pol == 1U)
{
(*((volatile uint16_t *)(0x00007060U + 0xAU))) |= 0x1U;
}
else
{
(*((volatile uint16_t *)(0x00007060U + 0xAU))) &= ~0x1U;
}
__edis();
}
//*****************************************************************************
//
//! Locks the Error control registers
//!
//! This function locks the Error configuration registers.
//!
//! \return None.
//!
//! \note The lock register is cleared only on a system reset.
//
//*****************************************************************************
static inline void
SysCtl_lockErrControl(void)
{
__eallow();
(*((volatile uint32_t *)(0x00007060U + 0xBU))) = 0x1U;
__edis();
}
//*****************************************************************************
//
//! Check if the MCAN wakeup event has occured.
//!
//! \return \b true if the MCAN wakeup event has occured.
//! \b false if the MCAN wakeup event has not occured.
//
//*****************************************************************************
static inline _Bool
SysCtl_isMCANWakeStatusSet(void)
{
//
// Read the MCAN wakeup event status and return true if set.
//
return(((*((volatile uint16_t *)(0x0005D300U + 0x98U))) &
0x1U) != 0U);
}
//*****************************************************************************
//
//! Clears the MCAN wakeup event status.
//!
//! This function clears the MCAN wakeup event status. To check if it was set
//! first, see SysCtl_isMCANWakeStatusSet().
//!
//! \return None.
//
//*****************************************************************************
static inline void
SysCtl_clearMCANWakeStatus(void)
{
//
// Clear the MCAN wakeup event status
//
(*((volatile uint16_t *)(0x0005D300U + 0x9AU))) |=
0x1U;
}
//*****************************************************************************
//
//! Sets the LFU_CPU configuration
//!
//! \param value is the value to be set.
//! - 0 : No pending requests
//! - 1 : LFU Request in progress
//!
//! \note This bit is used by compiler/application code for implementing CPU LFU
//!
//! \return None
//
//*****************************************************************************
static inline void
SysCtl_setLFUCPU(uint16_t value)
{
__eallow();
;
if(value == 0U)
{
(*((volatile uint32_t *)(0x00007FE0U + 0x0U))) &= ~0x1U;
}
else
{
(*((volatile uint32_t *)(0x00007FE0U + 0x0U))) |= 0x1U;
}
__edis();
}
//*****************************************************************************
//
//! Gets the LFU_CPU configuration
//!
//! \note This bit is used by compiler/application code for implementing CPU LFU
//!
//! \return 0 if No pending requests, 1 if LFU Request is in progress
//
//*****************************************************************************
static inline uint16_t
SysCtl_getLFUCPU(void)
{
return((((*((volatile uint32_t *)(0x00007FE0U + 0x0U))) &
0x1U) == 0U) ? 0U : 1U);
}
//*****************************************************************************
//
//! Sets the LFU_CLA configuration
//!
//! \param value is the value to be set.
//! - 0 : No pending requests
//! - 1 : LFU Request in progress
//!
//! \note This bit is used by compiler/application code for implementing CLA LFU
//!
//! \return None
//
//*****************************************************************************
static inline void
SysCtl_setLFUCLA1(uint16_t value)
{
__eallow();
;
if(value == 0U)
{
(*((volatile uint32_t *)(0x00007FE0U + 0x0U))) &= ~0x10U;
}
else
{
(*((volatile uint32_t *)(0x00007FE0U + 0x0U))) |= 0x10U;
}
__edis();
}
//*****************************************************************************
//
//! Gets the LFU_CLA configuration
//!
//! \note This bit is used by compiler/application code for implementing CLA LFU
//!
//! \return 0 if No pending requests, 1 if LFU Request is in progress
//
//*****************************************************************************
static inline uint16_t
SysCtl_getLFUCLA1(void)
{
return((((*((volatile uint32_t *)(0x00007FE0U + 0x0U))) &
0x10U) == 0U) ? 0U : 1U);
}
//*****************************************************************************
//
//! Swap PIE Vector Table to alternate location and swap LS0 and LS1
//!
//! \param swap Whether to enable or disable swap
//! - true : PIE Vector Table is swapped to alternate location.
//! LS0 and LS1 is swapped
//! - false : PIE vector table is mapped to the original location
//! LS0 and LS1 is mapped to original location
//!
//! \return None
//
//*****************************************************************************
static inline void
SysCtl_swapPieVectorAndLS01(_Bool swap)
{
__eallow();
if(swap)
{
(*((volatile uint32_t *)(0x00007FE0U + 0x0U))) |=
(0x1000U | 0x10000U);
}
else
{
(*((volatile uint32_t *)(0x00007FE0U + 0x0U))) &=
~(0x1000U | 0x10000U);
}
__edis();
}
//*****************************************************************************
//
//! Swap PIE Vector Table to alternate location
//!
//! \param swap Whether to enable or disable swap
//! - true : PIE Vector Table is swapped to alternate location
//! - false : PIE vector table is mapped to the original location
//!
//! \return None
//
//*****************************************************************************
static inline void
SysCtl_swapPieVector(_Bool swap)
{
__eallow();
if(swap)
{
(*((volatile uint32_t *)(0x00007FE0U + 0x0U))) |= 0x1000U;
}
else
{
(*((volatile uint32_t *)(0x00007FE0U + 0x0U))) &= ~0x1000U;
}
__edis();
}
//*****************************************************************************
//
//! Checks if the PIE Vector Table is swapped or not
//!
//! \param reg is the register to be set
//! \param value is the value to be set
//! \return true if the PIE Vector Table is mapped to original location,
//! false if PIE Vector Table is swapped to alternate location
//
//*****************************************************************************
static inline _Bool
SysCtl_isPieVectorSwap(void)
{
return(((*((volatile uint32_t *)(0x00007FE0U + 0x2U))) &
0x1000U) != 0U);
}
//*****************************************************************************
//
//! Swap LS0 and LS1
//!
//! \param swap Whether to enable or disable swap
//! - true : LS0 and LS1 is swapped
//! - false : LS0 and LS1 is mapped to original location
//!
//! \return None
//
//*****************************************************************************
static inline void
SysCtl_swapLS01(_Bool swap )
{
__eallow();
if(swap)
{
(*((volatile uint32_t *)(0x00007FE0U + 0x0U))) |= 0x10000U;
}
else
{
(*((volatile uint32_t *)(0x00007FE0U + 0x0U))) &= ~0x10000U;
}
__edis();
}
//*****************************************************************************
//
//! Checks if the LS0 and LS1 are swapped or not
//!
//! \param reg is the register to be set
//! \param value is the value to be set
//! \return true if the LS0 and LS1 is mapped to original location,
//! false if LS0 and LS1 is swapped
//
//*****************************************************************************
static inline _Bool
SysCtl_isLS01Swap(void)
{
return(((*((volatile uint32_t *)(0x00007FE0U + 0x2U))) &
0x10000U) != 0U);
}
//*****************************************************************************
//
//! Sets the user register.
//!
//! \param reg is the register to be set
//! \param value is the value to be set
//!
//! This function sets specified LFU user register.
//! The \e value parameter can have one enumerated value from
//! SysCtl_LFUUserRegister.
//!
//! \return None.
//
//*****************************************************************************
static inline void
SysCtl_setLFUUserRegister(SysCtl_LFUUserRegister reg, uint32_t value)
{
__eallow();
(*((volatile uint32_t *)(0x00007FE0U + 0x10U + ((uint32_t)reg * 2UL)))) = value;
__edis();
}
//*****************************************************************************
//
//! Gets the user register.
//!
//! \param reg is the register to be set
//!
//! This function sets specified LFU user register.
//! The \e value parameter can have one enumerated value from
//! SysCtl_LFUUserRegister.
//!
//! \return value of the specified register.
//
//*****************************************************************************
static inline uint32_t
SysCtl_getLFUUserRegister(SysCtl_LFUUserRegister reg)
{
return((*((volatile uint32_t *)(0x00007FE0U + 0x10U + ((uint32_t)reg * 2UL)))));
}
//*****************************************************************************
//
//! Locks the LFUConfig register
//!
//! \return None.
//
//*****************************************************************************
static inline void
SysCtl_lockLFUConfigRegister(void)
{
(*((volatile uint32_t *)(0x00007FE0U + 0x1CU))) |= 0x1U;
}
//*****************************************************************************
//
//! Locks the LFU User registers
//!
//! \param register to be locked
//! \return None.
//
//*****************************************************************************
static inline void
SysCtl_lockLFUUserRegister(SysCtl_LFUUserRegister reg)
{
(*((volatile uint32_t *)(0x00007FE0U + 0x1CU))) |= 0x100UL << (uint32_t)reg;
}
//*****************************************************************************
//
//! Unlocks the LFUConfig register
//!
//! \return None.
//
//*****************************************************************************
static inline void
SysCtl_unlockLFUConfigRegister(void)
{
(*((volatile uint32_t *)(0x00007FE0U + 0x1CU))) &= ~0x1U;
}
//*****************************************************************************
//
//! Unlocks the LFU User registers
//!
//! \param register to be unlocked
//! \return None.
//
//*****************************************************************************
static inline void
SysCtl_unlockLFUUserRegister(SysCtl_LFUUserRegister reg)
{
(*((volatile uint32_t *)(0x00007FE0U + 0x1CU))) &= ~(0x100UL << (uint32_t)reg);
}
//*****************************************************************************
//
//! Commits the LFUConfig register
//!
//! \return None.
//
//*****************************************************************************
static inline void
SysCtl_commitLFUConfigRegister(void)
{
(*((volatile uint32_t *)(0x00007FE0U + 0x1EU))) |= 0x1U;
}
//*****************************************************************************
//
//! Commits the LFU User registers
//!
//! \param register to be committed
//! \return None.
//
//*****************************************************************************
static inline void
SysCtl_commitLFUUserRegister(SysCtl_LFUUserRegister reg)
{
(*((volatile uint32_t *)(0x00007FE0U + 0x1EU))) |= 0x100UL << (uint32_t)reg;
}
//*****************************************************************************
//
//! Delays for a fixed number of cycles.
//!
//! \param count is the number of delay loop iterations to perform.
//!
//! This function generates a constant length delay using assembly code. The
//! loop takes 5 cycles per iteration plus 9 cycles of overhead.
//!
//! \note If count is equal to zero, the loop will underflow and run for a
//! very long time.
//!
//! \note Refer to the macro DEVICE_DELAY_US(x) in device.h which can be used to
//! insert a delay in microseconds.
//!
//! \return None.
//
//*****************************************************************************
extern void
SysCtl_delay(uint32_t count);
//*****************************************************************************
//
//! Calculates the system clock frequency (SYSCLK).
//!
//! \param clockInHz is the frequency of the oscillator clock source (OSCCLK).
//!
//! This function determines the frequency of the system clock based on the
//! frequency of the oscillator clock source (from \e clockInHz) and the PLL
//! and clock divider configuration registers.
//!
//! \return Returns the system clock frequency. If a missing clock is detected,
//! the function will return the INTOSC1 frequency. This needs to be
//! corrected and cleared (see SysCtl_resetMCD()) before trying to call this
//! function again.
//
//*****************************************************************************
extern uint32_t
SysCtl_getClock(uint32_t clockInHz);
//*****************************************************************************
//
//! Configures the clocking of the device.
//!
//! \param config is the required configuration of the device clocking.
//!
//! This function configures the clocking of the device. The input crystal
//! frequency, oscillator to be used, use of the PLL, and the system clock
//! divider are all configured with this function.
//!
//! The \e config parameter is the OR of several different values, many of
//! which are grouped into sets where only one can be chosen.
//!
//! - The system clock divider is chosen with the macro \b SYSCTL_SYSDIV(x)
//! where x is either 1 or an even value up to 126.
//!
//! - The use of the PLL is chosen with ONLY one of the below modes:
//! \b SYSCTL_PLL_ENABLE - This is to Enable the PLL Clock to the System
//! or
//! \b SYSCTL_PLL_BYPASS -This is to Bypass the PLLCLK from the System,
//! this will also power up the PLL if the user desires to power up the PLL
//! but not use it for System.
//! or
//! \b SYSCTL_PLL_DISABLE-This is to Power Down the PLL and Bypass the
//! PLLCLK to the System.
//!
//! - The integer multiplier is chosen \b SYSCTL_IMULT(x) where x is a value
//! from 1 to 127.
//!
//!
//! - The oscillator source chosen with \b SYSCTL_OSCSRC_OSC2,
//! \b SYSCTL_OSCSRC_XTAL, \b SYSCTL_OSCSRC_XTAL_SE or \b SYSCTL_OSCSRC_OSC1.
//!
//! This function uses the DCC to check that the PLLRAWCLK is running at the
//! expected rate. If you are using the DCC, you must back up its configuration
//! before calling this function and restore it afterward.
//! Locking PLL sequence is only done if the multipliers are updated.
//!
//! \note See your device errata for more details about locking the PLL.
//!
//! \return Returns \b false if a missing clock error is detected. This needs
//! to be cleared (see SysCtl_resetMCD()) before trying to call this function
//! again. Also, returns \b false if the PLLRAWCLK is not running and its
//! expected rate. Otherwise, returns \b true.
//
//*****************************************************************************
extern _Bool
SysCtl_setClock(uint32_t config);
//*****************************************************************************
//
//! Validates PLL Raw Clock Frequency (PLLRAWCLK)
//!
//! \param base is the DCC module base address
//! \param oscSource is the Clock Source for the PLL that is also used for DCC
//! \param pllMultDiv has the PLL Multiplier Register configuration which
//! include integer multiplier and divider values used to configure the
//! DCC Counter1 clock
//!
//! This function uses DCC module to validate the PLL clock frequency.
//! It uses oscSource as a reference clock for DCC, and PLL is used as clock
//! under test. As long as the Counter0 (running of oscSource) & Counter1
//! (running of PLL) expire at the same time, DCC will not generate an Error.
//! This function gives 100 attempts for PLL to lock and make sure frequency
//! is as expected.
//!
//! \note This function does not validate if PLL output frequency (PLLRAWCLK)
//! is within the operating range as per the datasheet.
//!
//! - The \e oscSource parameter is the oscillator source chosen with
//! \b SYSCTL_OSCSRC_OSC2, \b SYSCTL_OSCSRC_XTAL, \b SYSCTL_OSCSRC_XTAL_SE
//! or \b SYSCTL_OSCSRC_OSC1.
//!
//! - The \e pllMultDiv parameter is a bitwise OR of \b SYSCTL_IMULT(x)
//! where x is a value from 1 to 127 and both of the following divider
//! values which is chosen with the macro \b SYSCTL_REFDIV(x) and
//! SYSCTL_ODIV(x) where x is a value from 1 to 32 and can be different
//! for both macros.
//!
//! \return Returns \b true if the DCCSTATUS error flag is not set.
//! Otherwise, returns \b false.
//
//*****************************************************************************
extern _Bool
SysCtl_isPLLValid(uint32_t base, uint32_t oscSource, uint32_t pllMultDiv);
//*****************************************************************************
//
//! Configures the external oscillator for the clocking of the device.
//!
//! This function configures the external oscillator (XTAL) to be used for the
//! clocking of the device in crystal mode. It follows the procedure to turn on
//! the oscillator, wait for it to power up, and select it as the source of the
//! system clock.
//!
//! Please note that this function blocks while it waits for the XTAL to power
//! up. If the XTAL does not manage to power up properly, the function will
//! loop for a long time. It is recommended that you modify this function to
//! add an appropriate timeout and error-handling procedure.
//!
//! \return None.
//
//*****************************************************************************
extern void
SysCtl_selectXTAL(void);
//*****************************************************************************
//
//! Configures the external oscillator for the clocking of the device in
//! single-ended mode.
//!
//! This function configures the external oscillator (XTAL) to be used for the
//! clocking of the device in single-ended mode. It follows the procedure to
//! turn on the oscillator, wait for it to power up, and select it as the
//! source of the system clock.
//!
//! Please note that this function blocks while it waits for the XTAL to power
//! up. If the XTAL does not manage to power up properly, the function will
//! loop for a long time. It is recommended that you modify this function to
//! add an appropriate timeout and error-handling procedure.
//!
//! \return None.
//
//*****************************************************************************
extern void
SysCtl_selectXTALSingleEnded(void);
//*****************************************************************************
//
//! Selects the oscillator to be used for the clocking of the device.
//!
//! \param oscSource is the oscillator source to be configured.
//!
//! This function configures the oscillator to be used in the clocking of the
//! device. The \e oscSource parameter may take a value of
//! \b SYSCTL_OSCSRC_OSC2, \b SYSCTL_OSCSRC_XTAL, \b SYSCTL_OSCSRC_XTAL_SE, or
//! \b SYSCTL_OSCSRC_OSC1.
//!
//! \sa SysCtl_turnOnOsc()
//!
//! \return None.
//
//*****************************************************************************
extern void
SysCtl_selectOscSource(uint32_t oscSource);
//*****************************************************************************
//
//! Calculates the low-speed peripheral clock frequency (LSPCLK).
//!
//! \param clockInHz is the frequency of the oscillator clock source (OSCCLK).
//!
//! This function determines the frequency of the low-speed peripheral clock
//! based on the frequency of the oscillator clock source (from \e clockInHz)
//! and the PLL and clock divider configuration registers.
//!
//! \return Returns the low-speed peripheral clock frequency.
//
//*****************************************************************************
extern uint32_t
SysCtl_getLowSpeedClock(uint32_t clockInHz);
//*****************************************************************************
//
//! Get the device part parametric value
//!
//! \param parametric is the requested device parametric value
//!
//! This function gets the device part parametric value.
//!
//! The \e parametric parameter can have one the following enumerated values:
//! - \b SYSCTL_DEVICE_QUAL - Device Qualification Status
//! - \b SYSCTL_DEVICE_PINCOUNT - Device Pin Count
//! - \b SYSCTL_DEVICE_INSTASPIN - Device InstaSPIN Feature Set
//! - \b SYSCTL_DEVICE_FLASH - Device Flash size (KB)
//! - \b SYSCTL_DEVICE_FAMILY - Device Family
//! - \b SYSCTL_DEVICE_PARTNO - Device Part Number
//! - \b SYSCTL_DEVICE_CLASSID - Device Class ID
//!
//! \note This API is applicable only for the CPU1 subsystem.
//!
//! \return Returns the specified parametric value.
//
//*****************************************************************************
extern uint16_t
SysCtl_getDeviceParametric(SysCtl_DeviceParametric parametric);
//*****************************************************************************
//
//! Configures & locks/unlocks the peripheral type
//!
//! \param type is the peripheral type that needs to be configured.
//! \param config is the configuration done to the peripheral which is
//! dependent on the peripheral type.
//! \param lock is to decide if writes for any further configuration is to
//! be allowed or not.
//!
//! The \e type parameter can be a value from the enumeration
//! SysCtl_SelType
//! The \e config parameter can be a value from the ones below:
//! 0x0U : disables the feature for the type.
//! 0x1U : enables the feature for the type.
//!
//! For ECAP: ECAP registers are EALLOW protected or not.
//! For SDFM: Data Ready conditions do not generate the SDFMINT.
//! & Each filter generates a separate data ready interrupts.
//!
//! The \e lock parameter can be a value from the ones below:
//! 0x1U : Write for any further configuration is not allowed.
//! 0x0U : Write for any further configuration is allowed.
//!
//! \note This API is applicable only for the CPU1 subsystem.
//!
//! \return None.
//
//*****************************************************************************
extern void
SysCtl_configureType(SysCtl_SelType type , uint16_t config, uint16_t lock);
//*****************************************************************************
//
//! Check if writes for any further configuration of peripheral types is to
//! be allowed or not.
//!
//! \param type is the peripheral type for which permissions are being checked
//!
//! \note This API is applicable only for the CPU1 subsystem.
//!
//! \return \b true if Write for any further configuration is not allowed.
//! \b false if Write for any further configuration is allowed.
//
//*****************************************************************************
extern _Bool
SysCtl_isConfigTypeLocked(SysCtl_SelType type);
//*****************************************************************************
//
//! Locks the Clock configuration registers
//!
//! \param registerName is clock configuration register which needs to
//! be locked.
//!
//! The \e registerName parameter can be a value from the enumeration
//! SysCtl_ClkRegSel
//!
//! \return None.
//!
//! \note The register is unlocked only on a system reset.
//
//*****************************************************************************
extern void
SysCtl_lockClkConfig(SysCtl_ClkRegSel registerName);
//*****************************************************************************
//
//! Locks the CPU system configuration registers
//!
//! \param registerName is CPU system configuration register which needs to
//! be locked.
//!
//! The \e registerName parameter can be a value from the enumeration
//! SysCtl_CpuRegSel
//!
//! \return None.
//!
//! \note The register is unlocked only on a system reset.
//
//*****************************************************************************
extern void
SysCtl_lockSysConfig (SysCtl_CpuRegSel registerName);
//*****************************************************************************
//
// Close the Doxygen group.
//! @}
//
//****************************************************************************
//*****************************************************************************
//
// Mark the end of the C bindings section for C++ compilers.
//
//*****************************************************************************
//
// The key value for RAM initialization
//
//
// RAM Initialization Register Mask
//
//
// The Parity disable key value
//
//*****************************************************************************
//
// Miscellaneous defines for Message ID Types
//
//*****************************************************************************
//*****************************************************************************
//
// These are the flags used by the flags parameter when calling
// the CAN_setupMessageObject() function.
//
//*****************************************************************************
//! This indicates that transmit interrupts should be enabled, or are enabled.
//! This indicates that receive interrupts should be enabled, or are
//! enabled.
//! This indicates that a message object will use or is using filtering
//! based on the object's message identifier.
//! This indicates that a message object will use or is using filtering
//! based on the direction of the transfer.
//! This indicates that a message object will use or is using message
//! identifier filtering based on the extended identifier.
//! This indicates that this message object is part of a FIFO structure and
//! not the final message object in a FIFO.
//! This indicates that a message object has no flags set.
//*****************************************************************************
//
// These definitions are used to specify interrupt sources to
// CAN_enableInterrupt() and CAN_disableInterrupt().
//
//*****************************************************************************
//! This flag is used to allow a CAN controller to generate error
//! interrupts.
//! This flag is used to allow a CAN controller to generate status
//! interrupts.
//! This flag is used to allow a CAN controller to generate interrupts
//! on interrupt line 0
//! This flag is used to allow a CAN controller to generate interrupts
//! on interrupt line 1
//*****************************************************************************
//
// The following definitions contain all error or status indicators that can
// be returned when calling the CAN_getStatus() function.
//
//*****************************************************************************
//! CAN controller has detected a parity error.
//! CAN controller has entered a Bus Off state.
//! CAN controller error level has reached warning level.
//! CAN controller error level has reached error passive level.
//! A message was received successfully since the last read of this status.
//! A message was transmitted successfully since the last read of this
//! status.
//! This is the mask for the last error code field.
//! There was no error.
//! A bit stuffing error has occurred.
//! A formatting error has occurred.
//! An acknowledge error has occurred.
//! The bus remained a bit level of 1 for longer than is allowed.
//! The bus remained a bit level of 0 for longer than is allowed.
//! A CRC error has occurred.
//*****************************************************************************
//
// The following macros are added for the Global Interrupt EN/FLG/CLR
// register
//
//*****************************************************************************
//! CANINT0 global interrupt bit
//! CANINT1 global interrupt bit
//*****************************************************************************
//
// The following macros are added for accessing the interrupt register and
// the standard arbitration ID in the interface registers.
//
//*****************************************************************************
//! Status of INT0ID
//! IF1 Arbitration Standard ID Shift Offset
//! IF1 Arbitration Standard ID Mask
//! IF2 Arbitration Standard ID Shift Offset
//! IF2 Arbitration Standard ID Mask
//*****************************************************************************
//
//! This data type is used to decide between STD_ID or EXT_ID for a mailbox.
//! This is used when calling the CAN_setupMessageObject() function.
//
//*****************************************************************************
typedef enum
{
//! Set the message ID frame to standard.
CAN_MSG_FRAME_STD,
//! Set the message ID frame to extended.
CAN_MSG_FRAME_EXT
} CAN_MsgFrameType;
//*****************************************************************************
//
//! This definition is used to determine the type of message object that will
//! be set up via a call to the CAN_setupMessageObject() API.
//
//*****************************************************************************
typedef enum
{
//! Transmit message object.
CAN_MSG_OBJ_TYPE_TX,
//! Transmit remote request message object
CAN_MSG_OBJ_TYPE_TX_REMOTE,
//! Receive message object.
CAN_MSG_OBJ_TYPE_RX,
//! Remote frame receive remote, with auto-transmit message object.
CAN_MSG_OBJ_TYPE_RXTX_REMOTE
} CAN_MsgObjType;
//*****************************************************************************
//
//! This definition is used to determine the clock source that will
//! be set up via a call to the CAN_selectClockSource() API.
//
//*****************************************************************************
typedef enum
{
//! Peripheral System Clock Source
CAN_CLOCK_SOURCE_SYS = 0x0,
//! External Oscillator Clock Source
CAN_CLOCK_SOURCE_XTAL = 0x1,
//! Auxiliary Clock Input Source
CAN_CLOCK_SOURCE_AUX = 0x2
} CAN_ClockSource;
//*****************************************************************************
//
// Prototypes for the APIs.
//
//*****************************************************************************
//*****************************************************************************
//
//! \internal
//!
//! Checks a CAN base address.
//!
//! \param base is the base address of the CAN controller.
//!
//! This function determines if a CAN controller base address is valid.
//!
//! \return Returns \b true if the base address is valid and \b false
//! otherwise.
//
//*****************************************************************************
//*****************************************************************************
//
//! \internal
//!
//! Copies data from a buffer to the CAN Data registers.
//!
//! \param data is a pointer to the data to be written out to the CAN
//! controller's data registers.
//! \param address is a uint32_t value for the first register of the
//! CAN controller's data registers. For example, in order to use the IF1
//! register set on CAN controller 0, the value would be: \b CANA_BASE \b +
//! \b CAN_O_IF1DATA.
//! \param size is the number of bytes to copy into the CAN controller.
//!
//! This function takes the steps necessary to copy data from a contiguous
//! buffer in memory into the non-contiguous data registers used by the CAN
//! controller.
//!
//! \return None.
//
//*****************************************************************************
static inline void
CAN_writeDataReg(const uint16_t *const data, uint32_t address,
uint32_t size)
{
uint32_t idx;
uint32_t dataReg = address;
//
// Check the dataReg.
//
;
//
// Loop always copies 1 byte per iteration.
//
for(idx = 0U; idx < size; idx++)
{
//
// Write out the data 8 bits at a time.
//
__byte((int16_t *)(dataReg),0) = data[idx];
dataReg++;
}
}
//*****************************************************************************
//
//! \internal
//!
//! Copies data (all 16bits) from a buffer to the CAN Data registers.
//!
//! \param data is a pointer to the data to be written out to the CAN
//! controller's data registers.
//! \param address is a uint32_t value for the first register of the
//! CAN controller's data registers. For example, in order to use the IF1
//! register set on CAN controller 0, the value would be: \b CANA_BASE \b +
//! \b CAN_O_IF1DATA.
//! \param size is the number of bytes to copy into the CAN controller.
//!
//! This function takes the steps necessary to copy data from a contiguous
//! buffer in memory into the non-contiguous data registers used by the CAN
//! controller.
//!
//! \return None.
//
//*****************************************************************************
static inline void
CAN_writeDataReg_16bit(const uint16_t *const data, uint32_t address,
uint32_t size)
{
uint32_t idx;
uint32_t dataReg = address;
//
// Check the dataReg.
//
;
//
// Loop always copies 1 byte per iteration.
//
for(idx = 0U; idx < size; idx++)
{
//
// Write out the data 8 bits at a time.
//
__byte((int16_t *)(dataReg),0) = (uint32_t)((data[idx / 2UL]) >> ((idx % 2UL) * 8UL));
dataReg++;
}
}
//*****************************************************************************
//
//! \internal
//!
//! Copies data (all 32bits) from a buffer to the CAN Data registers.
//!
//! \param data is a pointer to the data to be written out to the CAN
//! controller's data registers.
//! \param address is a uint32_t value for the first register of the
//! CAN controller's data registers. For example, in order to use the IF1
//! register set on CAN controller 0, the value would be: \b CANA_BASE \b +
//! \b CAN_O_IF1DATA.
//! \param size is the number of bytes to copy into the CAN controller.
//!
//! This function takes the steps necessary to copy data from a contiguous
//! buffer in memory into the non-contiguous data registers used by the CAN
//! controller.
//!
//! \return None.
//
//*****************************************************************************
static inline void
CAN_writeDataReg_32bit(const uint32_t *const data, uint32_t address,
uint32_t size)
{
uint32_t idx;
uint32_t dataReg = address;
//
// Check the dataReg.
//
;
//
// Loop always copies 1 byte per iteration.
//
for(idx = 0U; idx < size; idx++)
{
//
// Write out the data 8 bits at a time.
//
__byte((int16_t *)(dataReg),0) = ((data[idx / 4UL]) >> ((idx % 4UL) * 8UL));
dataReg++;
}
}
//*****************************************************************************
//
//! \internal
//!
//! Copies data from the CAN Data registers to a buffer.
//!
//! \param data is a pointer to the location to store the data read from the
//! CAN controller's data registers.
//! \param address is a uint32_t value for the first register of the
//! CAN controller's data registers. For example, in order to use the IF1
//! register set on CAN controller 1, the value would be: \b CANA_BASE \b +
//! \b CAN_O_IF1DATA.
//! \param size is the number of bytes to copy from the CAN controller.
//!
//! This function takes the steps necessary to copy data to a contiguous buffer
//! in memory from the non-contiguous data registers used by the CAN
//! controller.
//!
//! \return None.
//
//*****************************************************************************
static inline void
CAN_readDataReg(uint16_t *data, const uint32_t address, uint32_t size)
{
uint32_t idx;
uint32_t dataReg = address;
//
// Loop always copies 1 byte per iteration.
//
for(idx = 0U; idx < size; idx++)
{
//
// Read out the data
//
data[idx] = __byte((int16_t *)(dataReg),0);
dataReg++;
}
}
//*****************************************************************************
//
//! Initializes the CAN controller's RAM.
//!
//! \param base is the base address of the CAN controller.
//!
//! Performs the initialization of the RAM used for the CAN message objects.
//!
//! \return None.
//
//*****************************************************************************
static inline void
CAN_initRAM(uint32_t base)
{
//
// Check the arguments.
//
;
(*((volatile uint16_t *)(base + 0x40U))) = 0x10U |
(0xAU);
while(!(((*((volatile uint16_t *)(base + 0x40U))) & (0x003FU)) ==
(0x20U | 0x4U |
0x1U)))
{
//
// Wait until RAM Init is complete
//
}
}
//*****************************************************************************
//
//! Select CAN Clock Source
//!
//! \param base is the base address of the CAN controller.
//! \param source is the clock source to use for the CAN controller.
//!
//! This function selects the specified clock source for the CAN controller.
//!
//! The \e source parameter can be any one of the following:
//! - \b CAN_CLOCK_SOURCE_SYS - Peripheral System Clock
//! - \b CAN_CLOCK_SOURCE_XTAL - External Oscillator
//! - \b CAN_CLOCK_SOURCE_AUX - Auxiliary Clock Input from GPIO
//!
//! \return None.
//
//*****************************************************************************
static inline void
CAN_selectClockSource(uint32_t base, CAN_ClockSource source)
{
//
// Check the arguments.
//
;
//
// Determine the CAN controller and set specified clock source
//
__eallow();
switch(base)
{
case 0x00048000U:
(*((volatile uint16_t *)(0x0005D200U + 0xAU))) &=
~0xCU;
(*((volatile uint16_t *)(0x0005D200U + 0xAU))) |= ((uint16_t)source <<
2U);
break;
default:
//
// Do nothing. Not a valid mode value.
//
break;
}
__edis();
}
//*****************************************************************************
//
//! Starts the CAN Module's Operations
//!
//! \param base is the base address of the CAN controller.
//!
//! This function starts the CAN module's operations after initialization,
//! which includes the CAN protocol controller state machine of the CAN core
//! and the message handler state machine to begin controlling the CAN's
//! internal data flow.
//!
//! \return None.
//
//*****************************************************************************
static inline void
CAN_startModule(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Clear Init and CCE bits
//
(*((volatile uint16_t *)(base + 0x0U))) &= ~(0x1U | 0x40U);
}
//*****************************************************************************
//
//! Enables the CAN controller.
//!
//! \param base is the base address of the CAN controller to enable.
//!
//! Enables the CAN controller for message processing. Once enabled, the
//! controller will automatically transmit any pending frames, and process any
//! received frames. The controller can be stopped by calling
//! CAN_disableController().
//!
//! \return None.
//
//*****************************************************************************
static inline void
CAN_enableController(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Clear the init bit in the control register.
//
(*((volatile uint16_t *)(base + 0x0U))) &= ~0x1U;
}
//*****************************************************************************
//
//! Disables the CAN controller.
//!
//! \param base is the base address of the CAN controller to disable.
//!
//! Disables the CAN controller for message processing. When disabled, the
//! controller will no longer automatically process data on the CAN bus. The
//! controller can be restarted by calling CAN_enableController(). The state
//! of the CAN controller and the message objects in the controller are left as
//! they were before this call was made.
//!
//! \return None.
//
//*****************************************************************************
static inline void
CAN_disableController(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Set the init bit in the control register.
//
(*((volatile uint16_t *)(base + 0x0U))) |= 0x1U;
}
//*****************************************************************************
//
//! Enables the test modes of the CAN controller.
//!
//! \param base is the base address of the CAN controller.
//! \param mode are the the test modes to enable.
//!
//! Enables test modes within the controller. The following valid options for
//! \e mode can be OR'ed together:
//! - \b CAN_TEST_SILENT - Silent Mode
//! - \b CAN_TEST_LBACK - Loopback Mode
//! - \b CAN_TEST_EXL - External Loopback Mode
//!
//! \note Loopback mode and external loopback mode \b can \b not be
//! enabled at the same time.
//!
//! \return None.
//
//*****************************************************************************
static inline void
CAN_enableTestMode(uint32_t base, uint16_t mode)
{
//
// Check the arguments.
//
;
;
//
// Clear the bits in the test register.
//
(*((volatile uint16_t *)(base + 0x14U))) &= ~((uint16_t)0x8U |
(uint16_t)0x10U |
(uint16_t)0x100U);
//
// Enable test mode and set the bits in the test register.
//
(*((volatile uint16_t *)(base + 0x0U))) |= 0x80U;
(*((volatile uint16_t *)(base + 0x14U))) |= mode;
}
//*****************************************************************************
//
//! Disables the test modes of the CAN controller.
//!
//! \param base is the base address of the CAN controller.
//!
//! Disables test modes within the controller and clears the test bits.
//!
//! \return None.
//
//*****************************************************************************
static inline void
CAN_disableTestMode(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Clear the bits in the test register.
//
(*((volatile uint16_t *)(base + 0x14U))) &= ~((uint16_t)0x8U |
(uint16_t)0x10U |
(uint16_t)0x100U);
//
// Clear the test mode enable bit
//
(*((volatile uint16_t *)(base + 0x0U))) &= ~0x80U;
}
//*****************************************************************************
//
//! Get the current settings for the CAN controller bit timing.
//!
//! \param base is the base address of the CAN controller.
//!
//! This function reads the current configuration of the CAN controller bit
//! clock timing.
//!
//! \return Returns the value of the bit timing register.
//
//*****************************************************************************
static inline uint32_t
CAN_getBitTiming(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Read and return BTR register
//
return(__byte_peripheral_32((uint32_t *)(base + 0xCU)));
}
//*****************************************************************************
//
//! Enables direct access to the RAM.
//!
//! \param base is the base address of the CAN controller.
//!
//! Enables direct access to the RAM while in Test mode.
//!
//! \note Test Mode must first be enabled to use this function.
//!
//! \return None.
//
//*****************************************************************************
static inline void
CAN_enableMemoryAccessMode(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Set the RAM direct access bit
//
(*((volatile uint16_t *)(base + 0x14U))) |= 0x200U;
}
//*****************************************************************************
//
//! Disables direct access to the RAM.
//!
//! \param base is the base address of the CAN controller.
//!
//! Disables direct access to the RAM while in Test mode.
//!
//! \return None.
//
//*****************************************************************************
static inline void
CAN_disableMemoryAccessMode(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Clear the RAM direct access bit
//
(*((volatile uint16_t *)(base + 0x14U))) &= ~0x200U;
}
//*****************************************************************************
//
//! Sets the interruption debug mode of the CAN controller.
//!
//! \param base is the base address of the CAN controller.
//! \param enable is a flag to enable or disable the interruption debug mode.
//!
//! This function sets the interruption debug mode of the CAN controller. When
//! the \e enable parameter is \b true, CAN will be configured to interrupt any
//! transmission or reception and enter debug mode immediately after it is
//! requested. When \b false, CAN will wait for a started transmission or
//! reception to be completed before entering debug mode.
//!
//! \return None.
//
//*****************************************************************************
static inline void
CAN_setInterruptionDebugMode(uint32_t base, _Bool enable)
{
//
// Check the arguments.
//
;
if(enable)
{
//
// Enable interrupt debug support
//
(*((volatile uint16_t *)(base + 0x0U))) |= 0x100U;
}
else
{
//
// Disable interrupt debug support
//
(*((volatile uint16_t *)(base + 0x0U))) &= ~0x100U;
}
}
//*****************************************************************************
//
//! Enables DMA Requests from the CAN controller.
//!
//! \param base is the base address of the CAN controller to enable.
//!
//! Enables the CAN controller DMA request lines for each of the 3 interface
//! register sets. To actually assert the request line, the DMA Active bit
//! must be set in the corresponding interface CMD register.
//!
//! \return None.
//
//*****************************************************************************
static inline void
CAN_enableDMARequests(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Set the DMA enable bits in the control register.
//
__byte_peripheral_32((uint32_t *)(base + 0x0U)) |=
(0x40000U | (uint32_t)0x80000U | (uint32_t)0x100000U);
}
//*****************************************************************************
//
//! Disables DMA Requests from the CAN controller.
//!
//! \param base is the base address of the CAN controller to enable.
//!
//! Disables the CAN controller DMA request lines for each of the 3 interface
//! register sets.
//!
//! \return None.
//
//*****************************************************************************
static inline void
CAN_disableDMARequests(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Clear the DMA enable bits in the control register.
//
__byte_peripheral_32((uint32_t *)(base + 0x0U)) &=
~(0x40000U | (uint32_t)0x80000U | (uint32_t)0x100000U);
}
//*****************************************************************************
//
//! Disables Auto-Bus-On.
//!
//! \param base is the base address of the CAN controller.
//!
//! Disables the Auto-Bus-On feature of the CAN controller.
//!
//! \return None.
//
//*****************************************************************************
static inline void
CAN_disableAutoBusOn(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Clear the ABO bit in the control register.
//
(*((volatile uint16_t *)(base + 0x0U))) &= ~0x200U;
}
//*****************************************************************************
//
//! Enables Auto-Bus-On.
//!
//! \param base is the base address of the CAN controller.
//!
//! Enables the Auto-Bus-On feature of the CAN controller. Be sure to also
//! configure the Auto-Bus-On time using the CAN_setAutoBusOnTime function.
//!
//! \return None.
//
//*****************************************************************************
static inline void
CAN_enableAutoBusOn(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Set the ABO bit in the control register.
//
(*((volatile uint16_t *)(base + 0x0U))) |= 0x200U;
}
//*****************************************************************************
//
//! Sets the time before a Bus-Off recovery sequence is started.
//!
//! \param base is the base address of the CAN controller.
//! \param onTime is number of clock cycles before a Bus-Off recovery sequence
//! is started.
//!
//! This function sets the number of clock cycles before a Bus-Off recovery
//! sequence is started by clearing the Init bit.
//!
//! \note To enable this functionality, use CAN_enableAutoBusOn().
//!
//! \return None.
//
//*****************************************************************************
static inline void
CAN_setAutoBusOnTime(uint32_t base, uint32_t onTime)
{
//
// Check the arguments.
//
;
//
// Set bus-off timer value
//
__byte_peripheral_32((uint32_t *)(base + 0x80U)) = onTime;
}
//*****************************************************************************
//
//! Enables individual CAN controller interrupt sources.
//!
//! \param base is the base address of the CAN controller.
//! \param intFlags is the bit mask of the interrupt sources to be enabled.
//!
//! Enables specific interrupt sources of the CAN controller. Only enabled
//! sources will cause a processor interrupt.
//!
//! The \e intFlags parameter is the logical OR of any of the following:
//! - \b CAN_INT_ERROR - a controller error condition has occurred
//! - \b CAN_INT_STATUS - a message transfer has completed, or a bus error has
//! been detected
//! - \b CAN_INT_IE0 - allow CAN controller to generate interrupts on interrupt
//! line 0
//! - \b CAN_INT_IE1 - allow CAN controller to generate interrupts on interrupt
//! line 1
//!
//! \return None.
//
//*****************************************************************************
static inline void
CAN_enableInterrupt(uint32_t base, uint32_t intFlags)
{
//
// Check the arguments.
//
;
;
//
// Enable the specified interrupts.
//
__byte_peripheral_32((uint32_t *)(base + 0x0U)) |= intFlags;
}
//*****************************************************************************
//
//! Disables individual CAN controller interrupt sources.
//!
//! \param base is the base address of the CAN controller.
//! \param intFlags is the bit mask of the interrupt sources to be disabled.
//!
//! Disables the specified CAN controller interrupt sources. Only enabled
//! interrupt sources can cause a processor interrupt.
//!
//! The \e intFlags parameter has the same definition as in the
//! CAN_enableInterrupt() function.
//!
//! \return None.
//
//*****************************************************************************
static inline void
CAN_disableInterrupt(uint32_t base, uint32_t intFlags)
{
//
// Check the arguments.
//
;
;
//
// Disable the specified interrupts.
//
__byte_peripheral_32((uint32_t *)(base + 0x0U)) &= ~(intFlags);
}
//*****************************************************************************
//
//! Get the CAN controller Interrupt Line set for each mailbox
//!
//! \param base is the base address of the CAN controller.
//!
//! Gets which interrupt line each message object should assert when an
//! interrupt occurs. Bit 0 corresponds to message object 32 and then bits
//! 1 to 31 correspond to message object 1 through 31 respectively. Bits that
//! are asserted indicate the message object should generate an interrupt on
//! interrupt line 1, while bits that are not asserted indicate the message
//! object should generate an interrupt on line 0.
//!
//! \return Returns the value of the interrupt muxing register.
//
//*****************************************************************************
static inline uint32_t
CAN_getInterruptMux(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Get the interrupt muxing for the CAN peripheral
//
return(__byte_peripheral_32((uint32_t *)(base + 0xD8U)));
}
//*****************************************************************************
//
//! Set the CAN controller Interrupt Line for each mailbox
//!
//! \param base is the base address of the CAN controller.
//! \param mux bit packed representation of which message objects should
//! generate an interrupt on a given interrupt line.
//!
//! Selects which interrupt line each message object should assert when an
//! interrupt occurs. Bit 0 corresponds to message object 32 and then bits
//! 1 to 31 correspond to message object 1 through 31 respectively. Bits that
//! are asserted indicate the message object should generate an interrupt on
//! interrupt line 1, while bits that are not asserted indicate the message
//! object should generate an interrupt on line 0.
//!
//! \return None.
//
//*****************************************************************************
static inline void
CAN_setInterruptMux(uint32_t base, uint32_t mux)
{
//
// Check the arguments.
//
;
//
// Set the interrupt muxing for the CAN peripheral
//
__byte_peripheral_32((uint32_t *)(base + 0xD8U)) = mux;
}
//*****************************************************************************
//
//! Enables the CAN controller automatic retransmission behavior.
//!
//! \param base is the base address of the CAN controller.
//!
//! Enables the automatic retransmission of messages with detected errors.
//!
//! \return None.
//
//*****************************************************************************
static inline void
CAN_enableRetry(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Clearing the DAR bit tells the controller to not disable the
// auto-retry of messages which were not transmitted or received
// correctly.
//
(*((volatile uint16_t *)(base + 0x0U))) &= ~0x20U;
}
//*****************************************************************************
//
//! Disables the CAN controller automatic retransmission behavior.
//!
//! \param base is the base address of the CAN controller.
//!
//! Disables the automatic retransmission of messages with detected errors.
//!
//! \return None.
//
//*****************************************************************************
static inline void
CAN_disableRetry(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Setting the DAR bit tells the controller to disable the auto-retry
// of messages which were not transmitted or received correctly.
//
(*((volatile uint16_t *)(base + 0x0U))) |= 0x20U;
}
//*****************************************************************************
//
//! Returns the current setting for automatic retransmission.
//!
//! \param base is the base address of the CAN controller.
//!
//! Reads the current setting for the automatic retransmission in the CAN
//! controller and returns it to the caller.
//!
//! \return Returns \b true if automatic retransmission is enabled, \b false
//! otherwise.
//
//*****************************************************************************
static inline _Bool
CAN_isRetryEnabled(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Read the disable automatic retry setting from the CAN controller.
//
return((_Bool)(((*((volatile uint16_t *)(base + 0x0U))) & 0x20U) != 0x20U));
}
//*****************************************************************************
//
//! Reads the CAN controller error counter register.
//!
//! \param base is the base address of the CAN controller.
//! \param rxCount is a pointer to storage for the receive error counter.
//! \param txCount is a pointer to storage for the transmit error counter.
//!
//! Reads the error counter register and returns the transmit and receive error
//! counts to the caller along with a flag indicating if the controller receive
//! counter has reached the error passive limit. The values of the receive and
//! transmit error counters are returned through the pointers provided as
//! parameters.
//!
//! After this call, \e rxCount will hold the current receive error count
//! and \e txCount will hold the current transmit error count.
//!
//! \return Returns \b true if the receive error count has reached the error
//! passive limit, and \b false if the error count is below the error passive
//! limit.
//
//*****************************************************************************
static inline _Bool
CAN_getErrorCount(uint32_t base, uint32_t *rxCount, uint32_t *txCount)
{
uint32_t canError = 0U;
//
// Check the arguments.
//
;
//
// Read the current count of transmit/receive errors.
//
canError = __byte_peripheral_32((uint32_t *)(base + 0x8U));
//
// Extract the error numbers from the register value.
//
*rxCount = (canError & 0x7F00U) >> 8U;
*txCount = (canError & 0xFFU) >> 0U;
return((_Bool)((canError & 0x8000U) != 0U));
}
//*****************************************************************************
//
//! Reads the CAN controller error and status register.
//!
//! \param base is the base address of the CAN controller.
//!
//! Reads the error and status register of the CAN controller.
//!
//! \return Returns the value of the register.
//
//*****************************************************************************
static inline uint16_t
CAN_getStatus(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Return error and status register value
//
return((*((volatile uint16_t *)(base + 0x4U))));
}
//*****************************************************************************
//
//! Reads the CAN controller TX request register.
//!
//! \param base is the base address of the CAN controller.
//!
//! Reads the TX request register of the CAN controller.
//!
//! \return Returns the value of the register.
//
//*****************************************************************************
static inline uint32_t
CAN_getTxRequests(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Return Tx requests register value
//
return(__byte_peripheral_32((uint32_t *)(base + 0x88U)));
}
//*****************************************************************************
//
//! Reads the CAN controller new data status register.
//!
//! \param base is the base address of the CAN controller.
//!
//! Reads the new data status register of the CAN controller for all message
//! objects.
//!
//! \return Returns the value of the register.
//
//*****************************************************************************
static inline uint32_t
CAN_getNewDataFlags(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Return new data register value
//
return(__byte_peripheral_32((uint32_t *)(base + 0x9CU)));
}
//*****************************************************************************
//
//! Reads the CAN controller valid message object register.
//!
//! \param base is the base address of the CAN controller.
//!
//! Reads the valid message object register of the CAN controller.
//!
//! \return Returns the value of the register.
//
//*****************************************************************************
static inline uint32_t
CAN_getValidMessageObjects(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Return the valid message register value
//
return(__byte_peripheral_32((uint32_t *)(base + 0xC4U)));
}
//*****************************************************************************
//
//! Get the CAN controller interrupt cause.
//!
//! \param base is the base address of the CAN controller.
//!
//! This function returns the value of the interrupt register that indicates
//! the cause of the interrupt.
//!
//! \return Returns the value of the interrupt register.
//
//*****************************************************************************
static inline uint32_t
CAN_getInterruptCause(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Read interrupt identifier status
//
return(__byte_peripheral_32((uint32_t *)(base + 0x10U)));
}
//*****************************************************************************
//
//! Get the CAN controller pending interrupt message source.
//!
//! \param base is the base address of the CAN controller.
//!
//! Returns the value of the pending interrupts register that indicates
//! which messages are the source of pending interrupts.
//!
//! \return Returns the value of the pending interrupts register.
//
//*****************************************************************************
static inline uint32_t
CAN_getInterruptMessageSource(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Read message object interrupt status
//
return(__byte_peripheral_32((uint32_t *)(base + 0xB0U)));
}
//*****************************************************************************
//
//! CAN Global interrupt Enable function.
//!
//! \param base is the base address of the CAN controller.
//! \param intFlags is the bit mask of the interrupt sources to be enabled.
//!
//! Enables specific CAN interrupt in the global interrupt enable register
//!
//! The \e intFlags parameter is the logical OR of any of the following:
//! - \b CAN_GLOBAL_INT_CANINT0 - Global Interrupt Enable bit for CAN INT0
//! - \b CAN_GLOBAL_INT_CANINT1 - Global Interrupt Enable bit for CAN INT1
//!
//! \return None.
//
//*****************************************************************************
static inline void
CAN_enableGlobalInterrupt(uint32_t base, uint16_t intFlags)
{
//
// Check the arguments.
//
;
;
//
// Enable the requested interrupts
//
(*((volatile uint16_t *)(base + 0x50U))) |= intFlags;
}
//*****************************************************************************
//
//! CAN Global interrupt Disable function.
//!
//! \param base is the base address of the CAN controller.
//! \param intFlags is the bit mask of the interrupt sources to be disabled.
//!
//! Disables the specific CAN interrupt in the global interrupt enable register
//!
//! The \e intFlags parameter is the logical OR of any of the following:
//! - \b CAN_GLOBAL_INT_CANINT0 - Global Interrupt bit for CAN INT0
//! - \b CAN_GLOBAL_INT_CANINT1 - Global Interrupt bit for CAN INT1
//!
//! \return None.
//
//*****************************************************************************
static inline void
CAN_disableGlobalInterrupt(uint32_t base, uint16_t intFlags)
{
//
// Check the arguments.
//
;
;
//
// Disable the requested interrupts
//
(*((volatile uint16_t *)(base + 0x50U))) &= ~intFlags;
}
//*****************************************************************************
//
//! CAN Global interrupt Clear function.
//!
//! \param base is the base address of the CAN controller.
//! \param intFlags is the bit mask of the interrupt sources to be cleared.
//!
//! Clear the specific CAN interrupt bit in the global interrupt flag register.
//!
//! The \e intFlags parameter is the logical OR of any of the following:
//! - \b CAN_GLOBAL_INT_CANINT0 - Global Interrupt bit for CAN INT0
//! - \b CAN_GLOBAL_INT_CANINT1 - Global Interrupt bit for CAN INT1
//!
//! \return None.
//
//*****************************************************************************
static inline void
CAN_clearGlobalInterruptStatus(uint32_t base, uint16_t intFlags)
{
//
// Check the arguments.
//
;
;
//
// Clear the requested interrupts
//
(*((volatile uint16_t *)(base + 0x58U))) |= intFlags;
}
//*****************************************************************************
//
//! Get the CAN Global Interrupt status.
//!
//! \param base is the base address of the CAN controller.
//! \param intFlags is the bit mask of the interrupt sources to be enabled.
//!
//! Check if any interrupt bit is set in the global interrupt flag register.
//!
//! The \e intFlags parameter is the logical OR of any of the following:
//! - \b CAN_GLOBAL_INT_CANINT0 - Global Interrupt bit for CAN INT0
//! - \b CAN_GLOBAL_INT_CANINT1 - Global Interrupt bit for CAN INT1
//!
//! \return True if any of the requested interrupt bits are set. False, if
//! none of the requested bits are set.
//
//*****************************************************************************
static inline _Bool
CAN_getGlobalInterruptStatus(uint32_t base, uint16_t intFlags)
{
//
// Check the arguments.
//
;
;
//
// Read and return the global interrupt flag register
//
return((_Bool)(((*((volatile uint16_t *)(base + 0x54U))) & intFlags) != 0U));
}
//*****************************************************************************
//
//! Initializes the CAN controller
//!
//! \param base is the base address of the CAN controller.
//!
//! This function initializes the message RAM, which also clears all the
//! message objects, and places the CAN controller in an init state. Write
//! access to the configuration registers is available as a result, allowing
//! the bit timing and message objects to be setup.
//!
//! \note To exit the initialization mode and start the CAN module, use the
//! CAN_startModule() function.
//!
//! \return None.
//
//*****************************************************************************
extern void
CAN_initModule(uint32_t base);
//*****************************************************************************
//
//! Sets the CAN Bit Timing based on requested Bit Rate.
//!
//! \param base is the base address of the CAN controller.
//! \param clockFreq is the CAN module clock frequency before the bit rate
//! prescaler (Hertz)
//! \param bitRate is the desired bit rate (bits/sec)
//! \param bitTime is the number of time quanta per bit required for desired
//! bit time (Tq) and must be in the range from 8 to 25
//!
//! This function sets the CAN bit timing values for the bit rate passed in the
//! \e bitRate and \e bitTime parameters based on the \e clockFreq parameter. The
//! CAN bit clock is calculated to be an average timing value that should work
//! for most systems. If tighter timing requirements are needed, then the
//! CAN_setBitTiming() function is available for full customization of all of
//! the CAN bit timing values.
//!
//! \note Not all bit-rate and bit-time combinations are valid.
//! For combinations that would yield the correct bit-rate,
//! refer to the DCAN_CANBTR_values.xlsx file in the "docs" directory.
//! The CANBTR register values calculated by the function CAN_setBitRate
//! may not be suitable for your network parameters. If this is the case
//! and you have computed the correct values for your network, you could
//! directly write those parameters in CANBTR register using the
//! function CAN_setBitTiming.
//!
//! \return None.
//
//*****************************************************************************
extern void
CAN_setBitRate(uint32_t base, uint32_t clockFreq, uint32_t bitRate,
uint16_t bitTime);
//*****************************************************************************
//
//! Manually set the CAN controller bit timing.
//!
//! \param base is the base address of the CAN controller.
//! \param prescaler is the baud rate prescaler
//! \param prescalerExtension is the baud rate prescaler extension
//! \param tSeg1 is the time segment 1
//! \param tSeg2 is the time segment 2
//! \param sjw is the synchronization jump width
//!
//! This function sets the various timing parameters for the CAN bus bit
//! timing: baud rate prescaler, prescaler extension, time segment 1,
//! time segment 2, and the Synchronization Jump Width.
//!
//! \return None.
//
//*****************************************************************************
extern void
CAN_setBitTiming(uint32_t base, uint16_t prescaler,
uint16_t prescalerExtension, uint16_t tSeg1, uint16_t tSeg2,
uint16_t sjw);
//*****************************************************************************
//
//! Clears a CAN interrupt source.
//!
//! \param base is the base address of the CAN controller.
//! \param intClr is a value indicating which interrupt source to clear.
//!
//! This function can be used to clear a specific interrupt source. The
//! \e intClr parameter should be either a number from 1 to 32 to clear a
//! specific message object interrupt or can be the following:
//! - \b CAN_INT_INT0ID_STATUS - Clears a status interrupt.
//!
//! It is not necessary to use this function to clear an interrupt. This
//! should only be used if the application wants to clear an interrupt source
//! without taking the normal interrupt action.
//!
//! \return None.
//
//*****************************************************************************
extern void
CAN_clearInterruptStatus(uint32_t base, uint32_t intClr);
//*****************************************************************************
//
//! Setup a Message Object
//!
//! \param base is the base address of the CAN controller.
//! \param objID is the message object number to configure (1-32).
//! \param msgID is the CAN message identifier used for the 11 or 29 bit
//! identifiers
//! \param frame is the CAN ID frame type
//! \param msgType is the message object type
//! \param msgIDMask is the CAN message identifier mask used when identifier
//! filtering is enabled
//! \param flags is the various flags and settings to be set for the message
//! object
//! \param msgLen is the number of bytes of data in the message object (0-8)
//!
//! This function sets the various values required for a message object.
//!
//! The \e frame parameter can be one of the following values:
//! - \b CAN_MSG_FRAME_STD - Standard 11 bit identifier
//! - \b CAN_MSG_FRAME_EXT - Extended 29 bit identifier
//!
//! The \e msgType parameter can be one of the following values:
//! - \b CAN_MSG_OBJ_TYPE_TX - Transmit Message
//! - \b CAN_MSG_OBJ_TYPE_TX_REMOTE - Transmit Remote Message
//! - \b CAN_MSG_OBJ_TYPE_RX - Receive Message
//! - \b CAN_MSG_OBJ_TYPE_RXTX_REMOTE - Receive Remote message with
//! auto-transmit
//!
//! The \e flags parameter can be set as \b CAN_MSG_OBJ_NO_FLAGS if no flags
//! are required or the parameter can be a logical OR of any of the following
//! values:
//! - \b CAN_MSG_OBJ_TX_INT_ENABLE - Enable Transmit Interrupts
//! - \b CAN_MSG_OBJ_RX_INT_ENABLE - Enable Receive Interrupts
//! - \b CAN_MSG_OBJ_USE_ID_FILTER - Use filtering based on the Message ID
//! (Standard or Extended)
//! - \b CAN_MSG_OBJ_USE_EXT_FILTER - Use Extended Identifier Bit for filtering
//! (Only among Extended IDs will be accepted)
//! - \b CAN_MSG_OBJ_USE_DIR_FILTER - Use filtering based on the direction of
//! the transfer
//! - \b CAN_MSG_OBJ_FIFO - Message object is part of a FIFO
//! structure and isn't the final message
//! object in FIFO
//!
//! If filtering is based on message identifier (for Standard or Extended IDs)
//! specified by the \e msgIDMask parameter, the value \b CAN_MSG_OBJ_USE_ID_FILTER
//! has to be logically ORed with the \e flag parameter.
//! If \b CAN_MSG_OBJ_USE_EXT_FILTER is ORed with the \e flag parameter,
//! only extended identifier frames are accepted which can further be masked
//! by using the flag above.
//!
//! \note The \b msgLen Parameter for the Receive Message Object is a "don't
//! care" but its value should be between 0-8 due to the assert.
//!
//! \return None.
//
//*****************************************************************************
extern void
CAN_setupMessageObject(uint32_t base, uint32_t objID, uint32_t msgID,
CAN_MsgFrameType frame, CAN_MsgObjType msgType,
uint32_t msgIDMask, uint32_t flags, uint16_t msgLen);
//*****************************************************************************
//
//! Sends a Message Object
//!
//! \param base is the base address of the CAN controller.
//! \param objID is the object number to configure (1-32).
//! \param msgLen is the number of bytes of data in the message object (0-8)
//! \param msgData is a pointer to the message object's data
//!
//! This function is used to transmit a message object and the message data,
//! if applicable.
//!
//! \note The message object requested by the \e objID must first be setup
//! using the CAN_setupMessageObject() function.
//!
//! \return None.
//
//*****************************************************************************
extern void
CAN_sendMessage(uint32_t base, uint32_t objID, uint16_t msgLen,
const uint16_t *msgData);
//*****************************************************************************
//
//! Sends a Message Object
//!
//! \param base is the base address of the CAN controller.
//! \param objID is the object number to configure (1-32).
//! \param msgLen is the number of bytes of data in the message object (0-8)
//! \param msgData is a pointer to the message object's data (all 16 bits are sent)
//!
//! This function is used to transmit a message object and the message data,
//! if applicable.
//!
//! \note The message object requested by the \e objID must first be setup
//! using the CAN_setupMessageObject() function.
//!
//! \return None.
//
//*****************************************************************************
extern void
CAN_sendMessage_16bit(uint32_t base, uint32_t objID, uint16_t msgLen,
const uint16_t *msgData);
//*****************************************************************************
//
//! Sends a Message Object
//!
//! \param base is the base address of the CAN controller.
//! \param objID is the object number to configure (1-32).
//! \param msgLen is the number of bytes of data in the message object (0-8)
//! \param msgData is a pointer to the message object's data (all 32 bits are sent)
//!
//! This function is used to transmit a message object and the message data,
//! if applicable.
//!
//! \note The message object requested by the \e objID must first be setup
//! using the CAN_setupMessageObject() function.
//!
//! \return None.
//
//*****************************************************************************
extern void
CAN_sendMessage_32bit(uint32_t base, uint32_t objID, uint16_t msgLen,
const uint32_t *msgData);
//*****************************************************************************
//
//! Sends a Message Object while dynamically updating data length
//!
//! \param base is the base address of the CAN controller.
//! \param objID is the object number to configure (1-32).
//! \param msgLen is the number of bytes of data in the message object (0-8)
//! \param msgData is a pointer to the message object's data
//!
//! This function is used to transmit a message object and the message data,
//! if applicable and can be used to dynamically update the data length
//! for every subsequent call of this function.
//!
//! \note The message object requested by the \e objID must first be setup
//! using the CAN_setupMessageObject() function.
//!
//! \return None.
//
//*****************************************************************************
extern void
CAN_sendMessage_updateDLC(uint32_t base, uint32_t objID, uint16_t msgLen,
const uint16_t *msgData);
//*****************************************************************************
//
//! Sends a Remote Request Message Object
//!
//! \param base is the base address of the CAN controller.
//! \param objID is the object number to configure (1-32).
//!
//! This function is used to transmit a remote request message object.
//!
//! \note The message object requested by the \e objID must first be setup
//! using the CAN_setupMessageObject() function with CAN_MSG_OBJ_TYPE_TX_REMOTE
//! as msgType flag.
//!
//! \return None.
//
//*****************************************************************************
extern void
CAN_sendRemoteRequestMessage(uint32_t base, uint32_t objID);
//*****************************************************************************
//
//! Reads the data in a Message Object
//!
//! \param base is the base address of the CAN controller.
//! \param objID is the object number to read (1-32).
//! \param msgData is a pointer to the array to store the message data
//!
//! This function is used to read the data contents of the specified message
//! object in the CAN controller. The data returned is stored in the
//! \e msgData parameter.
//!
//! \note
//! -# The message object requested by the \e objID must first be setup
//! using the CAN_setupMessageObject() function.
//! -# If the DLC of the received message is larger than the \e msgData
//! buffer provided, then it is possible for a buffer overflow to occur.
//!
//! \return Returns \b true if new data was retrieved, else returns
//! \b false to indicate no new data was retrieved.
//
//*****************************************************************************
extern _Bool
CAN_readMessage(uint32_t base, uint32_t objID,
uint16_t *msgData);
//*****************************************************************************
//
//! Reads the data and Message ID in a Message Object
//!
//! \param base is the base address of the CAN controller.
//! \param objID is the object number to read (1-32).
//! \param frameType is a pointer to the CAN_MsgFrameType to store the message
//! type that has been received in the mailbox
//! The \e frameType parameter shall be filled as of the following values:
//! - \b CAN_MSG_FRAME_STD - Standard 11 bit identifier
//! - \b CAN_MSG_FRAME_EXT - Extended 29 bit identifier
//! This parameter is filled when return value is true for this function.
//! \param msgID is a pointer to storage for the received Message ID
//! Filled when the return value is true for this function.
//! \param msgData is a pointer to the array to store the message data
//! Filled with read Data when the return value is true for this function.
//!
//! This function is used to read the data contents and the Message ID
//! of the specified message object in the CAN controller.The Message ID returned
//! is stored in the \e msgID parameter and its type in \e frameType parameter.
//! The data returned is stored in the \e msgData parameter.
//!
//! \note
//! -# The message object requested by the \e objID must first be setup
//! using the CAN_setupMessageObject() function.
//!
//! \return Returns \b true if new data was retrieved, else returns
//! \b false to indicate no new data was retrieved.
//
//*****************************************************************************
extern _Bool CAN_readMessageWithID(uint32_t base,
uint32_t objID,
CAN_MsgFrameType *frameType,
uint32_t *msgID,
uint16_t *msgData);
//*****************************************************************************
//
//! Transfers a CAN message between the IF registers and Message RAM.
//!
//! \param base is the base address of the CAN controller.
//! \param interface is the interface to use for the transfer. Valid value are
//! 1 or 2.
//! \param objID is the object number to transfer (1-32).
//! \param direction is the direction of the transfer.
//! False is Message RAM to IF, True is IF to Message RAM.
//! \param dmaRequest asserts the DMA request line after a transfer if
//! set to True.
//!
//! This function transfers the contents of the interface registers to message
//! RAM or vice versa depending on the value passed to direction. This
//! function is designed to be used with DMA transfers.
//!
//! \return None.
//
//*****************************************************************************
extern void
CAN_transferMessage(uint32_t base, uint16_t interface, uint32_t objID,
_Bool direction, _Bool dmaRequest);
//*****************************************************************************
//
//! Clears a message object so that it is no longer used.
//!
//! \param base is the base address of the CAN controller.
//! \param objID is the message object number to disable (1-32).
//!
//! This function frees(disables) the specified message object from use. Once
//! a message object has been cleared, it will no longer automatically send or
//! receive messages, or generate interrupts.
//!
//! \return None.
//
//*****************************************************************************
extern void
CAN_clearMessage(uint32_t base, uint32_t objID);
//*****************************************************************************
//
//! Disables specific message object
//!
//! \param base is the base address of the CAN controller.
//! \param objID is the message object number to disable (1-32).
//!
//! This function disables the specific message object. Once the message object
//! has been disabled it will be ignored by the message handler until it
//! is configured again.
//!
//! \return None.
//
//*****************************************************************************
extern void
CAN_disableMessageObject(uint32_t base, uint32_t objID);
//*****************************************************************************
//
//! Disables all message objects
//!
//! \param base is the base address of the CAN controller.
//!
//! This function disables all message objects. Once a message object
//! has been disabled it will be ignored by the message handler until it
//! is configured again. All message objects are disabled automatically on
//! reset, however this function can be used to restart CAN operations
//! without an external reset.
//!
//! \return None.
//
//*****************************************************************************
extern void
CAN_disableAllMessageObjects(uint32_t base);
//*****************************************************************************
//
// Close the Doxygen group.
//! @}
//
//*****************************************************************************
//*****************************************************************************
//
// Mark the end of the C bindings section for C++ compilers.
//
//*****************************************************************************
//###########################################################################
//
// FILE: cla.h
//
// TITLE: CLA Driver Implementation File
//
//###########################################################################
// $Copyright:
// Copyright (C) 2023 Texas Instruments Incorporated - http://www.ti.com/
//
// 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 Texas Instruments Incorporated 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
// OWNER 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.
// $
//###########################################################################
//*****************************************************************************
//
// If building with a C++ compiler, make all of the definitions in this header
// have a C binding.
//
//*****************************************************************************
//*****************************************************************************
//
//! \addtogroup cla_api CLA
//! \brief This module is used for configurating CLA.
//! @{
//
//*****************************************************************************
//###########################################################################
//
// FILE: hw_cla.h
//
// TITLE: Definitions for the CLA registers.
//
//###########################################################################
// $Copyright:
// Copyright (C) 2023 Texas Instruments Incorporated - http://www.ti.com/
//
// 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 Texas Instruments Incorporated 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
// OWNER 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.
// $
//###########################################################################
//*************************************************************************************************
//
// The following are defines for the CLA register offsets
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the MCTL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the SOFTINTEN register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the _MSTSBGRND register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the _MCTLBGRND register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the MIFR register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the MIOVF register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the MIFRC register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the MICLR register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the MICLROVF register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the MIER register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the MIRUN register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the _MSTF register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the _MPSACTL register
//
//*************************************************************************************************
// changes.
//*****************************************************************************
//
// Useful defines used within the driver functions. Not intended for use by
// application code.
//
//*****************************************************************************
//*****************************************************************************
//
//! Values that can be passed to CLA_getBackgroundTaskStatus() as the
//! \e stsFlag parameter.
//
//*****************************************************************************
typedef enum
{
//! Run status
CLA_BGSTS_RUNNING = 0x1U,
//! Can BG task be interrupted?
CLA_BGSTS_CANNOT_INTERRUPT = 0x2U,
//! BG task hardware trigger overflow - if a second trigger occurs
//! while the BG is already running, the overflow is set
CLA_BGSTS_OVERFLOW = 0x4U
} CLA_BGTaskStatus;
//*****************************************************************************
//
// Values that can be passed to CLA_clearTaskFlags(), CLA_forceTasks(),
// and CLA_enableTasks(), CLA_disableTasks(), and CLA_enableSoftwareInterrupt()
// as the taskFlags parameter.
//
//*****************************************************************************
//*****************************************************************************
//
//! Values that can be passed to CLA_getPendingTaskFlag(),
//! CLA_getTaskOverflowFlag(), CLA_getTaskRunStatus(), CLA_setTriggerSource(),
//! CLA_registerEndOfTaskInterrupt(), and CLA_unregisterEndOfTaskInterrupt()
//! as the taskNumber parameter.
//
//*****************************************************************************
typedef enum
{
CLA_TASK_1, //!< CLA Task 1
CLA_TASK_2, //!< CLA Task 2
CLA_TASK_3, //!< CLA Task 3
CLA_TASK_4, //!< CLA Task 4
CLA_TASK_5, //!< CLA Task 5
CLA_TASK_6, //!< CLA Task 6
CLA_TASK_7, //!< CLA Task 7
CLA_TASK_8 //!< CLA Task 8
} CLA_TaskNumber;
//*****************************************************************************
//
//! Values that can be passed to CLA_mapTaskVector() as the \e claIntVect
//! parameter.
//
//*****************************************************************************
typedef enum
{
CLA_MVECT_1 = 0x0U, //!< Task Interrupt Vector 1
CLA_MVECT_2 = 0x1U, //!< Task Interrupt Vector 2
CLA_MVECT_3 = 0x2U, //!< Task Interrupt Vector 3
CLA_MVECT_4 = 0x3U, //!< Task Interrupt Vector 4
CLA_MVECT_5 = 0x4U, //!< Task Interrupt Vector 5
CLA_MVECT_6 = 0x5U, //!< Task Interrupt Vector 6
CLA_MVECT_7 = 0x6U, //!< Task Interrupt Vector 7
CLA_MVECT_8 = 0x7U //!< Task Interrupt Vector 8
} CLA_MVECTNumber;
//*****************************************************************************
//
//! Values that can be passed to CLA_setTriggerSource() as the \e trigger
//! parameter.
//
//*****************************************************************************
typedef enum
{
CLA_TRIGGER_SOFTWARE = 0U, //!< CLA Task Trigger Source is Software
CLA_TRIGGER_ADCA1 = 1U, //!< CLA Task Trigger Source is ADCA1
CLA_TRIGGER_ADCA2 = 2U, //!< CLA Task Trigger Source is ADCA2
CLA_TRIGGER_ADCA3 = 3U, //!< CLA Task Trigger Source is ADCA3
CLA_TRIGGER_ADCA4 = 4U, //!< CLA Task Trigger Source is ADCA4
CLA_TRIGGER_ADCAEVT = 5U, //!< CLA Task Trigger Source is ADCAEVT
CLA_TRIGGER_ADCB1 = 6U, //!< CLA Task Trigger Source is ADCB1
CLA_TRIGGER_ADCB2 = 7U, //!< CLA Task Trigger Source is ADCB2
CLA_TRIGGER_ADCB3 = 8U, //!< CLA Task Trigger Source is ADCB3
CLA_TRIGGER_ADCB4 = 9U, //!< CLA Task Trigger Source is ADCB4
CLA_TRIGGER_ADCBEVT = 10U, //!< CLA Task Trigger Source is ADCBEVT
CLA_TRIGGER_ADCC1 = 11U, //!< CLA Task Trigger Source is ADCC1
CLA_TRIGGER_ADCC2 = 12U, //!< CLA Task Trigger Source is ADCC2
CLA_TRIGGER_ADCC3 = 13U, //!< CLA Task Trigger Source is ADCC3
CLA_TRIGGER_ADCC4 = 14U, //!< CLA Task Trigger Source is ADCC4
CLA_TRIGGER_ADCCEVT = 15U, //!< CLA Task Trigger Source is ADCCEVT
CLA_TRIGGER_XINT1 = 29U, //!< CLA Task Trigger Source is XINT1
CLA_TRIGGER_XINT2 = 30U, //!< CLA Task Trigger Source is XINT2
CLA_TRIGGER_XINT3 = 31U, //!< CLA Task Trigger Source is XINT3
CLA_TRIGGER_XINT4 = 32U, //!< CLA Task Trigger Source is XINT4
CLA_TRIGGER_XINT5 = 33U, //!< CLA Task Trigger Source is XINT5
CLA_TRIGGER_EPWM1INT = 36U, //!< CLA Task Trigger Source is EPWM1INT
CLA_TRIGGER_EPWM2INT = 37U, //!< CLA Task Trigger Source is EPWM2INT
CLA_TRIGGER_EPWM3INT = 38U, //!< CLA Task Trigger Source is EPWM3INT
CLA_TRIGGER_EPWM4INT = 39U, //!< CLA Task Trigger Source is EPWM4INT
CLA_TRIGGER_EPWM5INT = 40U, //!< CLA Task Trigger Source is EPWM5INT
CLA_TRIGGER_EPWM6INT = 41U, //!< CLA Task Trigger Source is EPWM6INT
CLA_TRIGGER_EPWM7INT = 42U, //!< CLA Task Trigger Source is EPWM7INT
CLA_TRIGGER_EPWM8INT = 43U, //!< CLA Task Trigger Source is EPWM8INT
CLA_TRIGGER_MCANA_FEVT0 = 52U, //!< CLA Task Trigger Source is MCANAFEVT0
CLA_TRIGGER_MCANA_FEVT1 = 53U, //!< CLA Task Trigger Source is MCANAFEVT1
CLA_TRIGGER_MCANA_FEVT2 = 54U, //!< CLA Task Trigger Source is MCANAFEVT2
CLA_TRIGGER_TINT0 = 68U, //!< CLA Task Trigger Source is TINT0
CLA_TRIGGER_TINT1 = 69U, //!< CLA Task Trigger Source is TINT1
CLA_TRIGGER_TINT2 = 70U, //!< CLA Task Trigger Source is TINT2
CLA_TRIGGER_ECAP1INT = 75U, //!< CLA Task Trigger Source is ECAP1INT
CLA_TRIGGER_ECAP2INT = 76U, //!< CLA Task Trigger Source is ECAP2INT
CLA_TRIGGER_ECAP3INT = 77U, //!< CLA Task Trigger Source is ECAP3INT
CLA_TRIGGER_EQEP1INT = 83U, //!< CLA Task Trigger Source is EQEP1INT
CLA_TRIGGER_EQEP2INT = 84U, //!< CLA Task Trigger Source is EQEP2INT
CLA_TRIGGER_ECAP3INT2 = 89U, //!< CLA Task Trigger Source is ECAP3INT2
CLA_TRIGGER_SDFM1INT = 95U, //!< CLA Task Trigger Source is SDFM1INT
CLA_TRIGGER_SDFM1DRINT1 = 96U, //!< CLA Task Trigger Srce is SDFM1DRINT1
CLA_TRIGGER_SDFM1DRINT2 = 97U, //!< CLA Task Trigger Srce is SDFM1DRINT2
CLA_TRIGGER_SDFM1DRINT3 = 98U, //!< CLA Task Trigger Srce is SDFM1DRINT3
CLA_TRIGGER_SDFM1DRINT4 = 99U, //!< CLA Task Trigger Srce is SDFM1DRINT4
CLA_TRIGGER_SDFM2INT = 100U, //!< CLA Task Trigger Source is SDFM2INT
CLA_TRIGGER_SDFM2DRINT1 = 101U, //!< CLA Task Trigger Srce is SDFM2DRINT1
CLA_TRIGGER_SDFM2DRINT2 = 102U, //!< CLA Task Trigger Srce is SDFM2DRINT2
CLA_TRIGGER_SDFM2DRINT3 = 103U, //!< CLA Task Trigger Srce is SDFM2DRINT3
CLA_TRIGGER_SDFM2DRINT4 = 104U, //!< CLA Task Trigger Srce is SDFM2DRINT4
CLA_TRIGGER_PMBUSAINT = 105U, //!< CLA Task Trigger Source is PMBUSAINT
CLA_TRIGGER_SPITXAINT = 109U, //!< CLA Task Trigger Source is SPITXAINT
CLA_TRIGGER_SPIRXAINT = 110U, //!< CLA Task Trigger Source is SPIRXAINT
CLA_TRIGGER_SPITXBINT = 111U, //!< CLA Task Trigger Source is SPITXBINT
CLA_TRIGGER_SPIRXBINT = 112U, //!< CLA Task Trigger Source is SPIRXBINT
CLA_TRIGGER_LINAINT1 = 117U, //!< CLA Task Trigger Source is LINAINT1
CLA_TRIGGER_LINAINT0 = 118U, //!< CLA Task Trigger Source is LINAINT0
CLA_TRIGGER_LINBINT1 = 119U, //!< CLA Task Trigger Source is LINAINT1
CLA_TRIGGER_LINBINT0 = 120U, //!< CLA Task Trigger Source is LINAINT0
CLA_TRIGGER_CLA1CRCINT = 121U, //!< CLA Task Trigger Srce is CLA1CRCINT
CLA_TRIGGER_FSITXAINT1 = 123U, //!< CLA Task Trigger Source is FSITXAINT1
CLA_TRIGGER_FSITXAINT2 = 124U, //!< CLA Task Trigger Source is FSITXAINT2
CLA_TRIGGER_FSIRXAINT1 = 125U, //!< CLA Task Trigger Source is FSIRXAINT1
CLA_TRIGGER_FSIRXAINT2 = 126U, //!< CLA Task Trigger Source is FSIRXAINT2
CLA_TRIGGER_CLB1INT = 127, //!< CLA Task Trigger Source is CLB1INT
CLA_TRIGGER_CLB2INT = 128, //!< CLA Task Trigger Source is CLB2INT
CLA_TRIGGER_CLB3INT = 129, //!< CLA Task Trigger Source is CLB3INT
CLA_TRIGGER_CLB4INT = 130, //!< CLA Task Trigger Source is CLB4INT
CLA_TRIGGER_HICAINT = 179U, //!< CLA Task Trigger Source is HICA_INT
CLA_TRIGGER_DMACH1INT = 184U, //!< CLA Task Trigger Source is DMA_CH1INT
CLA_TRIGGER_DMACH2INT = 185U, //!< CLA Task Trigger Source is DMA_CH2INT
CLA_TRIGGER_DMACH3INT = 186U, //!< CLA Task Trigger Source is DMA_CH3INT
CLA_TRIGGER_DMACH4INT = 187U, //!< CLA Task Trigger Source is DMA_CH4INT
CLA_TRIGGER_DMACH5INT = 188U, //!< CLA Task Trigger Source is DMA_CH5INT
CLA_TRIGGER_DMACH6INT = 189U, //!< CLA Task Trigger Source is DMA_CH6INT
} CLA_Trigger;
//*****************************************************************************
//
// Prototypes for the APIs.
//
//*****************************************************************************
//*****************************************************************************
//
//! \internal
//! Checks a CLA base address.
//!
//! \param base is the base address of the CLA controller.
//!
//! This function determines if a CLA controller base address is valid.
//!
//! \return Returns \b true if the base address is valid and \b false
//! otherwise.
//
//*****************************************************************************
//*****************************************************************************
//
//! Map CLA Task Interrupt Vector
//!
//! \param base is the base address of the CLA controller.
//! \param claIntVect is CLA interrupt vector (MVECT1 to MVECT8)
//! the value of claIntVect can be any of the following:
//! - \b CLA_MVECT_1 - Task Interrupt Vector 1
//! - \b CLA_MVECT_2 - Task Interrupt Vector 2
//! - \b CLA_MVECT_3 - Task Interrupt Vector 3
//! - \b CLA_MVECT_4 - Task Interrupt Vector 4
//! - \b CLA_MVECT_5 - Task Interrupt Vector 5
//! - \b CLA_MVECT_6 - Task Interrupt Vector 6
//! - \b CLA_MVECT_7 - Task Interrupt Vector 7
//! - \b CLA_MVECT_8 - Task Interrupt Vector 8
//! \param claTaskAddr is the start address of the code for task
//!
//! Each CLA Task (1 to 8) has its own MVECTx register. When a task is
//! triggered, the CLA loads the MVECTx register of the task in question
//! to the MPC (CLA program counter) and begins execution from that point.
//! The CLA has a 16-bit address bus, and can therefore, access the lower
//! 64 KW space. The MVECTx registers take an address anywhere in this space.
//!
//! \return None.
//
//*****************************************************************************
static inline void
CLA_mapTaskVector(uint32_t base, CLA_MVECTNumber claIntVect,
uint16_t claTaskAddr)
{
//
// Check the arguments.
//
;
//
// Modify protected register
//
__eallow();
(*((volatile uint16_t *)(base + (uint16_t)claIntVect))) = claTaskAddr;
__edis();
}
//*****************************************************************************
//
//! Hard Reset
//!
//! \param base is the base address of the CLA controller.
//!
//! This function will cause a hard reset of the CLA and set all CLA registers
//! to their default state.
//!
//! \return None.
//
//*****************************************************************************
static inline void
CLA_performHardReset(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Modify protected register
//
__eallow();
//
// Hard reset of the CLA
//
(*((volatile uint16_t *)(base + 0x10U))) |= 0x1U;
__edis();
//
// Wait for few cycles till the reset is complete
//
__asm(" NOP");
__asm(" NOP");
__asm(" NOP");
}
//*****************************************************************************
//
//! Soft Reset
//!
//! \param base is the base address of the CLA controller.
//!
//! This function will cause a soft reset of the CLA. This will stop the
//! current task, clear the MIRUN flag and clear all bits in the MIER register.
//!
//! \return None.
//
//*****************************************************************************
static inline void
CLA_performSoftReset(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Modify protected register
//
__eallow();
//
// Soft reset of the CLA
//
(*((volatile uint16_t *)(base + 0x10U))) |= 0x2U;
__edis();
//
// Wait for few cycles till the reset is complete
//
__asm(" NOP");
__asm(" NOP");
__asm(" NOP");
}
//*****************************************************************************
//
//! IACK enable
//!
//! \param base is the base address of the CLA controller.
//!
//! This function enables the main CPU to use the IACK #16bit instruction to
//! set MIFR bits in the same manner as writing to the MIFRC register.
//!
//! \return None.
//
//*****************************************************************************
static inline void
CLA_enableIACK(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Modify protected register
//
__eallow();
//
// Enable the main CPU to use the IACK #16bit instruction
//
(*((volatile uint16_t *)(base + 0x10U))) |= 0x4U;
__edis();
}
//*****************************************************************************
//
//! IACK disable
//!
//! \param base is the base address of the CLA controller.
//!
//! This function disables the main CPU to use the IACK #16bit instruction to
//! set MIFR bits in the same manner as writing to the MIFRC register.
//!
//! \return None.
//
//*****************************************************************************
static inline void
CLA_disableIACK(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Modify protected register
//
__eallow();
//
// Enable the main CPU to use the IACK #16bit instruction
//
(*((volatile uint16_t *)(base + 0x10U))) &= ~0x4U;
__edis();
}
//*****************************************************************************
//
//! Query task N to see if it is flagged and pending execution
//!
//! \param base is the base address of the CLA controller.
//! \param taskNumber is the number of the task CLA_TASK_N where N is a number
//! from 1 to 8. Do not use CLA_TASKFLAG_ALL.
//!
//! This function gets the status of each bit in the interrupt flag register
//! corresponds to a CLA task. The corresponding bit is automatically set
//! when the task is triggered (either from a peripheral, through software, or
//! through the MIFRC register). The bit gets cleared when the CLA starts to
//! execute the flagged task.
//!
//! \return \b True if the queried task has been triggered but pending
//! execution.
//
//*****************************************************************************
static inline _Bool
CLA_getPendingTaskFlag(uint32_t base, CLA_TaskNumber taskNumber)
{
//
// Check the arguments.
//
;
//
// Read the run status register and return the appropriate value.
//
return((((*((volatile uint16_t *)(base + 0x20U))) >> (uint16_t)taskNumber) & 1U) != 0U);
}
//*****************************************************************************
//
//! Get status of All Task Interrupt Flag
//!
//! \param base is the base address of the CLA controller.
//!
//! This function gets the value of the interrupt flag register (MIFR)
//!
//! \return the value of Interrupt Flag Register (MIFR)
//
//*****************************************************************************
static inline uint16_t
CLA_getAllPendingTaskFlags(uint32_t base)
{
uint16_t status;
//
// Check the arguments.
//
;
//
// Just return the Interrupt Flag Register (MIFR) since that is what was
// requested.
//
status = (*((volatile uint16_t *)(base + 0x20U)));
//
// Return the Interrupt Flag Register value
//
return(status);
}
//*****************************************************************************
//
//! Get status of Task n Interrupt Overflow Flag
//!
//! \param base is the base address of the CLA controller.
//! \param taskNumber is the number of the task CLA_TASK_N where N is a number
//! from 1 to 8. Do not use CLA_TASKFLAG_ALL.
//!
//! This function gets the status of each bit in the overflow flag register
//! corresponds to a CLA task, This bit is set when an interrupt overflow event
//! has occurred for the specific task.
//!
//! \return True if any of task interrupt overflow has occurred.
//
//*****************************************************************************
static inline _Bool
CLA_getTaskOverflowFlag(uint32_t base, CLA_TaskNumber taskNumber)
{
//
// Check the arguments.
//
;
//
// Read the run status register and return the appropriate value.
//
return((((*((volatile uint16_t *)(base + 0x21U))) >> (uint16_t)taskNumber) & 1U) != 0U);
}
//*****************************************************************************
//
//! Get status of All Task Interrupt Overflow Flag
//!
//! \param base is the base address of the CLA controller.
//!
//! This function gets the value of the Interrupt Overflow Flag Register
//!
//! \return the value of Interrupt Overflow Flag Register(MIOVF)
//
//*****************************************************************************
static inline uint16_t
CLA_getAllTaskOverflowFlags(uint32_t base)
{
uint16_t status;
//
// Check the arguments.
//
;
//
// Just return Interrupt Overflow Flag Register(MIOVF) since that is what
// was requested.
//
status = (*((volatile uint16_t *)(base + 0x21U)));
//
// Return the Interrupt Overflow Flag Register
//
return(status);
}
//*****************************************************************************
//
//! Clear the task interrupt flag
//!
//! \param base is the base address of the CLA controller.
//! \param taskFlags is the bitwise OR of the tasks' flags to be cleared
//! CLA_TASKFLAG_N where N is the task number from 1 to 8, or CLA_TASKFLAG_ALL
//! to clear all flags.
//!
//! This function is used to manually clear bits in the interrupt
//! flag (MIFR) register
//!
//! \return None.
//
//*****************************************************************************
static inline void
CLA_clearTaskFlags(uint32_t base, uint16_t taskFlags)
{
//
// Check the arguments.
//
;
//
//Modify protected register
//
__eallow();
//
// Clear the task interrupt flag
//
(*((volatile uint16_t *)(base + 0x23U))) |= taskFlags;
__edis();
}
//*****************************************************************************
//
//! Force a CLA Task
//!
//! \param base is the base address of the CLA controller.
//! \param taskFlags is the bitwise OR of the tasks' flags to be forced
//! CLA_TASKFLAG_N where N is the task number from 1 to 8, or CLA_TASKFLAG_ALL
//! to force all tasks.
//!
//! This function forces a task through software.
//!
//! \return None.
//
//*****************************************************************************
static inline void
CLA_forceTasks(uint32_t base, uint16_t taskFlags)
{
//
// Check the arguments.
//
;
//
// Modify protected register
//
__eallow();
//
// Force the task interrupt.
//
(*((volatile uint16_t *)(base + 0x22U))) |= taskFlags;
__edis();
}
//*****************************************************************************
//
//! Enable CLA task(s)
//!
//! \param base is the base address of the CLA controller.
//! \param taskFlags is the bitwise OR of the tasks' flags to be enabled
//! CLA_TASKFLAG_N where N is the task number from 1 to 8, or CLA_TASKFLAG_ALL
//! to enable all tasks
//!
//! This function allows an incoming interrupt or main CPU software to
//! start the corresponding CLA task.
//!
//! \return None.
//
//*****************************************************************************
static inline void
CLA_enableTasks(uint32_t base, uint16_t taskFlags)
{
//
// Check the arguments.
//
;
//
// Modify protected register
//
__eallow();
//
// Enable CLA task
//
(*((volatile uint16_t *)(base + 0x25U))) |= taskFlags;
__edis();
}
//*****************************************************************************
//
//! Disable CLA task interrupt
//!
//! \param base is the base address of the CLA controller.
//! \param taskFlags is the bitwise OR of the tasks' flags to be disabled
//! CLA_TASKFLAG_N where N is the task number from 1 to 8, or CLA_TASKFLAG_ALL
//! to disable all tasks
//!
//! This function disables CLA task interrupt by setting the MIER register bit
//! to 0, while the corresponding task is executing this will have no effect
//! on the task. The task will continue to run until it hits the MSTOP
//! instruction.
//!
//! \return None.
//
//*****************************************************************************
static inline void
CLA_disableTasks(uint32_t base, uint16_t taskFlags)
{
//
// Check the arguments.
//
;
//
// Modify protected register
//
__eallow();
//
// Disable CLA task interrupt
//
(*((volatile uint16_t *)(base + 0x25U))) &= ~taskFlags;
__edis();
}
//*****************************************************************************
//
//! Get the value of a task run status
//!
//! \param base is the base address of the CLA controller.
//! \param taskNumber is the number of the task CLA_TASK_N where N is a number
//! from 1 to 8. Do not use CLA_TASKFLAG_ALL.
//!
//! This function gets the status of each bit in the Interrupt Run Status
//! Register which indicates whether the task is currently executing
//!
//! \return True if the task is executing.
//
//*****************************************************************************
static inline _Bool
CLA_getTaskRunStatus(uint32_t base, CLA_TaskNumber taskNumber)
{
//
// Check the arguments.
//
;
//
// Read the run status register and return the appropriate value.
//
return((((*((volatile uint16_t *)(base + 0x26U))) >> (uint16_t)taskNumber) & 1U) != 0U);
}
//*****************************************************************************
//
//! Get the value of all task run status
//!
//! \param base is the base address of the CLA controller.
//!
//! This function indicates which task is currently executing.
//!
//! \return the value of Interrupt Run Status Register (MIRUN)
//
//*****************************************************************************
static inline uint16_t
CLA_getAllTaskRunStatus(uint32_t base)
{
uint16_t status;
//
// Check the arguments.
//
;
//
// Just return the Interrupt Run Status Register since that is what was
// requested.
//
status = (*((volatile uint16_t *)(base + 0x26U)));
//
// Return the Interrupt Run Status Register (MIRUN)
//
return(status);
}
//*****************************************************************************
//
//! Get the value of Active register for MVECTBGRNDACTIVE
//!
//! \param base is the base address of the CLA controller.
//!
//! This function gives the current interrupted MPC value of the background
//! task.
//!
//! \return the value of Active register for the Background Task Vector
//
//*****************************************************************************
static inline uint16_t
CLA_getBackgroundActiveVector(uint32_t base)
{
uint16_t status;
//
// Check the arguments.
//
;
//
// Just return the Active register for the Background Task Vector since
// that is what was requested.
//
status = (*((volatile uint16_t *)(base + 0x1BU)));
//
// Return the value of Active register for the Background Task Vector
//
return(status);
}
//*****************************************************************************
//
//! Enable the background task
//!
//! \param base is the base address of the CLA controller.
//!
//! This function enables the background task
//!
//! \return None.
//
//*****************************************************************************
static inline void
CLA_enableBackgroundTask(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Modify protected register
//
__eallow();
//
// Enable background task
//
(*((volatile uint16_t *)(base + 0x1EU))) |= 0x8000U;
__edis();
}
//*****************************************************************************
//
//! Disable background task
//!
//! \param base is the base address of the CLA controller.
//!
//! This function disables the background task
//!
//! \return None.
//
//*****************************************************************************
static inline void
CLA_disableBackgroundTask(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Modify protected register
//
__eallow();
//
// Disables background task
//
(*((volatile uint16_t *)(base + 0x1EU))) &= ~0x8000U;
__edis();
}
//*****************************************************************************
//
//! Start background task
//!
//! \param base is the base address of the CLA controller.
//!
//! This function will start the background task, provided there are no other
//! pending tasks.
//!
//! \return None.
//
//*****************************************************************************
static inline void
CLA_startBackgroundTask(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Modify protected register
//
__eallow();
//
// Start background task
//
(*((volatile uint16_t *)(base + 0x1EU))) |= 0x1U;
__edis();
}
//*****************************************************************************
//
//! Enable background task hardware trigger
//!
//! \param base is the base address of the CLA controller.
//!
//! This function enables hardware trigger for background task
//! \note Trigger source for the background task will be MPERINT8.1.
//!
//! \return None.
//
//*****************************************************************************
static inline void
CLA_enableHardwareTrigger(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Modify protected register
//
__eallow();
//
// Enable background task hardware trigger
//
(*((volatile uint16_t *)(base + 0x1EU))) |= 0x2U;
__edis();
}
//*****************************************************************************
//
//! Disable background task hardware trigger
//!
//! \param base is the base address of the CLA controller.
//!
//! This function disables hardware trigger for background task
//!
//! \return None.
//
//*****************************************************************************
static inline void
CLA_disableHardwareTrigger(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Modify protected register
//
__eallow();
//
// Disables hardware trigger for background task
//
(*((volatile uint16_t *)(base + 0x1EU))) &= ~0x2U;
__edis();
}
//*****************************************************************************
//
//! Map background task vector
//!
//! \param base is the base address of the CLA controller.
//! \param claTaskAddr is the start address of the code for task
//!
//! This function specifies the start address for the background task
//!
//! \return None.
//
//*****************************************************************************
static inline void
CLA_mapBackgroundTaskVector(uint32_t base, uint16_t claTaskAddr)
{
//
// Check the arguments.
//
;
//
// Modify protected register
//
__eallow();
(*((volatile uint16_t *)(base + 0x1FU))) = (uint16_t)claTaskAddr;
__edis();
}
//*****************************************************************************
//
//! Get Status register for the back ground task.
//!
//! \param base is the base address of the CLA controller.
//! \param stsFlag is status item to be returned.
//!
//! The value of \e stsFlag can be any of the following:
//! - \b CLA_BGSTS_RUNNING
//! - \b CLA_BGSTS_CANNOT_INTERRUPT
//! - \b CLA_BGSTS_OVERFLOW
//!
//! This function gets the status of background task
//!
//! \return Based on the value of \e stsFlag, the function will return:
//! - \b CLA_BGSTS_RUNNING - The function will return \b true if the background
//! task is running.
//! - \b CLA_BGSTS_CANNOT_INTERRUPT - The function will return \b true if the
//! background task will not be interrupted (when MSETC BGINTM is executed).
//! - \b CLA_BGSTS_OVERFLOW - This function will return \b true if an enabled
//! hardware trigger occurred while _MCTLBGRND.BGSTART is set.
//
//*****************************************************************************
static inline _Bool
CLA_getBackgroundTaskStatus(uint32_t base, CLA_BGTaskStatus stsFlag)
{
//
// Check the arguments.
//
;
;
//
// Return the background task status value
//
return(((*((volatile uint16_t *)(base + 0x1DU))) & (uint16_t)stsFlag) != 0U);
}
//
// These functions are accessible only from the CLA (Type - 1/2)
//
//
// These functions can only be called from the C28x
//
//*****************************************************************************
//
//! Configures CLA task triggers.
//!
//! \param taskNumber is the number of the task CLA_TASK_N where N is a number
//! from 1 to 8.
//! \param trigger is the trigger source to be assigned to the selected task.
//!
//! This function configures the trigger source of a CLA task. The
//! \e taskNumber parameter indicates which task is being configured, and the
//! \e trigger parameter is the interrupt source from a specific peripheral
//! interrupt (or software) that will trigger the task.
//!
//! \return None.
//
//*****************************************************************************
extern void
CLA_setTriggerSource(CLA_TaskNumber taskNumber, CLA_Trigger trigger);
//*****************************************************************************
//
// Close the Doxygen group.
//! @}
//
//*****************************************************************************
//*****************************************************************************
//
// Mark the end of the C bindings section for C++ compilers.
//
//*****************************************************************************
//###########################################################################
//
// FILE: clb.h
//
// TITLE: C28x CLB driver.
//
//###########################################################################
// $Copyright:
// Copyright (C) 2023 Texas Instruments Incorporated - http://www.ti.com/
//
// 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 Texas Instruments Incorporated 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
// OWNER 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.
// $
//###########################################################################
//*****************************************************************************
//
// If building with a C++ compiler, make all of the definitions in this header
// have a C binding.
//
//*****************************************************************************
//*****************************************************************************
//
//! \addtogroup clb_api CLB
//! @{
//
//*****************************************************************************
//###########################################################################
//
// FILE: hw_clb.h
//
// TITLE: Definitions for the CLB registers.
//
//###########################################################################
// $Copyright:
// Copyright (C) 2023 Texas Instruments Incorporated - http://www.ti.com/
//
// 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 Texas Instruments Incorporated 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
// OWNER 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.
// $
//###########################################################################
//*************************************************************************************************
//
// The following are defines for the CLB register offsets
//
//*************************************************************************************************
// controller
// synchronizers
// register
// outputs
//*************************************************************************************************
//
// The following are defines for the bit fields in the CLB_COUNT_RESET register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the CLB_COUNT_MODE_1 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the CLB_COUNT_MODE_0 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the CLB_COUNT_EVENT register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the CLB_FSM_EXTRA_IN0 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the CLB_FSM_EXTERNAL_IN0 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the CLB_FSM_EXTERNAL_IN1 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the CLB_FSM_EXTRA_IN1 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the CLB_LUT4_IN0 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the CLB_LUT4_IN1 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the CLB_LUT4_IN2 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the CLB_LUT4_IN3 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the CLB_FSM_LUT_FN1_0 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the CLB_FSM_LUT_FN2 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the CLB_LUT4_FN1_0 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the CLB_LUT4_FN2 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the CLB_FSM_NEXT_STATE_0 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the CLB_FSM_NEXT_STATE_1 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the CLB_FSM_NEXT_STATE_2 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the CLB_MISC_CONTROL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the CLB_OUTPUT_LUT_0 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the CLB_OUTPUT_LUT_1 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the CLB_OUTPUT_LUT_2 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the CLB_OUTPUT_LUT_3 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the CLB_OUTPUT_LUT_4 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the CLB_OUTPUT_LUT_5 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the CLB_OUTPUT_LUT_6 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the CLB_OUTPUT_LUT_7 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the CLB_HLC_EVENT_SEL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the CLB_COUNT_MATCH_TAP_SEL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the CLB_OUTPUT_COND_CTRL_0 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the CLB_OUTPUT_COND_CTRL_1 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the CLB_OUTPUT_COND_CTRL_2 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the CLB_OUTPUT_COND_CTRL_3 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the CLB_OUTPUT_COND_CTRL_4 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the CLB_OUTPUT_COND_CTRL_5 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the CLB_OUTPUT_COND_CTRL_6 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the CLB_OUTPUT_COND_CTRL_7 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the CLB_MISC_ACCESS_CTRL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the CLB_SPI_DATA_CTRL_HI register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the CLB_LOAD_EN register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the CLB_LOAD_ADDR register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the CLB_INPUT_FILTER register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the CLB_IN_MUX_SEL_0 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the CLB_LCL_MUX_SEL_1 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the CLB_LCL_MUX_SEL_2 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the CLB_BUF_PTR register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the CLB_GP_REG register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the CLB_GLBL_MUX_SEL_1 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the CLB_GLBL_MUX_SEL_2 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the CLB_PRESCALE_CTRL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the CLB_INTR_TAG_REG register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the CLB_LOCK register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the CLB_HLC_INSTR_READ_PTR register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the CLB_HLC_INSTR_VALUE register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the CLB_DBG_OUT_2 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the CLB_DBG_OUT register
//
//*************************************************************************************************
//*****************************************************************************
//
// Address offsets from LOGICCFG to LOGICCTL and DATAEXCH register memory maps
//
//*****************************************************************************
//*****************************************************************************
//
// Address offsets for CLB-internal memory space
//
//*****************************************************************************
//*****************************************************************************
//
// PUSH/PULL FIFO size (32-bit registers)
//
//*****************************************************************************
//*****************************************************************************
//
// Key to enable writes to the CLB registers
//
//*****************************************************************************
//*****************************************************************************
//
// Shift and masks needed by the API for Input selection
//
//*****************************************************************************
//*****************************************************************************
//
//! Values that can be passed to control the CLB output enable signal. It can
//! be passed to CLB_setOutputMask() as the \e outputMask parameter.
//
//*****************************************************************************
//*****************************************************************************
//
//! Values that can be passed to select CLB input signal
//
//*****************************************************************************
typedef enum
{
CLB_IN0 = 0, //!< Input 0
CLB_IN1 = 1, //!< Input 1
CLB_IN2 = 2, //!< Input 2
CLB_IN3 = 3, //!< Input 3
CLB_IN4 = 4, //!< Input 4
CLB_IN5 = 5, //!< Input 5
CLB_IN6 = 6, //!< Input 6
CLB_IN7 = 7 //!< Input 7
} CLB_Inputs;
//*****************************************************************************
//
//! Values that can be passed to select CLB output signal. It can be passed to
//! CLB_configOutputLUT() as the \e outID parameter.
//
//*****************************************************************************
typedef enum
{
CLB_OUT0 = 0, //!< Output 0
CLB_OUT1 = 1, //!< Output 1
CLB_OUT2 = 2, //!< Output 2
CLB_OUT3 = 3, //!< Output 3
CLB_OUT4 = 4, //!< Output 4
CLB_OUT5 = 5, //!< Output 5
CLB_OUT6 = 6, //!< Output 6
CLB_OUT7 = 7 //!< Output 7
} CLB_Outputs;
//*****************************************************************************
//
//! Values that can be passed to select CLB AOC signal. It can be passed to
//! CLB_configAOC() as the \e aocID parameter.
//! AOC is the Asynchronous Output Conditioning block.
//
//*****************************************************************************
typedef enum
{
CLB_AOC0 = 0, //!< AOC 0
CLB_AOC1 = 1, //!< AOC 1
CLB_AOC2 = 2, //!< AOC 2
CLB_AOC3 = 3, //!< AOC 3
CLB_AOC4 = 4, //!< AOC 4
CLB_AOC5 = 5, //!< AOC 5
CLB_AOC6 = 6, //!< AOC 6
CLB_AOC7 = 7 //!< AOC 7
} CLB_AOCs;
//*****************************************************************************
//
//! Values that can be passed to set/clear CLB SW release signals. It can
//! be passed to CLB_writeSWReleaseControl() as the \e inID parameter.
//
//*****************************************************************************
typedef enum
{
CLB_SW_RLS_CTRL0 = 0, //!< SW RLS CTRL 0
CLB_SW_RLS_CTRL1 = 1, //!< SW RLS CTRL 1
CLB_SW_RLS_CTRL2 = 2, //!< SW RLS CTRL 2
CLB_SW_RLS_CTRL3 = 3, //!< SW RLS CTRL 3
CLB_SW_RLS_CTRL4 = 4, //!< SW RLS CTRL 4
CLB_SW_RLS_CTRL5 = 5, //!< SW RLS CTRL 5
CLB_SW_RLS_CTRL6 = 6, //!< SW RLS CTRL 6
CLB_SW_RLS_CTRL7 = 7 //!< SW RLS CTRL 7
} CLB_SWReleaseCtrl;
//*****************************************************************************
//
//! Values that can be passed to set/clear CLB SW release signals. It can
//! be passed to CLB_writeSWGateControl() as the \e inID parameter.
//
//*****************************************************************************
typedef enum
{
CLB_SW_GATE_CTRL0 = 0, //!< SW GATE CTRL 0
CLB_SW_GATE_CTRL1 = 1, //!< SW GATE CTRL 1
CLB_SW_GATE_CTRL2 = 2, //!< SW GATE CTRL 2
CLB_SW_GATE_CTRL3 = 3, //!< SW GATE CTRL 3
CLB_SW_GATE_CTRL4 = 4, //!< SW GATE CTRL 4
CLB_SW_GATE_CTRL5 = 5, //!< SW GATE CTRL 5
CLB_SW_GATE_CTRL6 = 6, //!< SW GATE CTRL 6
CLB_SW_GATE_CTRL7 = 7 //!< SW GATE CTRL 7
} CLB_SWGateCtrl;
//*****************************************************************************
//
//! Values that can be passed to select CLB counter. It can be passed to
//! CLB_configCounterLoadMatch() as the \e counterID parameter.
//
//*****************************************************************************
typedef enum
{
CLB_CTR0 = 0, //!< Counter 0
CLB_CTR1 = 1, //!< Counter 1
CLB_CTR2 = 2 //!< Counter 2
} CLB_Counters;
//*****************************************************************************
//
//! Values that can be passed to CLB_getRegister() as the \e registerID
//! parameter.
//
//*****************************************************************************
typedef enum
{
CLB_REG_HLC_R0 = 0x30U, //!< HLC R0 register
CLB_REG_HLC_R1 = 0x32U, //!< HLC R1 register
CLB_REG_HLC_R2 = 0x34U, //!< HLC R2 register
CLB_REG_HLC_R3 = 0x36U, //!< HLC R3 register
CLB_REG_CTR_C0 = 0x38U, //!< Counter 0 register
CLB_REG_CTR_C1 = 0x3AU, //!< Counter 1 register
CLB_REG_CTR_C2 = 0x3CU //!< Counter 2 register
} CLB_Register;
//*****************************************************************************
//
//! Values that can be passed to CLB_selectInputFilter() as the \e filterType
//! parameter.
//
//*****************************************************************************
typedef enum
{
CLB_FILTER_NONE = 0, //!< No filtering
CLB_FILTER_RISING_EDGE = 1, //!< Rising edge detect
CLB_FILTER_FALLING_EDGE = 2, //!< Falling edge detect
CLB_FILTER_ANY_EDGE = 3 //!< Any edge detect
} CLB_FilterType;
//*****************************************************************************
//
//! Values that can be passed to CLB_configGPInputMux() as the \e gpMuxCfg
//! parameter.
//
//*****************************************************************************
typedef enum
{
CLB_GP_IN_MUX_EXTERNAL = 0, //!< Use external input path
CLB_GP_IN_MUX_GP_REG = 1 //!< Use CLB_GP_REG bit value as input
} CLB_GPInputMux;
//*****************************************************************************
//
//! Values that can be passed to CLB_configLocalInputMux() as the
//! \e localMuxCfg parameter.
//
//*****************************************************************************
typedef enum
{
CLB_LOCAL_IN_MUX_GLOBAL_IN = 0, //!< Global input mux selection
CLB_LOCAL_IN_MUX_EPWM_DCAEVT1 = 1, //!< EPWMx DCAEVT1
CLB_LOCAL_IN_MUX_EPWM_DCAEVT2 = 2, //!< EPWMx DCAEVT2
CLB_LOCAL_IN_MUX_EPWM_DCBEVT1 = 3, //!< EPWMx DCBEVT1
CLB_LOCAL_IN_MUX_EPWM_DCBEVT2 = 4, //!< EPWMx DCBEVT2
CLB_LOCAL_IN_MUX_EPWM_DCAH = 5, //!< EPWMx DCAH
CLB_LOCAL_IN_MUX_EPWM_DCAL = 6, //!< EPWMx DCAL
CLB_LOCAL_IN_MUX_EPWM_DCBH = 7, //!< EPWMx DCBH
CLB_LOCAL_IN_MUX_EPWM_DCBL = 8, //!< EPWMx DCBL
CLB_LOCAL_IN_MUX_EPWM_OST = 9, //!< EPWMx OST
CLB_LOCAL_IN_MUX_EPWM_CBC = 10, //!< EPWMx CBC
CLB_LOCAL_IN_MUX_ECAP_ECAPIN = 11, //!< ECAPx ECAPIN
CLB_LOCAL_IN_MUX_ECAP_ECAP_OUT = 12, //!< ECAPx ECAP_OUT
CLB_LOCAL_IN_MUX_ECAP_ECAP_OUT_EN = 13, //!< ECAPx ECAP_OUT_EN
CLB_LOCAL_IN_MUX_ECAP_CEVT1 = 14, //!< ECAPx CEVT1
CLB_LOCAL_IN_MUX_ECAP_CEVT2 = 15, //!< ECAPx CEVT2
CLB_LOCAL_IN_MUX_ECAP_CEVT3 = 16, //!< ECAPx CEVT3
CLB_LOCAL_IN_MUX_ECAP_CEVT4 = 17, //!< ECAPx CEVT4
CLB_LOCAL_IN_MUX_EQEP_EQEPA = 18, //!< EQEPx EQEPA
CLB_LOCAL_IN_MUX_EQEP_EQEPB = 19, //!< EQEPx EQEPB
CLB_LOCAL_IN_MUX_EQEP_EQEPI = 20, //!< EQEPx EQEPI
CLB_LOCAL_IN_MUX_EQEP_EQEPS = 21, //!< EQEPx EQEPS
CLB_LOCAL_IN_MUX_CPU1_TBCLKSYNC = 22, //!< CPU1.TBCLKSYNC
CLB_LOCAL_IN_MUX_CPU1_HALT = 24, //!< CPU1.HALT
CLB_LOCAL_IN_MUX_SPIPICO_CONTROLLER = 25, //!< SPIPICO Controller Output
CLB_LOCAL_IN_MUX_SPICLK = 26, //!< SPI Clock
CLB_LOCAL_IN_MUX_SPIPICO_PERIPHERAL = 27, //!< SPIPICO Peripheral Input
CLB_LOCAL_IN_MUX_SPIPTE = 28, //!< SPI PTE
CLB_LOCAL_IN_MUX_SCI_TX = 29, //!< SCI TX
CLB_LOCAL_IN_MUX_SPIPOCI_OUT = 30, //!< SPIPOCI(OUT)
CLB_LOCAL_IN_MUX_CLB_PSCLK = 31, //!< CLB prescaled clock
CLB_LOCAL_IN_MUX_EPWM5A = 32, //!< EPWM5A (CLB 1-4)
CLB_LOCAL_IN_MUX_EPWM5A_OE = 33, //!< EPWM5A trip output (CLB 1-4)
CLB_LOCAL_IN_MUX_EPWM5B = 34, //!< EPWM5B (CLB 1-4)
CLB_LOCAL_IN_MUX_EPWM5B_OE = 35, //!< EPWM5B trip output (CLB 1-4)
CLB_LOCAL_IN_MUX_EPWM6A = 36, //!< EPWM6A (CLB 1-4)
CLB_LOCAL_IN_MUX_EPWM6A_OE = 37, //!< EPWM6A trip output (CLB 1-4)
CLB_LOCAL_IN_MUX_EPWM6B = 38, //!< EPWM6B (CLB 1-4)
CLB_LOCAL_IN_MUX_EPWM6B_OE = 39, //!< EPWM6B trip output (CLB 1-4)
CLB_LOCAL_IN_MUX_EPWM7A = 40, //!< EPWM7A (CLB 1-4)
CLB_LOCAL_IN_MUX_EPWM7A_OE = 41, //!< EPWM7A trip output (CLB 1-4)
CLB_LOCAL_IN_MUX_EPWM7B = 42, //!< EPWM7B (CLB 1-4)
CLB_LOCAL_IN_MUX_EPWM7B_OE = 43, //!< EPWM7B trip output (CLB 1-4)
CLB_LOCAL_IN_MUX_EPWM8A = 44, //!< EPWM8A (CLB 1-4)
CLB_LOCAL_IN_MUX_EPWM8A_OE = 45, //!< EPWM8A trip output (CLB 1-4)
CLB_LOCAL_IN_MUX_EPWM8B = 46, //!< EPWM8B (CLB 1-4)
CLB_LOCAL_IN_MUX_EPWM8B_OE = 47, //!< EPWM8B trip output (CLB 1-4)
CLB_LOCAL_IN_MUX_INPUT1 = 48, //!< CLBINPUTXBAR INPUT1
CLB_LOCAL_IN_MUX_INPUT2 = 49, //!< CLBINPUTXBAR INPUT2
CLB_LOCAL_IN_MUX_INPUT3 = 50, //!< CLBINPUTXBAR INPUT3
CLB_LOCAL_IN_MUX_INPUT4 = 51, //!< CLBINPUTXBAR INPUT4
CLB_LOCAL_IN_MUX_INPUT5 = 52, //!< CLBINPUTXBAR INPUT5
CLB_LOCAL_IN_MUX_INPUT6 = 53, //!< CLBINPUTXBAR INPUT6
CLB_LOCAL_IN_MUX_INPUT7 = 54, //!< CLBINPUTXBAR INPUT7
CLB_LOCAL_IN_MUX_INPUT8 = 55, //!< CLBINPUTXBAR INPUT8
CLB_LOCAL_IN_MUX_INPUT9 = 56, //!< CLBINPUTXBAR INPUT9
CLB_LOCAL_IN_MUX_INPUT10 = 57, //!< CLBINPUTXBAR INPUT10
CLB_LOCAL_IN_MUX_INPUT11 = 58, //!< CLBINPUTXBAR INPUT11
CLB_LOCAL_IN_MUX_INPUT12 = 59, //!< CLBINPUTXBAR INPUT12
CLB_LOCAL_IN_MUX_INPUT13 = 60, //!< CLBINPUTXBAR INPUT13
CLB_LOCAL_IN_MUX_INPUT14 = 61, //!< CLBINPUTXBAR INPUT14
CLB_LOCAL_IN_MUX_INPUT15 = 62, //!< CLBINPUTXBAR INPUT15
CLB_LOCAL_IN_MUX_INPUT16 = 63 //!< CLBINPUTXBAR INPUT16
} CLB_LocalInputMux;
//*****************************************************************************
//
//! Values that can be passed to CLB_configGlobalInputMux() as the
//! \e globalMuxCfg parameter.
//
//*****************************************************************************
typedef enum
{
CLB_GLOBAL_IN_MUX_EPWM1A = 0, //!< EPWM1A
CLB_GLOBAL_IN_MUX_EPWM1A_OE = 1, //!< EPWM1A trip output
CLB_GLOBAL_IN_MUX_EPWM1B = 2, //!< EPWM1B
CLB_GLOBAL_IN_MUX_EPWM1B_OE = 3, //!< EPWM1B trip output
CLB_GLOBAL_IN_MUX_EPWM1_CTR_ZERO = 4, //!< EPWM1 TBCTR = Zero
CLB_GLOBAL_IN_MUX_EPWM1_CTR_PRD = 5, //!< EPWM1 TBCTR = TBPRD
CLB_GLOBAL_IN_MUX_EPWM1_CTRDIR = 6, //!< EPWM1 CTRDIR
CLB_GLOBAL_IN_MUX_EPWM1_TBCLK = 7, //!< EPWM1 TBCLK
CLB_GLOBAL_IN_MUX_EPWM1_CTR_CMPA = 8, //!< EPWM1 TBCTR = CMPA
CLB_GLOBAL_IN_MUX_EPWM1_CTR_CMPB = 9, //!< EPWM1 TBCTR = CMPB
CLB_GLOBAL_IN_MUX_EPWM1_CTR_CMPC = 10, //!< EPWM1 TBCTR = CMPC
CLB_GLOBAL_IN_MUX_EPWM1_CTR_CMPD = 11, //!< EPWM1 TBCTR = CMPD
CLB_GLOBAL_IN_MUX_EPWM1A_AQ = 12, //!< EPWM1A AQ submodule output
CLB_GLOBAL_IN_MUX_EPWM1B_AQ = 13, //!< EPWM1B AQ submodule output
CLB_GLOBAL_IN_MUX_EPWM1A_DB = 14, //!< EPWM1A DB submodule output
CLB_GLOBAL_IN_MUX_EPWM1B_DB = 15, //!< EPWM1B DB submodule output
CLB_GLOBAL_IN_MUX_EPWM2A = 16, //!< EPWM2A
CLB_GLOBAL_IN_MUX_EPWM2A_OE = 17, //!< EPWM2A trip output
CLB_GLOBAL_IN_MUX_EPWM2B = 18, //!< EPWM2B
CLB_GLOBAL_IN_MUX_EPWM2B_OE = 19, //!< EPWM2B trip output
CLB_GLOBAL_IN_MUX_EPWM2_CTR_ZERO = 20, //!< EPWM2 TBCTR = Zero
CLB_GLOBAL_IN_MUX_EPWM2_CTR_PRD = 21, //!< EPWM2 TBCTR = TBPRD
CLB_GLOBAL_IN_MUX_EPWM2_CTRDIR = 22, //!< EPWM2 CTRDIR
CLB_GLOBAL_IN_MUX_EPWM2_TBCLK = 23, //!< EPWM2 TBCLK
CLB_GLOBAL_IN_MUX_EPWM2_CTR_CMPA = 24, //!< EPWM2 TBCTR = CMPA
CLB_GLOBAL_IN_MUX_EPWM2_CTR_CMPB = 25, //!< EPWM2 TBCTR = CMPB
CLB_GLOBAL_IN_MUX_EPWM2_CTR_CMPC = 26, //!< EPWM2 TBCTR = CMPC
CLB_GLOBAL_IN_MUX_EPWM2_CTR_CMPD = 27, //!< EPWM2 TBCTR = CMPD
CLB_GLOBAL_IN_MUX_EPWM2A_AQ = 28, //!< EPWM2A AQ submodule output
CLB_GLOBAL_IN_MUX_EPWM2B_AQ = 29, //!< EPWM2B AQ submodule output
CLB_GLOBAL_IN_MUX_EPWM2A_DB = 30, //!< EPWM2A DB submodule output
CLB_GLOBAL_IN_MUX_EPWM2B_DB = 31, //!< EPWM2B DB submodule output
CLB_GLOBAL_IN_MUX_EPWM3A = 32, //!< EPWM3A
CLB_GLOBAL_IN_MUX_EPWM3A_OE = 33, //!< EPWM3A trip output
CLB_GLOBAL_IN_MUX_EPWM3B = 34, //!< EPWM3B
CLB_GLOBAL_IN_MUX_EPWM3B_OE = 35, //!< EPWM3B trip output
CLB_GLOBAL_IN_MUX_EPWM3_CTR_ZERO = 36, //!< EPWM3 TBCTR = Zero
CLB_GLOBAL_IN_MUX_EPWM3_CTR_PRD = 37, //!< EPWM3 TBCTR = TBPRD
CLB_GLOBAL_IN_MUX_EPWM3_CTRDIR = 38, //!< EPWM3 CTRDIR
CLB_GLOBAL_IN_MUX_EPWM3_TBCLK = 39, //!< EPWM3 TBCLK
CLB_GLOBAL_IN_MUX_EPWM3_CTR_CMPA = 40, //!< EPWM3 TBCTR = CMPA
CLB_GLOBAL_IN_MUX_EPWM3_CTR_CMPB = 41, //!< EPWM3 TBCTR = CMPB
CLB_GLOBAL_IN_MUX_EPWM3_CTR_CMPC = 42, //!< EPWM3 TBCTR = CMPC
CLB_GLOBAL_IN_MUX_EPWM3_CTR_CMPD = 43, //!< EPWM3 TBCTR = CMPD
CLB_GLOBAL_IN_MUX_EPWM3A_AQ = 44, //!< EPWM3A AQ submodule output
CLB_GLOBAL_IN_MUX_EPWM3B_AQ = 45, //!< EPWM3B AQ submodule output
CLB_GLOBAL_IN_MUX_EPWM3A_DB = 46, //!< EPWM3A DB submodule output
CLB_GLOBAL_IN_MUX_EPWM3B_DB = 47, //!< EPWM3B DB submodule output
CLB_GLOBAL_IN_MUX_EPWM4A = 48, //!< EPWM4A
CLB_GLOBAL_IN_MUX_EPWM4A_OE = 49, //!< EPWM4A trip output
CLB_GLOBAL_IN_MUX_EPWM4B = 50, //!< EPWM4B
CLB_GLOBAL_IN_MUX_EPWM4B_OE = 51, //!< EPWM4B trip output
CLB_GLOBAL_IN_MUX_EPWM4_CTR_ZERO = 52, //!< EPWM4 TBCTR = Zero
CLB_GLOBAL_IN_MUX_EPWM4_CTR_PRD = 53, //!< EPWM4 TBCTR = TBPRD
CLB_GLOBAL_IN_MUX_EPWM4_CTRDIR = 54, //!< EPWM4 CTRDIR
CLB_GLOBAL_IN_MUX_EPWM4_TBCLK = 55, //!< EPWM4 TBCLK
CLB_GLOBAL_IN_MUX_EPWM4_CTR_CMPA = 56, //!< EPWM4 TBCTR = CMPA
CLB_GLOBAL_IN_MUX_EPWM4_CTR_CMPB = 57, //!< EPWM4 TBCTR = CMPB
CLB_GLOBAL_IN_MUX_EPWM4_CTR_CMPC = 58, //!< EPWM4 TBCTR = CMPC
CLB_GLOBAL_IN_MUX_EPWM4_CTR_CMPD = 59, //!< EPWM4 TBCTR = CMPD
CLB_GLOBAL_IN_MUX_EPWM4A_AQ = 60, //!< EPWM4A AQ submodule output
CLB_GLOBAL_IN_MUX_EPWM4B_AQ = 61, //!< EPWM4B AQ submodule output
CLB_GLOBAL_IN_MUX_EPWM4A_DB = 62, //!< EPWM4A DB submodule output
CLB_GLOBAL_IN_MUX_EPWM4B_DB = 63, //!< EPWM4B DB submodule output
CLB_GLOBAL_IN_MUX_CLB_AUXSIG0 = 64, //!< CLB X-BAR AUXSIG0
CLB_GLOBAL_IN_MUX_CLB_AUXSIG1 = 65, //!< CLB X-BAR AUXSIG1
CLB_GLOBAL_IN_MUX_CLB_AUXSIG2 = 66, //!< CLB X-BAR AUXSIG2
CLB_GLOBAL_IN_MUX_CLB_AUXSIG3 = 67, //!< CLB X-BAR AUXSIG3
CLB_GLOBAL_IN_MUX_CLB_AUXSIG4 = 68, //!< CLB X-BAR AUXSIG4
CLB_GLOBAL_IN_MUX_CLB_AUXSIG5 = 69, //!< CLB X-BAR AUXSIG5
CLB_GLOBAL_IN_MUX_CLB_AUXSIG6 = 70, //!< CLB X-BAR AUXSIG6
CLB_GLOBAL_IN_MUX_CLB_AUXSIG7 = 71, //!< CLB X-BAR AUXSIG7
CLB_GLOBAL_IN_MUX_CLB1_OUT16 = 72, //!< CLB1 OUT16
CLB_GLOBAL_IN_MUX_CLB1_OUT17 = 73, //!< CLB1 OUT17
CLB_GLOBAL_IN_MUX_CLB1_OUT18 = 74, //!< CLB1 OUT18
CLB_GLOBAL_IN_MUX_CLB1_OUT19 = 75, //!< CLB1 OUT19
CLB_GLOBAL_IN_MUX_CLB1_OUT20 = 76, //!< CLB1 OUT20
CLB_GLOBAL_IN_MUX_CLB1_OUT21 = 77, //!< CLB1 OUT21
CLB_GLOBAL_IN_MUX_CLB1_OUT22 = 78, //!< CLB1 OUT22
CLB_GLOBAL_IN_MUX_CLB1_OUT23 = 79, //!< CLB1 OUT23
CLB_GLOBAL_IN_MUX_CLB2_OUT16 = 80, //!< CLB2 OUT16
CLB_GLOBAL_IN_MUX_CLB2_OUT17 = 81, //!< CLB2 OUT17
CLB_GLOBAL_IN_MUX_CLB2_OUT18 = 82, //!< CLB2 OUT18
CLB_GLOBAL_IN_MUX_CLB2_OUT19 = 83, //!< CLB2 OUT19
CLB_GLOBAL_IN_MUX_CLB2_OUT20 = 84, //!< CLB2 OUT20
CLB_GLOBAL_IN_MUX_CLB2_OUT21 = 85, //!< CLB2 OUT21
CLB_GLOBAL_IN_MUX_CLB2_OUT22 = 86, //!< CLB2 OUT22
CLB_GLOBAL_IN_MUX_CLB2_OUT23 = 87, //!< CLB2 OUT23
CLB_GLOBAL_IN_MUX_CLB3_OUT16 = 88, //!< CLB3 OUT16
CLB_GLOBAL_IN_MUX_CLB3_OUT17 = 89, //!< CLB3 OUT17
CLB_GLOBAL_IN_MUX_CLB3_OUT18 = 90, //!< CLB3 OUT18
CLB_GLOBAL_IN_MUX_CLB3_OUT19 = 91, //!< CLB3 OUT19
CLB_GLOBAL_IN_MUX_CLB3_OUT20 = 92, //!< CLB3 OUT20
CLB_GLOBAL_IN_MUX_CLB3_OUT21 = 93, //!< CLB3 OUT21
CLB_GLOBAL_IN_MUX_CLB3_OUT22 = 94, //!< CLB3 OUT22
CLB_GLOBAL_IN_MUX_CLB3_OUT23 = 95, //!< CLB3 OUT23
CLB_GLOBAL_IN_MUX_CLB4_OUT16 = 96, //!< CLB4 OUT16
CLB_GLOBAL_IN_MUX_CLB4_OUT17 = 97, //!< CLB4 OUT17
CLB_GLOBAL_IN_MUX_CLB4_OUT18 = 98, //!< CLB4 OUT18
CLB_GLOBAL_IN_MUX_CLB4_OUT19 = 99, //!< CLB4 OUT19
CLB_GLOBAL_IN_MUX_CLB4_OUT20 = 100, //!< CLB4 OUT20
CLB_GLOBAL_IN_MUX_CLB4_OUT21 = 101, //!< CLB4 OUT21
CLB_GLOBAL_IN_MUX_CLB4_OUT22 = 102, //!< CLB4 OUT22
CLB_GLOBAL_IN_MUX_CLB4_OUT23 = 103, //!< CLB4 OUT23
CLB_GLOBAL_IN_MUX_ERAD_EVENT0 = 104, //!< ERAD Event 0 (BUSCOMP1)
CLB_GLOBAL_IN_MUX_ERAD_EVENT1 = 105, //!< ERAD Event 1 (BUSCOMP2)
CLB_GLOBAL_IN_MUX_ERAD_EVENT2 = 106, //!< ERAD Event 2 (BUSCOMP3)
CLB_GLOBAL_IN_MUX_ERAD_EVENT3 = 107, //!< ERAD Event 3 (BUSCOMP4)
CLB_GLOBAL_IN_MUX_ERAD_EVENT4 = 108, //!< ERAD Event 4 (BUSCOMP5)
CLB_GLOBAL_IN_MUX_ERAD_EVENT5 = 109, //!< ERAD Event 5 (BUSCOMP6)
CLB_GLOBAL_IN_MUX_ERAD_EVENT6 = 110, //!< ERAD Event 6 (BUSCOMP7)
CLB_GLOBAL_IN_MUX_ERAD_EVENT7 = 111, //!< ERAD Event 7 (BUSCOMP8)
CLB_GLOBAL_IN_MUX_FSIRXA_DATA_PACKET_RCVD = 112, //!< FSIRXA Data Packet Received
CLB_GLOBAL_IN_MUX_FSIRXA_ERROR_PACKET_RCVD = 113, //!< FSIRXA Error Packet Received
CLB_GLOBAL_IN_MUX_FSIRXA_PING_PACKET_RCVD = 114, //!< FSIRXA PING Packet Received
CLB_GLOBAL_IN_MUX_FSIRXA_OUTPUT_FRAME_DONE = 115, //!< FSIRXA Output Frame Done
CLB_GLOBAL_IN_MUX_FSIRXA_PING_TAG_MATCH = 116, //!< FSIRXA PING TAG Match
CLB_GLOBAL_IN_MUX_FSIRXA_DATA_TAG_MATCH = 117, //!< FSIRXA DATA TAG Match
CLB_GLOBAL_IN_MUX_FSIRXA_ERROR_TAG_MATCH = 118, //!< FSIRXA ERROR TAG Match
CLB_GLOBAL_IN_MUX_FSIRXA_RX_TRIG2 = 119, //!< FSIRXA RX Trig 2
CLB_GLOBAL_IN_MUX_SPI1_SPICLK = 120, //!< SPI1 SPICLK OUT
CLB_GLOBAL_IN_MUX_SPI1_SPIPOCI_CONTROLLER = 121, //!< SPI1 SPIPOCI Controller IN
CLB_GLOBAL_IN_MUX_SPI1_SPIPTE = 122, //!< SPI1 SPIPTE OUT
CLB_GLOBAL_IN_MUX_SPI2_SPICLK = 123, //!< SPI2 SPICLK OUT
CLB_GLOBAL_IN_MUX_SPI2_SPIPOCI_CONTROLLER = 124, //!< SPI2 SPIPOCI Controller IN
CLB_GLOBAL_IN_MUX_SPI2_SPIPTE = 125, //!< SPI2 SPIPTE OUT
CLB_GLOBAL_IN_MUX_FSIRXA_RX_TRIG3 = 127, //!< FSIRXA RX Trig 3
} CLB_GlobalInputMux;
//*****************************************************************************
//
// Prototypes for the APIs.
//
//*****************************************************************************
//
//!
//! Checks the CLB base address.
//!
//! \param base is the base address of a CLB tile's logic config register.
//!
//! This function determines if a CLB base address is valid.
//!
//! \return Returns \b true if the base address is valid and \b false
//! otherwise.
//
//*****************************************************************************
//*****************************************************************************
//
//! Set global enable.
//!
//! \param base is the base address of a CLB tile's logic config register.
//!
//! This function enables the CLB via global enable register.
//!
//! \return None.
//
//*****************************************************************************
static inline void CLB_enableCLB(uint32_t base)
{
;
__eallow();
(*((volatile uint16_t *)(base + 0x0100U + 0x0U))) |= 0x2U;
__edis();
}
//*****************************************************************************
//
//! Clear global enable.
//!
//! \param base is the base address of a CLB tile's logic config register.
//!
//! This function disables the CLB via global enable register.
//!
//! \return None.
//
//*****************************************************************************
static inline void CLB_disableCLB(uint32_t base)
{
;
__eallow();
(*((volatile uint16_t *)(base + 0x0100U + 0x0U))) &= ~0x2U;
__edis();
}
//*****************************************************************************
//
//! Enable HLC NMI.
//!
//! \param base is the base address of a CLB tile's logic config register.
//!
//! This function enables the CLB HLC NMI.
//!
//! \return None.
//
//*****************************************************************************
static inline void CLB_enableNMI(uint32_t base)
{
;
__eallow();
(*((volatile uint16_t *)(base + 0x0100U + 0x0U))) |= 0x8U;
__edis();
}
//*****************************************************************************
//
//! Disable HLC NMI.
//!
//! \param base is the base address of a CLB tile's logic config register.
//!
//! This function disables the CLB HLC NMI.
//!
//! \return None.
//
//*****************************************************************************
static inline void CLB_disableNMI(uint32_t base)
{
;
__eallow();
(*((volatile uint16_t *)(base + 0x0100U + 0x0U))) &= ~0x8U;
__edis();
}
//*****************************************************************************
//
//! Configure Clock Prescalar.
//!
//! \param base is the base address of a CLB tile's logic config register.
//!
//! This function enables and configures the CLB Clock Precalar.
//!
//! \return None.
//
//*****************************************************************************
static inline void CLB_configureClockPrescalar(uint32_t base, uint16_t prescl)
{
;
__eallow();
(*((volatile uint32_t *)(base + 0x0100U + 0x18U))) =
((*((volatile uint32_t *)(base + 0x0100U + 0x18U))) &
~(0xFFFF0000U)) |
((uint32_t)prescl << 16U);
(*((volatile uint32_t *)(base + 0x0100U + 0x18U))) |= 0x1U;
__edis();
}
//*****************************************************************************
//
//! Configures Clock Precalar Strobe Mode.
//!
//! \param base is the base address of a CLB tile's logic config register.
//!
//! This function enables and configures the CLB Clock Precalar Strobe Mode.
//!
//! \return None.
//
//*****************************************************************************
static inline void CLB_configureStrobeMode(uint32_t base, uint16_t strb)
{
;
__eallow();
(*((volatile uint32_t *)(base + 0x0100U + 0x18U))) =
((*((volatile uint32_t *)(base + 0x0100U + 0x18U))) &
~((uint32_t)0x3CU)) |
((uint32_t)strb << 2U);
(*((volatile uint32_t *)(base + 0x0100U + 0x18U))) |= 0x2U;
__edis();
}
//*****************************************************************************
//
//! Configures the general purpose SW release control value.
//!
//! \param base is the base address of a CLB tile's logic config register.
//! \param inID is the specified CLB SW Release input signal.
//! \param val is the value of the SW RLS control.
//!
//! This function configures the general purpose SW release control value.
//! The \e inID parameter can have one enumeration value from CLB_SWReleaseCtrl.
//!
//! \return None.
//
//*****************************************************************************
static inline void CLB_writeSWReleaseControl(uint32_t base,
CLB_SWReleaseCtrl inID, _Bool val)
{
;
(*((volatile uint32_t *)(base + 0x0100U + 0x10U))) =
((*((volatile uint32_t *)(base + 0x0100U + 0x10U))) &
~(0x1000000U << (uint32_t)inID)) |
(((uint32_t)val) << (24U + (uint16_t)inID));
}
//*****************************************************************************
//
//! Configures the general purpose SW gate control value.
//!
//! \param base is the base address of a CLB tile's logic config register.
//! \param inID is the specified CLB SW Release input signal.
//! \param val is the value of the SW GATE control.
//!
//! This function configures the general purpose SW release control value.
//! The \e inID parameter can have one enumeration value from CLB_SWGateCtrl.
//!
//! \return None.
//
//*****************************************************************************
static inline void CLB_writeSWGateControl(uint32_t base,
CLB_SWGateCtrl inID, _Bool val)
{
;
(*((volatile uint32_t *)(base + 0x0100U + 0x10U))) =
((*((volatile uint32_t *)(base + 0x0100U + 0x10U))) &
~(0x10000U << (uint32_t)inID)) |
(((uint32_t)val) << (16U + (uint16_t)inID));
}
//*****************************************************************************
//
//! Configures Counter TAP Selects.
//!
//! \param base is the base address of a CLB tile's logic config register.
//! \param miscCtrl is the value to represent counter tap selects.
//! Generated by tool as \b TILEx_CFG_TAP_SELL.
//!
//! This function configures the counter tap selects.
//!
//! \return None.
//
//*****************************************************************************
static inline void CLB_configCounterTapSelects(uint32_t base, uint32_t tapSel)
{
;
__eallow();
(*((volatile uint32_t *)(base + 0x3EU))) = tapSel;
__edis();
}
//*****************************************************************************
//
//! Configures AOC (Asynchronous Output Conditioning) functions.
//!
//! \param base is the base address of a CLB tile's logic config register.
//! \param aocID is the specified CLB tile AOC signal.
//! \param aocCfg is the value for the AOC signal function and input
//! signal selections. Generated by tool as \b TILEx_OUTPUT_COND_CTR_n
//! where n is the output number.
//!
//! This function configures the input signals and equations of the aoc LUT
//! corresponding to the /e aocID parameter.
//!
//! \return None.
//
//*****************************************************************************
static inline void CLB_configAOC(uint32_t base, CLB_AOCs aocID,
uint32_t aocCfg)
{
;
__eallow();
(*((volatile uint32_t *)(base + 0x40U + (sizeof(uint32_t) * aocID)))) = aocCfg;
__edis();
}
//*****************************************************************************
//
//! Enable CLB lock.
//!
//! \param base is the base address of a CLB tile's logic config register.
//!
//! This function enables the lock bit of the lock register. The lock can only
//! be set once and can only be cleared by a device reset.
//!
//! \return None.
//
//*****************************************************************************
static inline void CLB_enableLock(uint32_t base)
{
;
//
// Setting the lock bit requires key 0x5A5A to be written at the same time
//
__eallow();
(*((volatile uint32_t *)(base + 0x0100U + 0x22U))) =
(uint32_t)0x1U | ((uint32_t)0x5A5AU << 16U);
__edis();
}
//*****************************************************************************
//
//! Write value to address.
//!
//! \param base is the base address of a CLB tile's logic config register.
//! \param address is the address of CLB internal memory.
//! \param value is the value to write to specified address.
//!
//! This function writes the specified value to CLB internal memory.
//!
//! \return None.
//
//*****************************************************************************
static inline void CLB_writeInterface(uint32_t base, uint32_t address,
uint32_t value)
{
;
;
__eallow();
(*((volatile uint32_t *)(base + 0x0100U + 0x2U))) = address;
(*((volatile uint32_t *)(base + 0x0100U + 0x4U))) = value;
(*((volatile uint32_t *)(base + 0x0100U + 0x0U))) |= 0x1U;
__edis();
}
//*****************************************************************************
//
//! Select input filter type.
//!
//! \param base is the base address of a CLB tile's logic config register.
//! \param inID is the specified CLB tile input signal.
//! \param filterType is the selected type of filter applied to the input.
//!
//! This function configures the filter selection for the specified input.
//! The \e inID parameter can have one enumeration value from CLB_Inputs.
//! The \e filterType parameter can have one enumeration value from
//! CLB_FilterType.
//!
//! \return None.
//
//*****************************************************************************
static inline void CLB_selectInputFilter(uint32_t base, CLB_Inputs inID,
CLB_FilterType filterType)
{
uint16_t shiftVal;
;
//
// Each input has a 2-bit field in this register so need to calculate
// shift amount accordingly.
//
shiftVal = (uint16_t)inID << 1;
(*((volatile uint16_t *)(base + 0x0100U + 0x6U))) =
((*((volatile uint16_t *)(base + 0x0100U + 0x6U))) &
~(0x3U << shiftVal)) |
((uint16_t)filterType << shiftVal);
}
//*****************************************************************************
//
//! Enables synchronization of an input signal.
//!
//! \param base is the base address of a CLB tile's logic config register.
//! \param inID is the specified CLB tile input signal.
//!
//! This function enables synchronization on the specified input signal.
//! The \e inID parameter can have one enumeration value from CLB_Inputs.
//!
//! \return None.
//
//*****************************************************************************
static inline void CLB_enableSynchronization(uint32_t base, CLB_Inputs inID)
{
;
(*((volatile uint16_t *)(base + 0x0100U + 0x6U + 1U))) |=
(1U << (uint16_t)inID);
}
//*****************************************************************************
//
//! Disables synchronization of an input signal.
//!
//! \param base is the base address of a CLB tile's logic config register.
//! \param inID is the specified CLB tile input signal.
//!
//! This function disables synchronization on the specified input signal.
//! The \e inID parameter can have one enumeration value from CLB_Inputs.
//!
//! \return None.
//
//*****************************************************************************
static inline void CLB_disableSynchronization(uint32_t base, CLB_Inputs inID)
{
;
(*((volatile uint16_t *)(base + 0x0100U + 0x6U + 1U))) &=
~(1U << (uint16_t)inID);
}
//*****************************************************************************
//
//! Configures the general purpose input mux.
//!
//! \param base is the base address of a CLB tile's logic config register.
//! \param inID is the specified CLB tile input signal.
//! \param gpMuxCfg is the mux selection for the general purpose input mux.
//!
//! This function configures the general purpose input mux. The \e gpMuxCfg
//! parameter can select either the use of an external input signal
//! (\b CLB_GP_IN_MUX_EXTERNAL) or the use of the corresponding CLB_GP_REG bit
//! as an input (\b CLB_GP_IN_MUX_GP_REG).
//! The \e inID parameter can have one enumeration value from CLB_Inputs.
//!
//! \sa CLB_setGPREG() to write to the CLB_GP_REG.
//!
//! \return None.
//
//*****************************************************************************
static inline void CLB_configGPInputMux(uint32_t base, CLB_Inputs inID,
CLB_GPInputMux gpMuxCfg)
{
;
(*((volatile uint16_t *)(base + 0x0100U + 0x8U))) =
((*((volatile uint16_t *)(base + 0x0100U + 0x8U))) &
~(0x1U << (uint16_t)inID)) |
((uint16_t)gpMuxCfg << (uint16_t)inID);
}
//*****************************************************************************
//
//! Sets the CLB_GP_REG register value.
//!
//! \param base is the base address of a CLB tile's logic config register.
//! \param gpRegVal is the value to be written to CLB_GP_REG.
//!
//! This function writes to the CLB_GP_REG register. When the general purpose
//! input mux is configured to use CLB_GP_REG, each bit in \e gpRegVal
//! corresponds to an input signal (bit 0 to Input 0, bit 1 to Input 1, and
//! so on).
//!
//! \sa CLB_configGPInputMux() to select the CLB_GP_REG as the source for
//! an input signal.
//!
//! \return None.
//
//*****************************************************************************
static inline void CLB_setGPREG(uint32_t base, uint32_t gpRegVal)
{
;
(*((volatile uint32_t *)(base + 0x0100U + 0x10U))) = gpRegVal;
}
//*****************************************************************************
//
//! Gets the CLB_GP_REG register value.
//!
//! \param base is the base address of a CLB tile's logic config register.
//!
//! This function writes to the CLB_GP_REG register. When the general purpose
//! input mux is configured to use CLB_GP_REG, each bit in \e gpRegVal
//! corresponds to an input signal (bit 0 to Input 0, bit 1 to Input 1, and
//! so on).
//!
//! \sa CLB_configGPInputMux() to select the CLB_GP_REG as the source for
//! an input signal.
//!
//! \return CLB_GP_REG value.
//
//*****************************************************************************
static inline uint32_t CLB_getGPREG(uint32_t base)
{
;
return((*((volatile uint32_t *)(base + 0x0100U + 0x10U))));
}
//*****************************************************************************
//
//! Configures the local input mux.
//!
//! \param base is the base address of a CLB tile's logic config register.
//! \param inID is the specified CLB tile input signal.
//! \param localMuxCfg is the mux selection for the local input mux.
//!
//! This function configures the local input mux for the specified input
//! signal.
//!
//! The \e inID parameter can have one enumeration value from CLB_Inputs.
//! The \e localMuxCfg parameter can have one enumeration value from
//! CLB_LocalInputMux.
//!
//! \note The local input mux options' peripheral sources depend on which
//! instance of the CLB (\e base) you are using. For example, for CLB1 the
//! EPWM signal selections come from EPWM1 but for CLB2 they come from EPWM2.
//! See your technical reference manual for details.
//!
//! \return None.
//
//*****************************************************************************
static inline void CLB_configLocalInputMux(uint32_t base, CLB_Inputs inID,
CLB_LocalInputMux localMuxCfg)
{
uint16_t shiftVal;
uint32_t miscShiftVal, inputMuxSel;
;
//
// Each local input has a 5-bit field in this register so need to calculate
// shift amount accordingly.
//
shiftVal = (uint16_t)inID * 5U;
//
// If the local inputs are selected then only 5-bits are used in this
// register but if miscellaneous inputs are selected then another 1-bit is
// used along with the above 5. So we need to calculate this accordingly.
//
//
// Each miscellaneous input has a 1-bit field in this register so
// need to calculate shift amount accordingly.
//
miscShiftVal = (uint32_t)inID + 28U;
//
// Check if input < input4
//
if(inID < CLB_IN4)
{
//
// Each miscellaneous input has an extra 1-bit to be set
// apart from the local input bits
//
inputMuxSel =
((((uint32_t)localMuxCfg & 0x1FU) <<
shiftVal) |
((((uint32_t)localMuxCfg & 0x20U) >>
5U) << miscShiftVal));
//
//Update the local / misc input mux selections
//
(*((volatile uint32_t *)(base + 0x0100U + 0xAU))) =
((*((volatile uint32_t *)(base + 0x0100U + 0xAU))) &
~(((uint32_t)0x1FU << shiftVal) |
((uint32_t)1U << miscShiftVal))) |
inputMuxSel;
}
else
{
//
//Adjust the previously calculated shifts for the inputs >3
//
shiftVal -= 4U * 5U;
miscShiftVal -= 4U;
//
// Each miscellaneous input has an extra 1-bit to be set
// apart from the local input bits
//
inputMuxSel =
((((uint32_t)localMuxCfg & 0x1FU) <<
shiftVal) |
((((uint32_t)localMuxCfg & 0x20U) >>
5U) << miscShiftVal));
(*((volatile uint32_t *)(base + 0x0100U + 0xCU))) =
((*((volatile uint32_t *)(base + 0x0100U + 0xCU))) &
~(((uint32_t)0x1FU << shiftVal) |
((uint32_t)1U << miscShiftVal))) |
inputMuxSel;
}
}
//*****************************************************************************
//
//! Configures the global input mux.
//!
//! \param base is the base address of a CLB tile's logic config register.
//! \param inID is the specified CLB tile input signal.
//! \param globalMuxCfg is the mux selection for the global input mux.
//!
//! This function configures the global input mux for the specified input
//! signal.
//! The \e inID parameter can have one enumeration value from CLB_Inputs.
//! The \e globalMuxCfg parameter can have one enumeration value from
//! CLB_GlobalInputMux.
//!
//! \note The global input mux options' peripheral sources depend on which
//! instance of the CLB (\e base) you are using. For example, for CLB1 the
//! EPWM signal selections come from EPWM1 but for CLB2 they come from EPWM2.
//! See your technical reference manual for details.
//!
//! \return None.
//
//*****************************************************************************
static inline void CLB_configGlobalInputMux(uint32_t base, CLB_Inputs inID,
CLB_GlobalInputMux globalMuxCfg)
{
uint16_t shiftVal;
;
//
// Each input has a 5-bit field in this register so need to calculate
// shift amount accordingly.
//
shiftVal = (uint16_t)inID * 7U;
if(inID < CLB_IN4)
{
(*((volatile uint32_t *)(base + 0x0100U + 0x14U))) =
((*((volatile uint32_t *)(base + 0x0100U + 0x14U))) &
~((uint32_t)0x7FU << shiftVal)) |
((uint32_t)globalMuxCfg << shiftVal);
}
else
{
shiftVal -= 4U * 7U;
(*((volatile uint32_t *)(base + 0x0100U + 0x16U))) =
((*((volatile uint32_t *)(base + 0x0100U + 0x16U))) &
~((uint32_t)0x7FU << shiftVal)) |
((uint32_t)globalMuxCfg << shiftVal);
}
}
//*****************************************************************************
//
//! Controls the output enable.
//!
//! \param base is the base address of a CLB tile's logic config register.
//! \param outputMask is a mask of the outputs to be enabled.
//! \param enable is a switch to decide if the CLB outputs need to be enabled
//! or not.
//!
//! This function is used to enable and disable CLB outputs by writing a mask
//! to CLB_OUT_EN. Each bit corresponds to a CLB output. When a bit is 1, the
//! corresponding output is enabled; when a bit is 0, the output is disabled.
//!
//! The \e outputMask parameter takes a logical OR of any of the CLB_OUTPUT_0x
//! values that correspond to the CLB OUTPUT ENABLE for the respective outputs.
//! The \e enable parameter can have one of the values from:
//! false: Disable the respective CLB outputs
//! true: Enable the respective CLB outputs
//!
//! \note Note that the 8 CLB outputs are replicated to create more output
//! paths. See your technical reference manual for more details.
//! If no further modifications are expected, then it is advised to set the
//! block writes bit of the MISC_ACCESS_CTRL Register. This will prevent
//! accidental writes.
//!
//! \return None.
//
//*****************************************************************************
static inline void CLB_setOutputMask(uint32_t base, uint32_t outputMask ,
_Bool enable)
{
;
if(enable == 1)
{
(*((volatile uint32_t *)(base + 0x0100U + 0x12U))) |= outputMask;
}
else
{
(*((volatile uint32_t *)(base + 0x0100U + 0x12U))) &= ~outputMask;
}
}
//*****************************************************************************
//
//! Reads the interrupt tag register.
//!
//! \param base is the base address of a CLB tile's logic config register.
//!
//! \return Returns the value in the interrupt tag register which is a 6-bit
//! constant set by the HLC.
//
//*****************************************************************************
static inline uint16_t CLB_getInterruptTag(uint32_t base)
{
;
return((*((volatile uint16_t *)(base + 0x0100U + 0x20U))));
}
//*****************************************************************************
//
//! Clears the interrupt tag register.
//!
//! \param base is the base address of a CLB tile's logic config register.
//!
//! This function clears the interrupt tag register, setting it to 0.
//!
//! \return None.
//
//*****************************************************************************
static inline void CLB_clearInterruptTag(uint32_t base)
{
;
(*((volatile uint16_t *)(base + 0x0100U + 0x20U))) = 0U;
}
//*****************************************************************************
//
//! Selects LUT4 inputs.
//!
//! \param base is the base address of a CLB tile's logic config register.
//! \param lut4In0 is the value for LUT4 input signal 0. Generated by tool as
//! \b TILEx_CFG_LUT4_IN0.
//! \param lut4In1 is the value for LUT4 input signal 1. Generated by tool as
//! \b TILEx_CFG_LUT4_IN1.
//! \param lut4In2 is the value for LUT4 input signal 2. Generated by tool as
//! \b TILEx_CFG_LUT4_IN2.
//! \param lut4In3 is the value for LUT4 input signal 3. Generated by tool as
//! \b TILEx_CFG_LUT4_IN3.
//!
//! This function configures the LUT4 block's input signals.
//!
//! \return None.
//
//*****************************************************************************
static inline void CLB_selectLUT4Inputs(uint32_t base, uint32_t lut4In0,
uint32_t lut4In1, uint32_t lut4In2,
uint32_t lut4In3)
{
;
__eallow();
(*((volatile uint32_t *)(base + 0x12U))) = lut4In0;
(*((volatile uint32_t *)(base + 0x14U))) = lut4In1;
(*((volatile uint32_t *)(base + 0x16U))) = lut4In2;
(*((volatile uint32_t *)(base + 0x18U))) = lut4In3;
__edis();
}
//*****************************************************************************
//
//! Configures LUT4 functions.
//!
//! \param base is the base address of a CLB tile's logic config register.
//! \param lut4Fn10 is the equation value for LUT4 blocks 0 and 1. Generated by
//! tool as \b TILEx_CFG_LUT4_FN10.
//! \param lut4Fn2 is the equation value for LUT4 block2. Generated by tool as
//! \b TILEx_CFG_LUT4_FN2.
//!
//! This function configures the LUT4 block's equations.
//!
//! \return None.
//
//*****************************************************************************
static inline void CLB_configLUT4Function(uint32_t base, uint32_t lut4Fn10,
uint32_t lut4Fn2)
{
;
__eallow();
(*((volatile uint32_t *)(base + 0x20U))) = lut4Fn10;
(*((volatile uint32_t *)(base + 0x22U))) = lut4Fn2;
__edis();
}
//*****************************************************************************
//
//! Selects FSM inputs.
//!
//! \param base is the base address of a CLB tile's logic config register.
//! \param external0 is the value for FSM external 0 input. Generated by tool
//! as \b TILEx_CFG_FSM_EXT_IN0.
//! \param external1 is the value for FSM external 1 input. Generated by tool
//! as \b TILEx_CFG_FSM_EXT_IN1.
//! \param extra0 is the value for FSM extra 0 input. Generated by tool
//! as \b TILEx_CFG_FSM_EXTRA_IN0.
//! \param extra1 is the value for FSM extra 1 input. Generated by tool
//! as \b TILEx_CFG_FSM_EXTRA_IN1.
//!
//! This function configures the FSM block's external inputs and extra external
//! inputs.
//!
//! \return None.
//
//*****************************************************************************
static inline void CLB_selectFSMInputs(uint32_t base, uint32_t external0,
uint32_t external1, uint32_t extra0,
uint32_t extra1)
{
;
__eallow();
(*((volatile uint32_t *)(base + 0xCU))) = external0;
(*((volatile uint32_t *)(base + 0xEU))) = external1;
(*((volatile uint32_t *)(base + 0xAU))) = extra0;
(*((volatile uint32_t *)(base + 0x10U))) = extra1;
__edis();
}
//*****************************************************************************
//
//! Configures FSM LUT function.
//!
//! \param base is the base address of a CLB tile's logic config register.
//! \param fsmLutFn10 is the value for FSM 0 & FSM 1 LUT function. Generated
//! by tool as \b TILEx_CFG_FSM_LUT_FN10.
//! \param fsmLutFn2 is the value for FSM 2 LUT function. Generated by tool as
//! \b TILEx_CFG_FSM_LUT_FN2.
//!
//! This function configures the FSM block's LUT equations.
//!
//! \return None.
//
//*****************************************************************************
static inline void CLB_configFSMLUTFunction(uint32_t base, uint32_t fsmLutFn10,
uint32_t fsmLutFn2)
{
;
__eallow();
(*((volatile uint32_t *)(base + 0x1CU))) = fsmLutFn10;
(*((volatile uint32_t *)(base + 0x1EU))) = fsmLutFn2;
__edis();
}
//*****************************************************************************
//
//! Configures FSM next state.
//!
//! \param base is the base address of a CLB tile's logic config register.
//! \param nextState0 is the value for FSM 0's next state. Generated by tool as
//! \b TILEx_CFG_FSM_NEXT_STATE_0.
//! \param nextState1 is the value for FSM 1's next state. Generated by tool as
//! \b TILEx_CFG_FSM_NEXT_STATE_1.
//! \param nextState2 is the value for FSM 2's next state. Generated by tool as
//! \b TILEx_CFG_FSM_NEXT_STATE_2.
//!
//! This function configures the FSM's next state equation.
//!
//! \return None.
//
//*****************************************************************************
static inline void CLB_configFSMNextState(uint32_t base, uint32_t nextState0,
uint32_t nextState1,
uint32_t nextState2)
{
;
__eallow();
(*((volatile uint32_t *)(base + 0x24U))) = nextState0;
(*((volatile uint32_t *)(base + 0x26U))) = nextState1;
(*((volatile uint32_t *)(base + 0x28U))) = nextState2;
__edis();
}
//*****************************************************************************
//
//! Selects Counter inputs.
//!
//! \param base is the base address of a CLB tile's logic config register.
//! \param reset is the value for counter's reset inputs. Generated by tool as
//! \b TILEx_CFG_COUNTER_RESET.
//! \param event is the value for counter's event inputs. Generated by tool as
//! \b TILEx_CFG_COUNTER_EVENT.
//! \param mode0 is the value for counter's mode 0 inputs. Generated by tool as
//! \b TILEx_CFG_COUNTER_MODE_0.
//! \param mode1 is the value for counter's mode 1 inputs. Generated by tool as
//! \b TILEx_CFG_COUNTER_MODE_1.
//!
//! This function selects the input signals to the counter block.
//!
//! \return None.
//
//*****************************************************************************
static inline void CLB_selectCounterInputs(uint32_t base, uint32_t reset,
uint32_t event, uint32_t mode0,
uint32_t mode1)
{
;
__eallow();
(*((volatile uint32_t *)(base + 0x2U))) = reset;
(*((volatile uint32_t *)(base + 0x8U))) = event;
(*((volatile uint32_t *)(base + 0x6U))) = mode0;
(*((volatile uint32_t *)(base + 0x4U))) = mode1;
__edis();
}
//*****************************************************************************
//
//! Configures Counter and FSM modes.
//!
//! \param base is the base address of a CLB tile's logic config register.
//! \param miscCtrl is the value to represent counter and FSM modes.
//! Generated by tool as \b TILEx_CFG_MISC_CONTROL.
//!
//! This function configures the counter mode, particularly add/shift, load
//! modes. The function also configures whether the FSM should use state inputs
//! or an extra external input.
//!
//! \return None.
//
//*****************************************************************************
static inline void CLB_configMiscCtrlModes(uint32_t base, uint32_t miscCtrl)
{
;
__eallow();
(*((volatile uint32_t *)(base + 0x2AU))) = miscCtrl;
__edis();
}
//*****************************************************************************
//
//! Configures Output LUT functions.
//!
//! \param base is the base address of a CLB tile's logic config register.
//! \param outID is the specified CLB tile output signal.
//! \param outputCfg is the value for the output LUT signal function and input
//! signal selections. Generated by tool as \b TILEx_CFG_OUTLUT_n where
//! n is the output number.
//!
//! This function configures the input signals and equations of the output LUT
//! corresponding to the /e outID parameter.
//!
//! \return None.
//
//*****************************************************************************
static inline void CLB_configOutputLUT(uint32_t base, CLB_Outputs outID,
uint32_t outputCfg)
{
;
__eallow();
(*((volatile uint32_t *)(base + 0x2CU + (sizeof(uint32_t) * outID)))) = outputCfg;
__edis();
}
//*****************************************************************************
//
//! Configures HLC event selection.
//!
//! \param base is the base address of a CLB tile's logic config register.
//! \param eventSel is the value for HLC event selection. Generated by tool as
//! \b TILEx_HLC_EVENT_SEL.
//!
//! This function configures the event selection for the High Level Controller.
//!
//! \return None.
//
//*****************************************************************************
static inline void CLB_configHLCEventSelect(uint32_t base, uint32_t eventSel)
{
;
__eallow();
(*((volatile uint32_t *)(base + 0x3CU))) = eventSel;
__edis();
}
//*****************************************************************************
//
//! Program HLC instruction.
//!
//! \param base is the base address of a CLB tile's logic config register.
//! \param instructionNum is the index into the HLC instruction memory. For
//! example, a value of 0 corresponds to instruction 0 of event 0,
//! a value of 1 corresponds to instruction 1 of event 0, and so on up
//! to a value of 31 which corresponds to instruction 7 of event 3.
//! \param instruction is the instruction to be programmed. Generated by tool
//! as \b TILEx_HLCINSTR_n where n is the instruction number.
//!
//! This function configures the CLB internal memory corresponding to the
//! specified HLC instruction number with the given instruction.
//!
//! \return None.
//
//*****************************************************************************
static inline void CLB_programHLCInstruction(uint32_t base,
uint32_t instructionNum,
uint32_t instruction)
{
;
;
CLB_writeInterface(base, 0x20U + instructionNum, instruction);
}
//*****************************************************************************
//
//! Set HLC registers.
//!
//! \param base is the base address of a CLB tile's logic config register.
//! \param r0Init is the value to write to HLC register R0. Generated by tool
//! as \b TILEx_HLC_R0_INIT.
//! \param r1Init is the value to write to HLC register R1. Generated by tool
//! as \b TILEx_HLC_R1_INIT.
//! \param r2Init is the value to write to HLC register R2. Generated by tool
//! as \b TILEx_HLC_R2_INIT.
//! \param r3Init is the value to write to HLC register R3. Generated by tool
//! as \b TILEx_HLC_R3_INIT.
//!
//! This function configures the CLB internal memory corresponding to the HLC
//! registers R0-R3 with the specified values.
//!
//! \return None.
//
//*****************************************************************************
static inline void CLB_setHLCRegisters(uint32_t base, uint32_t r0Init,
uint32_t r1Init, uint32_t r2Init,
uint32_t r3Init)
{
;
CLB_writeInterface(base, 0xCU, r0Init);
CLB_writeInterface(base, 0xDU, r1Init);
CLB_writeInterface(base, 0xEU, r2Init);
CLB_writeInterface(base, 0xFU, r3Init);
}
//*****************************************************************************
//
//! Get HLC or counter register values.
//!
//! \param base is the base address of a CLB tile's logic config register.
//! \param registerID is the internal register from which to read. Can be
//! either an HLC register (\b CLB_REG_HLC_Rn) or a counter value
//! (\b CLB_REG_CTR_Cn).
//!
//! \return Returns the value in the specified HLC register or counter.
//
//*****************************************************************************
static inline uint32_t CLB_getRegister(uint32_t base, CLB_Register registerID)
{
;
return((*((volatile uint32_t *)(base + 0x0100U + (uint32_t)registerID))));
}
//*****************************************************************************
//
//! Get output status.
//!
//! \param base is the base address of a CLB tile's logic config register.
//!
//! \return Returns the output status of various components within the CLB tile
//! such as a counter match or LUT output. Use the \b CLB_DBG_OUT_*
//! masks from hw_clb.h to decode the bits.
//
//*****************************************************************************
static inline uint32_t CLB_getOutputStatus(uint32_t base)
{
;
return((*((volatile uint32_t *)(base + 0x0100U + 0x3EU))));
}
//*****************************************************************************
//
//! Enable CLB Pipeline Mode.
//!
//! \param base is the base address of a CLB tile's logic config register.
//!
//! This function enables the CLB Pipeline Mode
//!
//! \return None.
//
//*****************************************************************************
static inline void CLB_enablePipelineMode(uint32_t base)
{
;
__eallow();
(*((volatile uint16_t *)(base + 0x0100U + 0x0U))) |= 0x10U;
__edis();
}
//*****************************************************************************
//
//! Disable CLB Pipeline Mode.
//!
//! \param base is the base address of a CLB tile's logic config register.
//!
//! This function disables the CLB Pipeline Mode.
//!
//! \return None.
//
//*****************************************************************************
static inline void CLB_disablePipelineMode(uint32_t base)
{
;
__eallow();
(*((volatile uint16_t *)(base + 0x0100U + 0x0U))) &= ~0x10U;
__edis();
}
//*****************************************************************************
//
//! Disable CLB Output Mask Updates.
//!
//! \param base is the base address of a CLB tile's logic config register.
//!
//! This function disables the CLB Output Mask updates
//!
//! \return None.
//
//*****************************************************************************
static inline void CLB_disableOutputMaskUpdates(uint32_t base)
{
;
__eallow();
(*((volatile uint16_t *)(base + 0x50U))) |= 0x2U;
__edis();
}
//*****************************************************************************
//
//! Enable CLB Output Mask Updates.
//!
//! \param base is the base address of a CLB tile's logic config register.
//!
//! This function enables the CLB Output Mask updates
//!
//! \return None.
//
//*****************************************************************************
static inline void CLB_enableOutputMaskUpdates(uint32_t base)
{
;
__eallow();
(*((volatile uint16_t *)(base + 0x50U))) &= ~0x2U;
__edis();
}
//*****************************************************************************
//
//! Enable Input Pipeline Mode.
//!
//! \param base is the base address of a CLB tile's logic config register.
//!
//! This function enables the CLB Input Pipeline mode
//!
//! \return None.
//
//*****************************************************************************
static inline void CLB_enableInputPipelineMode(uint32_t base, CLB_Inputs inID)
{
;
(*((volatile uint32_t *)(base + 0x0100U + 0x6U))) |=
(0x1000000U << (uint32_t)inID);
}
//*****************************************************************************
//
//! Disable Input Pipeline Mode.
//!
//! \param base is the base address of a CLB tile's logic config register.
//!
//! This function disables the CLB Input Pipeline mode
//!
//! \return None.
//
//*****************************************************************************
static inline void CLB_disableInputPipelineMode(uint32_t base, CLB_Inputs inID)
{
;
(*((volatile uint32_t *)(base + 0x0100U + 0x6U))) &=
~(0x1000000U << (uint32_t)inID);
}
//*****************************************************************************
//
//! Disable SPI RX Buffer Access.
//!
//! \param base is the base address of a CLB tile's logic config register.
//!
//! This function disables the CLB SPI RX Buffer access
//!
//! \return None.
//
//*****************************************************************************
static inline void CLB_disableSPIBufferAccess(uint32_t base)
{
;
__eallow();
(*((volatile uint16_t *)(base + 0x50U))) &= ~0x1U;
__edis();
}
//*****************************************************************************
//
//! Enable SPI RX Buffer Access.
//!
//! \param base is the base address of a CLB tile's logic config register.
//!
//! This function enables the CLB SPI RX Buffer access
//!
//! \return None.
//
//*****************************************************************************
static inline void CLB_enableSPIBufferAccess(uint32_t base)
{
;
__eallow();
(*((volatile uint16_t *)(base + 0x50U))) |= 0x1U;
__edis();
}
//*****************************************************************************
//
//! Configures SPI RX Buffer Load Signal event selection.
//!
//! \param base is the base address of a CLB tile's logic config register.
//! \param eventSel is the value for HLC event selection. Generated by tool as
//! \b TILEx_SPI_BUF_EVENT_SEL.
//!
//! This function configures the event selection for the SPI RX Buffer.
//!
//! \return None.
//
//*****************************************************************************
static inline void CLB_configSPIBufferLoadSignal(uint32_t base, uint16_t eventSel)
{
;
__eallow();
(*((volatile uint16_t *)(base + 0x51U))) =
((*((volatile uint16_t *)(base + 0x51U))) &
~((uint16_t)0x1FU << 0U)) |
((uint16_t)eventSel << 0U);
__edis();
}
//*****************************************************************************
//
//! Configures SPI Export HLC R0 Shift value.
//!
//! \param base is the base address of a CLB tile's logic config register.
//! \param shiftVal is the value for SPI export HLC R0 bit range selection.
//!
//! This function configures the SPI Export HLC R0 Shift value.
//!
//! \return None.
//
//*****************************************************************************
static inline void CLB_configSPIBufferShift(uint32_t base, uint16_t shiftVal)
{
;
__eallow();
(*((volatile uint16_t *)(base + 0x51U))) =
((*((volatile uint16_t *)(base + 0x51U))) &
~((uint16_t)0x1F00U << 8U)) |
((uint16_t)shiftVal << 8U);
__edis();
}
//*****************************************************************************
//
//! Configures Counter load and match.
//!
//! \param base is the base address of a CLB tile's logic config register.
//! \param counterID is the specified counter unit.
//! \param load is the value for counter's load mode. Generated by tool as
//! \b TILEx_COUNTER_n_LOAD_VAL where n is the counter number.
//! \param match1 is the value for counter's match 1. Generated by tool as
//! \b TILEx_COUNTER_n_MATCH1_VAL where n is the counter number.
//! \param match2 is the value for counter's match 2. Generated by tool as
//! \b TILEx_COUNTER_n_MATCH2_VAL where n is the counter number.
//!
//! This function configures the CLB internal memory corresponding to the
//! counter block's load and match values.
//!
//! \return None.
//
//*****************************************************************************
extern void CLB_configCounterLoadMatch(uint32_t base, CLB_Counters counterID,
uint32_t load, uint32_t match1,
uint32_t match2);
//*****************************************************************************
//
//! Clear FIFO registers.
//!
//! \param base is the base address of a CLB tile's logic config register.
//!
//! This function clears the PUSH/PULL FIFOs as well as its pointers.
//!
//! \return None.
//
//*****************************************************************************
extern void CLB_clearFIFOs(uint32_t base);
//*****************************************************************************
//
//! Configure the FIFO registers.
//!
//! \param base is the base address of a CLB tile's logic config register.
//! \param pullData[] is a pointer to an array of bytes which needs to be
//! written into the FIFO. The 0th FIFO data is in the 0th index.
//!
//! This function writes to the PULL FIFO. This also clears the FIFOs and
//! its pointer using the CLB_clearFIFOs() API prior to writing to
//! the FIFO.
//!
//! \return None.
//
//*****************************************************************************
extern void CLB_writeFIFOs(uint32_t base, const uint32_t pullData[]);
//*****************************************************************************
//
//! Read FIFO registers.
//!
//! \param base is the base address of a CLB tile's logic config register.
//! \param pushData[] is a pointer to an array of bytes which needs to be
//! read from the FIFO.
//!
//! This function reads from the PUSH FIFO. The 0th FIFO data would be in
//! the 0th index.
//!
//! \return None.
//
//*****************************************************************************
extern void CLB_readFIFOs(uint32_t base , uint32_t pushData[]);
//*****************************************************************************
//
// Close the Doxygen group.
//! @}
//
//*****************************************************************************
//*****************************************************************************
//
// Mark the end of the C bindings section for C++ compilers.
//
//*****************************************************************************
//###########################################################################
//
// FILE: cmpss.h
//
// TITLE: C28x CMPSS driver.
//
//###########################################################################
// $Copyright:
// Copyright (C) 2023 Texas Instruments Incorporated - http://www.ti.com/
//
// 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 Texas Instruments Incorporated 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
// OWNER 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.
// $
//###########################################################################
//*****************************************************************************
//
// If building with a C++ compiler, make all of the definitions in this header
// have a C binding.
//
//*****************************************************************************
//*****************************************************************************
//
//! \addtogroup cmpss_api CMPSS
//! @{
//
//*****************************************************************************
//###########################################################################
//
// FILE: hw_cmpss.h
//
// TITLE: Definitions for the CMPSS registers.
//
//###########################################################################
// $Copyright:
// Copyright (C) 2023 Texas Instruments Incorporated - http://www.ti.com/
//
// 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 Texas Instruments Incorporated 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
// OWNER 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.
// $
//###########################################################################
//*************************************************************************************************
//
// The following are defines for the CMPSS register offsets
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the COMPCTL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the COMPHYSCTL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the COMPSTS register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the COMPSTSCLR register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the COMPDACCTL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the DACHVALS register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the DACHVALA register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the DACLVALS register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the DACLVALA register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the RAMPDLYA register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the RAMPDLYS register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the CTRIPLFILCTL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the CTRIPHFILCTL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the COMPLOCK register
//
//*************************************************************************************************
//*****************************************************************************
//
// Useful defines used within the driver functions. Not intended for use by
// application code.
//
//*****************************************************************************
//*****************************************************************************
//
// Values that can be passed to CMPSS_configLowComparator() and
// CMPSS_configHighComparator() as the config parameter.
//
//*****************************************************************************
//
// Comparator negative input source
//
//! Input driven by internal DAC
//! Input driven by external pin
//
// Extra options
//
//! Comparator output is inverted
//! Asynch comparator output feeds into OR with latched digital filter output
//*****************************************************************************
//
// Values that can be passed to CMPSS_configOutputsLow() and
// CMPSS_configOutputsHigh() as the config parameter.
//
//*****************************************************************************
//
// Signal driving CTRIPOUT
//
//! Asynchronous comparator output drives CTRIPOUT
//! Synchronous comparator output drives CTRIPOUT
//! Filter output drives CTRIPOUT
//! Latched filter output drives CTRIPOUT
//
// Signal driving CTRIP
//
//! Asynchronous comparator output drives CTRIP
//! Synchronous comparator output drives CTRIP
//! Filter output drives CTRIP
//! Latched filter output drives CTRIP
//*****************************************************************************
//
// Values that can be returned by CMPSS_getStatus().
//
//*****************************************************************************
//! High digital filter output
//! Latched value of high digital filter output
//! Low digital filter output
//! Latched value of low digital filter output
//*****************************************************************************
//
// Values that can be passed to CMPSS_configDAC() the config parameter.
//
//*****************************************************************************
//
// When is DAC value loaded from shadow register
//
//! DAC value updated from SYSCLK
//! DAC value updated from PWMSYNC
//
// DAC reference voltage
//
//! VDDA is the voltage reference
//! VDAC is the voltage reference
//
// DAC value source
//
//! DAC value updated from shadow register
//! DAC value is updated from the ramp register
//*****************************************************************************
//
// Values that can be passed to CMPSS_configRamp()
// as the pwmSyncSrc parameter.
//
//*****************************************************************************
//*****************************************************************************
//
// Prototypes for the APIs.
//
//*****************************************************************************
//*****************************************************************************
//
//! \internal
//! Checks the CMPSS base address.
//!
//! \param base is the base address of the CMPSS module.
//!
//! This function determines if a CMPSS base address is valid.
//!
//! \return Returns \b true if the base address is valid and \b false
//! otherwise.
//
//*****************************************************************************
//*****************************************************************************
//
//! Enables the CMPSS module.
//!
//! \param base is the base address of the CMPSS module.
//!
//! This function enables the CMPSS module passed into the \e base parameter.
//!
//! \return None.
//
//*****************************************************************************
static inline void
CMPSS_enableModule(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Set the bit that enables the CMPSS module.
//
__eallow();
(*((volatile uint16_t *)(base + 0x0U))) |= 0x8000U;
__edis();
}
//*****************************************************************************
//
//! Disables the CMPSS module.
//!
//! \param base is the base address of the CMPSS module.
//!
//! This function disables the CMPSS module passed into the \e base parameter.
//!
//! \return None.
//
//*****************************************************************************
static inline void
CMPSS_disableModule(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Clear the bit that enables the CMPSS module.
//
__eallow();
(*((volatile uint16_t *)(base + 0x0U))) &= ~0x8000U;
__edis();
}
//*****************************************************************************
//
//! Sets the configuration for the high comparator.
//!
//! \param base is the base address of the CMPSS module.
//! \param config is the configuration of the high comparator.
//!
//! This function configures a comparator. The \e config parameter is the
//! result of a logical OR operation between a \b CMPSS_INSRC_xxx value and if
//! desired, \b CMPSS_INV_INVERTED and \b CMPSS_OR_ASYNC_OUT_W_FILT values.
//!
//! The \b CMPSS_INSRC_xxx term can take on the following values to specify
//! the high comparator negative input source:
//! - \b CMPSS_INSRC_DAC - The internal DAC.
//! - \b CMPSS_INSRC_PIN - An external pin.
//!
//! \b CMPSS_INV_INVERTED may be ORed into \e config if the comparator output
//! should be inverted.
//!
//! \b CMPSS_OR_ASYNC_OUT_W_FILT may be ORed into \e config if the
//! asynchronous comparator output should be fed into an OR gate with the
//! latched digital filter output before it is made available for CTRIPH or
//! CTRIPOUTH.
//!
//! \return None.
//
//*****************************************************************************
static inline void
CMPSS_configHighComparator(uint32_t base, uint16_t config)
{
//
// Check the arguments.
//
;
//
// Write the high comparator configuration to the appropriate register.
//
__eallow();
(*((volatile uint16_t *)(base + 0x0U))) =
((*((volatile uint16_t *)(base + 0x0U))) & ~(0x1U | 0x2U | 0x40U)) | config;
__edis();
}
//*****************************************************************************
//
//! Sets the configuration for the low comparator.
//!
//! \param base is the base address of the CMPSS module.
//! \param config is the configuration of the low comparator.
//!
//! This function configures a comparator. The \e config parameter is the
//! result of a logical OR operation between a \b CMPSS_INSRC_xxx value and if
//! desired, \b CMPSS_INV_INVERTED and \b CMPSS_OR_ASYNC_OUT_W_FILT values.
//!
//! The \b CMPSS_INSRC_xxx term can take on the following values to specify
//! the low comparator negative input source:
//! - \b CMPSS_INSRC_DAC - The internal DAC.
//! - \b CMPSS_INSRC_PIN - An external pin.
//!
//! \b CMPSS_INV_INVERTED may be ORed into \e config if the comparator output
//! should be inverted.
//!
//! \b CMPSS_OR_ASYNC_OUT_W_FILT may be ORed into \e config if the
//! asynchronous comparator output should be fed into an OR gate with the
//! latched digital filter output before it is made available for CTRIPL or
//! CTRIPOUTL.
//!
//! \return None.
//
//*****************************************************************************
static inline void
CMPSS_configLowComparator(uint32_t base, uint16_t config)
{
//
// Check the arguments.
//
;
//
// Write the low comparator configuration to the appropriate register.
//
__eallow();
(*((volatile uint16_t *)(base + 0x0U))) =
((*((volatile uint16_t *)(base + 0x0U))) & ~(0x100U | 0x200U | 0x4000U)) | (config << 8U);
__edis();
}
//*****************************************************************************
//
//! Sets the output signal configuration for the high comparator.
//!
//! \param base is the base address of the CMPSS module.
//! \param config is the configuration of the high comparator output signals.
//!
//! This function configures a comparator's output signals CTRIP and CTRIPOUT.
//! The \e config parameter is the result of a logical OR operation between the
//! \b CMPSS_TRIPOUT_xxx and \b CMPSS_TRIP_xxx values.
//!
//! The \b CMPSS_TRIPOUT_xxx term can take on the following values to specify
//! which signal drives CTRIPOUTH:
//! - \b CMPSS_TRIPOUT_ASYNC_COMP - The asynchronous comparator output.
//! - \b CMPSS_TRIPOUT_SYNC_COMP - The synchronous comparator output.
//! - \b CMPSS_TRIPOUT_FILTER - The output of the digital filter.
//! - \b CMPSS_TRIPOUT_LATCH - The latched output of the digital filter.
//!
//! The \b CMPSS_TRIP_xxx term can take on the following values to specify
//! which signal drives CTRIPH:
//! - \b CMPSS_TRIP_ASYNC_COMP - The asynchronous comparator output.
//! - \b CMPSS_TRIP_SYNC_COMP - The synchronous comparator output.
//! - \b CMPSS_TRIP_FILTER - The output of the digital filter.
//! - \b CMPSS_TRIP_LATCH - The latched output of the digital filter.
//!
//! \return None.
//
//*****************************************************************************
static inline void
CMPSS_configOutputsHigh(uint32_t base, uint16_t config)
{
//
// Check the arguments.
//
;
//
// Write the high comparator output settings to the appropriate register.
//
__eallow();
(*((volatile uint16_t *)(base + 0x0U))) = ((*((volatile uint16_t *)(base + 0x0U))) &
~(0x30U |
0xCU)) |
config;
__edis();
}
//*****************************************************************************
//
//! Sets the output signal configuration for the low comparator.
//!
//! \param base is the base address of the CMPSS module.
//! \param config is the configuration of the low comparator output signals.
//!
//! This function configures a comparator's output signals CTRIP and CTRIPOUT.
//! The \e config parameter is the result of a logical OR operation between the
//! \b CMPSS_TRIPOUT_xxx and \b CMPSS_TRIP_xxx values.
//!
//! The \b CMPSS_TRIPOUT_xxx term can take on the following values to specify
//! which signal drives CTRIPOUTL:
//! - \b CMPSS_TRIPOUT_ASYNC_COMP - The asynchronous comparator output.
//! - \b CMPSS_TRIPOUT_SYNC_COMP - The synchronous comparator output.
//! - \b CMPSS_TRIPOUT_FILTER - The output of the digital filter.
//! - \b CMPSS_TRIPOUT_LATCH - The latched output of the digital filter.
//!
//! The \b CMPSS_TRIP_xxx term can take on the following values to specify
//! which signal drives CTRIPL:
//! - \b CMPSS_TRIP_ASYNC_COMP - The asynchronous comparator output.
//! - \b CMPSS_TRIP_SYNC_COMP - The synchronous comparator output.
//! - \b CMPSS_TRIP_FILTER - The output of the digital filter.
//! - \b CMPSS_TRIP_LATCH - The latched output of the digital filter.
//!
//! \return None.
//
//*****************************************************************************
static inline void
CMPSS_configOutputsLow(uint32_t base, uint16_t config)
{
//
// Check the arguments.
//
;
//
// Write the low comparator output settings to the appropriate register.
//
__eallow();
(*((volatile uint16_t *)(base + 0x0U))) = ((*((volatile uint16_t *)(base + 0x0U))) &
~(0x3000U |
0xC00U)) |
(config << 8U);
__edis();
}
//*****************************************************************************
//
//! Gets the current comparator status.
//!
//! \param base is the base address of the comparator module.
//!
//! This function returns the current status for the comparator, specifically
//! the digital filter output and latched digital filter output.
//!
//! \return Returns the current interrupt status, enumerated as a bit field of
//! the following values:
//! - \b CMPSS_STS_HI_FILTOUT - High digital filter output
//! - \b CMPSS_STS_HI_LATCHFILTOUT - Latched value of high digital filter
//! output
//! - \b CMPSS_STS_LO_FILTOUT - Low digital filter output
//! - \b CMPSS_STS_LO_LATCHFILTOUT - Latched value of low digital filter output
//
//*****************************************************************************
static inline uint16_t
CMPSS_getStatus(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Return contents of the status register.
//
return((*((volatile uint16_t *)(base + 0x2U))));
}
//*****************************************************************************
//
//! Sets the configuration for the internal comparator DACs.
//!
//! \param base is the base address of the CMPSS module.
//! \param config is the configuration of the internal DAC.
//!
//! This function configures the comparator's internal DAC. The \e config
//! parameter is the result of a logical OR operation between the
//! \b CMPSS_DACVAL_xxx, \b CMPSS_DACREF_xxx, and \b CMPSS_DACSRC_xxx.
//!
//! The \b CMPSS_DACVAL_xxx term can take on the following values to specify
//! when the DAC value is loaded from its shadow register:
//! - \b CMPSS_DACVAL_SYSCLK - Value register updated on system clock.
//! - \b CMPSS_DACVAL_PWMSYNC - Value register updated on PWM sync.
//!
//! The \b CMPSS_DACREF_xxx term can take on the following values to specify
//! which voltage supply is used as reference for the DACs:
//! - \b CMPSS_DACREF_VDDA - VDDA is the voltage reference for the DAC.
//! - \b CMPSS_DACREF_VDAC - VDAC is the voltage reference for the DAC.
//!
//! The \b CMPSS_DACSRC_xxx term can take on the following values to specify
//! the DAC value source for the high comparator's internal DAC:
//! - \b CMPSS_DACSRC_SHDW - The user-programmed DACVALS register.
//! - \b CMPSS_DACSRC_RAMP - The ramp generator RAMPSTS register
//!
//! \note The \b CMPSS_DACVAL_xxx and \b CMPSS_DACREF_xxx terms apply to
//! both the high and low comparators. \b CMPSS_DACSRC_xxx will only affect
//! the high comparator's internal DAC.
//!
//! \return None.
//
//*****************************************************************************
static inline void
CMPSS_configDAC(uint32_t base, uint16_t config)
{
//
// Check the arguments.
//
;
//
// Write the DAC configuration to the appropriate register.
//
__eallow();
(*((volatile uint16_t *)(base + 0x4U))) =
((*((volatile uint16_t *)(base + 0x4U))) &
~(0x80U | 0x20U |
0x1U)) | config;
__edis();
}
//*****************************************************************************
//
//! Sets the value of the internal DAC of the high comparator.
//!
//! \param base is the base address of the comparator module.
//! \param value is the value actively driven by the DAC.
//!
//! This function sets the 12-bit value driven by the internal DAC of the high
//! comparator. This function will load the value into the shadow register from
//! which the actual DAC value register will be loaded. To configure which
//! event causes this shadow load to take place, use CMPSS_configDAC().
//!
//! \return None.
//
//*****************************************************************************
static inline void
CMPSS_setDACValueHigh(uint32_t base, uint16_t value)
{
//
// Check the arguments.
//
;
;
//
// Write the DAC value to the DAC value shadow register.
//
(*((volatile uint16_t *)(base + 0x6U))) = value;
}
//*****************************************************************************
//
//! Sets the value of the internal DAC of the low comparator.
//!
//! \param base is the base address of the comparator module.
//! \param value is the value actively driven by the DAC.
//!
//! This function sets the 12-bit value driven by the internal DAC of the low
//! comparator. This function will load the value into the shadow register from
//! which the actual DAC value register will be loaded. To configure which
//! event causes this shadow load to take place, use CMPSS_configDAC().
//!
//! \return None.
//
//*****************************************************************************
static inline void
CMPSS_setDACValueLow(uint32_t base, uint16_t value)
{
//
// Check the arguments.
//
;
;
//
// Write the DAC value to the DAC value shadow register.
//
(*((volatile uint16_t *)(base + 0x12U))) = value;
}
//*****************************************************************************
//
//! Initializes the digital filter of the high comparator.
//!
//! \param base is the base address of the comparator module.
//!
//! This function initializes all the samples in the high comparator digital
//! filter to the filter input value.
//!
//! \note See CMPSS_configFilterHigh() for the proper initialization sequence
//! to avoid glitches.
//!
//! \return None.
//
//*****************************************************************************
static inline void
CMPSS_initFilterHigh(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Set the high comparator filter initialization bit.
//
__eallow();
(*((volatile uint16_t *)(base + 0x18U))) |= 0x8000U;
__edis();
}
//*****************************************************************************
//
//! Initializes the digital filter of the low comparator.
//!
//! \param base is the base address of the comparator module.
//!
//! This function initializes all the samples in the low comparator digital
//! filter to the filter input value.
//!
//! \note See CMPSS_configFilterLow() for the proper initialization sequence
//! to avoid glitches.
//!
//! \return None.
//
//*****************************************************************************
static inline void
CMPSS_initFilterLow(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Set the low comparator filter initialization bit.
//
__eallow();
(*((volatile uint16_t *)(base + 0x16U))) |= 0x8000U;
__edis();
}
//*****************************************************************************
//
//! Gets the value of the internal DAC of the high comparator.
//!
//! \param base is the base address of the comparator module.
//!
//! This function gets the value of the internal DAC of the high comparator.
//! The value is read from the \e active register--not the shadow register to
//! which CMPSS_setDACValueHigh() writes.
//!
//! \return Returns the value driven by the internal DAC of the high comparator.
//
//*****************************************************************************
static inline uint16_t
CMPSS_getDACValueHigh(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Write the DAC value to the DAC value shadow register.
//
return((*((volatile uint16_t *)(base + 0x7U))));
}
//*****************************************************************************
//
//! Gets the value of the internal DAC of the low comparator.
//!
//! \param base is the base address of the comparator module.
//!
//! This function gets the value of the internal DAC of the low comparator.
//! The value is read from the \e active register--not the shadow register to
//! which CMPSS_setDACValueLow() writes.
//!
//! \return Returns the value driven by the internal DAC of the low comparator.
//
//*****************************************************************************
static inline uint16_t
CMPSS_getDACValueLow(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Write the DAC value to the DAC value shadow register.
//
return((*((volatile uint16_t *)(base + 0x13U))));
}
//*****************************************************************************
//
//! Causes a software reset of the high comparator digital filter output latch.
//!
//! \param base is the base address of the comparator module.
//!
//! This function causes a software reset of the high comparator digital filter
//! output latch. It will generate a single pulse of the latch reset signal.
//!
//! \return None.
//
//*****************************************************************************
static inline void
CMPSS_clearFilterLatchHigh(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Set the bit that generates a reset pulse to the digital filter latch.
//
__eallow();
(*((volatile uint16_t *)(base + 0x3U))) |= 0x2U;
__edis();
}
//*****************************************************************************
//
//! Causes a software reset of the low comparator digital filter output latch.
//!
//! \param base is the base address of the comparator module.
//!
//! This function causes a software reset of the low comparator digital filter
//! output latch. It will generate a single pulse of the latch reset signal.
//!
//! \return None.
//
//*****************************************************************************
static inline void
CMPSS_clearFilterLatchLow(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Set the bit that generates a reset pulse to the digital filter latch.
//
__eallow();
(*((volatile uint16_t *)(base + 0x3U))) |= 0x200U;
__edis();
}
//*****************************************************************************
//
//! Sets the ramp generator maximum reference value.
//!
//! \param base is the base address of the comparator module.
//! \param value the ramp maximum reference value.
//!
//! This function sets the ramp maximum reference value that will be loaded
//! into the ramp generator.
//!
//! \return None.
//
//*****************************************************************************
static inline void
CMPSS_setMaxRampValue(uint32_t base, uint16_t value)
{
//
// Check the arguments.
//
;
//
// Write the maximum ramp value to the shadow register.
//
(*((volatile uint16_t *)(base + 0xAU))) = value;
}
//*****************************************************************************
//
//! Gets the ramp generator maximum reference value.
//!
//! \param base is the base address of the comparator module.
//!
//! \return Returns the latched ramp maximum reference value that will be
//! loaded into the ramp generator.
//
//*****************************************************************************
static inline uint16_t
CMPSS_getMaxRampValue(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Read the maximum ramp value from the register.
//
return((*((volatile uint16_t *)(base + 0x8U))));
}
//*****************************************************************************
//
//! Sets the ramp generator decrement value.
//!
//! \param base is the base address of the comparator module.
//! \param value is the ramp decrement value.
//!
//! This function sets the value that is subtracted from the ramp value on
//! every system clock cycle.
//!
//! \return None.
//
//*****************************************************************************
static inline void
CMPSS_setRampDecValue(uint32_t base, uint16_t value)
{
//
// Check the arguments.
//
;
//
// Write the ramp decrement value to the shadow register.
//
(*((volatile uint16_t *)(base + 0xEU))) = value;
}
//*****************************************************************************
//
//! Gets the ramp generator decrement value.
//!
//! \param base is the base address of the comparator module.
//!
//! \return Returns the latched ramp decrement value that is subtracted from
//! the ramp value on every system clock cycle.
//
//*****************************************************************************
static inline uint16_t
CMPSS_getRampDecValue(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Read the ramp decrement value from the register.
//
return((*((volatile uint16_t *)(base + 0xCU))));
}
//*****************************************************************************
//
//! Sets the ramp generator delay value.
//!
//! \param base is the base address of the comparator module.
//! \param value is the 13-bit ramp delay value.
//!
//! This function sets the value that configures the number of system clock
//! cycles to delay the start of the ramp generator decrementer after a PWMSYNC
//! event is received. Delay value can be no greater than 8191.
//!
//! \return None.
//
//*****************************************************************************
static inline void
CMPSS_setRampDelayValue(uint32_t base, uint16_t value)
{
//
// Check the arguments.
//
;
;
//
// Write the ramp delay value to the shadow register.
//
(*((volatile uint16_t *)(base + 0x15U))) = value;
}
//*****************************************************************************
//
//! Gets the ramp generator delay value.
//!
//! \param base is the base address of the comparator module.
//!
//! \return Returns the latched ramp delay value that is subtracted from
//! the ramp value on every system clock cycle.
//
//*****************************************************************************
static inline uint16_t
CMPSS_getRampDelayValue(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Read the ramp delay value from the register.
//
return((*((volatile uint16_t *)(base + 0x14U))));
}
//*****************************************************************************
//
//! Configures sync source for comparator
//!
//! \param base is the base address of the comparator module.
//! \param syncSource is the desired EPWMxSYNCPER source
//!
//! This function configures desired EPWMxSYNCPER source for comparator
//! blocks. Configured EPWMxSYNCPER signal can be used to synchronize loading
//! of DAC input value from shadow to active register. It can also be used to
//! synchronize Ramp generator, if applicable. Refer to device manual to check
//! if Ramp generator is available in the desired CMPSS instance.
//!
//! Valid values for \e syncSource parameter can be 1 to n, where n represents
//! the maximum number of EPWMSYNCPER signals available on the device. For
//! instance, passing 2 into \e syncSource will select EPWM2SYNCPER.
//!
//! \return None.
//
//*****************************************************************************
static inline void
CMPSS_configureSyncSource(uint32_t base, uint16_t syncSource)
{
//
// Check the arguments.
//
;
//
// Write the ramp delay value to the shadow register.
//
__eallow();
(*((volatile uint16_t *)(base + 0x4U))) = ((*((volatile uint16_t *)(base + 0x4U))) &
~0x1EU) |
((uint16_t)(syncSource - 1U) <<
1U);
__edis();
}
//*****************************************************************************
//
//! Sets the comparator hysteresis settings.
//!
//! \param base is the base address of the comparator module.
//! \param value is the amount of hysteresis on the comparator inputs.
//!
//! This function sets the amount of hysteresis on the comparator inputs. The
//! \e value parameter indicates the amount of hysteresis desired. Passing in 0
//! results in none, passing in 1 results in typical hysteresis, passing in 2
//! results in 2x of typical hysteresis, and so on where \e value x of typical
//! hysteresis is the amount configured.
//!
//! \return None.
//
//*****************************************************************************
static inline void
CMPSS_setHysteresis(uint32_t base, uint16_t value)
{
//
// Check the arguments.
//
;
;
//
// Read the ramp delay value from the register.
//
__eallow();
(*((volatile uint16_t *)(base + 0x1U))) = value;
__edis();
}
//*****************************************************************************
//
//! Enables reset of HIGH comparator digital filter output latch on PWMSYNC
//!
//! \param base is the base address of the comparator module.
//!
//! This function enables EPWMSYNCPER reset of High comparator digital filter
//! output latch
//!
//! \return None.
//
//*****************************************************************************
static inline void
CMPSS_enableLatchResetOnPWMSYNCHigh(uint32_t base)
{
//
// Check the arguments.
//
;
__eallow();
(*((volatile uint16_t *)(base + 0x3U))) |= 0x4U;
__edis();
}
//*****************************************************************************
//
//! Disables reset of HIGH comparator digital filter output latch on PWMSYNC
//!
//! \param base is the base address of the comparator module.
//!
//! This function disables EPWMSYNCPER reset of High comparator digital filter
//! output latch
//!
//! \return None.
//
//*****************************************************************************
static inline void
CMPSS_disableLatchResetOnPWMSYNCHigh(uint32_t base)
{
//
// Check the arguments.
//
;
__eallow();
(*((volatile uint16_t *)(base + 0x3U))) &= ~0x4U;
__edis();
}
//*****************************************************************************
//
//! Enables reset of LOW comparator digital filter output latch on PWMSYNC
//!
//! \param base is the base address of the comparator module.
//!
//! This function enables EPWMSYNCPER reset of Low comparator digital filter
//! output latch
//!
//! \return None.
//
//*****************************************************************************
static inline void
CMPSS_enableLatchResetOnPWMSYNCLow(uint32_t base)
{
//
// Check the arguments.
//
;
__eallow();
(*((volatile uint16_t *)(base + 0x3U))) |= 0x400U;
__edis();
}
//*****************************************************************************
//
//! Disables reset of LOW comparator digital filter output latch on PWMSYNC
//!
//! \param base is the base address of the comparator module.
//!
//! This function disables EPWMSYNCPER reset of Low comparator digital filter
//! output latch
//!
//! \return None.
//
//*****************************************************************************
static inline void
CMPSS_disableLatchResetOnPWMSYNCLow(uint32_t base)
{
//
// Check the arguments.
//
;
__eallow();
(*((volatile uint16_t *)(base + 0x3U))) &= ~0x400U;
__edis();
}
//*****************************************************************************
//
//! Sets the ePWM module blanking signal that holds trip in reset.
//!
//! \param base is the base address of the comparator module.
//! \param pwmBlankSrc is the number of the PWMBLANK source.
//!
//! This function configures which PWMBLANK signal from the ePWM module will
//! hold trip in reset when blanking is enabled.
//!
//! The number of the PWMBLANK signal to be used to reset the ramp generator
//! should be specified by passing it into the \e pwmBlankSrc parameter. For
//! instance, passing a 2 into \e pwmBlankSrc will select PWMBLANK2.
//!
//! \return None.
//
//*****************************************************************************
static inline void
CMPSS_configBlanking(uint32_t base, uint16_t pwmBlankSrc)
{
//
// Check the arguments.
//
;
;
//
// Write the blank source number to the appropriate register.
//
__eallow();
(*((volatile uint16_t *)(base + 0x4U))) =
((*((volatile uint16_t *)(base + 0x4U))) & ~0xF00U) |
((pwmBlankSrc - 1U) << 8U);
__edis();
}
//*****************************************************************************
//
//! Enables an ePWM blanking signal to hold trip in reset.
//!
//! \param base is the base address of the comparator module.
//!
//! This function enables a selected ePWM blanking signal to hold trip in
//! reset.
//!
//! \return None.
//
//*****************************************************************************
static inline void
CMPSS_enableBlanking(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Set the bit that enables the PWMBLANK signal.
//
__eallow();
(*((volatile uint16_t *)(base + 0x4U))) |= 0x1000U;
__edis();
}
//*****************************************************************************
//
//! Disables an ePWM blanking signal from holding trip in reset.
//!
//! \param base is the base address of the comparator module.
//!
//! This function disables a selected ePWM blanking signal from holding trip in
//! reset.
//!
//! \return None.
//
//*****************************************************************************
static inline void
CMPSS_disableBlanking(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Clear the bit that enables the PWMBLANK signal.
//
__eallow();
(*((volatile uint16_t *)(base + 0x4U))) &= ~0x1000U;
__edis();
}
//*****************************************************************************
//
//! Configures the digital filter of the high comparator.
//!
//! \param base is the base address of the comparator module.
//! \param samplePrescale is the number of system clock cycles between samples.
//! \param sampleWindow is the number of FIFO samples to monitor.
//! \param threshold is the majority threshold of samples to change state.
//!
//! This function configures the operation of the digital filter of the high
//! comparator.
//!
//! The \e samplePrescale parameter specifies the number of system clock cycles
//! between samples. It is a 16-bit value so a number higher than 65535 should
//! not be passed as this parameter. The prescaler used by digital filter is 1
//! more than \e samplePrescale value. So, the input provided should be 1 less
//! than the expected prescaler.
//!
//! The \e sampleWindow parameter configures the size of the window of FIFO
//! samples taken from the input that will be monitored to determine when to
//! change the filter output. This sample window may be no larger than 32
//! samples.
//!
//! The \e threshold parameter configures the threshold value to be used by
//! the digital filter.
//!
//! The filter output resolves to the majority value of the sample window where
//! majority is defined by the value passed into the \e threshold parameter.
//! For proper operation, the value of \e threshold must be greater than
//! sampleWindow / 2.
//!
//! To ensure proper operation of the filter, the following is the recommended
//! function call sequence for initialization:
//!
//! -# Configure and enable the comparator using CMPSS_configHighComparator()
//! and CMPSS_enableModule()
//! -# Configure the digital filter using CMPSS_configFilterHigh()
//! -# Initialize the sample values using CMPSS_initFilterHigh()
//! -# Configure the module output signals CTRIP and CTRIPOUT using
//! CMPSS_configOutputsHigh()
//!
//! \return None.
//
//*****************************************************************************
extern void
CMPSS_configFilterHigh(uint32_t base, uint16_t samplePrescale,
uint16_t sampleWindow, uint16_t threshold);
//*****************************************************************************
//
//! Configures the digital filter of the low comparator.
//!
//! \param base is the base address of the comparator module.
//! \param samplePrescale is the number of system clock cycles between samples.
//! \param sampleWindow is the number of FIFO samples to monitor.
//! \param threshold is the majority threshold of samples to change state.
//!
//! This function configures the operation of the digital filter of the low
//! comparator.
//!
//! The \e samplePrescale parameter specifies the number of system clock cycles
//! between samples. It is a 16-bit value so a number higher than 65535 should
//! not be passed as this parameter. The prescaler used by digital filter is 1
//! more than \e samplePrescale value. So, the input provided should be 1 less
//! than the expected prescaler.
//!
//! The \e sampleWindow parameter configures the size of the window of FIFO
//! samples taken from the input that will be monitored to determine when to
//! change the filter output. This sample window may be no larger than 32
//! samples.
//!
//! The \e threshold parameter configures the threshold value to be used by
//! the digital filter.
//!
//! The filter output resolves to the majority value of the sample window where
//! majority is defined by the value passed into the \e threshold parameter.
//! For proper operation, the value of \e threshold must be greater than
//! sampleWindow / 2.
//!
//! To ensure proper operation of the filter, the following is the recommended
//! function call sequence for initialization:
//!
//! -# Configure and enable the comparator using CMPSS_configLowComparator()
//! and CMPSS_enableModule()
//! -# Configure the digital filter using CMPSS_configFilterLow()
//! -# Initialize the sample values using CMPSS_initFilterLow()
//! -# Configure the module output signals CTRIP and CTRIPOUT using
//! CMPSS_configOutputsLow()
//!
//! \return None.
//
//*****************************************************************************
extern void
CMPSS_configFilterLow(uint32_t base, uint16_t samplePrescale,
uint16_t sampleWindow, uint16_t threshold);
//*****************************************************************************
//
//! Configures whether or not the digital filter latches are reset by PWMSYNC
//!
//! \param base is the base address of the comparator module.
//! \param highEnable indicates filter latch settings in the high comparator.
//! \param lowEnable indicates filter latch settings in the low comparator.
//!
//! This function configures whether or not the digital filter latches in both
//! the high and low comparators should be reset by PWMSYNC. If the
//! \e highEnable parameter is \b true, the PWMSYNC will be allowed to reset
//! the high comparator's digital filter latch. If it is false, the ability of
//! the PWMSYNC to reset the latch will be disabled. The \e lowEnable parameter
//! has the same effect on the low comparator's digital filter latch.
//!
//! \return None.
//
//*****************************************************************************
extern void
CMPSS_configLatchOnPWMSYNC(uint32_t base, _Bool highEnable, _Bool lowEnable);
//*****************************************************************************
//
//! Configures the comparator subsystem's ramp generator.
//!
//! \param base is the base address of the comparator module.
//! \param maxRampVal is the ramp maximum reference value.
//! \param decrementVal value is the ramp decrement value.
//! \param delayVal is the ramp delay value.
//! \param pwmSyncSrc is the number of the PWMSYNC source.
//! \param useRampValShdw indicates if the max ramp shadow should be used.
//!
//! This function configures many of the main settings of the comparator
//! subsystem's ramp generator. The \e maxRampVal parameter should be passed
//! the ramp maximum reference value that will be loaded into the ramp
//! generator. The \e decrementVal parameter should be passed the decrement
//! value that will be subtracted from the ramp generator on each system clock
//! cycle. The \e delayVal parameter should be passed the 13-bit number of
//! system clock cycles the ramp generator should delay before beginning to
//! decrement the ramp generator after a PWMSYNC signal is received.
//!
//! These three values may be be set individually using the
//! CMPSS_setMaxRampValue(), CMPSS_setRampDecValue(), and
//! CMPSS_setRampDelayValue() APIs.
//!
//! The number of the PWMSYNC signal to be used to reset the ramp generator
//! should be specified by passing it into the \e pwmSyncSrc parameter. For
//! instance, passing a CMPSS_PWMSYNCx into \e pwmSyncSrc will select PWMSYNCx.
//!
//! To indicate whether the ramp generator should reset with the value from the
//! ramp max reference value shadow register or with the latched ramp max
//! reference value, use the \e useRampValShdw parameter. Passing it \b true
//! will result in the latched value being bypassed. The ramp generator will be
//! loaded right from the shadow register. A value of \b false will load the
//! ramp generator from the latched value.
//!
//! \return None.
//
//*****************************************************************************
extern void
CMPSS_configRamp(uint32_t base, uint16_t maxRampVal, uint16_t decrementVal,
uint16_t delayVal, uint16_t pwmSyncSrc, _Bool useRampValShdw);
//*****************************************************************************
//
// Close the Doxygen group.
//! @}
//
//*****************************************************************************
//*****************************************************************************
//
// Mark the end of the C bindings section for C++ compilers.
//
//*****************************************************************************
//#############################################################################
//
// FILE: cputimer.h
//
// TITLE: C28x CPU timer Driver
//
//#############################################################################
// $Copyright:
// Copyright (C) 2023 Texas Instruments Incorporated - http://www.ti.com/
//
// 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 Texas Instruments Incorporated 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
// OWNER 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.
// $
//#############################################################################
//*****************************************************************************
//
// If building with a C++ compiler, make all of the definitions in this header
// have a C binding.
//
//*****************************************************************************
//*****************************************************************************
//
//! \addtogroup cputimer_api CPUTimer
//! @{
//
//*****************************************************************************
//###########################################################################
//
// FILE: hw_cputimer.h
//
// TITLE: Definitions for the CPUTIMER registers.
//
//###########################################################################
// $Copyright:
// Copyright (C) 2023 Texas Instruments Incorporated - http://www.ti.com/
//
// 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 Texas Instruments Incorporated 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
// OWNER 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.
// $
//###########################################################################
//*************************************************************************************************
//
// The following are defines for the CPUTIMER register offsets
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the TIM register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the PRD register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the TCR register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the TPR register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the TPRH register
//
//*************************************************************************************************
//*****************************************************************************
//
// Defines for the API.
//
//*****************************************************************************
//*****************************************************************************
//
//! Values that can be passed to CPUTimer_setEmulationMode() as the
//! \e mode parameter.
//
//****************************************************************************
typedef enum
{
//! Denotes that the timer will stop after the next decrement
CPUTIMER_EMULATIONMODE_STOPAFTERNEXTDECREMENT = 0x0000,
//! Denotes that the timer will stop when it reaches zero
CPUTIMER_EMULATIONMODE_STOPATZERO = 0x0400,
//! Denotes that the timer will run free
CPUTIMER_EMULATIONMODE_RUNFREE = 0x0800
}CPUTimer_EmulationMode;
//*****************************************************************************
//
//! The following are values that can be passed to
//! CPUTimer_selectClockSource() as the \e source parameter.
//
//*****************************************************************************
typedef enum
{
//! System Clock Source
CPUTIMER_CLOCK_SOURCE_SYS = 0x0,
//! Internal Oscillator 1 Clock Source
CPUTIMER_CLOCK_SOURCE_INTOSC1 = 0x1,
//! Internal Oscillator 2 Clock Source
CPUTIMER_CLOCK_SOURCE_INTOSC2 = 0x2,
//! External Clock Source
CPUTIMER_CLOCK_SOURCE_XTAL = 0x3,
} CPUTimer_ClockSource;
//*****************************************************************************
//
//! The following are values that can be passed to
//! CPUTimer_selectClockSource() as the \e prescaler parameter.
//
//*****************************************************************************
typedef enum
{
CPUTIMER_CLOCK_PRESCALER_1 = 0, //!< Prescaler value of / 1
CPUTIMER_CLOCK_PRESCALER_2 = 1, //!< Prescaler value of / 2
CPUTIMER_CLOCK_PRESCALER_4 = 2, //!< Prescaler value of / 4
CPUTIMER_CLOCK_PRESCALER_8 = 3, //!< Prescaler value of / 8
CPUTIMER_CLOCK_PRESCALER_16 = 4 //!< Prescaler value of / 16
} CPUTimer_Prescaler;
//*****************************************************************************
//
//! \internal
//! Checks CPU timer base address.
//!
//! \param base specifies the Timer module base address.
//!
//! This function determines if a CPU timer module base address is valid.
//!
//! \return Returns \b true if the base address is valid and \b false
//! otherwise.
//
//*****************************************************************************
//*****************************************************************************
//
//! Clears CPU timer overflow flag.
//!
//! \param base is the base address of the timer module.
//!
//! This function clears the CPU timer overflow flag.
//!
//! \return None.
//
//*****************************************************************************
static inline void CPUTimer_clearOverflowFlag(uint32_t base)
{
;
//
// Set TIF bit of TCR register
//
(*((volatile uint16_t *)(base + 0x4U))) |= 0x8000U;
}
//*****************************************************************************
//
//! Disables CPU timer interrupt.
//!
//! \param base is the base address of the timer module.
//!
//! This function disables the CPU timer interrupt.
//!
//! \return None.
//
//*****************************************************************************
static inline void CPUTimer_disableInterrupt(uint32_t base)
{
;
//
// Clear TIE bit of TCR register
//
(*((volatile uint16_t *)(base + 0x4U))) &= ~0x4000U;
}
//*****************************************************************************
//
//! Enables CPU timer interrupt.
//!
//! \param base is the base address of the timer module.
//!
//! This function enables the CPU timer interrupt.
//!
//! \return None.
//
//*****************************************************************************
static inline void CPUTimer_enableInterrupt(uint32_t base)
{
uint16_t tcrValue = 0;
;
//
// Set TIE bit of TCR register
//
tcrValue = (*((volatile uint16_t *)(base + 0x4U))) & (~0x8000U);
(*((volatile uint16_t *)(base + 0x4U))) = tcrValue | 0x4000U;
}
//*****************************************************************************
//
//! Reloads CPU timer counter.
//!
//! \param base is the base address of the timer module.
//!
//! This function reloads the CPU timer counter with the values contained in
//! the CPU timer period register.
//!
//! \return None.
//
//*****************************************************************************
static inline void CPUTimer_reloadTimerCounter(uint32_t base)
{
uint16_t tcrValue = 0;
;
//
// Set TRB bit of register TCR
//
tcrValue = (*((volatile uint16_t *)(base + 0x4U))) & (~0x8000U);
(*((volatile uint16_t *)(base + 0x4U))) = tcrValue | 0x20U;
}
//*****************************************************************************
//
//! Stops CPU timer.
//!
//! \param base is the base address of the timer module.
//!
//! This function stops the CPU timer.
//!
//! \return None.
//
//*****************************************************************************
static inline void CPUTimer_stopTimer(uint32_t base)
{
uint16_t tcrValue = 0;
;
//
// Set TSS bit of register TCR
//
tcrValue = (*((volatile uint16_t *)(base + 0x4U))) & (~0x8000U);
(*((volatile uint16_t *)(base + 0x4U))) = tcrValue | 0x10U;
}
//*****************************************************************************
//
//! Starts(restarts) CPU timer.
//!
//! \param base is the base address of the timer module.
//!
//! This function starts (restarts) the CPU timer.
//!
//! \b Note: This function doesn't reset the timer counter.
//!
//! \return None.
//
//*****************************************************************************
static inline void CPUTimer_resumeTimer(uint32_t base)
{
;
//
// Clear TSS bit of register TCR
//
(*((volatile uint16_t *)(base + 0x4U))) &= ~0x10U;
}
//*****************************************************************************
//
//! Starts(restarts) CPU timer.
//!
//! \param base is the base address of the timer module.
//!
//! This function starts (restarts) the CPU timer.
//!
//! \b Note: This function reloads the timer counter.
//!
//! \return None.
//
//*****************************************************************************
static inline void CPUTimer_startTimer(uint32_t base)
{
uint16_t tcrValue = 0;
;
//
// Reload the timer counter
//
tcrValue = (*((volatile uint16_t *)(base + 0x4U))) & (~0x8000U);
(*((volatile uint16_t *)(base + 0x4U))) = tcrValue | 0x20U;
//
// Clear TSS bit of register TCR
//
(*((volatile uint16_t *)(base + 0x4U))) &= ~0x10U;
}
//*****************************************************************************
//
//! Sets CPU timer period.
//!
//! \param base is the base address of the timer module.
//! \param periodCount is the CPU timer period count.
//!
//! This function sets the CPU timer period count.
//!
//! \return None.
//
//*****************************************************************************
static inline void CPUTimer_setPeriod(uint32_t base, uint32_t periodCount)
{
;
//
// Load the MSB period Count
//
(*((volatile uint32_t *)(base + 0x2U))) = periodCount;
}
//*****************************************************************************
//
//! Returns the current CPU timer counter value.
//!
//! \param base is the base address of the timer module.
//!
//! This function returns the current CPU timer counter value.
//!
//! \return Returns the current CPU timer count value.
//
//*****************************************************************************
static inline uint32_t CPUTimer_getTimerCount(uint32_t base)
{
;
//
// Get the TIMH:TIM registers value
//
return((*((volatile uint32_t *)(base + 0x0U))));
}
//*****************************************************************************
//
//! Set CPU timer pre-scaler value.
//!
//! \param base is the base address of the timer module.
//! \param prescaler is the CPU timer pre-scaler value.
//!
//! This function sets the pre-scaler value for the CPU timer. For every value
//! of (prescaler + 1), the CPU timer counter decrements by 1.
//!
//! \return None.
//
//*****************************************************************************
static inline void CPUTimer_setPreScaler(uint32_t base, uint16_t prescaler)
{
;
//
// Writes to TPR.TDDR and TPRH.TDDRH bits
//
(*((volatile uint16_t *)(base + 0x7U))) = prescaler >> 8U;
(*((volatile uint16_t *)(base + 0x6U))) = (prescaler & 0xFFU) ;
}
//*****************************************************************************
//
//! Return the CPU timer overflow status.
//!
//! \param base is the base address of the timer module.
//!
//! This function returns the CPU timer overflow status.
//!
//! \return Returns true if the CPU timer has overflowed, false if not.
//
//*****************************************************************************
static inline _Bool CPUTimer_getTimerOverflowStatus(uint32_t base)
{
;
//
// Check if TIF bits of register TCR are set
//
return((((*((volatile uint16_t *)(base + 0x4U))) & 0x8000U) ==
0x8000U) ? 1 : 0);
}
//*****************************************************************************
//
//! Select CPU Timer 2 Clock Source and Prescaler
//!
//! \param base is the base address of the timer module.
//! \param source is the clock source to use for CPU Timer 2
//! \param prescaler is the value that configures the selected clock source
//! relative to the system clock
//!
//! This function selects the specified clock source and prescaler value
//! for the CPU timer (CPU timer 2 only).
//!
//! The \e source parameter can be any one of the following:
//! - \b CPUTIMER_CLOCK_SOURCE_SYS - System Clock
//! - \b CPUTIMER_CLOCK_SOURCE_INTOSC1 - Internal Oscillator 1 Clock
//! - \b CPUTIMER_CLOCK_SOURCE_INTOSC2 - Internal Oscillator 2 Clock
//! - \b CPUTIMER_CLOCK_SOURCE_XTAL - External Clock
//!
//! The \e prescaler parameter can be any one of the following:
//! - \b CPUTIMER_CLOCK_PRESCALER_1 - Prescaler value of / 1
//! - \b CPUTIMER_CLOCK_PRESCALER_2 - Prescaler value of / 2
//! - \b CPUTIMER_CLOCK_PRESCALER_4 - Prescaler value of / 4
//! - \b CPUTIMER_CLOCK_PRESCALER_8 - Prescaler value of / 8
//! - \b CPUTIMER_CLOCK_PRESCALER_16 - Prescaler value of / 16
//!
//! \return None.
//
//*****************************************************************************
static inline void CPUTimer_selectClockSource(uint32_t base,
CPUTimer_ClockSource source,
CPUTimer_Prescaler prescaler)
{
;
//
// Set source and prescaler for CPU Timer 2
//
if(base == 0x00000C10U)
{
__eallow();
//
// Set Clock Source
//
(*((volatile uint16_t *)(0x0005D300U + 0x7CU))) &=
~0x7U;
(*((volatile uint16_t *)(0x0005D300U + 0x7CU))) |= (uint16_t)source;
//
// Set Clock Prescaler
//
(*((volatile uint16_t *)(0x0005D300U + 0x7CU))) &=
~0x38U;
(*((volatile uint16_t *)(0x0005D300U + 0x7CU))) |= ((uint16_t)prescaler <<
3U);
__edis();
}
}
//*****************************************************************************
//
// Prototypes for the APIs.
//
//*****************************************************************************
//*****************************************************************************
//
//! Sets Emulation mode for CPU timer.
//!
//! \param base is the base address of the timer module.
//! \param mode is the emulation mode of the timer.
//!
//! This function sets the behaviour of CPU timer during emulation. Valid
//! values mode are: CPUTIMER_EMULATIONMODE_STOPAFTERNEXTDECREMENT,
//! CPUTIMER_EMULATIONMODE_STOPATZERO and CPUTIMER_EMULATIONMODE_RUNFREE.
//!
//! \return None.
//
//*****************************************************************************
extern void CPUTimer_setEmulationMode(uint32_t base,
CPUTimer_EmulationMode mode);
//*****************************************************************************
//
// Close the Doxygen group.
//! @}
//
//*****************************************************************************
//*****************************************************************************
//
// Mark the end of the C bindings section for C++ compilers.
//
//*****************************************************************************
//###########################################################################
//
// FILE: dac.h
//
// TITLE: C28x DAC driver.
//
//###########################################################################
// $Copyright:
// Copyright (C) 2023 Texas Instruments Incorporated - http://www.ti.com/
//
// 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 Texas Instruments Incorporated 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
// OWNER 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.
// $
//###########################################################################
//*****************************************************************************
//
// If building with a C++ compiler, make all of the definitions in this header
// have a C binding.
//
//*****************************************************************************
//*****************************************************************************
//
//! \addtogroup dac_api DAC
//! @{
//
//*****************************************************************************
//###########################################################################
//
// FILE: hw_dac.h
//
// TITLE: Definitions for the DAC registers.
//
//###########################################################################
// $Copyright:
// Copyright (C) 2023 Texas Instruments Incorporated - http://www.ti.com/
//
// 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 Texas Instruments Incorporated 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
// OWNER 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.
// $
//###########################################################################
//*************************************************************************************************
//
// The following are defines for the DAC register offsets
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the DACREV register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the DACCTL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the DACVALA register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the DACVALS register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the DACOUTEN register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the DACLOCK register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the DACTRIM register
//
//*************************************************************************************************
//
// A 8-bit register mask
//
//
// Lock Key
//
//*****************************************************************************
//
// The following are defines for the reg parameter of the
// DAC_lockRegister() and DAC_isRegisterLocked() functions.
//
//*****************************************************************************
//*****************************************************************************
//
//! Values that can be passed to DAC_setReferenceVoltage() as the \e source
//! parameter.
//
//*****************************************************************************
typedef enum
{
DAC_REF_VDAC = 0, //!< VDAC reference voltage
DAC_REF_ADC_VREFHI = 1 //!< ADC VREFHI reference voltage
}DAC_ReferenceVoltage;
//*****************************************************************************
//
//! Values that can be passed to DAC_setGainMode() as the \e mode parameter.
//
//*****************************************************************************
typedef enum
{
DAC_GAIN_ONE = 0, //!< Gain set to 1
DAC_GAIN_TWO = 2 //!< Gain set to 2
}DAC_GainMode;
//*****************************************************************************
//
//! Values that can be passed to DAC_setLoadMode() as the \e mode parameter.
//
//*****************************************************************************
typedef enum
{
DAC_LOAD_SYSCLK = 0, //!< Load on next SYSCLK
DAC_LOAD_PWMSYNC = 4 //!< Load on next PWMSYNC specified by SYNCSEL
}DAC_LoadMode;
//*****************************************************************************
//
// Prototypes for the APIs.
//
//*****************************************************************************
//*****************************************************************************
//
//! \internal
//! Checks DAC base address.
//!
//! \param base specifies the DAC module base address.
//!
//! This function determines if an DAC module base address is valid.
//!
//! \return Returns \b true if the base address is valid and \b false
//! otherwise.
//
//*****************************************************************************
//*****************************************************************************
//
//! Get the DAC Revision value
//!
//! \param base is the DAC module base address
//!
//! This function gets the DAC revision value.
//!
//! \return Returns the DAC revision value.
//
//*****************************************************************************
static inline uint16_t
DAC_getRevision(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Get the revision value.
//
return((*((volatile uint16_t *)(base + 0x0U))) & 0xFFU);
}
//*****************************************************************************
//
//! Sets the DAC Reference Voltage
//!
//! \param base is the DAC module base address
//! \param source is the selected reference voltage
//!
//! This function sets the DAC reference voltage.
//!
//! The \e source parameter can have the following value:
//! - \b DAC_REF_VDAC - The VDAC reference voltage
//! - \b DAC_REF_ADC_VREFHI - The ADC VREFHI reference voltage
//!
//! \return None.
//
//*****************************************************************************
static inline void
DAC_setReferenceVoltage(uint32_t base, DAC_ReferenceVoltage source)
{
//
// Check the arguments.
//
;
//
// Set the reference voltage
//
__eallow();
(*((volatile uint16_t *)(base + 0x1U))) = ((*((volatile uint16_t *)(base + 0x1U))) &
~0x1U) | (uint16_t)source;
__edis();
}
//*****************************************************************************
//
//! Sets the DAC Gain Mode
//!
//! \param base is the DAC module base address
//! \param mode is the selected gain mode
//!
//! This function sets the DAC gain mode for the buffered output.
//!
//! The \e mode parameter can have one of two values:
//! - \b DAC_GAIN_ONE - Gain is set to 1
//! - \b DAC_GAIN_TWO - Gain is set to 2
//!
//! \note This value is only used when \e DAC_REF_ADC_VREFHI is set using
//! DAC_setReferenceVoltage() and internal ADC reference mode is selected.
//!
//! \return None.
//
//*****************************************************************************
static inline void
DAC_setGainMode(uint32_t base, DAC_GainMode mode)
{
//
// Check the arguments.
//
;
//
// Set the gain mode
//
__eallow();
(*((volatile uint16_t *)(base + 0x1U))) = ((*((volatile uint16_t *)(base + 0x1U))) &
~0x2U) | (uint16_t)mode;
__edis();
}
//*****************************************************************************
//
//! Sets the DAC Load Mode
//!
//! \param base is the DAC module base address
//! \param mode is the selected load mode
//!
//! This function sets the DAC load mode.
//!
//! The \e mode parameter can have one of two values:
//! - \b DAC_LOAD_SYSCLK - Load on next SYSCLK
//! - \b DAC_LOAD_PWMSYNC - Load on next PWMSYNC specified by SYNCSEL
//!
//! \return None.
//
//*****************************************************************************
static inline void
DAC_setLoadMode(uint32_t base, DAC_LoadMode mode)
{
//
// Check the arguments.
//
;
//
// Set the load mode
//
__eallow();
(*((volatile uint16_t *)(base + 0x1U))) = ((*((volatile uint16_t *)(base + 0x1U))) &
~0x4U) | (uint16_t)mode;
__edis();
}
//*****************************************************************************
//
//! Sets the DAC PWMSYNC Signal
//!
//! \param base is the DAC module base address
//! \param signal is the selected PWM signal
//!
//! This function sets the DAC PWMSYNC signal.
//!
//! The \e signal parameter must be set to a number that represents the PWM
//! signal that will be set. For instance, passing 2 into \e signal will
//! select PWM sync signal 2.
//!
//! \return None.
//
//*****************************************************************************
static inline void
DAC_setPWMSyncSignal(uint32_t base, uint16_t pwmSignal)
{
//
// Check the arguments.
//
;
;
//
// Set the PWM sync signal
//
__eallow();
(*((volatile uint16_t *)(base + 0x1U))) = ((*((volatile uint16_t *)(base + 0x1U))) &
~0xF0U) |
((uint16_t)(pwmSignal - 1U) <<
4U);
__edis();
}
//*****************************************************************************
//
//! Get the DAC Active Output Value
//!
//! \param base is the DAC module base address
//!
//! This function gets the DAC active output value.
//!
//! \return Returns the DAC active output value.
//
//*****************************************************************************
static inline uint16_t
DAC_getActiveValue(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Get the active value
//
return((*((volatile uint16_t *)(base + 0x2U))) & 0xFFFU);
}
//*****************************************************************************
//
//! Set the DAC Shadow Output Value
//!
//! \param base is the DAC module base address
//! \param value is the 12-bit code to be loaded into the active value register
//!
//! This function sets the DAC shadow output value.
//!
//! \return None.
//
//*****************************************************************************
static inline void
DAC_setShadowValue(uint32_t base, uint16_t value)
{
//
// Check the arguments.
//
;
;
//
// Set the shadow value
//
(*((volatile uint16_t *)(base + 0x3U))) = ((*((volatile uint16_t *)(base + 0x3U))) &
~0xFFFU) |
(uint16_t)(value & 0xFFFU);
}
//*****************************************************************************
//
//! Get the DAC Shadow Output Value
//!
//! \param base is the DAC module base address
//!
//! This function gets the DAC shadow output value.
//!
//! \return Returns the DAC shadow output value.
//
//*****************************************************************************
static inline uint16_t
DAC_getShadowValue(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Get the shadow value
//
return((*((volatile uint16_t *)(base + 0x3U))) & 0xFFFU);
}
//*****************************************************************************
//
//! Enable the DAC Output
//!
//! \param base is the DAC module base address
//!
//! This function enables the DAC output.
//!
//! \note A delay is required after enabling the DAC. Further details
//! regarding the exact delay time length can be found in the device datasheet.
//!
//! \return None.
//
//*****************************************************************************
static inline void
DAC_enableOutput(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Enable the output
//
__eallow();
(*((volatile uint16_t *)(base + 0x4U))) |= 0x1U;
__edis();
}
//*****************************************************************************
//
//! Disable the DAC Output
//!
//! \param base is the DAC module base address
//!
//! This function disables the DAC output.
//!
//! \return None.
//
//*****************************************************************************
static inline void
DAC_disableOutput(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Disable the output
//
__eallow();
(*((volatile uint16_t *)(base + 0x4U))) &= ~0x1U;
__edis();
}
//*****************************************************************************
//
//! Set DAC Offset Trim
//!
//! \param base is the DAC module base address
//! \param offset is the specified value for the offset trim
//!
//! This function sets the DAC offset trim. The \e offset value should be a
//! signed number in the range of -128 to 127.
//!
//! \note The offset should not be modified unless specifically indicated by
//! TI Errata or other documentation. Modifying the offset value could cause
//! this module to operate outside of the datasheet specifications.
//!
//! \return None.
//
//*****************************************************************************
static inline void
DAC_setOffsetTrim(uint32_t base, int16_t offset)
{
//
// Check the arguments.
//
;
;
//
// Set the offset trim value
//
__eallow();
(*((volatile uint16_t *)(base + 0x6U))) = ((*((volatile uint16_t *)(base + 0x6U))) &
~0xFFU) | (int16_t)offset;
__edis();
}
//*****************************************************************************
//
//! Get DAC Offset Trim
//!
//! \param base is the DAC module base address
//!
//! This function gets the DAC offset trim value.
//!
//! \return None.
//
//*****************************************************************************
static inline int16_t
DAC_getOffsetTrim(uint32_t base)
{
uint16_t value;
//
// Check the arguments.
//
;
//
// Get the sign-extended offset trim value
//
value = ((*((volatile uint16_t *)(base + 0x6U))) & 0xFFU);
value = ((value & (uint16_t)(0xFFU)) ^ (uint16_t)0x80) -
(uint16_t)0x80;
return((int16_t)value);
}
//*****************************************************************************
//
//! Lock write-access to DAC Register
//!
//! \param base is the DAC module base address
//! \param reg is the selected DAC registers
//!
//! This function locks the write-access to the specified DAC register. Only a
//! system reset can unlock the register once locked.
//!
//! The \e reg parameter can be an ORed combination of any of the following
//! values:
//! - \b DAC_LOCK_CONTROL - Lock the DAC control register
//! - \b DAC_LOCK_SHADOW - Lock the DAC shadow value register
//! - \b DAC_LOCK_OUTPUT - Lock the DAC output enable/disable register
//!
//! \return None.
//
//*****************************************************************************
static inline void
DAC_lockRegister(uint32_t base, uint16_t reg)
{
//
// Check the arguments.
//
;
;
//
// Lock the specified registers
//
__eallow();
(*((volatile uint16_t *)(base + 0x5U))) |= ((0xA000U) | reg);
__edis();
}
//*****************************************************************************
//
//! Check if DAC Register is locked
//!
//! \param base is the DAC module base address
//! \param reg is the selected DAC register locks to check
//!
//! This function checks if write-access has been locked on the specified DAC
//! register.
//!
//! The \e reg parameter can be an ORed combination of any of the following
//! values:
//! - \b DAC_LOCK_CONTROL - Lock the DAC control register
//! - \b DAC_LOCK_SHADOW - Lock the DAC shadow value register
//! - \b DAC_LOCK_OUTPUT - Lock the DAC output enable/disable register
//!
//! \return Returns \b true if any of the registers specified are locked, and
//! \b false if all specified registers aren't locked.
//
//*****************************************************************************
static inline _Bool
DAC_isRegisterLocked(uint32_t base, uint16_t reg)
{
//
// Check the arguments.
//
;
;
//
// Return the lock status on the specified registers
//
return((_Bool)(((*((volatile uint16_t *)(base + 0x5U))) & reg) != 0U));
}
//*****************************************************************************
//
//! Tune DAC Offset Trim
//!
//! \param base is the DAC module base address
//! \param referenceVoltage is the reference voltage the DAC
//! module is operating at.
//!
//! This function adjusts/tunes the DAC offset trim. The \e referenceVoltage
//! value should be a floating point number in the range specified in the
//! device data manual.
//!
//! \note Use this function to adjust the DAC offset trim if operating
//! at a reference voltage other than 2.5v. Since this function modifies
//! the DAC offset trim register, it should only be called once after
//! Device_cal. If it is called multiple times after Device_cal, the offset
//! value scaled would be the wrong value.
//!
//! \return None.
//
//*****************************************************************************
extern void
DAC_tuneOffsetTrim(uint32_t base, float32_t referenceVoltage);
//*****************************************************************************
//
// Close the Doxygen group.
//! @}
//
//*****************************************************************************
//*****************************************************************************
//
// Mark the end of the C bindings section for C++ compilers.
//
//*****************************************************************************
//###########################################################################
//
// FILE: dcc.h
//
// TITLE: C28x DCC driver.
//
//###########################################################################
// $Copyright:
// Copyright (C) 2023 Texas Instruments Incorporated - http://www.ti.com/
//
// 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 Texas Instruments Incorporated 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
// OWNER 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.
// $
//###########################################################################
//*****************************************************************************
//
// If building with a C++ compiler, make all of the definitions in this header
// have a C binding.
//
//*****************************************************************************
//*****************************************************************************
//
//! \addtogroup dcc_api DCC
//! @{
//
//*****************************************************************************
//###########################################################################
//
// FILE: hw_dcc.h
//
// TITLE: Definitions for the DCC registers.
//
//###########################################################################
// $Copyright:
// Copyright (C) 2023 Texas Instruments Incorporated - http://www.ti.com/
//
// 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 Texas Instruments Incorporated 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
// OWNER 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.
// $
//###########################################################################
//*************************************************************************************************
//
// The following are defines for the DCC register offsets
//
//*************************************************************************************************
// 0.
//*************************************************************************************************
//
// The following are defines for the bit fields in the DCCGCTRL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the DCCCNTSEED0 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the DCCVALIDSEED0 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the DCCCNTSEED1 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the DCCSTATUS register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the DCCCNT0 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the DCCVALID0 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the DCCCNT1 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the DCCCLKSRC1 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the DCCCLKSRC0 register
//
//*************************************************************************************************
//
// Minimum and maximum values of valid seed value
//
//
// Minimum and maximum values of counter0/1 seed value
//
//
// The reset value required to start or enable specific DCC operations
//
//
// The reset value required to stop or disable specific DCC operations
//
//
// A 16-bit register mask
//
//
// A 7-bit register mask
//
//
// A mask for the DCC counter seed registers
//
//
// A mask for the DCC counter seed value
//
//*****************************************************************************
//
//! The following are defines for the mode parameter of the
//! DCC_enableSingleShotMode() function.
//
//*****************************************************************************
typedef enum
{
//! Use to stop counting when counter0 and valid0 both reach zero
DCC_MODE_COUNTER_ZERO = 0xA00U,
//! Use to stop counting when counter1 reaches zero
DCC_MODE_COUNTER_ONE = 0xB00U
} DCC_SingleShotMode;
//*****************************************************************************
//
//! The following are defines for the source parameter of the
//! DCC_setCounter1ClkSource() function.
//
//*****************************************************************************
typedef enum
{
DCC_COUNT1SRC_PLL = 0x0U, //!< PLLRAWCLK Clock Out Source
DCC_COUNT1SRC_INTOSC1 = 0x2U, //!< Internal Oscillator1 Clock Source
DCC_COUNT1SRC_INTOSC2 = 0x3U, //!< Internal Oscillator2 Clock Source
DCC_COUNT1SRC_SYSCLK = 0x6U, //!< SYSCLK (System Clock) Source
DCC_COUNT1SRC_AUXCLKIN = 0xAU, //!< AUXCLKIN (Auxiliary Clock) Source
DCC_COUNT1SRC_EPWM = 0xBU, //!< EPWM Clock Source
DCC_COUNT1SRC_ADCCLK = 0xDU, //!< ADC Clock Source
DCC_COUNT1SRC_WDCLK = 0xEU, //!< Watch Dog Clock Source
DCC_COUNT1SRC_CANX = 0xFU, //!< CANxBIT Clock Source
DCC_COUNT1SRC_SYSAPLL_CLK_AUX = 0x16U, //!< System APLL Aux Clk
} DCC_Count1ClockSource;
//*****************************************************************************
//
//! The following are defines for the source parameter of the
//! DCC_setCounter0ClkSource() function.
//
//*****************************************************************************
typedef enum
{
DCC_COUNT0SRC_XTAL = 0x0U, //!< XTAL Clock Source
DCC_COUNT0SRC_INTOSC1 = 0x1U, //!< Internal Oscillator1 Clock Source
DCC_COUNT0SRC_INTOSC2 = 0x2U, //!< Internal Oscillator2 Clock Source
DCC_COUNT0SRC_SYSCLK = 0x5U, //!< System Clock Source
DCC_COUNT0SRC_AUXCLK = 0x8U, //!< AUX Clock Source
} DCC_Count0ClockSource;
//*****************************************************************************
//
// Prototypes for the APIs.
//
//*****************************************************************************
//*****************************************************************************
//
//! \internal
//! Checks DCC base address.
//!
//! \param base specifies the DCC module base address.
//!
//! This function determines if an DCC module base address is valid.
//!
//! \return Returns \b true if the base address is valid and \b false
//! otherwise.
//
//*****************************************************************************
//*****************************************************************************
//
//! Enables the DCC module.
//!
//! \param base is the DCC module base address
//!
//! This function starts the DCC counter operation.
//!
//! \return None.
//
//*****************************************************************************
static inline void
DCC_enableModule(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Set DCC enable bit field.
//
__eallow();
(*((volatile uint16_t *)(base + 0x0U))) = ((*((volatile uint16_t *)(base + 0x0U))) &
~(0xFU)) | (0xAU);
__edis();
}
//*****************************************************************************
//
//! Disable the DCC module.
//!
//! \param base is the DCC module base address
//!
//! This function stops the DCC counter operation.
//!
//! \return None.
//
//*****************************************************************************
static inline void
DCC_disableModule(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Reset DCC enable bit field.
//
__eallow();
(*((volatile uint16_t *)(base + 0x0U))) = ((*((volatile uint16_t *)(base + 0x0U))) &
~(0xFU)) | (0x5U);
__edis();
}
//*****************************************************************************
//
//! Enable DCC Error Signal
//!
//! \param base is the DCC module base address
//!
//! This function enables the error signal interrupt.
//!
//! \return None.
//
//*****************************************************************************
static inline void
DCC_enableErrorSignal(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Enable the error signal
//
__eallow();
(*((volatile uint16_t *)(base + 0x0U))) = ((*((volatile uint16_t *)(base + 0x0U))) &
~(0xF0U)) |
((0xAU) << 4U);
__edis();
}
//*****************************************************************************
//
//! Enable DCC Done Signal
//!
//! \param base is the DCC module base address
//!
//! This function enables the done signal interrupt.
//!
//! \return None.
//
//*****************************************************************************
static inline void
DCC_enableDoneSignal(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Enable the done interrupt signal
//
__eallow();
(*((volatile uint16_t *)(base + 0x0U))) = ((*((volatile uint16_t *)(base + 0x0U))) &
~(0xF000U)) |
((0xAU) << 12U);
__edis();
}
//*****************************************************************************
//
//! Disable DCC Error Signal
//!
//! \param base is the DCC module base address
//!
//! This function disables the error signal interrupt.
//!
//! \return None.
//
//*****************************************************************************
static inline void
DCC_disableErrorSignal(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Disable the error signal
//
__eallow();
(*((volatile uint16_t *)(base + 0x0U))) = ((*((volatile uint16_t *)(base + 0x0U))) &
~(0xF0U)) |
((0x5U) << 4U);
__edis();
}
//*****************************************************************************
//
//! Disable DCC Done Signal
//!
//! \param base is the DCC module base address
//!
//! This function disables the done signal interrupt.
//!
//! \return None.
//
//*****************************************************************************
static inline void
DCC_disableDoneSignal(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Disable the done interrupt signal
//
__eallow();
(*((volatile uint16_t *)(base + 0x0U))) = ((*((volatile uint16_t *)(base + 0x0U))) &
~(0xF000U)) |
((0x5U) << 12U);
__edis();
}
//*****************************************************************************
//
//! Enable DCC Single-Shot Mode
//!
//! \param base is the DCC module base address
//! \param mode is the selected Single-Shot operation mode
//!
//! This function enables the single-shot mode and sets the operation mode.
//!
//! The \e mode parameter can have one of two values:
//! - \b DCC_MODE_COUNTER_ZERO - Stops counting when counter0 and valid0 both
//! reach zero
//! - \b DCC_MODE_COUNTER_ONE - Stops counting when counter1 reaches zero
//!
//! \return None.
//
//*****************************************************************************
static inline void
DCC_enableSingleShotMode(uint32_t base, DCC_SingleShotMode mode)
{
//
// Check the arguments.
//
;
//
// Set Single-Shot mode value to the appropriate register
//
if(mode == DCC_MODE_COUNTER_ZERO)
{
__eallow();
(*((volatile uint16_t *)(base + 0x0U))) = ((*((volatile uint16_t *)(base + 0x0U))) &
~(0xF00U)) |
(uint16_t)DCC_MODE_COUNTER_ZERO;
__edis();
}
else
{
__eallow();
(*((volatile uint16_t *)(base + 0x0U))) = ((*((volatile uint16_t *)(base + 0x0U))) &
~(0xF00U)) |
(uint16_t)DCC_MODE_COUNTER_ONE;
__edis();
}
}
//*****************************************************************************
//
//! Disable DCC Single-Shot Mode
//!
//! \param base is the DCC module base address
//!
//! This function disables the DCC Single-Shot operation mode
//!
//! \return None.
//
//*****************************************************************************
static inline void
DCC_disableSingleShotMode(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Reset Single-Shot enable bit field.
//
__eallow();
(*((volatile uint16_t *)(base + 0x0U))) = ((*((volatile uint16_t *)(base + 0x0U))) &
~(0xF00U)) |
((0x5U) << 8U);
__edis();
}
//*****************************************************************************
//
//! Get Error Flag Status
//!
//! \param base is the DCC module base address
//!
//! This function gets the error flag status.
//!
//! \return Returns \b true if an error has occurred, \b false if no errors
//! have occurred.
//
//*****************************************************************************
static inline _Bool
DCC_getErrorStatus(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Get the error flag
//
return((_Bool)(((*((volatile uint16_t *)(base + 0x14U))) & 0x1U) ==
0x1U));
}
//*****************************************************************************
//
//! Get Single-Shot Done Flag Status
//!
//! \param base is the DCC module base address
//!
//! This function gets the single-shot done flag status.
//!
//! \return Returns \b true if single-shot mode has completed, \b false if
//! single-shot mode has not completed.
//
//*****************************************************************************
static inline _Bool
DCC_getSingleShotStatus(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Read the done flag
//
return((_Bool)(((*((volatile uint16_t *)(base + 0x14U))) & 0x2U) ==
0x2U));
}
//*****************************************************************************
//
//! Clear Error Status Flag
//!
//! \param base is the DCC module base address
//!
//! This function clears the DCC error status flag.
//!
//! \return None.
//
//*****************************************************************************
static inline void
DCC_clearErrorFlag(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Clear error status flag
//
__eallow();
(*((volatile uint16_t *)(base + 0x14U))) |= 0x1U;
__edis();
}
//*****************************************************************************
//
//! Clear Single-Shot Done Status Flag
//!
//! \param base is the DCC module base address
//!
//! This function clears the DCC single-shot done status flag.
//!
//! \return None.
//
//*****************************************************************************
static inline void
DCC_clearDoneFlag(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Clear done status flag
//
__eallow();
(*((volatile uint16_t *)(base + 0x14U))) |= 0x2U;
__edis();
}
//*****************************************************************************
//
//! Get Current Value of Counter 0
//!
//! \param base is the DCC module base address
//!
//! This function gets current value of counter 0.
//!
//! \note Reads of the counter value may not be exact since the read operation
//! is synchronized to the vbus clock.
//!
//! \return Returns the current value of counter 0.
//
//*****************************************************************************
static inline uint32_t
DCC_getCounter0Value(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Get the current counter 0 value
//
return((*((volatile uint32_t *)(base + 0x18U))));
}
//*****************************************************************************
//
//! Get Current Value of the Valid Duration Counter for Counter 0
//!
//! \param base is the DCC module base address
//!
//! This function gets current value of the valid duration counter for
//! counter 0.
//!
//! \note Reads of the counter value may not be exact since the read operation
//! is synchronized to the vbus clock.
//!
//! \return Returns the current value of the valid duration counter.
//
//*****************************************************************************
static inline uint16_t
DCC_getValidCounter0Value(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Get the current valid duration counter value
//
return((*((volatile uint16_t *)(base + 0x1CU))));
}
//*****************************************************************************
//
//! Get Current Value of Counter 1
//!
//! \param base is the DCC module base address
//!
//! This function gets current value of counter 1.
//!
//! \note Reads of the counter value may not be exact since the read operation
//! is synchronized to the vbus clock.
//!
//! \return Returns the current value of counter 1.
//
//*****************************************************************************
static inline uint32_t
DCC_getCounter1Value(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Get the current counter 1 value
//
return((*((volatile uint32_t *)(base + 0x20U))));
}
//*****************************************************************************
//
//! Set Counter 1 Clock Source
//!
//! \param base is the DCC module base address
//! \param source is the selected clock source for counter 1
//!
//! This function sets the counter 1 clock source.
//!
//! \return None.
//
//*****************************************************************************
static inline void
DCC_setCounter1ClkSource(uint32_t base, DCC_Count1ClockSource source)
{
//
// Check the arguments.
//
;
//
// Set the specified clock source
//
__eallow();
//
// DCC Clk source is of 5bits DCCCLKSRC1[4:0]
//
(*((volatile uint16_t *)(base + 0x24U))) = ((*((volatile uint16_t *)(base + 0x24U))) &
((0x7FU) << 5U)) |
(((0xAU) << 12U) |
(uint16_t)source);
__edis();
}
//*****************************************************************************
//
//! Set Counter 0 Clock Source
//!
//! \param base is the DCC module base address
//! \param source is the selected clock source for counter 0
//!
//! This function sets the counter 0 clock source.
//!
//! \return None.
//
//*****************************************************************************
static inline void
DCC_setCounter0ClkSource(uint32_t base, DCC_Count0ClockSource source)
{
//
// Check the arguments.
//
;
//
// Set the specified clock source
//
__eallow();
//
// DCC Clk source is of 5bits DCCCLKSRC0[4:0]
//
(*((volatile uint16_t *)(base + 0x28U))) = ((*((volatile uint16_t *)(base + 0x28U))) &
((0x7FU) << 5U)) |
(((0xAU) << 12U) |
(uint16_t)source);
__edis();
}
//*****************************************************************************
//
//! Get Counter 1 Clock Source
//!
//! \param base is the DCC module base address
//!
//! This function gets the counter 1 clock source.
//!
//! \return Returns Counter 1 clock source from the enum DCC_Count1ClockSource
//
//*****************************************************************************
static inline uint16_t
DCC_getCounter1ClkSource(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Get the specified clock source
//
return((*((volatile uint16_t *)(base + 0x24U))) & 0x1FU);
}
//*****************************************************************************
//
//! Get Counter 0 Clock Source
//!
//! \param base is the DCC module base address
//!
//! This function gets the counter 0 clock source.
//!
//! \return Returns Counter 0 clock source from the enum DCC_Count0ClockSource
//
//*****************************************************************************
static inline uint16_t
DCC_getCounter0ClkSource(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Get the specified clock source
//
return((*((volatile uint16_t *)(base + 0x28U))) & 0xFU);
}
//*****************************************************************************
//
//! Set the seed values
//!
//! \param base is the DCC module base address
//! \param counter0 sets the seed value that gets loaded into Counter 0
//! \param validCounter0 sets the seed value that gets loaded into the valid
//! duration counter for Counter 0
//! \param counter1 sets the seed value that gets loaded into Counter 1
//!
//! This function sets the seed values for Counter 0, Valid Duration Counter 0,
//! and Counter 1.
//!
//! \note
//! -# Operating DCC with '0' set as the seed value for Counter 0, Valid
//! Duration Counter 0, and/or Counter 1 will result in undefined operation.
//! -# The Valid Duration Counter 0 is designed to be at least four cycles
//! wide and shouldn't be programmed with a value less than '4'.
//!
//! \return None.
//
//*****************************************************************************
static inline void
DCC_setCounterSeeds(uint32_t base, uint32_t counter0, uint32_t validCounter0,
uint32_t counter1)
{
//
// Check the arguments.
//
;
;
;
;
;
;
;
__eallow();
//
// Set Counter 0 Seed
//
(*((volatile uint16_t *)(base + 0x8U))) = counter0 & (0xFFFFU);
(*((volatile uint16_t *)(base + 0x8U + 2U))) = ((*((volatile uint16_t *)(base + 0x8U + 2U))) &
(0xFFF0U)) |
((uint32_t)(counter0 &
(0xF0000U)) >> 16U);
//
// Set Valid Duration Counter 0 Seed
//
(*((volatile uint16_t *)(base + 0xCU))) = validCounter0;
//
// Set Counter 1 Seed
//
(*((volatile uint16_t *)(base + 0x10U))) = counter1 & (0xFFFFU);
(*((volatile uint16_t *)(base + 0x10U + 2U))) = ((*((volatile uint16_t *)(base + 0x10U + 2U))) &
(0xFFF0U)) |
((uint32_t)(counter1 &
(0xF0000U)) >> 16U);
__edis();
}
//*****************************************************************************
//
//! Verify the frequency of a clock source using a reference clock
//!
//! \param base is the DCC module base address
//! \param clock1 is the clock source to be verified
//! \param freq1 is the frequency of the clock source to be verified
//! \param clock0 is the reference clock
//! \param freq0 is the frequency of the reference clock
//! \param tolerance is the DCC error tolerance in percentage
//! \param freqerr is the allowable Frequency Tolerance in percentage
//! \param freq_sysclk is the frequency of the system clock
//!
//! This function verifies the frequency of the specified clock using a
//! reference clock.
//!
//! \note Make sure that the frequency of all the clocks are in the same unit
//!
//! \return Returns \b true if the actual frequency of clock1 is matching
//! freq1, \b false otherwise
//
//*****************************************************************************
extern _Bool
DCC_verifyClockFrequency(uint32_t base,
DCC_Count1ClockSource clock1,
float32_t freq1,
DCC_Count0ClockSource clock0,
float32_t freq0,
float32_t tolerance,
float32_t freqerr,
float32_t freq_sysclk);
//*****************************************************************************
//
//! Measure the frequency of a clock source using a reference clock
//!
//! \param base is the DCC module base address
//! \param clock1 is the clock source to be measured
//! \param clock0 is the reference clock
//! \param freq0 is the frequency of the reference clock
//! \param tolerance is the DCC error tolerance in percentage
//! \param freqerr is the allowable Frequency Tolerance in percentage
//! \param freq_sysclk is the frequency of the system clock
//!
//! This function measures the frequency of the specified clock using a
//! reference clock.
//!
//! \note Make sure that the frequency of all the clocks are in the same unit
//!
//! \return Measured clock frequency
//
//*****************************************************************************
extern float32_t
DCC_measureClockFrequency(uint32_t base,
DCC_Count1ClockSource clock1,
DCC_Count0ClockSource clock0,
float32_t freq0,
float32_t tolerance,
float32_t freqerr,
float32_t freq_sysclk);
//*****************************************************************************
//
//! Continuously monitor the frequency of a clock source using a reference clock
//!
//! \param base is the DCC module base address
//! \param clock1 is the clock source to be verified
//! \param freq1 is the frequency of the clock source to be verified
//! \param clock0 is the reference clock
//! \param freq0 is the frequency of the reference clock
//! \param tolerance is the DCC error tolerance in percentage
//! \param freqerr is the allowable Frequency Tolerance in percentage
//! \param freq_sysclk is the frequency of the system clock
//!
//! This function continuously monitors the frequency of the specified clock
//! using a reference clock. An error signal is generated if the frequency
//! ratio is altered.
//!
//! \note Make sure that the frequency of all the clocks are in the same unit
//!
//! \note This function does not enable the DCC interrupt. The user application
//! must enable it to trigger an intetrupt when an error is detected.
//!
//! \return Returns None
//
//*****************************************************************************
extern void
DCC_continuousMonitor(uint32_t base,
DCC_Count1ClockSource clock1,
float32_t freq1,
DCC_Count0ClockSource clock0,
float32_t freq0,
float32_t tolerance,
float32_t freqerr,
float32_t freq_sysclk);
//*****************************************************************************
//
// Close the Doxygen group.
//! @}
//
//*****************************************************************************
//*****************************************************************************
//
// Mark the end of the C bindings section for C++ compilers.
//
//*****************************************************************************
//#############################################################################
//
// FILE: dcsm.h
//
// TITLE: C28x Driver for the DCSM security module.
//
//#############################################################################
// $Copyright:
// Copyright (C) 2023 Texas Instruments Incorporated - http://www.ti.com/
//
// 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 Texas Instruments Incorporated 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
// OWNER 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.
// $
//#############################################################################
//*****************************************************************************
//
// If building with a C++ compiler, make all of the definitions in this header
// have a C binding.
//
//*****************************************************************************
//*****************************************************************************
//
//! \addtogroup dcsm_api DCSM
//! @{
//
//*****************************************************************************
//###########################################################################
//
// FILE: hw_dcsm.h
//
// TITLE: Definitions for the DCSM registers.
//
//###########################################################################
// $Copyright:
// Copyright (C) 2023 Texas Instruments Incorporated - http://www.ti.com/
//
// 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 Texas Instruments Incorporated 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
// OWNER 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.
// $
//###########################################################################
//*************************************************************************************************
//
// The following are defines for the DCSM register offsets
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the Z1_LINKPOINTER register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the Z1_OTPSECLOCK register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the Z1_JLM_ENABLE register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the Z1_LINKPOINTERERR register
//
//*************************************************************************************************
// from OTP loaded values
//*************************************************************************************************
//
// The following are defines for the bit fields in the Z1_CR register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the Z1_GRABSECT1R register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the Z1_GRABSECT2R register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the Z1_GRABSECT3R register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the Z1_GRABRAM1R register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the Z1_EXEONLYSECT1R register
//
//*************************************************************************************************
// in flash Bank 0
// in flash Bank 0
// in flash Bank 0
// in flash Bank 0
// in flash Bank 0
// in flash Bank 0
// in flash Bank 0
// in flash Bank 0
// in flash Bank 0
// in flash Bank 0
// in flash Bank 0
// in flash Bank 0
// in flash Bank 0
// in flash Bank 0
// in flash Bank 0
// in flash Bank 0
// in flash Bank 1
// in flash Bank 1
// in flash Bank 1
// in flash Bank 1
// in flash Bank 1
// in flash Bank 1
// in flash Bank 1
// in flash Bank 1
// in flash Bank 1
// in flash Bank 1
// in flash Bank 1
// in flash Bank 1
// in flash Bank 1
// in flash Bank 1
// in flash Bank 1
// in flash Bank 1
//*************************************************************************************************
//
// The following are defines for the bit fields in the Z1_EXEONLYSECT2R register
//
//*************************************************************************************************
// flash BANK 2
// flash BANK 2
// flash BANK 2
// flash BANK 2
// flash BANK 2
// flash BANK 2
// flash BANK 2
// flash BANK 2
// flash BANK 2
// flash BANK 2
// flash BANK 2
// flash BANK 2
// flash BANK 2
// flash BANK 2
// flash BANK 2
// flash BANK 2
//*************************************************************************************************
//
// The following are defines for the bit fields in the Z1_EXEONLYRAM1R register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the Z2_LINKPOINTER register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the Z2_OTPSECLOCK register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the Z2_LINKPOINTERERR register
//
//*************************************************************************************************
// from OTP loaded values
//*************************************************************************************************
//
// The following are defines for the bit fields in the Z2_CR register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the Z2_GRABSECT1R register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the Z2_GRABSECT2R register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the Z2_GRABSECT3R register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the Z2_GRABRAM1R register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the Z2_EXEONLYSECT1R register
//
//*************************************************************************************************
// in flash Bank 0
// in flash Bank 0
// in flash Bank 0
// in flash Bank 0
// in flash Bank 0
// in flash Bank 0
// in flash Bank 0
// in flash Bank 0
// in flash Bank 0
// in flash Bank 0
// in flash Bank 0
// in flash Bank 0
// in flash Bank 0
// in flash Bank 0
// in flash Bank 0
// in flash Bank 0
// in flash Bank 1
// in flash Bank 1
// in flash Bank 1
// in flash Bank 1
// in flash Bank 1
// in flash Bank 1
// in flash Bank 1
// in flash Bank 1
// in flash Bank 1
// in flash Bank 1
// in flash Bank 1
// in flash Bank 1
// in flash Bank 1
// in flash Bank 1
// in flash Bank 1
// in flash Bank 1
//*************************************************************************************************
//
// The following are defines for the bit fields in the Z2_EXEONLYSECT2R register
//
//*************************************************************************************************
// flash Bank 2
// flash Bank 2
// flash Bank 2
// flash Bank 2
// flash Bank 2
// flash Bank 2
// flash Bank 2
// flash Bank 2
// flash Bank 2
// flash Bank 2
// flash Bank 2
// flash Bank 2
// flash Bank 2
// flash Bank 2
// flash Bank 2
// flash Bank 2
//*************************************************************************************************
//
// The following are defines for the bit fields in the Z2_EXEONLYRAM1R register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the FLSEM register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the SECTSTAT1 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the SECTSTAT2 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the SECTSTAT3 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the RAMSTAT1 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the SECERRSTAT register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the SECERRCLR register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the SECERRFRC register
//
//*************************************************************************************************
//*****************************************************************************
//
// Defines for the unlockZone1CSM() and unlockZone2CSM().
// These are not parameters for any function.
// These are not intended for application code.
//
//*****************************************************************************
//*****************************************************************************
//
// Register key defines.
//
//*****************************************************************************
//*****************************************************************************
//
//! Data structures to hold password keys.
//
//*****************************************************************************
typedef struct
{
uint32_t csmKey0;
uint32_t csmKey1;
uint32_t csmKey2;
uint32_t csmKey3;
} DCSM_CSMPasswordKey;
//*****************************************************************************
//
//! Values to distinguish the status of RAM or FLASH sectors. These values
//! describe which zone the memory location belongs too.
//! These values can be returned from DCSM_getRAMZone(),
//! DCSM_getFlashSectorZone().
//
//*****************************************************************************
typedef enum
{
DCSM_MEMORY_INACCESSIBLE, //!< Inaccessible
DCSM_MEMORY_ZONE1, //!< Zone 1
DCSM_MEMORY_ZONE2, //!< Zone 2
DCSM_MEMORY_FULL_ACCESS //!< Full access
} DCSM_MemoryStatus;
//*****************************************************************************
//
//! Values to pass to DCSM_claimZoneSemaphore(). These values are used
//! to describe the zone that can write to Flash Wrapper registers.
//
//*****************************************************************************
typedef enum
{
DCSM_FLSEM_ZONE1 = 0x01U, //!< Flash semaphore Zone 1
DCSM_FLSEM_ZONE2 = 0x02U //!< Flash semaphore Zone 2
} DCSM_SemaphoreZone;
//*****************************************************************************
//
//! Values to distinguish the security status of the zones.
//! These values can be returned from DCSM_getZone1CSMSecurityStatus(),
//! DCSM_getZone2CSMSecurityStatus().
//
//*****************************************************************************
typedef enum
{
DCSM_STATUS_SECURE, //!< Secure
DCSM_STATUS_UNSECURE, //!< Unsecure
DCSM_STATUS_LOCKED, //!< Locked
DCSM_STATUS_BLOCKED //!< Blocked
} DCSM_SecurityStatus;
//*****************************************************************************
//
// Values to distinguish the status of the Control Registers. These values
// describe can be used with the return values of
// DCSM_getZone1ControlStatus(), and DCSM_getZone2ControlStatus().
//
//*****************************************************************************
//*****************************************************************************
//
//! Values to decribe the EXEONLY Status.
//! These values are returned from to DCSM_getZone1RAMEXEStatus(),
//! DCSM_getZone2RAMEXEStatus(), DCSM_getZone1FlashEXEStatus(),
//! DCSM_getZone2FlashEXEStatus().
//
//*****************************************************************************
typedef enum
{
DCSM_PROTECTED, //!< Protected
DCSM_UNPROTECTED, //!< Unprotected
DCSM_INCORRECT_ZONE //!< Incorrect Zone
}DCSM_EXEOnlyStatus;
//*****************************************************************************
//
//! Values to distinguish RAM Module.
//! These values can be passed to DCSM_getZone1RAMEXEStatus()
//! DCSM_getZone2RAMEXEStatus(), DCSM_getRAMZone().
//
//*****************************************************************************
typedef enum
{
//
//C28x RAMs
//
DCSM_RAMLS0, //!< RAMLS0
DCSM_RAMLS1, //!< RAMLS1
DCSM_RAMLS2, //!< RAMLS2
DCSM_RAMLS3, //!< RAMLS3
DCSM_RAMLS4, //!< RAMLS4
DCSM_RAMLS5, //!< RAMLS5
DCSM_RAMLS6, //!< RAMLS6
DCSM_RAMLS7, //!< RAMLS7
DCSM_CLA = 14U //!> 16U);
return((uint16_t)stat);
}
//*****************************************************************************
//
//! Returns the Control Status of zone 2
//!
//! This function returns the Control Status of zone 2 CSM
//!
//! \return Returns the contents of the Control Register which can be
//! used with the provided defines.
//
//*****************************************************************************
static inline uint16_t
DCSM_getZone2ControlStatus(void)
{
uint32_t stat;
//
// Return the contents of the CR register.
//
stat = (((*((volatile uint32_t *)(0x0005F080U + 0x18U)))) >> 16U);
return((uint16_t)stat);
}
//*****************************************************************************
//
//! Returns the security zone a RAM section belongs to
//!
//! \param module is the RAM module value. Valid values are type DCSM_RAMModule
//! C28x RAMs :
//! - \b DCSM_RAMLS0
//! - \b DCSM_RAMLS1
//! - \b DCSM_RAMLS2
//! - \b DCSM_RAMLS3
//! - \b DCSM_RAMLS4
//! - \b DCSM_RAMLS5
//! - \b DCSM_RAMLS6
//! - \b DCSM_RAMLS7
//!
//! This function returns the security zone a RAM section belongs to.
//!
//! \return Returns DCSM_MEMORY_INACCESSIBLE if the section is inaccessible,
//! DCSM_MEMORY_ZONE1 if the section belongs to zone 1, DCSM_MEMORY_ZONE2 if
//! the section belongs to zone 2 and DCSM_MEMORY_FULL_ACCESS if the section
//! doesn't belong to any zone (or if the section is unsecure).
//
//*****************************************************************************
static inline DCSM_MemoryStatus
DCSM_getRAMZone(DCSM_RAMModule module)
{
uint16_t shift = (uint16_t)module * 2U;
uint32_t ramStatus;
//
//Read the RAMSTAT register for the specific RAM Module.
//
ramStatus = (((*((volatile uint32_t *)(0x0005F0C0U + 0x10U))) >>
shift) & 0x03U);
return((DCSM_MemoryStatus)ramStatus);
}
//*****************************************************************************
//
//! Returns the security zone a flash sector belongs to
//!
//! \param sector is the flash sector value. Use DCSM_Sector type.
//!
//! This function returns the security zone a flash sector belongs to.
//!
//! \return Returns DCSM_MEMORY_INACCESSIBLE if the section is inaccessible ,
//! DCSM_MEMORY_ZONE1 if the section belongs to zone 1, DCSM_MEMORY_ZONE2 if
//! the section belongs to zone 2 and DCSM_MEMORY_FULL_ACCESS if the section
//! doesn't belong to any zone (or if the section is unsecure)..
//
//*****************************************************************************
static inline DCSM_MemoryStatus
DCSM_getFlashSectorZone(DCSM_Sector sector)
{
uint32_t sectStat;
uint16_t shift;
//
// Get the Sector status register for the specific bank
//
if(sector <= DCSM_BANK0_SECTOR15)
{
sectStat = (*((volatile uint32_t *)(0x0005F0C0U + 0x8U)));
shift = (uint16_t)sector * 2U;
}
else if(sector <= DCSM_BANK1_SECTOR15)
{
sectStat = (*((volatile uint32_t *)(0x0005F0C0U + 0xAU)));
shift = ((uint16_t)sector & 0xFU) * (uint16_t)2U;
}
else
{
sectStat = (*((volatile uint32_t *)(0x0005F0C0U + 0xCU)));
shift = ((uint16_t)sector & 0xFU) * (uint16_t)2U;
}
//
//Read the SECTSTAT register for the specific Flash Sector.
//
return((DCSM_MemoryStatus)((uint16_t)((sectStat >> shift) & 0x3U)));
}
//*****************************************************************************
//
//! Read Zone 1 Link Pointer Error
//!
//! A non-zero value indicates an error on the bit position that is set to 1.
//!
//! \return Returns the value of the Zone 1 Link Pointer error.
//
//*****************************************************************************
static inline uint32_t
DCSM_getZone1LinkPointerError(void)
{
//
// Return the LinkPointer Error for specific bank
//
return((*((volatile uint32_t *)(0x0005F000U + 0x6U))));
}
//*****************************************************************************
//
//! Read Zone 2 Link Pointer Error
//!
//! A non-zero value indicates an error on the bit position that is set to 1.
//!
//! \return Returns the value of the Zone 2 Link Pointer error.
//
//*****************************************************************************
static inline uint32_t
DCSM_getZone2LinkPointerError(void)
{
//
// Return the LinkPointer Error for specific bank
//
return((*((volatile uint32_t *)(0x0005F080U + 0x6U))));
}
//*****************************************************************************
//
//! Get the status of the security configuration load from USER-OTP or sector
//! error status
//!
//! \return Returns 0 if no error in loading security information from
//! USER-OTP, 1 if an error has occurred in the load from USER-OTP.
//
//*****************************************************************************
static inline _Bool
DCSM_getFlashErrorStatus(void)
{
return((_Bool)((*((volatile uint32_t *)(0x0005F0C0U + 0x18U))) &
0x1U));
}
//*****************************************************************************
//
//! Clear the Flash Error Status bit
//!
//! Write a '1' to the clear bit to clear the sector error status bit.
//!
//! \return None.
//
//*****************************************************************************
static inline void
DCSM_clearFlashErrorStatus(void)
{
(*((volatile uint32_t *)(0x0005F0C0U + 0x1AU))) |= 0x1U;
}
//*****************************************************************************
//
//! Set the force Flash Error Status bit
//!
//! Write a '1' to force bit to set the sector error status bit.
//!
//! \return None.
//
//*****************************************************************************
static inline void
DCSM_forceFlashErrorStatus(void)
{
(*((volatile uint32_t *)(0x0005F0C0U + 0x1CU))) = 0x1U |
((uint32_t)0x5A5AU
<< 16U);
}
//*****************************************************************************
//
//! Returns the OTP secure Lock status of zone 1
//!
//! \param lockType is the OTP secure Lock feature type .
//!
//! The \e lockType parameter can have one of the following values of the
//! DCSM_CPUSel type:
//! - \b DCSM_OTPSECLOCK_JTAG - JTAG Lock Status
//! - \b DCSM_OTPSECLOCK_CRCLOCK - Zone CRC Lock
//! - \b DCSM_OTPSECLOCK_PSWDLOCK - Zone Password Lock
//!
//! This function takes in a valid OTP secure Lock feature type and
//! returns the status of zone 1 lock feature
//!
//! \return Returns security lock status can be:
//! For JTAG lock : 0 - JTAG is not locked , 1 - JTAG is locked
//!
//! For Zone Password Lock : 1111 - CSM Pwd locations in the OTP are not
//! protected and can be read from the debugger as well as code running
//! from anywhere.
//! Other Value : CSM Pwd locations in the OTP are protected and can't be read
//! without unlocking CSM of that zone.
//!
//! For Zone CRC Lock : 1111 : VCU has ability to calculate CRC
//! on secure memories.
//! Other Value : VCU doesn't have the ability to calculate CRC on
//! secure memories.
//
//*****************************************************************************
static inline uint32_t
DCSM_getZone1OTPSecureLockStatus(DCSM_OTPLock lockType)
{
uint32_t status, returnStatus;
status = (*((volatile uint32_t *)(0x0005F000U + 0x2U)));
//
// Reflects the state of the OTP Sec LOCK feature.
//
if(lockType == DCSM_OTPSECLOCK_JTAG)
{
returnStatus = (status & 0x1U) >>
0U;
}
else if(lockType == DCSM_OTPSECLOCK_CRCLOCK)
{
returnStatus = (status & 0xF00U) >>
8U;
}
else if(lockType == DCSM_OTPSECLOCK_PSWDLOCK)
{
returnStatus = (status & 0xF0U) >>
4U;
}
else
{
returnStatus = (uint32_t)0xFFFFU;
}
return(returnStatus);
}
//*****************************************************************************
//
//! Returns the OTP secure Lock status of zone 2
//!
//! \param lockType is the OTP secure Lock feature type .
//!
//! The \e lockType parameter can have one of the following values of the
//! DCSM_CPUSel type:
//! - \b DCSM_OTPSECLOCK_CRCLOCK - Zone CRC Lock
//! - \b DCSM_OTPSECLOCK_PSWDLOCK - Zone Password Lock
//!
//! This function takes in a valid OTP secure Lock feature type and
//! returns the status of zone 2 lock feature
//!
//! \return Returns security lock status can be:
//!
//! For Zone Password Lock : 1111 - CSM Pwd locations in the OTP are not
//! protected and can be read from the debugger as well as code running
//! from anywhere.
//! Other Value : CSM Pwd locations in the OTP are protected and can't be read
//! without unlocking CSM of that zone.
//!
//! For Zone CRC Lock : 1111 : VCU has ability to calculate CRC
//! on secure memories.
//! Other Value : VCU doesn't have the ability to calculate CRC on
//! secure memories.
//
//*****************************************************************************
static inline uint32_t
DCSM_getZone2OTPSecureLockStatus(DCSM_OTPLock lockType)
{
uint32_t status, returnStatus;
status = (*((volatile uint32_t *)(0x0005F080U + 0x2U)));
//
// Reflects the state of the OTP Sec LOCK feature.
//
if(lockType == DCSM_OTPSECLOCK_CRCLOCK)
{
returnStatus = (status & 0xF00U) >>
8U;
}
else if(lockType == DCSM_OTPSECLOCK_PSWDLOCK)
{
returnStatus = (status & 0xF0U) >>
4U;
}
else
{
returnStatus = (uint32_t)0xFFFFU;
}
return(returnStatus);
}
//*****************************************************************************
//
//! Unlocks Zone 1 CSM.
//!
//! \param psCMDKey is a pointer to the DCSM_CSMPasswordKey struct that has the
//! CSM password for zone 1.
//!
//! This function unlocks the CSM password. It first reads the
//! four password locations in the User OTP. If any of the password values is
//! different from 0xFFFFFFFF, it unlocks the device by writing the provided
//! passwords into CSM Key registers
//!
//! \return None.
//!
//! \note This function should not be called in an actual application,
//! should only be used for once to program the OTP memory. Ensure flash data
//! cache is disabled before calling this function(Flash_disableCache).
//
//*****************************************************************************
extern void
DCSM_unlockZone1CSM(const DCSM_CSMPasswordKey * const psCMDKey);
//*****************************************************************************
//
//! Unlocks Zone 2 CSM.
//!
//! \param psCMDKey is a pointer to the CSMPSWDKEY that has the CSM
//! password for zone 2.
//!
//! This function unlocks the CSM password. It first reads
//! the four password locations in the User OTP. If any of the password values
//! is different from 0xFFFFFFFF, it unlocks the device by writing the
//! provided passwords into CSM Key registers
//!
//! \return None.
//!
//! \note This function should not be called in an actual application,
//! should only be used for once to program the OTP memory. Ensure flash data
//! cache is disabled before calling this function(Flash_disableCache).
//
//*****************************************************************************
extern void
DCSM_unlockZone2CSM(const DCSM_CSMPasswordKey * const psCMDKey);
//*****************************************************************************
//
//! Write Zone 1 CSM.
//!
//! \param psCMDKey is a pointer to the CSMPSWDKEY that has the CSM
//! password for zone 1.
//!
//! Password match flow is essentially a sequence of dummy reads
//! from password locations (PWL) followed by writes to CSMKEY registers.
//! This function helps writing the provided passwords into the CSM Key
//! registers. The DCSM_readZone1CSMPwd() should be called
//! by CPU1 before calling this API.
//!
//! \return None.
//
//*****************************************************************************
extern void
DCSM_writeZone1CSM(const DCSM_CSMPasswordKey * const psCMDKey);
//*****************************************************************************
//
//! Write Zone 2 CSM.
//!
//! \param psCMDKey is a pointer to the CSMPSWDKEY that has the CSM
//! password for zone 2.
//!
//! Password match flow is essentially a sequence of dummy reads
//! from password locations (PWL) followed by writes to CSMKEY registers.
//! This function helps writing the provided passwords into the CSM Key
//! registers. The DCSM_readZone2CSMPwd() should be called
//! by CPU1 before calling this API.
//!
//! \return None.
//
//*****************************************************************************
extern void
DCSM_writeZone2CSM(const DCSM_CSMPasswordKey * const psCMDKey);
//*****************************************************************************
//
//! Returns the EXE-ONLY status of zone 1 for a flash sector
//!
//! \param sector is the flash sector value. Use DCSM_Sector type.
//!
//! This function takes in a valid sector value and returns the status of EXE
//! ONLY security protection for the sector.
//!
//! \return Returns DCSM_PROTECTED if the sector is EXE-ONLY protected,
//! DCSM_UNPROTECTED if the sector is not EXE-ONLY protected,
//! DCSM_INCORRECT_ZONE if sector does not belong to this zone.
//
//*****************************************************************************
extern DCSM_EXEOnlyStatus
DCSM_getZone1FlashEXEStatus(DCSM_Sector sector);
//*****************************************************************************
//
//! Returns the EXE-ONLY status of zone 1 for a RAM module
//!
//! \param module is the RAM module value. Valid values are type DCSM_RAMModule
//! C28x RAMs :
//! - \b DCSM_RAMLS0
//! - \b DCSM_RAMLS1
//! - \b DCSM_RAMLS2
//! - \b DCSM_RAMLS3
//! - \b DCSM_RAMLS4
//! - \b DCSM_RAMLS5
//! - \b DCSM_RAMLS6
//! - \b DCSM_RAMLS7
//!
//! This function takes in a valid module value and returns the status of EXE
//! ONLY security protection for that module. DCSM_CLA is an invalid module
//! value. There is no EXE-ONLY available for DCSM_CLA.
//!
//! \return Returns DCSM_PROTECTED if the module is EXE-ONLY protected,
//! DCSM_UNPROTECTED if the module is not EXE-ONLY protected,
//! DCSM_INCORRECT_ZONE if module does not belong to this zone.
//
//*****************************************************************************
extern DCSM_EXEOnlyStatus
DCSM_getZone1RAMEXEStatus(DCSM_RAMModule module);
//*****************************************************************************
//
//! Returns the EXE-ONLY status of zone 2 for a flash sector
//!
//! \param sector is the flash sector value. Use DCSM_Sector type.
//!
//! This function takes in a valid sector value and returns the status of EXE
//! ONLY security protection for the sector.
//!
//! \return Returns DCSM_PROTECTED if the sector is EXE-ONLY protected,
//! DCSM_UNPROTECTED if the sector is not EXE-ONLY protected,
//! DCSM_INCORRECT_ZONE if sector does not belong to this zone.
//
//*****************************************************************************
extern DCSM_EXEOnlyStatus
DCSM_getZone2FlashEXEStatus(DCSM_Sector sector);
//*****************************************************************************
//
//! Returns the EXE-ONLY status of zone 2 for a RAM module
//!
//! \param module is the RAM module value. Valid values are type DCSM_RAMModule
//! C28x RAMs :
//! - \b DCSM_RAMLS0
//! - \b DCSM_RAMLS1
//! - \b DCSM_RAMLS2
//! - \b DCSM_RAMLS3
//! - \b DCSM_RAMLS4
//! - \b DCSM_RAMLS5
//! - \b DCSM_RAMLS6
//! - \b DCSM_RAMLS7
//!
//! This function takes in a valid module value and returns the status of EXE
//! ONLY security protection for that module. DCSM_CLA is an invalid module
//! value. There is no EXE-ONLY available for DCSM_CLA.
//!
//! \return Returns DCSM_PROTECTED if the module is EXE-ONLY protected,
//! DCSM_UNPROTECTED if the module is not EXE-ONLY protected,
//! DCSM_INCORRECT_ZONE if module does not belong to this zone.
//
//*****************************************************************************
extern DCSM_EXEOnlyStatus
DCSM_getZone2RAMEXEStatus(DCSM_RAMModule module);
//*****************************************************************************
//
//! Claims the zone semaphore which allows access to the Flash Wrapper register
//! for that zone.
//!
//! \param zone is the zone which is trying to claim the semaphore which allows
//! access to the Flash Wrapper registers.
//!
//! \return Returns true for a successful semaphore capture, false if it was
//! unable to capture the semaphore.
//
//*****************************************************************************
extern _Bool
DCSM_claimZoneSemaphore(DCSM_SemaphoreZone zone);
//*****************************************************************************
//
//! Releases the zone semaphore.
//!
//! \return Returns true if it was successful in releasing the zone semaphore
//! and false if it was unsuccessful in releasing the zone semaphore.
//!
//! \note If the calling function is not in the right zone to be able
//! to access this register, it will return a false.
//
//*****************************************************************************
extern _Bool
DCSM_releaseZoneSemaphore(void);
//*****************************************************************************
//
//! Perform dummy reads on the 128-bit Zone 1 CSM password.
//!
//! This function reads the four password locations in the User OTP
//! needed to be done as part of the Password Match Flow before
//! writes to the CSMKEY registers.
//! This would need to be done before a DCSM_writeZone1CSM().
//!
//! \return None.
//!
//! \note This API to be called from CPU1.
//
//*****************************************************************************
extern void
DCSM_readZone1CSMPwd(void);
//*****************************************************************************
//
//! Perform dummy reads on the 128-bit Zone 2 CSM password.
//!
//! This function reads the four password locations in the User OTP
//! needed to be done as part of the Password Match Flow before
//! writes to the CSMKEY registers.
//! This would need to be done before a DCSM_writeZone2CSM().
//!
//! \return None.
//!
//! \note This API to be called from CPU1.
//
//*****************************************************************************
extern void
DCSM_readZone2CSMPwd(void);
//*****************************************************************************
//
// Close the Doxygen group.
//! @}
//
//*****************************************************************************
//*****************************************************************************
//
// Mark the end of the C bindings section for C++ compilers.
//
//*****************************************************************************
//###########################################################################
//
// FILE: dma.h
//
// TITLE: C28x DMA driver.
//
//###########################################################################
// $Copyright:
// Copyright (C) 2023 Texas Instruments Incorporated - http://www.ti.com/
//
// 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 Texas Instruments Incorporated 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
// OWNER 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.
// $
//###########################################################################
//*****************************************************************************
//
// If building with a C++ compiler, make all of the definitions in this header
// have a C binding.
//
//*****************************************************************************
//*****************************************************************************
//
//! \addtogroup dma_api DMA
//! \brief This module is used for DMA configurations.
//! @{
//
//*****************************************************************************
//###########################################################################
//
// FILE: hw_dma.h
//
// TITLE: Definitions for the DMA registers.
//
//###########################################################################
// $Copyright:
// Copyright (C) 2023 Texas Instruments Incorporated - http://www.ti.com/
//
// 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 Texas Instruments Incorporated 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
// OWNER 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.
// $
//###########################################################################
//*************************************************************************************************
//
// The following are defines for the DMA register offsets
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the DMACTRL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the DEBUGCTRL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the PRIORITYCTRL1 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the PRIORITYSTAT register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the MODE register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the CONTROL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the BURST_SIZE register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the BURST_COUNT register
//
//*************************************************************************************************
//*****************************************************************************
//
// Values that can be passed to DMA_configMode() as the config parameter.
//
//*****************************************************************************
//! Only one burst transfer performed per trigger.
//! Burst transfers occur without additional event triggers after the first.
//! DMA channel will be disabled at the end of a transfer.
//! DMA reinitializes when the transfer count is zero and waits for a trigger.
//! DMA transfers 16 bits at a time.
//! DMA transfers 32 bits at a time.
//*****************************************************************************
//
//! Values that can be passed to DMA_configMode() as the \e trigger parameter.
//
//*****************************************************************************
typedef enum
{
DMA_TRIGGER_SOFTWARE = 0,
DMA_TRIGGER_ADCA1 = 1,
DMA_TRIGGER_ADCA2 = 2,
DMA_TRIGGER_ADCA3 = 3,
DMA_TRIGGER_ADCA4 = 4,
DMA_TRIGGER_ADCAEVT = 5,
DMA_TRIGGER_ADCB1 = 6,
DMA_TRIGGER_ADCB2 = 7,
DMA_TRIGGER_ADCB3 = 8,
DMA_TRIGGER_ADCB4 = 9,
DMA_TRIGGER_ADCBEVT = 10,
DMA_TRIGGER_ADCC1 = 11,
DMA_TRIGGER_ADCC2 = 12,
DMA_TRIGGER_ADCC3 = 13,
DMA_TRIGGER_ADCC4 = 14,
DMA_TRIGGER_ADCCEVT = 15,
DMA_TRIGGER_XINT1 = 29,
DMA_TRIGGER_XINT2 = 30,
DMA_TRIGGER_XINT3 = 31,
DMA_TRIGGER_XINT4 = 32,
DMA_TRIGGER_XINT5 = 33,
DMA_TRIGGER_EPWM1SOCA = 36,
DMA_TRIGGER_EPWM1SOCB = 37,
DMA_TRIGGER_EPWM2SOCA = 38,
DMA_TRIGGER_EPWM2SOCB = 39,
DMA_TRIGGER_EPWM3SOCA = 40,
DMA_TRIGGER_EPWM3SOCB = 41,
DMA_TRIGGER_EPWM4SOCA = 42,
DMA_TRIGGER_EPWM4SOCB = 43,
DMA_TRIGGER_EPWM5SOCA = 44,
DMA_TRIGGER_EPWM5SOCB = 45,
DMA_TRIGGER_EPWM6SOCA = 46,
DMA_TRIGGER_EPWM6SOCB = 47,
DMA_TRIGGER_EPWM7SOCA = 48,
DMA_TRIGGER_EPWM7SOCB = 49,
DMA_TRIGGER_EPWM8SOCA = 50,
DMA_TRIGGER_EPWM8SOCB = 51,
DMA_TRIGGER_TINT0 = 68,
DMA_TRIGGER_TINT1 = 69,
DMA_TRIGGER_TINT2 = 70,
DMA_TRIGGER_ECAP1 = 75,
DMA_TRIGGER_ECAP2 = 76,
DMA_TRIGGER_ECAP3 = 77,
DMA_TRIGGER_SDFM1FLT1 = 96,
DMA_TRIGGER_SDFM1FLT2 = 97,
DMA_TRIGGER_SDFM1FLT3 = 98,
DMA_TRIGGER_SDFM1FLT4 = 99,
DMA_TRIGGER_SDFM2FLT1 = 101,
DMA_TRIGGER_SDFM2FLT2 = 102,
DMA_TRIGGER_SDFM2FLT3 = 103,
DMA_TRIGGER_SDFM2FLT4 = 104,
DMA_TRIGGER_SPIATX = 109,
DMA_TRIGGER_SPIARX = 110,
DMA_TRIGGER_SPIBTX = 111,
DMA_TRIGGER_SPIBRX = 112,
DMA_TRIGGER_LINATX = 117,
DMA_TRIGGER_LINARX = 118,
DMA_TRIGGER_LINBTX = 119,
DMA_TRIGGER_LINBRX = 120,
DMA_TRIGGER_FSITXA = 123,
DMA_TRIGGER_FSI_DATA_TAG_MATCH = 124,
DMA_TRIGGER_FSIRXA = 125,
DMA_TRIGGER_FSI_PING_DATA_MATCH = 126,
DMA_TRIGGER_CLB1INT = 127,
DMA_TRIGGER_CLB2INT = 128,
DMA_TRIGGER_CLB3INT = 129,
DMA_TRIGGER_CLB4INT = 130,
DMA_TRIGGER_CANAIF1 = 167,
DMA_TRIGGER_CANAIF2 = 168,
DMA_TRIGGER_CANAIF3 = 169,
DMA_TRIGGER_HICA = 179,
DMA_TRIGGER_AESA_CONTEXTIN = 180,
DMA_TRIGGER_AESA_DATAIN = 181,
DMA_TRIGGER_AESA_CONTEXTOUT = 182,
DMA_TRIGGER_AESA_DATAOUT = 183,
DMA_TRIGGER_EPG1 = 184
} DMA_Trigger;
//*****************************************************************************
//
//! Values that can be passed to DMA_setInterruptMode() as the \e mode
//! parameter.
//
//*****************************************************************************
typedef enum
{
//! DMA interrupt is generated at the beginning of a transfer
DMA_INT_AT_BEGINNING,
//! DMA interrupt is generated at the end of a transfer
DMA_INT_AT_END
} DMA_InterruptMode;
//*****************************************************************************
//
//! Values that can be passed to DMA_setEmulationMode() as the \e mode
//! parameter.
//
//*****************************************************************************
typedef enum
{
//! Transmission stops after current read-write access is completed
DMA_EMULATION_STOP,
//! Continue DMA operation regardless of emulation suspend
DMA_EMULATION_FREE_RUN
} DMA_EmulationMode;
//*****************************************************************************
//
//! Values that can be passed to DMA_configChannel() as the
//! configure parameter.
//
//*****************************************************************************
typedef struct
{
DMA_Trigger transferTrigger; //DMA transfer triggers
DMA_InterruptMode interruptMode; //Channel interrupt mode
//! enableInterrupt can have a value 1(Enable) or 0(Disable)
_Bool enableInterrupt; //Enable/Disable interrupt mode
//! configSize can have a value DMA_CFG_SIZE_16BIT/32BIT
uint32_t configSize; //Data bus width (16 or 32 bits)
//! transferMode can have a value DMA_CFG_ONESHOT_DISABLE/ENABLE
uint32_t transferMode; //Burst transfer mode
//! reinitMode can have a value DMA_CFG_CONTINUOUS_DISABLE/ENABLE
uint32_t reinitMode; //DMA reinitialization mode
//! burstSize value range from 1 word to 32 sixteen-bit words.
uint32_t burstSize; //Number of words transferred per burst
//! transferSize value range from 1 to 65536
uint32_t transferSize; //Number of bursts per transfer
//! Number of bursts to be transferred before a wrap of the source address
//! occurs. srcWrapSize value range from 1 to 65536
uint32_t srcWrapSize;
//! Number of bursts to be transferred before a wrap of the destination
//! address occurs. destWrapSize value range from 1 to 65536
uint32_t destWrapSize;
uint32_t destAddr; //destination address
uint32_t srcAddr; //source address
//! Amount to inc or dec the source address after each word of a burst.
//! srcBurstStep can have only signed values from -4096 to 4095
int16_t srcBurstStep;
//! Amount to inc or dec the destination address after each word of a burst.
//! destBurstStep can have only signed values from -4096 to 4095
int16_t destBurstStep;
//! Amount to inc or dec the source address after each burst of a transfer.
//! srcTransferStep can have only signed values from -4096 to 4095
int16_t srcTransferStep;
//! Amount to inc or dec the destination address after each burst of a
//! transfer. destTransferStep can have only signed values from -4096 to 4095
int16_t destTransferStep;
//! Amount to inc or dec the source address when the wrap occurs.
//! srcWrapStep can have only signed values from -4096 to 4095
int16_t srcWrapStep;
//! Amount to inc or dec the destination address when the wrap occurs.
//! destWrapStep can have only signed values from -4096 to 4095
int16_t destWrapStep;
} DMA_ConfigParams;
//*****************************************************************************
//
// Prototypes for the APIs.
//
//*****************************************************************************
//*****************************************************************************
//
//! \internal
//! Checks an DMA channel base address.
//!
//! \param base specifies the DMA channel base address.
//!
//! This function determines if a DMA channel base address is valid.
//!
//! \return Returns \b true if the base address is valid and \b false
//! otherwise.
//
//*****************************************************************************
//*****************************************************************************
//
//! Initializes the DMA controller to a known state.
//!
//! This function configures does a hard reset of the DMA controller in order
//! to put it into a known state. The function also sets the DMA to run free
//! during an emulation suspend (see the field DEBUGCTRL.FREE for more info).
//!
//! \return None.
//
//*****************************************************************************
static inline void
DMA_initController(void)
{
__eallow();
//
// Set the hard reset bit. One NOP is required after HARDRESET.
//
(*((volatile uint16_t *)(0x00001000U + 0x0U))) |= 0x1U;
__asm(" NOP");
__edis();
}
//*****************************************************************************
//
//! Channel Soft Reset
//!
//! \param base is the base address of the DMA channel control registers.
//!
//! This function does a soft reset to place the channel into its default state
//!
//! \return None.
//
//*****************************************************************************
static inline void
DMA_triggerSoftReset(uint32_t base)
{
__eallow();
//
// Set the soft reset bit. One NOP is required after SOFTRESET.
//
(*((volatile uint16_t *)(base + 0x1U))) |= 0x4U;
__asm(" NOP");
__edis();
}
//*****************************************************************************
//
//! Sets DMA emulation mode.
//!
//! \param mode is the emulation mode to be selected.
//!
//! This function sets the behavior of the DMA operation when an emulation
//! suspend occurs. The \e mode parameter can be one of the following:
//!
//! - \b DMA_EMULATION_STOP - DMA runs until the current read-write access is
//! completed.
//! - \b DMA_EMULATION_FREE_RUN - DMA operation continues regardless of a
//! the suspend.
//!
//! \return None.
//
//*****************************************************************************
static inline void
DMA_setEmulationMode(DMA_EmulationMode mode)
{
__eallow();
//
// Set emulation mode
//
if(mode == DMA_EMULATION_STOP)
{
(*((volatile uint16_t *)(0x00001000U + 0x1U))) &= ~0x8000U;
}
else
{
(*((volatile uint16_t *)(0x00001000U + 0x1U))) |= 0x8000U;
}
__edis();
}
//*****************************************************************************
//
//! Enables peripherals to trigger a DMA transfer.
//!
//! \param base is the base address of the DMA channel control registers.
//!
//! This function enables the selected peripheral trigger to start a DMA
//! transfer on the specified channel.
//!
//! \return None.
//
//*****************************************************************************
static inline void
DMA_enableTrigger(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Set the peripheral interrupt trigger enable bit.
//
__eallow();
(*((volatile uint16_t *)(base + 0x0U))) |= 0x100U;
__edis();
}
//*****************************************************************************
//
//! Disables peripherals from triggering a DMA transfer.
//!
//! \param base is the base address of the DMA channel control registers.
//!
//! This function disables the selected peripheral trigger from starting a DMA
//! transfer on the specified channel. This also disables the use of the
//! software force using the DMA_forceTrigger() API.
//!
//! \return None.
//
//*****************************************************************************
static inline void
DMA_disableTrigger(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Clear the peripheral interrupt trigger enable bit.
//
__eallow();
(*((volatile uint16_t *)(base + 0x0U))) &= ~0x100U;
__edis();
}
//*****************************************************************************
//
//! Force a peripheral trigger to a DMA channel.
//!
//! \param base is the base address of the DMA channel control registers.
//!
//! This function sets the peripheral trigger flag and if triggering a DMA
//! burst is enabled (see DMA_enableTrigger()), a DMA burst transfer will be
//! forced.
//!
//! \return None.
//
//*****************************************************************************
static inline void
DMA_forceTrigger(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Set the peripheral interrupt trigger force bit.
//
__eallow();
(*((volatile uint16_t *)(base + 0x1U))) |= 0x8U;
__edis();
}
//*****************************************************************************
//
//! Clears a DMA channel's peripheral trigger flag.
//!
//! \param base is the base address of the DMA channel control registers.
//!
//! This function clears the peripheral trigger flag. Normally, you would use
//! this function when initializing the DMA for the first time. The flag is
//! cleared automatically when the DMA starts the first burst of a transfer.
//!
//! \return None.
//
//*****************************************************************************
static inline void
DMA_clearTriggerFlag(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Write a one to the clear bit to clear the peripheral trigger flag.
//
__eallow();
(*((volatile uint16_t *)(base + 0x1U))) |= 0x10U;
__edis();
}
//*****************************************************************************
//
//! Gets the status of a DMA channel's Transfer Status Flag.
//!
//! \param base is the base address of the DMA channel control registers.
//!
//! This function returns \b true if the Transfer Status Flag is set, which
//! means a DMA transfer has begun.
//! This flag is cleared when TRANSFER_COUNT reaches zero, or when the
//! HARDRESET or SOFTRESET bit is set.
//!
//! \return Returns \b true if the Transfer Status Flag is set. Returns \b false
//! otherwise.
//
//*****************************************************************************
static inline _Bool
DMA_getTransferStatusFlag(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Read the Transfer Status Flag and return appropriately.
//
return(((*((volatile uint16_t *)(base + 0x1U))) & 0x800U) != 0U);
}
//*****************************************************************************
//
//! Gets the status of a DMA channel's Burst Status Flag.
//!
//! \param base is the base address of the DMA channel control registers.
//!
//! This function returns \b true if the Burst Status Flag is set, which
//! means a DMA burst has begun.
//! This flag is cleared when BURST_COUNT reaches zero, or when the
//! HARDRESET or SOFTRESET bit is set.
//!
//! \return Returns \b true if the Burst Status Flag is set. Returns \b false
//! otherwise.
//
//*****************************************************************************
static inline _Bool
DMA_getBurstStatusFlag(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Read the Burst Status Flag and return appropriately.
//
return(((*((volatile uint16_t *)(base + 0x1U))) & 0x1000U) != 0U);
}
//*****************************************************************************
//
//! Gets the status of a DMA channel's Run Status Flag.
//!
//! \param base is the base address of the DMA channel control registers.
//!
//! This function returns \b true if the Run Status Flag is set, which
//! means the DMA channel is enabled.
//! This flag is cleared when a transfer completes (TRANSFER_COUNT = 0) and
//! continuous mode is disabled, or when the HARDRESET, SOFTRESET, or HALT bit
//! is set.
//!
//! \return Returns \b true if the channel is enabled. Returns \b false
//! otherwise.
//
//*****************************************************************************
static inline _Bool
DMA_getRunStatusFlag(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Read the Run Status Flag and return appropriately.
//
return(((*((volatile uint16_t *)(base + 0x1U))) & 0x2000U) != 0U);
}
//*****************************************************************************
//
//! Gets the status of a DMA channel's Overflow Flag.
//!
//! \param base is the base address of the DMA channel control registers.
//!
//! This function returns \b true if the Overflow Flag is set, which
//! means peripheral event trigger was received while Peripheral Event Trigger
//! Flag was already set.
//! This flag can be cleared by writing to ERRCLR bit, using the function
//! DMA_clearErrorFlag().
//!
//! \return Returns \b true if the channel is enabled. Returns \b false
//! otherwise.
//
//*****************************************************************************
static inline _Bool
DMA_getOverflowFlag(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Read the Overflow Flag and return appropriately.
//
return(((*((volatile uint16_t *)(base + 0x1U))) & 0x4000U) != 0U);
}
//*****************************************************************************
//
//! Gets the status of a DMA channel's peripheral trigger flag.
//!
//! \param base is the base address of the DMA channel control registers.
//!
//! This function returns \b true if a peripheral trigger event has occurred
//! The flag is automatically cleared when the first burst transfer begins, but
//! if needed, it can be cleared using DMA_clearTriggerFlag().
//!
//! \return Returns \b true if a peripheral trigger event has occurred and its
//! flag is set. Returns \b false otherwise.
//
//*****************************************************************************
static inline _Bool
DMA_getTriggerFlagStatus(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Read the peripheral trigger flag and return appropriately.
//
return(((*((volatile uint16_t *)(base + 0x1U))) & 0x100U) != 0U);
}
//*****************************************************************************
//
//! Starts a DMA channel.
//!
//! \param base is the base address of the DMA channel control registers.
//!
//! This function starts the DMA running, typically after you have configured
//! it. It will wait for the first trigger event to start operation. To halt
//! the channel use DMA_stopChannel().
//!
//! \return None.
//
//*****************************************************************************
static inline void
DMA_startChannel(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Set the run bit.
//
__eallow();
(*((volatile uint16_t *)(base + 0x1U))) |= 0x1U;
__edis();
}
//*****************************************************************************
//
//! Halts a DMA channel.
//!
//! \param base is the base address of the DMA channel control registers.
//!
//! This function halts the DMA at its current state and any current read-write
//! access is completed. To start the channel again use DMA_startChannel().
//!
//! \return None.
//
//*****************************************************************************
static inline void
DMA_stopChannel(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Set the halt bit.
//
__eallow();
(*((volatile uint16_t *)(base + 0x1U))) |= 0x2U;
__edis();
}
//*****************************************************************************
//
//! Enables a DMA channel interrupt source.
//!
//! \param base is the base address of the DMA channel control registers.
//!
//! This function enables the indicated DMA channel interrupt source.
//!
//! \return None.
//
//*****************************************************************************
static inline void
DMA_enableInterrupt(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Enable the specified DMA channel interrupt.
//
__eallow();
(*((volatile uint16_t *)(base + 0x0U))) |= 0x8000U;
__edis();
}
//*****************************************************************************
//
//! Disables a DMA channel interrupt source.
//!
//! \param base is the base address of the DMA channel control registers.
//!
//! This function disables the indicated DMA channel interrupt source.
//!
//! \return None.
//
//*****************************************************************************
static inline void
DMA_disableInterrupt(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Disable the specified DMA channel interrupt.
//
__eallow();
(*((volatile uint16_t *)(base + 0x0U))) &= ~0x8000U;
__edis();
}
//*****************************************************************************
//
//! Enables the DMA channel overrun interrupt.
//!
//! \param base is the base address of the DMA channel control registers.
//!
//! This function enables the indicated DMA channel's ability to generate an
//! interrupt upon the detection of an overrun. An overrun is when a peripheral
//! event trigger is received by the DMA before a previous trigger on that
//! channel had been serviced and its flag had been cleared.
//!
//! Note that this is the same interrupt signal as the interrupt that gets
//! generated at the beginning/end of a transfer. That interrupt must first be
//! enabled using DMA_enableInterrupt() in order for the overrun interrupt to
//! be generated.
//!
//! \return None.
//
//*****************************************************************************
static inline void
DMA_enableOverrunInterrupt(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Enable the specified DMA channel interrupt.
//
__eallow();
(*((volatile uint16_t *)(base + 0x0U))) |= 0x80U;
__edis();
}
//*****************************************************************************
//
//! Disables the DMA channel overrun interrupt.
//!
//! \param base is the base address of the DMA channel control registers.
//!
//! This function disables the indicated DMA channel's ability to generate an
//! interrupt upon the detection of an overrun.
//!
//! \return None.
//
//*****************************************************************************
static inline void
DMA_disableOverrunInterrupt(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Disable the specified DMA channel interrupt.
//
__eallow();
(*((volatile uint16_t *)(base + 0x0U))) &= ~0x80U;
__edis();
}
//*****************************************************************************
//
//! Clears the DMA channel error flags.
//!
//! \param base is the base address of the DMA channel control registers.
//!
//! This function clears both the DMA channel's sync error flag and its
//! overrun error flag.
//!
//! \return None.
//
//*****************************************************************************
static inline void
DMA_clearErrorFlag(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Write to the error clear bit.
//
__eallow();
(*((volatile uint16_t *)(base + 0x1U))) |= 0x80U;
__edis();
}
//*****************************************************************************
//
//! Sets the interrupt generation mode of a DMA channel interrupt.
//!
//! \param base is the base address of the DMA channel control registers.
//! \param mode is a flag to indicate the channel interrupt mode.
//!
//! This function sets the channel interrupt mode. When the \e mode parameter
//! is \b DMA_INT_AT_END, the DMA channel interrupt will be generated at the
//! end of the transfer. If \b DMA_INT_AT_BEGINNING, the interrupt will be
//! generated at the beginning of a new transfer. Generating at the beginning
//! of a new transfer is the default behavior.
//!
//! \return None.
//
//*****************************************************************************
static inline void
DMA_setInterruptMode(uint32_t base, DMA_InterruptMode mode)
{
//
// Check the arguments.
//
;
__eallow();
//
// Write the selected interrupt generation mode to the register.
//
if(mode == DMA_INT_AT_END)
{
(*((volatile uint16_t *)(base + 0x0U))) |= 0x200U;
}
else
{
(*((volatile uint16_t *)(base + 0x0U))) &= ~0x200U;
}
__edis();
}
//*****************************************************************************
//
//! Sets the DMA channel priority mode.
//!
//! \param ch1IsHighPri is a flag to indicate the channel interrupt mode.
//!
//! This function sets the channel interrupt mode. When the \e ch1IsHighPri
//! parameter is \b false, the DMA channels are serviced in round-robin mode.
//! This is the default behavior.
//!
//! If \b true, channel 1 will be given higher priority than the other
//! channels. This means that if a channel 1 trigger occurs, the current word
//! transfer on any other channel is completed and channel 1 is serviced for
//! the complete burst count. The lower-priority channel's interrupted transfer
//! will then resume.
//!
//! \return None.
//
//*****************************************************************************
static inline void
DMA_setPriorityMode(_Bool ch1IsHighPri)
{
__eallow();
//
// Write the selected priority mode to the register.
//
if(ch1IsHighPri)
{
(*((volatile uint16_t *)(0x00001000U + 0x4U))) |=
0x1U;
}
else
{
(*((volatile uint16_t *)(0x00001000U + 0x4U))) &=
~0x1U;
}
__edis();
}
//*****************************************************************************
//
//! Configures the source address for the DMA channel
//!
//! \param base is the base address of the DMA channel control registers.
//! \param *srcAddr is a source address.
//!
//! This function configures the source address of a DMA
//! channel.
//!
//! \return None.
//
//*****************************************************************************
static inline void
DMA_configSourceAddress(uint32_t base, const void *srcAddr)
{
//
// Check the arguments.
//
;
__eallow();
//
// Set up SOURCE address.
//
(*((volatile uint32_t *)(base + 0x10U))) = (uint32_t)srcAddr;
(*((volatile uint32_t *)(base + 0x12U))) = (uint32_t)srcAddr;
__edis();
}
//*****************************************************************************
//
//! Configures the destination address for the DMA channel
//!
//! \param base is the base address of the DMA channel control registers.
//! \param *destAddr is the destination address.
//!
//! This function configures the destinaton address of a DMA
//! channel.
//!
//! \return None.
//
//*****************************************************************************
static inline void
DMA_configDestAddress(uint32_t base, const void *destAddr)
{
//
// Check the arguments.
//
;
__eallow();
//
// Set up DESTINATION address.
//
(*((volatile uint32_t *)(base + 0x18U))) = (uint32_t)destAddr;
(*((volatile uint32_t *)(base + 0x1AU))) = (uint32_t)destAddr;
__edis();
}
//*****************************************************************************
//
//! Setup DMA to transfer data on the specified channel.
//!
//! \param base is Base address of the DMA channel control register
//! \param *transfParams configuration parameter
//! Refer struct #DMA_ConfigParams
//!
//! This function configures the DMA transfer on the specified channel.
//!
//! \return None.
//
//*****************************************************************************
extern void
DMA_configChannel(uint32_t base, const DMA_ConfigParams *transfParams);
//*****************************************************************************
//
//! Configures the DMA channel
//!
//! \param base is the base address of the DMA channel control registers.
//! \param *destAddr is the destination address.
//! \param *srcAddr is a source address.
//!
//! This function configures the source and destination addresses of a DMA
//! channel. The parameters are pointers to the data to be transferred.
//!
//! \return None.
//
//*****************************************************************************
extern void
DMA_configAddresses(uint32_t base, const void *destAddr, const void *srcAddr);
//*****************************************************************************
//
//! Configures the DMA channel's burst settings.
//!
//! \param base is the base address of the DMA channel control registers.
//! \param size is the number of words transferred per burst.
//! \param srcStep is the amount to increment or decrement the source address
//! after each word of a burst.
//! \param destStep is the amount to increment or decrement the destination
//! address after each word of a burst.
//!
//! This function configures the size of each burst and the address step size.
//!
//! The \e size parameter is the number of words that will be transferred
//! during a single burst. Possible amounts range from 1 word to 32 words.
//!
//! The \e srcStep and \e destStep parameters specify the address step that
//! should be added to the source and destination addresses after each
//! transferred word of a burst. Only signed values from -4096 to 4095 are
//! valid.
//!
//! \note Note that regardless of what data size (configured by
//! DMA_configMode()) is used, parameters are in terms of 16-bits words.
//!
//! \return None.
//
//*****************************************************************************
extern void DMA_configBurst(uint32_t base, uint16_t size, int16_t srcStep,
int16_t destStep);
//*****************************************************************************
//
//! Configures the DMA channel's transfer settings.
//!
//! \param base is the base address of the DMA channel control registers.
//! \param transferSize is the number of bursts per transfer.
//! \param srcStep is the amount to increment or decrement the source address
//! after each burst of a transfer unless a wrap occurs.
//! \param destStep is the amount to increment or decrement the destination
//! address after each burst of a transfer unless a wrap occurs.
//!
//! This function configures the transfer size and the address step that is
//! made after each burst.
//!
//! The \e transferSize parameter is the number of bursts per transfer. If DMA
//! channel interrupts are enabled, they will occur after this number of bursts
//! have completed. The maximum number of bursts is 65536.
//!
//! The \e srcStep and \e destStep parameters specify the address step that
//! should be added to the source and destination addresses after each
//! transferred burst of a transfer. Only signed values from -4096 to 4095 are
//! valid. If a wrap occurs, these step values will be ignored. Wrapping is
//! configured with DMA_configWrap().
//!
//! \note Note that regardless of what data size (configured by
//! DMA_configMode()) is used, parameters are in terms of 16-bits words.
//!
//! \return None.
//
//*****************************************************************************
extern void
DMA_configTransfer(uint32_t base, uint32_t transferSize, int16_t srcStep,
int16_t destStep);
//*****************************************************************************
//
//! Configures the DMA channel's wrap settings.
//!
//! \param base is the base address of the DMA channel control registers.
//! \param srcWrapSize is the number of bursts to be transferred before a wrap
//! of the source address occurs.
//! \param srcStep is the amount to increment or decrement the source address
//! after each burst of a transfer unless a wrap occurs.
//! \param destWrapSize is the number of bursts to be transferred before a wrap
//! of the destination address occurs.
//! \param destStep is the amount to increment or decrement the destination
//! address after each burst of a transfer unless a wrap occurs.
//!
//! This function configures the DMA channel's wrap settings.
//!
//! The \e srcWrapSize and \e destWrapSize parameters are the number of bursts
//! that are to be transferred before their respective addresses are wrapped.
//! The maximum wrap size is 65536 bursts.
//!
//! The \e srcStep and \e destStep parameters specify the address step that
//! should be added to the source and destination addresses when the wrap
//! occurs. Only signed values from -4096 to 4095 are valid.
//!
//! \note Note that regardless of what data size (configured by
//! DMA_configMode()) is used, parameters are in terms of 16-bits words.
//!
//! \return None.
//
//*****************************************************************************
extern void
DMA_configWrap(uint32_t base, uint32_t srcWrapSize, int16_t srcStep,
uint32_t destWrapSize, int16_t destStep);
//*****************************************************************************
//
//! Configures the DMA channel trigger and mode.
//!
//! \param base is the base address of the DMA channel control registers.
//! \param trigger is the interrupt source that triggers a DMA transfer.
//! \param config is a bit field of several configuration selections.
//!
//! This function configures the DMA channel's trigger and mode.
//!
//! The \e trigger parameter is the interrupt source that will trigger the
//! start of a DMA transfer.
//!
//! The \e config parameter is the logical OR of the following values:
//! - \b DMA_CFG_ONESHOT_DISABLE or \b DMA_CFG_ONESHOT_ENABLE. If enabled,
//! the subsequent burst transfers occur without additional event triggers
//! after the first event trigger. If disabled, only one burst transfer is
//! performed per event trigger.
//! - \b DMA_CFG_CONTINUOUS_DISABLE or \b DMA_CFG_CONTINUOUS_ENABLE. If enabled
//! the DMA reinitializes when the transfer count is zero and waits for the
//! next interrupt event trigger. If disabled, the DMA stops and clears the
//! run status bit.
//! - \b DMA_CFG_SIZE_16BIT or \b DMA_CFG_SIZE_32BIT. This setting selects
//! whether the databus width is 16 or 32 bits.
//!
//! \return None.
//
//*****************************************************************************
extern void
DMA_configMode(uint32_t base, DMA_Trigger trigger, uint32_t config);
//*****************************************************************************
//
// Close the Doxygen group.
//! @}
//
//*****************************************************************************
//*****************************************************************************
//
// Mark the end of the C bindings section for C++ compilers.
//
//*****************************************************************************
//###########################################################################
//
// FILE: ecap.h
//
// TITLE: C28x ECAP driver
//
//#############################################################################
// $Copyright:
// Copyright (C) 2023 Texas Instruments Incorporated - http://www.ti.com/
//
// 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 Texas Instruments Incorporated 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
// OWNER 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.
// $
//#############################################################################
//*****************************************************************************
//
// If building with a C++ compiler, make all of the definitions in this header
// have a C binding.
//
//*****************************************************************************
//*****************************************************************************
//
//! \addtogroup ecap_api eCAP
//! @{
//
//*****************************************************************************
//*****************************************************************************
//
// Includes
//
//*****************************************************************************
//###########################################################################
//
// FILE: hw_ecap.h
//
// TITLE: Definitions for the ECAP registers.
//
//###########################################################################
// $Copyright:
// Copyright (C) 2023 Texas Instruments Incorporated - http://www.ti.com/
//
// 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 Texas Instruments Incorporated 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
// OWNER 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.
// $
//###########################################################################
//*************************************************************************************************
//
// The following are defines for the ECAP register offsets
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the ECCTL0 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the ECCTL1 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the ECCTL2 register
//
//*************************************************************************************************
// flags.
//*************************************************************************************************
//
// The following are defines for the bit fields in the ECEINT register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the ECFLG register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the ECCLR register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the ECFRC register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the ECAPSYNCINSEL register
//
//*************************************************************************************************
//*****************************************************************************
//
// eCAP minimum and maximum values
//
//*****************************************************************************
//*****************************************************************************
//
// Values that can be passed to ECAP_enableInterrupt(),
// ECAP_disableInterrupt(), ECAP_clearInterrupt() and ECAP_forceInterrupt() as
// the intFlags parameter and returned by ECAP_getInterruptSource().
//
//*****************************************************************************
//! Event 1 ISR source
//!
//! Event 2 ISR source
//!
//! Event 3 ISR source
//!
//! Event 4 ISR source
//!
//! Counter overflow ISR source
//!
//! Counter equals period ISR source
//!
//! Counter equals compare ISR source
//!
//*****************************************************************************
//
//! Values that can be passed to ECAP_setEmulationMode() as the
//! \e mode parameter.
//
//*****************************************************************************
typedef enum
{
//! TSCTR is stopped on emulation suspension
ECAP_EMULATION_STOP = 0x0U,
//! TSCTR runs until 0 before stopping on emulation suspension
ECAP_EMULATION_RUN_TO_ZERO = 0x1U,
//! TSCTR is not affected by emulation suspension
ECAP_EMULATION_FREE_RUN = 0x2U
}ECAP_EmulationMode;
//*****************************************************************************
//
//! Values that can be passed to ECAP_setCaptureMode() as the
//! \e mode parameter.
//
//*****************************************************************************
typedef enum
{
//! eCAP operates in continuous capture mode
ECAP_CONTINUOUS_CAPTURE_MODE = 0U,
//! eCAP operates in one shot capture mode
ECAP_ONE_SHOT_CAPTURE_MODE = 1U
}ECAP_CaptureMode;
//*****************************************************************************
//
//! Values that can be passed to ECAP_setEventPolarity(),ECAP_setCaptureMode(),
//! ECAP_enableCounterResetOnEvent(),ECAP_disableCounterResetOnEvent(),
//! ECAP_getEventTimeStamp(),ECAP_setDMASource() as the \e event parameter.
//
//*****************************************************************************
typedef enum
{
ECAP_EVENT_1 = 0U, //!< eCAP event 1
ECAP_EVENT_2 = 1U, //!< eCAP event 2
ECAP_EVENT_3 = 2U, //!< eCAP event 3
ECAP_EVENT_4 = 3U //!< eCAP event 4
}ECAP_Events;
//*****************************************************************************
//
//! Values that can be passed to ECAP_setSyncOutMode() as the \e mode
//! parameter.
//
//*****************************************************************************
typedef enum
{
//! sync out on the sync in signal and software force
ECAP_SYNC_OUT_SYNCI = 0x00U,
//! sync out on counter equals period
ECAP_SYNC_OUT_COUNTER_PRD = 0x40U,
//! Disable sync out signal
ECAP_SYNC_OUT_DISABLED = 0x80U
}ECAP_SyncOutMode;
//*****************************************************************************
//
//! Values that can be passed to ECAP_setAPWMPolarity() as the \e polarity
//! parameter.
//
//*****************************************************************************
typedef enum
{
ECAP_APWM_ACTIVE_HIGH = 0x000, //!< APWM is active high
ECAP_APWM_ACTIVE_LOW = 0x400 //!< APWM is active low
}ECAP_APWMPolarity;
//*****************************************************************************
//
//! Values that can be passed to ECAP_setEventPolarity() as the \e polarity
//! parameter.
//
//*****************************************************************************
typedef enum
{
ECAP_EVNT_RISING_EDGE = 0U, //!< Rising edge polarity
ECAP_EVNT_FALLING_EDGE = 1U //!< Falling edge polarity
}ECAP_EventPolarity;
//*****************************************************************************
//
//! Values that can be passed to ECAP_selectECAPInput() as the \e input
//! parameter.
//
//*****************************************************************************
typedef enum
{
//! GPIO Input Crossbar output signal-1
ECAP_INPUT_INPUTXBAR1 = 0,
//! GPIO Input Crossbar output signal-2
ECAP_INPUT_INPUTXBAR2 = 1,
//! GPIO Input Crossbar output signal-3
ECAP_INPUT_INPUTXBAR3 = 2,
//! GPIO Input Crossbar output signal-4
ECAP_INPUT_INPUTXBAR4 = 3,
//! GPIO Input Crossbar output signal-5
ECAP_INPUT_INPUTXBAR5 = 4,
//! GPIO Input Crossbar output signal-6
ECAP_INPUT_INPUTXBAR6 = 5,
//! GPIO Input Crossbar output signal-7
ECAP_INPUT_INPUTXBAR7 = 6,
//! GPIO Input Crossbar output signal-8
ECAP_INPUT_INPUTXBAR8 = 7,
//! GPIO Input Crossbar output signal-9
ECAP_INPUT_INPUTXBAR9 = 8,
//! GPIO Input Crossbar output signal-10
ECAP_INPUT_INPUTXBAR10 = 9,
//! GPIO Input Crossbar output signal-11
ECAP_INPUT_INPUTXBAR11 = 10,
//! GPIO Input Crossbar output signal-12
ECAP_INPUT_INPUTXBAR12 = 11,
//! GPIO Input Crossbar output signal-13
ECAP_INPUT_INPUTXBAR13 = 12,
//! GPIO Input Crossbar output signal-14
ECAP_INPUT_INPUTXBAR14 = 13,
//! GPIO Input Crossbar output signal-15
ECAP_INPUT_INPUTXBAR15 = 14,
//! GPIO Input Crossbar output signal-16
ECAP_INPUT_INPUTXBAR16 = 15,
//! CLB1 CLBOUT14 input for ECAP1 instance
ECAP_INPUT_ECAP1_CLB1_CLBOUT14 = 16,
//! CLB2 CLBOUT14 input for ECAP2 instance
ECAP_INPUT_ECAP2_CLB2_CLBOUT14 = 16,
//! CLB1 CLBOUT14 input for ECAP3 instance
ECAP_INPUT_ECAP3_CLB1_CLBOUT14 = 16,
//! CLB1 CLBOUT15 input for ECAP1 instance
ECAP_INPUT_ECAP1_CLB1_CLBOUT15 = 17,
//! CLB2 CLBOUT15 input for ECAP2 instance
ECAP_INPUT_ECAP2_CLB2_CLBOUT15 = 17,
//! CLB1 CLBOUT15 input for ECAP3 instance
ECAP_INPUT_ECAP3_CLB1_CLBOUT15 = 17,
//! CLB2 CLBOUT14 input for ECAP1 instance
ECAP_INPUT_ECAP1_CLB2_CLBOUT14 = 18,
//! CLB1 CLBOUT14 input for ECAP2 instance
ECAP_INPUT_ECAP2_CLB1_CLBOUT14 = 18,
//! CLB2 CLBOUT14 input for ECAP3 instance
ECAP_INPUT_ECAP3_CLB2_CLBOUT14 = 18,
//! CLB2 CLBOUT15 input for ECAP1 instance
ECAP_INPUT_ECAP1_CLB2_CLBOUT15 = 19,
//! CLB1 CLBOUT15 input for ECAP2 instance
ECAP_INPUT_ECAP2_CLB1_CLBOUT15 = 19,
//! CLB2 CLBOUT15 input for ECAP3 instance
ECAP_INPUT_ECAP3_CLB2_CLBOUT15 = 19,
//! CANA INT0 Input
ECAP_INPUT_CANA_INT0 = 20,
//! Output Xbar Output-1
ECAP_INPUT_OUTPUTXBAR1 = 24,
//! Output Xbar Output-2
ECAP_INPUT_OUTPUTXBAR2 = 25,
//! Output Xbar Output-3
ECAP_INPUT_OUTPUTXBAR3 = 26,
//! Output Xbar Output-4
ECAP_INPUT_OUTPUTXBAR4 = 27,
//! Output Xbar Output-5
ECAP_INPUT_OUTPUTXBAR5 = 28,
//! Output Xbar Output-6
ECAP_INPUT_OUTPUTXBAR6 = 29,
//! Output Xbar Output-7
ECAP_INPUT_OUTPUTXBAR7 = 30,
//! Output Xbar Output-8
ECAP_INPUT_OUTPUTXBAR8 = 31,
//! ADCC Event4
ECAP_INPUT_ADC_C_EVENT4 = 36,
//! ADCC Event3
ECAP_INPUT_ADC_C_EVENT3 = 37,
//! ADCC Event2
ECAP_INPUT_ADC_C_EVENT2 = 38,
//! ADCC Event1
ECAP_INPUT_ADC_C_EVENT1 = 39,
//! ADCB Event4
ECAP_INPUT_ADC_B_EVENT4 = 40,
//! ADCB Event3
ECAP_INPUT_ADC_B_EVENT3 = 41,
//! ADCB Event2
ECAP_INPUT_ADC_B_EVENT2 = 42,
//! ADCB Event1
ECAP_INPUT_ADC_B_EVENT1 = 43,
//! ADCA Event4
ECAP_INPUT_ADC_A_EVENT4 = 44,
//! ADCA Event3
ECAP_INPUT_ADC_A_EVENT3 = 45,
//! ADCA Event2
ECAP_INPUT_ADC_A_EVENT2 = 46,
//! ADCA Event1
ECAP_INPUT_ADC_A_EVENT1 = 47,
//! FSIA Rx MSR Line
ECAP_INPUT_FSIA_RX_MSR_LINE = 48,
//! FSIA Rx MSR Line Rise
ECAP_INPUT_FSIA_RX_MSR_LINE_RISE = 49,
//! FSIA Rx MSR Line Fall
ECAP_INPUT_FSIA_RX_MSR_LINE_FALL = 50,
//! SDFM-2 Filter-1 Compare Low Trip
ECAP_INPUT_SDFM2_FLT1_COMPARE_LOW = 60,
//! SDFM-2 Filter-2 Compare Low Trip
ECAP_INPUT_SDFM2_FLT2_COMPARE_LOW = 61,
//! SDFM-2 Filter-3 Compare Low Trip
ECAP_INPUT_SDFM2_FLT3_COMPARE_LOW = 62,
//! SDFM-2 Filter-4 Compare Low Trip
ECAP_INPUT_SDFM2_FLT4_COMPARE_LOW = 63,
//! SDFM-1 Filter-1 Compare Low Trip
ECAP_INPUT_SDFM1_FLT1_COMPARE_LOW = 64,
//! SDFM-1 Filter-2 Compare Low Trip
ECAP_INPUT_SDFM1_FLT2_COMPARE_LOW = 65,
//! SDFM-1 Filter-3 Compare Low Trip
ECAP_INPUT_SDFM1_FLT3_COMPARE_LOW = 66,
//! SDFM-1 Filter-4 Compare Low Trip
ECAP_INPUT_SDFM1_FLT4_COMPARE_LOW = 67,
//! SDFM-2 Filter-1 Compare Z Trip
ECAP_INPUT_SDFM2_FLT1_COMPARE_Z = 68,
//! SDFM-2 Filter-2 Compare Low Trip
ECAP_INPUT_SDFM2_FLT2_COMPARE_Z = 69,
//! SDFM-2 Filter-3 Compare Low Trip
ECAP_INPUT_SDFM2_FLT3_COMPARE_Z = 70,
//! SDFM-2 Filter-4 Compare Low Trip
ECAP_INPUT_SDFM2_FLT4_COMPARE_Z = 71,
//! SDFM-1 Filter-1 Compare Z Trip
ECAP_INPUT_SDFM1_FLT1_COMPARE_Z = 72,
//! SDFM-1 Filter-2 Compare Low Trip
ECAP_INPUT_SDFM1_FLT2_COMPARE_Z = 73,
//! SDFM-1 Filter-3 Compare Low Trip
ECAP_INPUT_SDFM1_FLT3_COMPARE_Z = 74,
//! SDFM-1 Filter-4 Compare Low Trip
ECAP_INPUT_SDFM1_FLT4_COMPARE_Z = 75,
//! SDFM-2 Filter-1 Compare High Trip
ECAP_INPUT_SDFM2_FLT1_COMPARE_HIGH = 76,
//! SDFM-2 Filter-2 Compare High Trip
ECAP_INPUT_SDFM2_FLT2_COMPARE_HIGH = 77,
//! SDFM-2 Filter-3 Compare High Trip
ECAP_INPUT_SDFM2_FLT3_COMPARE_HIGH = 78,
//! SDFM-2 Filter-4 Compare High Trip
ECAP_INPUT_SDFM2_FLT4_COMPARE_HIGH = 79,
//! SDFM-1 Filter-1 Compare High Trip
ECAP_INPUT_SDFM1_FLT1_COMPARE_HIGH = 80,
//! SDFM-1 Filter-2 Compare High Trip
ECAP_INPUT_SDFM1_FLT2_COMPARE_HIGH = 81,
//! SDFM-1 Filter-3 Compare High Trip
ECAP_INPUT_SDFM1_FLT3_COMPARE_HIGH = 82,
//! SDFM-1 Filter-4 Compare High Trip
ECAP_INPUT_SDFM1_FLT4_COMPARE_HIGH = 83,
//! SDFM-2 Filter-1 Compare High Trip or Low Trip
ECAP_INPUT_SDFM2_FLT1_COMPARE_HIGH_OR_LOW = 84,
//! SDFM-2 Filter-2 Compare High Trip or Low Trip
ECAP_INPUT_SDFM2_FLT2_COMPARE_HIGH_OR_LOW = 85,
//! SDFM-2 Filter-3 Compare High Trip or Low Trip
ECAP_INPUT_SDFM2_FLT3_COMPARE_HIGH_OR_LOW = 86,
//! SDFM-2 Filter-4 Compare High Trip or Low Trip
ECAP_INPUT_SDFM2_FLT4_COMPARE_HIGH_OR_LOW = 87,
//! SDFM-1 Filter-1 Compare High Trip or Low Trip
ECAP_INPUT_SDFM1_FLT1_COMPARE_HIGH_OR_LOW = 88,
//! SDFM-1 Filter-2 Compare High Trip or Low Trip
ECAP_INPUT_SDFM1_FLT2_COMPARE_HIGH_OR_LOW = 89,
//! SDFM-1 Filter-3 Compare High Trip or Low Trip
ECAP_INPUT_SDFM1_FLT3_COMPARE_HIGH_OR_LOW = 90,
//! SDFM-1 Filter-4 Compare High Trip or Low Trip
ECAP_INPUT_SDFM1_FLT4_COMPARE_HIGH_OR_LOW = 91,
//! Compare Subsystem-1 Low Trip
ECAP_INPUT_CMPSS1_CTRIP_LOW = 96,
//! Compare Subsystem-2 Low Trip
ECAP_INPUT_CMPSS2_CTRIP_LOW = 97,
//! Compare Subsystem-3 Low Trip
ECAP_INPUT_CMPSS3_CTRIP_LOW = 98,
//! Compare Subsystem-4 Low Trip
ECAP_INPUT_CMPSS4_CTRIP_LOW = 99,
//! Compare Subsystem-1 High Trip
ECAP_INPUT_CMPSS1_CTRIP_HIGH = 108,
//! Compare Subsystem-2 High Trip
ECAP_INPUT_CMPSS2_CTRIP_HIGH = 109,
//! Compare Subsystem-3 High Trip
ECAP_INPUT_CMPSS3_CTRIP_HIGH = 110,
//! Compare Subsystem-4 High Trip
ECAP_INPUT_CMPSS4_CTRIP_HIGH = 111,
//! GPIO8
ECAP_INPUT_GPIO8 = 115,
//! GPIO9
ECAP_INPUT_GPIO9 = 116,
//! GPIO22
ECAP_INPUT_GPIO22 = 117,
//! GPIO23
ECAP_INPUT_GPIO23 = 118,
//! Compare Subsystem-1 High Trip or Low Trip
ECAP_INPUT_CMPSS1_CTRIP_HIGH_OR_LOW = 120,
//! Compare Subsystem-2 High Trip or Low Trip
ECAP_INPUT_CMPSS2_CTRIP_HIGH_OR_LOW = 121,
//! Compare Subsystem-3 High Trip or Low Trip
ECAP_INPUT_CMPSS3_CTRIP_HIGH_OR_LOW = 122,
//! Compare Subsystem-4 High Trip or Low Trip
ECAP_INPUT_CMPSS4_CTRIP_HIGH_OR_LOW = 123,
//! GPTRIP7 input for instance ECAP1
ECAP_INPUT_ECAP1_GPTRIP7 = 127,
//! GPTRIP8 input for instance ECAP2
ECAP_INPUT_ECAP2_GPTRIP8 = 127,
//! GPTRIP9 input for instance ECAP3
ECAP_INPUT_ECAP3_GPTRIP9 = 127,
}ECAP_InputCaptureSignals;
//*****************************************************************************
//
//! Values that can be passed to ECAP_setSyncInPulseSource() as the \e mode
//! parameter.
//
//*****************************************************************************
typedef enum
{
//! Disable Sync-in
ECAP_SYNC_IN_PULSE_SRC_DISABLE = 0x0,
//! Sync-in source is EPWM1 sync-out signal
ECAP_SYNC_IN_PULSE_SRC_SYNCOUT_EPWM1 = 0x1,
//! Sync-in source is EPWM2 sync-out signal
ECAP_SYNC_IN_PULSE_SRC_SYNCOUT_EPWM2 = 0x2,
//! Sync-in source is EPWM3 sync-out signal
ECAP_SYNC_IN_PULSE_SRC_SYNCOUT_EPWM3 = 0x3,
//! Sync-in source is EPWM4 sync-out signal
ECAP_SYNC_IN_PULSE_SRC_SYNCOUT_EPWM4 = 0x4,
//! Sync-in source is EPWM5 sync-out signal
ECAP_SYNC_IN_PULSE_SRC_SYNCOUT_EPWM5 = 0x5,
//! Sync-in source is EPWM6 sync-out signal
ECAP_SYNC_IN_PULSE_SRC_SYNCOUT_EPWM6 = 0x6,
//! Sync-in source is EPWM7 sync-out signal
ECAP_SYNC_IN_PULSE_SRC_SYNCOUT_EPWM7 = 0x7,
//! Sync-in source is EPWM8 sync-out signal
ECAP_SYNC_IN_PULSE_SRC_SYNCOUT_EPWM8 = 0x8,
//! Sync-in source is ECAP1 sync-out signal
ECAP_SYNC_IN_PULSE_SRC_SYNCOUT_ECAP1 = 0x11,
//! Sync-in source is ECAP2 sync-out signal
ECAP_SYNC_IN_PULSE_SRC_SYNCOUT_ECAP2 = 0x12,
//! Sync-in source is ECAP3 sync-out signal
ECAP_SYNC_IN_PULSE_SRC_SYNCOUT_ECAP3 = 0x13,
//! Sync-in source is Input XBAR out5 signal
ECAP_SYNC_IN_PULSE_SRC_INPUTXBAR_OUT5 = 0x18,
//! Sync-in source is Input XBAR out6 signal
ECAP_SYNC_IN_PULSE_SRC_INPUTXBAR_OUT6 = 0x19,
//! Sync-in source is FSI RXA RX signal
ECAP_SYNC_IN_PULSE_SRC_FSIRXA_RX_TRIG1 = 0x1F,
}ECAP_SyncInPulseSource;
//*****************************************************************************
//
//! \internal
//! Checks eCAP base address.
//!
//! \param base specifies the eCAP module base address.
//!
//! This function determines if an eCAP module base address is valid.
//!
//! \return Returns \b true if the base address is valid and \b false
//! otherwise.
//
//*****************************************************************************
//*****************************************************************************
//
//! Sets the input prescaler.
//!
//! \param base is the base address of the ECAP module.
//! \param preScalerValue is the pre scaler value for ECAP input
//!
//! This function divides the ECAP input scaler. The pre scale value is
//! doubled inside the module. For example a preScalerValue of 5 will divide
//! the scaler by 10. Use a value of 1 to divide the pre scaler by 1.
//! The \e preScalerValue should be less than \b ECAP_MAX_PRESCALER_VALUE.
//!
//! \return None.
//
//*****************************************************************************
static inline void ECAP_setEventPrescaler(uint32_t base,
uint16_t preScalerValue)
{
;
;
__eallow();
//
// Write to PRESCALE bit
//
(*((volatile uint16_t *)(base + 0x14U))) =
(((*((volatile uint16_t *)(base + 0x14U))) & (~0x3E00U)) |
(preScalerValue << 9U));
__edis();
}
//*****************************************************************************
//
//! Sets the Capture event polarity.
//!
//! \param base is the base address of the ECAP module.
//! \param event is the event number.
//! \param polarity is the polarity of the event.
//!
//! This function sets the polarity of a given event. The value of event
//! is between \b ECAP_EVENT_1 and \b ECAP_EVENT_4 inclusive corresponding to
//! the four available events.For each event the polarity value determines the
//! edge on which the capture is activated. For a rising edge use a polarity
//! value of \b ECAP_EVNT_RISING_EDGE and for a falling edge use a polarity of
//! \b ECAP_EVNT_FALLING_EDGE.
//!
//! \return None.
//
//*****************************************************************************
static inline void ECAP_setEventPolarity(uint32_t base,
ECAP_Events event,
ECAP_EventPolarity polarity)
{
uint16_t shift;
;
shift = ((uint16_t)event) << 1U;
__eallow();
//
// Write to CAP1POL, CAP2POL, CAP3POL or CAP4POL
//
(*((volatile uint16_t *)(base + 0x14U))) =
((*((volatile uint16_t *)(base + 0x14U))) & ~(1U << shift)) |
((uint16_t)polarity << shift);
__edis();
}
//*****************************************************************************
//
//! Sets the capture mode.
//!
//! \param base is the base address of the ECAP module.
//! \param mode is the capture mode.
//! \param event is the event number at which the counter stops or wraps.
//!
//! This function sets the eCAP module to a continuous or one-shot mode.
//! The value of mode should be either \b ECAP_CONTINUOUS_CAPTURE_MODE or
//! \b ECAP_ONE_SHOT_CAPTURE_MODE corresponding to continuous or one-shot mode
//! respectively.
//!
//! The value of event determines the event number at which the counter stops
//! (in one-shot mode) or the counter wraps (in continuous mode). The value of
//! event should be between \b ECAP_EVENT_1 and \b ECAP_EVENT_4 corresponding
//! to the valid event numbers.
//!
//! \return None.
//
//*****************************************************************************
static inline void ECAP_setCaptureMode(uint32_t base,
ECAP_CaptureMode mode,
ECAP_Events event)
{
;
__eallow();
//
// Write to CONT/ONESHT
//
(*((volatile uint16_t *)(base + 0x15U))) =
(((*((volatile uint16_t *)(base + 0x15U))) & (~0x1U)) |
(uint16_t)mode);
//
// Write to STOP_WRAP
//
(*((volatile uint16_t *)(base + 0x15U))) =
(((*((volatile uint16_t *)(base + 0x15U))) & (~0x6U)) |
(((uint16_t)event) << 1U ));
__edis();
}
//*****************************************************************************
//
//! Re-arms the eCAP module.
//!
//! \param base is the base address of the ECAP module.
//!
//! This function re-arms the eCAP module.
//!
//! \return None.
//
//*****************************************************************************
static inline void ECAP_reArm(uint32_t base)
{
;
__eallow();
//
// Write to RE-ARM bit
//
(*((volatile uint16_t *)(base + 0x15U))) |= 0x8U;
__edis();
}
//*****************************************************************************
//
//! Enables interrupt source.
//!
//! \param base is the base address of the ECAP module.
//! \param intFlags is the interrupt source to be enabled.
//!
//! This function sets and enables eCAP interrupt source. The following are
//! valid interrupt sources.
//! - ECAP_ISR_SOURCE_CAPTURE_EVENT_1 - Event 1 generates interrupt
//! - ECAP_ISR_SOURCE_CAPTURE_EVENT_2 - Event 2 generates interrupt
//! - ECAP_ISR_SOURCE_CAPTURE_EVENT_3 - Event 3 generates interrupt
//! - ECAP_ISR_SOURCE_CAPTURE_EVENT_4 - Event 4 generates interrupt
//! - ECAP_ISR_SOURCE_COUNTER_OVERFLOW - Counter overflow generates interrupt
//! - ECAP_ISR_SOURCE_COUNTER_PERIOD - Counter equal period generates
//! interrupt
//! - ECAP_ISR_SOURCE_COUNTER_COMPARE - Counter equal compare generates
//! interrupt
//!
//! \return None.
//
//*****************************************************************************
static inline void ECAP_enableInterrupt(uint32_t base,
uint16_t intFlags)
{
;
;
__eallow();
//
// Set bits in ECEINT register
//
(*((volatile uint16_t *)(base + 0x16U))) |= intFlags;
__edis();
}
//*****************************************************************************
//
//! Disables interrupt source.
//!
//! \param base is the base address of the ECAP module.
//! \param intFlags is the interrupt source to be disabled.
//!
//! This function clears and disables eCAP interrupt source. The following are
//! valid interrupt sources.
//! - ECAP_ISR_SOURCE_CAPTURE_EVENT_1 - Event 1 generates interrupt
//! - ECAP_ISR_SOURCE_CAPTURE_EVENT_2 - Event 2 generates interrupt
//! - ECAP_ISR_SOURCE_CAPTURE_EVENT_3 - Event 3 generates interrupt
//! - ECAP_ISR_SOURCE_CAPTURE_EVENT_4 - Event 4 generates interrupt
//! - ECAP_ISR_SOURCE_COUNTER_OVERFLOW - Counter overflow generates interrupt
//! - ECAP_ISR_SOURCE_COUNTER_PERIOD - Counter equal period generates
//! interrupt
//! - ECAP_ISR_SOURCE_COUNTER_COMPARE - Counter equal compare generates
//! interrupt
//!
//! \return None.
//
//*****************************************************************************
static inline void ECAP_disableInterrupt(uint32_t base,
uint16_t intFlags)
{
;
;
__eallow();
//
// Clear bits in ECEINT register
//
(*((volatile uint16_t *)(base + 0x16U))) &= ~intFlags;
__edis();
}
//*****************************************************************************
//
//! Returns the interrupt flag.
//!
//! \param base is the base address of the ECAP module.
//!
//! This function returns the eCAP interrupt flag. The following are valid
//! interrupt sources corresponding to the eCAP interrupt flag.
//!
//! \return Returns the eCAP interrupt that has occurred. The following are
//! valid return values.
//! - ECAP_ISR_SOURCE_CAPTURE_EVENT_1 - Event 1 generates interrupt
//! - ECAP_ISR_SOURCE_CAPTURE_EVENT_2 - Event 2 generates interrupt
//! - ECAP_ISR_SOURCE_CAPTURE_EVENT_3 - Event 3 generates interrupt
//! - ECAP_ISR_SOURCE_CAPTURE_EVENT_4 - Event 4 generates interrupt
//! - ECAP_ISR_SOURCE_COUNTER_OVERFLOW - Counter overflow generates interrupt
//! - ECAP_ISR_SOURCE_COUNTER_PERIOD - Counter equal period generates
//! interrupt
//! - ECAP_ISR_SOURCE_COUNTER_COMPARE - Counter equal compare generates
//! interrupt
//!
//! \note - User can check if a combination of various interrupts have occurred
//! by ORing the above return values.
//
//*****************************************************************************
static inline uint16_t ECAP_getInterruptSource(uint32_t base)
{
;
//
// Return contents of ECFLG register
//
return((*((volatile uint16_t *)(base + 0x17U))) & 0xFEU);
}
//*****************************************************************************
//
//! Returns the Global interrupt flag.
//!
//! \param base is the base address of the ECAP module.
//!
//! This function returns the eCAP Global interrupt flag.
//!
//! \return Returns true if there is a global eCAP interrupt, false otherwise.
//
//*****************************************************************************
static inline _Bool ECAP_getGlobalInterruptStatus(uint32_t base)
{
;
//
// Return contents of Global interrupt bit
//
return(((*((volatile uint16_t *)(base + 0x17U))) & 0x1U) == 0x1U);
}
//*****************************************************************************
//
//! Clears interrupt flag.
//!
//! \param base is the base address of the ECAP module.
//! \param intFlags is the interrupt source.
//!
//! This function clears eCAP interrupt flags. The following are valid
//! interrupt sources.
//! - ECAP_ISR_SOURCE_CAPTURE_EVENT_1 - Event 1 generates interrupt
//! - ECAP_ISR_SOURCE_CAPTURE_EVENT_2 - Event 2 generates interrupt
//! - ECAP_ISR_SOURCE_CAPTURE_EVENT_3 - Event 3 generates interrupt
//! - ECAP_ISR_SOURCE_CAPTURE_EVENT_4 - Event 4 generates interrupt
//! - ECAP_ISR_SOURCE_COUNTER_OVERFLOW - Counter overflow generates interrupt
//! - ECAP_ISR_SOURCE_COUNTER_PERIOD - Counter equal period generates
//! interrupt
//! - ECAP_ISR_SOURCE_COUNTER_COMPARE - Counter equal compare generates
//! interrupt
//!
//! \return None.
//
//*****************************************************************************
static inline void ECAP_clearInterrupt(uint32_t base,
uint16_t intFlags)
{
;
;
//
// Write to ECCLR register
//
(*((volatile uint16_t *)(base + 0x18U))) = intFlags;
}
//*****************************************************************************
//
//! Clears global interrupt flag
//!
//! \param base is the base address of the ECAP module.
//!
//! This function clears the global interrupt bit.
//!
//! \return None.
//
//*****************************************************************************
static inline void ECAP_clearGlobalInterrupt(uint32_t base)
{
;
//
// Write to INT bit
//
(*((volatile uint16_t *)(base + 0x18U))) = 0x1U;
}
//*****************************************************************************
//
//! Forces interrupt source.
//!
//! \param base is the base address of the ECAP module.
//! \param intFlags is the interrupt source.
//!
//! This function forces and enables eCAP interrupt source. The following are
//! valid interrupt sources.
//! - ECAP_ISR_SOURCE_CAPTURE_EVENT_1 - Event 1 generates interrupt
//! - ECAP_ISR_SOURCE_CAPTURE_EVENT_2 - Event 2 generates interrupt
//! - ECAP_ISR_SOURCE_CAPTURE_EVENT_3 - Event 3 generates interrupt
//! - ECAP_ISR_SOURCE_CAPTURE_EVENT_4 - Event 4 generates interrupt
//! - ECAP_ISR_SOURCE_COUNTER_OVERFLOW - Counter overflow generates interrupt
//! - ECAP_ISR_SOURCE_COUNTER_PERIOD - Counter equal period generates
//! interrupt
//! - ECAP_ISR_SOURCE_COUNTER_COMPARE - Counter equal compare generates
//! interrupt
//!
//! \return None.
//
//*****************************************************************************
static inline void ECAP_forceInterrupt(uint32_t base,
uint16_t intFlags)
{
;
;
__eallow();
//
// Write to ECFRC register
//
(*((volatile uint16_t *)(base + 0x19U))) = intFlags;
__edis();
}
//*****************************************************************************
//
//! Sets eCAP in Capture mode.
//!
//! \param base is the base address of the ECAP module.
//!
//! This function sets the eCAP module to operate in Capture mode.
//!
//! \return None.
//
//*****************************************************************************
static inline void ECAP_enableCaptureMode(uint32_t base)
{
;
__eallow();
//
// Clear CAP/APWM bit
//
(*((volatile uint16_t *)(base + 0x15U))) &= ~0x200U;
__edis();
}
//*****************************************************************************
//
//! Sets eCAP in APWM mode.
//!
//! \param base is the base address of the ECAP module.
//!
//! This function sets the eCAP module to operate in APWM mode.
//!
//! \return None.
//
//*****************************************************************************
static inline void ECAP_enableAPWMMode(uint32_t base)
{
;
__eallow();
//
// Set CAP/APWM bit
//
(*((volatile uint16_t *)(base + 0x15U))) |= 0x200U;
__edis();
}
//*****************************************************************************
//
//! Enables counter reset on an event.
//!
//! \param base is the base address of the ECAP module.
//! \param event is the event number the time base gets reset.
//!
//! This function enables the base timer, TSCTR, to be reset on capture
//! event provided by the variable event. Valid inputs for event are
//! \b ECAP_EVENT_1 to \b ECAP_EVENT_4.
//!
//! \return None.
//
//*****************************************************************************
static inline void ECAP_enableCounterResetOnEvent(uint32_t base,
ECAP_Events event)
{
;
__eallow();
//
// Set CTRRST1,CTRRST2,CTRRST3 or CTRRST4 bits
//
(*((volatile uint16_t *)(base + 0x14U))) |= 1U << ((2U * (uint16_t)event) + 1U);
__edis();
}
//*****************************************************************************
//
//! Disables counter reset on events.
//!
//! \param base is the base address of the ECAP module.
//! \param event is the event number the time base gets reset.
//!
//! This function disables the base timer, TSCTR, from being reset on capture
//! event provided by the variable event. Valid inputs for event are
//! \b ECAP_EVENT_1 to \b ECAP_EVENT_4.
//!
//! \return None.
//
//*****************************************************************************
static inline void ECAP_disableCounterResetOnEvent(uint32_t base,
ECAP_Events event)
{
;
__eallow();
//
// Clear CTRRST1,CTRRST2,CTRRST3 or CTRRST4 bits
//
(*((volatile uint16_t *)(base + 0x14U))) &= ~(1U << ((2U * (uint16_t)event) + 1U));
__edis();
}
//*****************************************************************************
//
//! Enables time stamp capture.
//!
//! \param base is the base address of the ECAP module.
//!
//! This function enables time stamp count to be captured
//!
//! \return None.
//
//*****************************************************************************
static inline void ECAP_enableTimeStampCapture(uint32_t base)
{
;
__eallow();
//
// Set CAPLDEN bit
//
(*((volatile uint16_t *)(base + 0x14U))) |= 0x100U;
__edis();
}
//*****************************************************************************
//
//! Disables time stamp capture.
//!
//! \param base is the base address of the ECAP module.
//!
//! This function disables time stamp count to be captured
//!
//! \return None.
//
//*****************************************************************************
static inline void ECAP_disableTimeStampCapture(uint32_t base)
{
;
__eallow();
//
// Clear CAPLDEN bit
//
(*((volatile uint16_t *)(base + 0x14U))) &= ~0x100U;
__edis();
}
//*****************************************************************************
//
//! Sets a phase shift value count.
//!
//! \param base is the base address of the ECAP module.
//! \param shiftCount is the phase shift value.
//!
//! This function writes a phase shift value to be loaded into the main time
//! stamp counter.
//!
//! \return None.
//
//*****************************************************************************
static inline void ECAP_setPhaseShiftCount(uint32_t base, uint32_t shiftCount)
{
;
//
// Write to CTRPHS
//
(*((volatile uint32_t *)(base + 0x2U))) = shiftCount;
}
//*****************************************************************************
//
//! Set up the source for sync-in pulse.
//!
//! \param base is the base address of the ECAP module.
//! \param source is the sync-in pulse source.
//!
//! This function set the sync out pulse mode.
//! Valid values for mode are:
//! - ECAP_SYNC_IN_PULSE_SRC_SYNCOUT_EPWMx - sync-in pulse source can be
//! any of the EPWMx sync-out
//! signal
//! - ECAP_SYNC_IN_PULSE_SRC_SYNCOUT_ECAPx - sync-in pulse source can be
//! selected as any of the ECAPx
//! sync-out signal
//! - ECAP_SYNC_IN_PULSE_SRC_INPUTXBAR_OUT5-6 - sync-in pulse source can be
//! selected as any of the Input
//! xbar out5-6 signal
//! - ECAP_SYNC_IN_PULSE_SRC_FSI_RXA_RX_TRIG1 - sync-in pulse source can be
//! selected as FSI RXA RX trig
//! signal
//! - ECAP_SYNC_IN_PULSE_SRC_DISABLE - sync-in pulse is disabled for the
//! ECAP module
//!
//! \return None.
//
//*****************************************************************************
static inline void
ECAP_setSyncInPulseSource(uint32_t base, ECAP_SyncInPulseSource source)
{
;
__eallow();
//
// Set ECAP Sync-In Source Mode.
//
(*((volatile uint16_t *)(base + 0x1EU))) =
((*((volatile uint16_t *)(base + 0x1EU))) & (~0x1FU)) |
((uint16_t)source & 0x1FU);
__edis();
}
//*****************************************************************************
//
//! Enable counter loading with phase shift value.
//!
//! \param base is the base address of the ECAP module.
//!
//! This function enables loading of the counter with the value present in the
//! phase shift counter as defined by the ECAP_setPhaseShiftCount() function.
//!
//! \return None.
//
//*****************************************************************************
static inline void ECAP_enableLoadCounter(uint32_t base)
{
;
__eallow();
//
// Write to SYNCI_EN
//
(*((volatile uint16_t *)(base + 0x15U))) |= 0x20U;
__edis();
}
//*****************************************************************************
//
//! Disable counter loading with phase shift value.
//!
//! \param base is the base address of the ECAP module.
//!
//! This function disables loading of the counter with the value present in the
//! phase shift counter as defined by the ECAP_setPhaseShiftCount() function.
//!
//! \return None.
//
//*****************************************************************************
static inline void ECAP_disableLoadCounter(uint32_t base)
{
;
__eallow();
//
// Write to SYNCI_EN
//
(*((volatile uint16_t *)(base + 0x15U))) &= ~0x20U;
__edis();
}
//*****************************************************************************
//
//! Load time stamp counter
//!
//! \param base is the base address of the ECAP module.
//!
//! This function forces the value in the phase shift counter register to be
//! loaded into Time stamp counter register.
//! Make sure to enable loading of Time stamp counter by calling
//! ECAP_enableLoadCounter() function before calling this function.
//!
//! \return None.
//
//*****************************************************************************
static inline void ECAP_loadCounter(uint32_t base)
{
;
__eallow();
//
// Write to SWSYNC
//
(*((volatile uint16_t *)(base + 0x15U))) |= 0x100U;
__edis();
}
//*****************************************************************************
//
//! Configures Sync out signal mode.
//!
//! \param base is the base address of the ECAP module.
//! \param mode is the sync out mode.
//!
//! This function sets the sync out mode. Valid parameters for mode are:
//! - ECAP_SYNC_OUT_SYNCI - Trigger sync out on sync-in event.
//! - ECAP_SYNC_OUT_COUNTER_PRD - Trigger sync out when counter equals period.
//! - ECAP_SYNC_OUT_DISABLED - Disable sync out.
//!
//! \return None.
//
//*****************************************************************************
static inline void ECAP_setSyncOutMode(uint32_t base,
ECAP_SyncOutMode mode)
{
;
__eallow();
//
// Write to SYNCO_SEL
//
(*((volatile uint16_t *)(base + 0x15U))) =
(((*((volatile uint16_t *)(base + 0x15U))) & (~0xC0U)) |
(uint16_t)mode);
__edis();
}
//*****************************************************************************
//
//! Stops Time stamp counter.
//!
//! \param base is the base address of the ECAP module.
//!
//! This function stops the time stamp counter.
//!
//! \return None.
//
//*****************************************************************************
static inline void ECAP_stopCounter(uint32_t base)
{
;
__eallow();
//
// Clear TSCTR
//
(*((volatile uint16_t *)(base + 0x15U))) &= ~0x10U;
__edis();
}
//*****************************************************************************
//
//! Starts Time stamp counter.
//!
//! \param base is the base address of the ECAP module.
//!
//! This function starts the time stamp counter.
//!
//! \return None.
//
//*****************************************************************************
static inline void ECAP_startCounter(uint32_t base)
{
;
__eallow();
//
// Set TSCTR
//
(*((volatile uint16_t *)(base + 0x15U))) |= 0x10U;
__edis();
}
//*****************************************************************************
//
//! Set eCAP APWM polarity.
//!
//! \param base is the base address of the ECAP module.
//! \param polarity is the polarity of APWM
//!
//! This function sets the polarity of the eCAP in APWM mode. Valid inputs for
//! polarity are:
//! - ECAP_APWM_ACTIVE_HIGH - For active high.
//! - ECAP_APWM_ACTIVE_LOW - For active low.
//!
//! \return None.
//
//*****************************************************************************
static inline void ECAP_setAPWMPolarity(uint32_t base,
ECAP_APWMPolarity polarity)
{
;
__eallow();
(*((volatile uint16_t *)(base + 0x15U))) =
(((*((volatile uint16_t *)(base + 0x15U))) & ~0x400U) |
(uint16_t)polarity);
__edis();
}
//*****************************************************************************
//
//! Set eCAP APWM period.
//!
//! \param base is the base address of the ECAP module.
//! \param periodCount is the period count for APWM.
//!
//! This function sets the period count of the APWM waveform.
//! periodCount takes the actual count which is written to the register. The
//! user is responsible for converting the desired frequency or time into
//! the period count.
//!
//! \return None.
//
//*****************************************************************************
static inline void ECAP_setAPWMPeriod(uint32_t base, uint32_t periodCount)
{
;
//
// Write to CAP1
//
(*((volatile uint32_t *)(base + 0x4U))) = periodCount;
}
//*****************************************************************************
//
//! Set eCAP APWM on or off time count.
//!
//! \param base is the base address of the ECAP module.
//! \param compareCount is the on or off count for APWM.
//!
//! This function sets the on or off time count of the APWM waveform depending
//! on the polarity of the output. If the output , as set by
//! ECAP_setAPWMPolarity(), is active high then compareCount determines the on
//! time. If the output is active low then compareCount determines the off
//! time. compareCount takes the actual count which is written to the register.
//! The user is responsible for converting the desired frequency or time into
//! the appropriate count value.
//!
//! \return None.
//
//*****************************************************************************
static inline void ECAP_setAPWMCompare(uint32_t base, uint32_t compareCount)
{
;
//
// Write to CAP2
//
(*((volatile uint32_t *)(base + 0x6U))) = compareCount;
}
//*****************************************************************************
//
//! Load eCAP APWM shadow period.
//!
//! \param base is the base address of the ECAP module.
//! \param periodCount is the shadow period count for APWM.
//!
//! This function sets the shadow period count of the APWM waveform.
//! periodCount takes the actual count which is written to the register. The
//! user is responsible for converting the desired frequency or time into
//! the period count.
//!
//! \return None.
//
//*****************************************************************************
static inline void ECAP_setAPWMShadowPeriod(uint32_t base,
uint32_t periodCount)
{
;
//
// Write to CAP3
//
(*((volatile uint32_t *)(base + 0x8U))) = periodCount;
}
//*****************************************************************************
//
//! Set eCAP APWM shadow on or off time count.
//!
//! \param base is the base address of the ECAP module.
//! \param compareCount is the on or off count for APWM.
//!
//! This function sets the shadow on or off time count of the APWM waveform
//! depending on the polarity of the output. If the output , as set by
//! ECAP_setAPWMPolarity() , is active high then compareCount determines the
//! on time. If the output is active low then compareCount determines the off
//! time. compareCount takes the actual count which is written to the register.
//! The user is responsible for converting the desired frequency or time into
//! the appropriate count value.
//!
//! \return None.
//
//*****************************************************************************
static inline void ECAP_setAPWMShadowCompare(uint32_t base,
uint32_t compareCount)
{
;
//
// Write to CAP4
//
(*((volatile uint32_t *)(base + 0xAU))) = compareCount;
}
//*****************************************************************************
//
//! Returns the time base counter value.
//!
//! \param base is the base address of the ECAP module.
//!
//! This function returns the time base counter value.
//!
//! \return Returns the time base counter value.
//
//*****************************************************************************
static inline uint32_t ECAP_getTimeBaseCounter(uint32_t base)
{
;
//
// Read the Time base counter value
//
return((*((volatile uint32_t *)(base + 0x0U))));
}
//*****************************************************************************
//
//! Returns event time stamp.
//!
//! \param base is the base address of the ECAP module.
//! \param event is the event number.
//!
//! This function returns the current time stamp count of the given event.
//! Valid values for event are \b ECAP_EVENT_1 to \b ECAP_EVENT_4.
//!
//! \return Event time stamp value or 0 if \e event is invalid.
//
//*****************************************************************************
static inline uint32_t ECAP_getEventTimeStamp(uint32_t base, ECAP_Events event)
{
uint32_t count;
;
switch(event)
{
case ECAP_EVENT_1:
//
// Read CAP1 register
//
count = (*((volatile uint32_t *)(base + 0x4U)));
break;
case ECAP_EVENT_2:
//
// Read CAP2 register
//
count = (*((volatile uint32_t *)(base + 0x6U)));
break;
case ECAP_EVENT_3:
//
// Read CAP3 register
//
count = (*((volatile uint32_t *)(base + 0x8U)));
break;
case ECAP_EVENT_4:
//
// Read CAP4 register
//
count = (*((volatile uint32_t *)(base + 0xAU)));
break;
default:
//
// Invalid event parameter
//
count = 0U;
break;
}
return(count);
}
//*****************************************************************************
//
//! Select eCAP input.
//!
//! \param base is the base address of the ECAP module.
//! \param input is the eCAP input signal.
//!
//! This function selects the eCAP input signal.
//!
//! Please refer to the ::ECAP_InputCaptureSignals Enum for the valid values
//! to be passed to \e input parameter.
//!
//! \return None.
//
//*****************************************************************************
static inline void ECAP_selectECAPInput(uint32_t base,
ECAP_InputCaptureSignals input)
{
;
__eallow();
//
// Write to ECCTL0
//
(*((volatile uint16_t *)(base + 0x12U))) =
(((*((volatile uint16_t *)(base + 0x12U))) & ~0x7FU) |
(uint16_t)input);
__edis();
}
//*****************************************************************************
//
//! Resets eCAP counters and flags.
//!
//! \param base is the base address of the ECAP module.
//!
//! This function resets the main counter (TSCTR register), event filter,
//! modulo counter, capture events and counter overflow flags
//!
//! \return None.
//
//*****************************************************************************
static inline void ECAP_resetCounters(uint32_t base)
{
;
__eallow();
//
// Write to ECCTL2
//
(*((volatile uint16_t *)(base + 0x15U))) |= 0x800U;
__edis();
}
//*****************************************************************************
//
//! Sets the eCAP DMA source.
//!
//! \param base is the base address of the ECAP module.
//! \param event is the eCAP event for the DMA
//!
//! This function sets the eCAP event source for the DMA trigger.
//! Valid values for \e event are \b ECAP_EVENT_1 to \b ECAP_EVENT_4.
//!
//! \return None.
//
//*****************************************************************************
static inline void ECAP_setDMASource(uint32_t base, ECAP_Events event)
{
;
__eallow();
//
// Write to ECCTL2
//
(*((volatile uint16_t *)(base + 0x15U))) =
(((*((volatile uint16_t *)(base + 0x15U))) & ~0x3000U) |
((uint16_t)event << 12U));
__edis();
}
//*****************************************************************************
//
//! Return the Modulo counter status.
//!
//! \param base is the base address of the ECAP module.
//!
//! This function returns the modulo counter status, indicating which register
//! gets loaded on the next capture event.
//!
//! \return Returns an \b ECAP_EVENT_n value indicating that CAPn is the
//! register to be loaded on the next event.
//
//*****************************************************************************
static inline ECAP_Events ECAP_getModuloCounterStatus(uint32_t base)
{
uint16_t counterStatusValue;
;
counterStatusValue = ((((*((volatile uint16_t *)(base + 0x15U))) &
0xC000U) >>
14U));
//
// Read MODCNTRSTS bit
//
return((ECAP_Events)(counterStatusValue));
}
//*****************************************************************************
//
//! Configures emulation mode.
//!
//! \param base is the base address of the ECAP module.
//! \param mode is the emulation mode.
//!
//! This function configures the eCAP counter, TSCTR, to the desired emulation
//! mode when emulation suspension occurs. Valid inputs for mode are:
//! - ECAP_EMULATION_STOP - Counter is stopped immediately.
//! - ECAP_EMULATION_RUN_TO_ZERO - Counter runs till it reaches 0.
//! - ECAP_EMULATION_FREE_RUN - Counter is not affected.
//!
//! \return None.
//
//*****************************************************************************
extern void ECAP_setEmulationMode(uint32_t base, ECAP_EmulationMode mode);
//*****************************************************************************
//
// Close the Doxygen group.
//! @}
//
//*****************************************************************************
//*****************************************************************************
//
// Mark the end of the C bindings section for C++ compilers.
//
//*****************************************************************************
//###########################################################################
//
// FILE: epg.h
//
// TITLE: C28x EPG driver.
//
//###########################################################################
// $Copyright:
// Copyright (C) 2023 Texas Instruments Incorporated - http://www.ti.com/
//
// 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 Texas Instruments Incorporated 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
// OWNER 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.
// $
//###########################################################################
//###########################################################################
//
// FILE: hw_epg.h
//
// TITLE: Definitions for the EPG registers.
//
//###########################################################################
// $Copyright:
// Copyright (C) 2023 Texas Instruments Incorporated - http://www.ti.com/
//
// 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 Texas Instruments Incorporated 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
// OWNER 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.
// $
//###########################################################################
//*************************************************************************************************
//
// The following are defines for the EPG register offsets
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the GCTL0 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the GCTL1 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the GCTL2 register
//
//*************************************************************************************************
// output 0.
// output 1.
// output 2.
// output 3.
// output 4.
// output 5.
// output 6.
// output 7.
//*************************************************************************************************
//
// The following are defines for the bit fields in the GCTL3 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the EPGLOCK register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the EPGCOMMIT register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the GINTSTS register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the GINTEN register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the GINTCLR register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the GINTFRC register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the CLKDIV0_CTL0 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the CLKDIV0_CLKOFFSET register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the CLKDIV1_CTL0 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the CLKDIV1_CLKOFFSET register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the SIGGEN0_CTL0 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the SIGGEN0_CTL1 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the EPGMXSEL0 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the EPGMXSELLOCK register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the EPGMXSELCOMMIT register
//
//*************************************************************************************************
//*****************************************************************************
//
// Useful defines used within the driver functions. Not intended for use by
// application code.
//
//*****************************************************************************
//*****************************************************************************
//
//! Values that can be passed to EPG_selectGlobalOutput() as the \e gPinOutSel
//! parameter.
//
//*****************************************************************************
typedef enum
{
EPG_OUT_SEL_SIG = 0x0U, //!< Signal Generator mux output
EPG_OUT_SEL_CLK = 0x1U //!< Clock Generator mux output
} EPG_OutputSelect;
//*****************************************************************************
//
//! Values that can be passed to EPG_selectSignalOutput() as the
//! \e sigGenOutput parameter.
//
//*****************************************************************************
typedef enum
{
EPG_SIGGEN0_DATATRANOUT0 = 0x0U, //!< Signal Generator 0 Data Transform out 0
EPG_SIGGEN0_DATATRANOUT1 = 0x1U, //!< Signal Generator 0 Data Transform out 1
EPG_SIGGEN0_DATATRANOUT2 = 0x2U, //!< Signal Generator 0 Data Transform out 2
EPG_SIGGEN0_DATATRANOUT3 = 0x3U, //!< Signal Generator 0 Data Transform out 3
EPG_SIGGEN0_DATATRANOUT4 = 0x4U, //!< Signal Generator 0 Data Transform out 4
EPG_SIGGEN0_DATATRANOUT5 = 0x5U, //!< Signal Generator 0 Data Transform out 5
EPG_SIGGEN0_DATATRANOUT6 = 0x6U, //!< Signal Generator 0 Data Transform out 6
EPG_SIGGEN0_DATATRANOUT7 = 0x7U, //!< Signal Generator 0 Data Transform out 7
} EPG_SignalGenOut;
//*****************************************************************************
//
//! Values that can be passed to EPG_selectClkOutput()
//! as the \e clkGenOutput parameter.
//
//*****************************************************************************
typedef enum
{
EPG_CLKGEN0_CLKOUT0_DCLK = 0x0U, //!< Clock Generator 0 Clk output 0 DCLK
EPG_CLKGEN0_CLKOUT1_DCLK = 0x1U, //!< Clock Generator 0 Clk output 1 DCLK
EPG_CLKGEN0_CLKOUT2_DCLK = 0x2U, //!< Clock Generator 0 Clk output 2 DCLK
EPG_CLKGEN0_CLKOUT3_DCLK = 0x3U, //!< Clock Generator 0 Clk output 3 DCLK
EPG_CLKGEN1_CLKOUT0_DCLK = 0x4U, //!< Clock Generator 1 Clk output 0 DCLK
EPG_CLKGEN1_CLKOUT1_DCLK = 0x5U, //!< Clock Generator 1 Clk output 1 DCLK
EPG_CLKGEN1_CLKOUT2_DCLK = 0x6U, //!< Clock Generator 1 Clk output 2 DCLK
EPG_CLKGEN1_CLKOUT3_DCLK = 0x7U, //!< Clock Generator 1 Clk output 3 DCLK
} EPG_ClockGenOut;
//*****************************************************************************
//
//! Values that can be passed to EPG_selectSigGenClkSource()
//! as the \e clkGenOutput parameter.
//
//*****************************************************************************
typedef enum
{
EPG_CLKGEN0_CLKOUT0_GCLK = 0x0U, //!< Clock Generator 0 Clk output 0 GCLK
EPG_CLKGEN0_CLKOUT1_GCLK = 0x1U, //!< Clock Generator 0 Clk output 1 GCLK
EPG_CLKGEN0_CLKOUT2_GCLK = 0x2U, //!< Clock Generator 0 Clk output 2 GCLK
EPG_CLKGEN0_CLKOUT3_GCLK = 0x3U, //!< Clock Generator 0 Clk output 3 GCLK
EPG_CLKGEN1_CLKOUT0_GCLK = 0x4U, //!< Clock Generator 1 Clk output 0 GCLK
EPG_CLKGEN1_CLKOUT1_GCLK = 0x5U, //!< Clock Generator 1 Clk output 1 GCLK
EPG_CLKGEN1_CLKOUT2_GCLK = 0x6U, //!< Clock Generator 1 Clk output 2 GCLK
EPG_CLKGEN1_CLKOUT3_GCLK = 0x7U, //!< Clock Generator 1 Clk output 3 GCLK
} EPG_ClockGenGclkOut;
//*****************************************************************************
//
//! Values that can be passed to EPG_setClkGenStopEdge(),
//! as the \e stopEdge parameter.
//
//*****************************************************************************
typedef enum
{
EPG_CLK_STOP_EDGE_CLKOUT0 = 0x000U, //!< Stop on Clk output 0
EPG_CLK_STOP_EDGE_CLKOUT1 = 0x010U, //!< Stop on Clk output 1
EPG_CLK_STOP_EDGE_CLKOUT2 = 0x100U, //!< Stop on Clk output 2
EPG_CLK_STOP_EDGE_CLKOUT3 = 0x110U, //!< Stop on Clk output 3
} EPG_ClockStopEdge;
//*****************************************************************************
//
//! Values that can be passed to EPG_setSignalGenMode(),
//! as the \e sigGenMode parameter.
//
//*****************************************************************************
typedef enum
{
EPG_SIGGEN_MODE_BIT_BANG = 0x0U, //!< BIT BANG MODE
EPG_SIGGEN_MODE_SHIFT_RIGHT_ONCE = 0x1U, //!< SHIFT RIGHT ONCE MODE
EPG_SIGGEN_MODE_ROTATE_RIGHT_ONCE = 0x2U, //!< ROTATE RIGHT ONCE MODE
EPG_SIGGEN_MODE_ROTATE_RIGHT_REPEAT = 0x3U, //!< ROTATE RIGHT REPEAT MODE
EPG_SIGGEN_MODE_SHIFT_LEFT_ONCE = 0x4U, //!< SHIFT LEFT ONCE MODE
EPG_SIGGEN_MODE_ROTATE_LEFT_ONCE = 0x5U, //!< ROTATE LEFT ONCE MODE
EPG_SIGGEN_MODE_ROTATE_LEFT_REPEAT = 0x6U, //!< ROTATE LEFT REPEAT
EPG_SIGGEN_MODE_SHIFT_RIGHT_REPEAT = 0x7U, //!< SHIFT RIGHT REPEAT MODE
EPG_SIGGEN_MODE_SHIFT_LEFT_REPEAT = 0x8U, //!< SHIGT LEFT REPEAT MODE
} EPG_SignalGenMode;
//*****************************************************************************
//
//! Values that can be passed to EPG_setData0In(),
//! as the \e data0Input parameter.
//
//*****************************************************************************
typedef enum
{
EPG_SIGGEN_DATA0_DATA_NEXT0 = 0x0U, //!< DATA TRANSFORM NEXT[0]
EPG_SIGGEN_DATA0_EPGIN0 = 0x1U, //!< EPG Input 0
EPG_SIGGEN_DATA0_EPGIN1 = 0x2U, //!< EPG Input 1
EPG_SIGGEN_DATA0_EPGIN2 = 0x3U, //!< EPG Input 2
EPG_SIGGEN_DATA0_EPGIN3 = 0x4U, //!< EPG Input 3
EPG_SIGGEN_DATA0_EPGIN4 = 0x5U, //!< EPG Input 4
EPG_SIGGEN_DATA0_EPGIN5 = 0x6U, //!< EPG Input 5
EPG_SIGGEN_DATA0_EPGIN6 = 0x7U, //!< EPG Input 6
EPG_SIGGEN_DATA0_EPGIN7 = 0x8U, //!< EPG Input 7
} EPG_SignalGenData0In;
//*****************************************************************************
//
//! Values that can be passed to EPG_setData63In(),
//! as the \e data63Input parameter.
//
//*****************************************************************************
typedef enum
{
EPG_SIGGEN_DATA63_DATA_NEXT63 = 0x0U, //!< DATA TRANSFORM NEXT[63]
EPG_SIGGEN_DATA63_EPGIN0 = 0x1U, //!< EPG Input 0
EPG_SIGGEN_DATA63_EPGIN1 = 0x2U, //!< EPG Input 1
EPG_SIGGEN_DATA63_EPGIN2 = 0x3U, //!< EPG Input 2
EPG_SIGGEN_DATA63_EPGIN3 = 0x4U, //!< EPG Input 3
EPG_SIGGEN_DATA63_EPGIN4 = 0x5U, //!< EPG Input 4
EPG_SIGGEN_DATA63_EPGIN5 = 0x6U, //!< EPG Input 5
EPG_SIGGEN_DATA63_EPGIN6 = 0x7U, //!< EPG Input 6
EPG_SIGGEN_DATA63_EPGIN7 = 0x8U, //!< EPG Input 7
} EPG_SignalGenData63In;
//*****************************************************************************
//
//! Values that can be passed to EPG_selectEPGOutput(), EPG_selectClkOutput,
//! EPG_selectSignalOutput as the \e gPinNum parameter.
//
//*****************************************************************************
typedef enum
{
EPG_OUT0 = 0x0U, //!< EPG Output 0
EPG_OUT1 = 0x1U, //!< EPG Output 1
EPG_OUT2 = 0x2U, //!< EPG Output 2
EPG_OUT3 = 0x3U, //!< EPG Output 3
EPG_OUT4 = 0x4U, //!< EPG Output 4
EPG_OUT5 = 0x5U, //!< EPG Output 5
EPG_OUT6 = 0x6U, //!< EPG Output 6
} EPG_OUT;
//*****************************************************************************
//
//! Values that can be used for \e sigGenNum parameter.
//
//*****************************************************************************
typedef enum
{
EPG_SIGGEN0 = 0x0U, //!< Signal Generator 0
} EPG_SIGGEN;
//*****************************************************************************
//
//! Values that can be used for \e clkGenNum parameter.
//
//*****************************************************************************
typedef enum
{
EPG_CLKGEN0 = 0x0U, //!< Clock Generator 0
EPG_CLKGEN1 = 0x1U, //> 2U) << syncModeOffset) |
(((uint16_t)loadMode & 0x3U) << loadModeOffset)));
}
//*****************************************************************************
//
//! Disable Counter Compare shadow load mode
//!
//! \param base is the base address of the EPWM module.
//! \param compModule is the counter compare module.
//!
//! This function disables counter compare shadow load mode.
//! Valid values for the variables are:
//! - compModule
//! - EPWM_COUNTER_COMPARE_A - counter compare A.
//! - EPWM_COUNTER_COMPARE_B - counter compare B.
//! - EPWM_COUNTER_COMPARE_C - counter compare C.
//! - EPWM_COUNTER_COMPARE_D - counter compare D.
//!
//! \return None.
//
//*****************************************************************************
static inline void
EPWM_disableCounterCompareShadowLoadMode(uint32_t base,
EPWM_CounterCompareModule compModule)
{
uint16_t shadowModeOffset;
uint32_t registerOffset;
//
// Check the arguments
//
;
if((compModule == EPWM_COUNTER_COMPARE_A) ||
(compModule == EPWM_COUNTER_COMPARE_C))
{
shadowModeOffset = 4U;
}
else
{
shadowModeOffset = 6U;
}
//
// Get the register offset. EPWM_O_CMPCTL for A&B or
// EPWM_O_CMPCTL2 for C&D
//
registerOffset = base + 0x8U + ((uint32_t)compModule & 0x1U);
//
// Disable shadow load mode.
//
(*((volatile uint16_t *)(registerOffset))) = ((*((volatile uint16_t *)(registerOffset))) |
(0x1U << shadowModeOffset));
}
//*****************************************************************************
//
//! Set counter compare values.
//!
//! \param base is the base address of the EPWM module.
//! \param compModule is the Counter Compare value module.
//! \param compCount is the counter compare count value.
//!
//! This function sets the counter compare value for counter compare registers.
//! The maximum value for compCount is 0xFFFF.
//! Valid values for compModule are:
//! - EPWM_COUNTER_COMPARE_A - counter compare A.
//! - EPWM_COUNTER_COMPARE_B - counter compare B.
//! - EPWM_COUNTER_COMPARE_C - counter compare C.
//! - EPWM_COUNTER_COMPARE_D - counter compare D.
//!
//! \return None.
//
//*****************************************************************************
static inline void
EPWM_setCounterCompareValue(uint32_t base, EPWM_CounterCompareModule compModule,
uint16_t compCount)
{
uint32_t registerOffset;
//
// Check the arguments
//
;
//
// Get the register offset for the Counter compare
//
registerOffset = 0x6AU + (uint32_t)compModule;
//
// Write to the counter compare registers.
//
if((compModule == EPWM_COUNTER_COMPARE_A) ||
(compModule == EPWM_COUNTER_COMPARE_B))
{
//
// Write to COMPA or COMPB bits
//
(*((volatile uint16_t *)(base + registerOffset + 0x1U))) = compCount;
}
else
{
//
// Write to COMPC or COMPD bits
//
(*((volatile uint16_t *)(base + registerOffset))) = compCount;
}
}
//*****************************************************************************
//
//! Get counter compare values.
//!
//! \param base is the base address of the EPWM module.
//! \param compModule is the Counter Compare value module.
//!
//! This function gets the counter compare value for counter compare registers.
//! Valid values for compModule are:
//! - EPWM_COUNTER_COMPARE_A - counter compare A.
//! - EPWM_COUNTER_COMPARE_B - counter compare B.
//! - EPWM_COUNTER_COMPARE_C - counter compare C.
//! - EPWM_COUNTER_COMPARE_D - counter compare D.
//!
//! \return The counter compare count value.
//
//*****************************************************************************
static inline uint16_t
EPWM_getCounterCompareValue(uint32_t base, EPWM_CounterCompareModule compModule)
{
uint32_t registerOffset;
uint16_t compCount;
//
// Check the arguments
//
;
//
// Get the register offset for the Counter compare
//
registerOffset = 0x6AU + (uint32_t)compModule;
//
// Read from the counter compare registers.
//
if((compModule == EPWM_COUNTER_COMPARE_A) ||
(compModule == EPWM_COUNTER_COMPARE_B))
{
//
// Read COMPA or COMPB bits
//
compCount = (uint16_t)(((*((volatile uint32_t *)(base + registerOffset))) &
0xFFFF0000UL) >> 16U);
}
else
{
//
// Read COMPC or COMPD bits
//
compCount = (*((volatile uint16_t *)(base + registerOffset)));
}
return(compCount);
}
//*****************************************************************************
//
//! Return the counter compare shadow register full status.
//!
//! \param base is the base address of the EPWM module.
//! \param compModule is the Counter Compare value module.
//!
//! This function returns the counter Compare shadow register full status flag.
//! Valid values for compModule are:
//! - EPWM_COUNTER_COMPARE_A - counter compare A.
//! - EPWM_COUNTER_COMPARE_B - counter compare B.
//!
//! \return Returns true if the shadow register is full.
//! Returns false if the shadow register is not full.
//
//*****************************************************************************
static inline _Bool
EPWM_getCounterCompareShadowStatus(uint32_t base,
EPWM_CounterCompareModule compModule)
{
//
// Check the arguments
//
;
//
// Check the validity of input.
// COMPA and COMPB are valid input arguments.
//
;
//
// Read the value of SHDWAFULL or SHDWBFULL bit
//
return(((((*((volatile uint32_t *)(base + 0x8U))) >>
((((uint16_t)compModule >> 1U) & 0x1U) + 8U)) &
0x1U) == 0x1U) ? 1:0);
}
//
// Action Qualifier module related APIs
//
//*****************************************************************************
//
//! Sets the Action Qualifier shadow load mode
//!
//! \param base is the base address of the EPWM module.
//! \param aqModule is the Action Qualifier module value.
//! \param loadMode is the shadow to active load mode.
//!
//! This function enables and sets the Action Qualifier shadow load mode.
//! Valid values for the variables are:
//! - aqModule
//! - EPWM_ACTION_QUALIFIER_A - Action Qualifier A.
//! - EPWM_ACTION_QUALIFIER_B - Action Qualifier B.
//! - loadMode
//! - EPWM_AQ_LOAD_ON_CNTR_ZERO - load when counter equals zero
//! - EPWM_AQ_LOAD_ON_CNTR_PERIOD - load when counter equals period
//! - EPWM_AQ_LOAD_ON_CNTR_ZERO_PERIOD - load when counter equals
//! zero or period
//! - EPWM_AQ_LOAD_FREEZE - Freeze shadow to active load
//! - EPWM_AQ_LOAD_ON_SYNC_CNTR_ZERO - load on sync or when counter
//! equals zero
//! - EPWM_AQ_LOAD_ON_SYNC_CNTR_PERIOD - load on sync or when counter
//! equals period
//! - EPWM_AQ_LOAD_ON_SYNC_CNTR_ZERO_PERIOD - load on sync or when
//! counter equals zero or period
//! - EPWM_AQ_LOAD_ON_SYNC_ONLY - load on sync only
//!
//! \return None.
//
//*****************************************************************************
static inline void
EPWM_setActionQualifierShadowLoadMode(uint32_t base,
EPWM_ActionQualifierModule aqModule,
EPWM_ActionQualifierLoadMode loadMode)
{
uint16_t syncModeOffset;
uint16_t shadowModeOffset;
//
// Check the arguments
//
;
syncModeOffset = 8U + (uint16_t)aqModule;
shadowModeOffset = 4U + (uint16_t)aqModule;
//
// Set the appropriate sync and load mode bits and also enable shadow
// load mode. Shadow to active load can also be frozen.
//
(*((volatile uint16_t *)(base + 0x10U))) = (((*((volatile uint16_t *)(base + 0x10U))) &
(~((0x3U << (uint16_t)aqModule) |
(0x3U << (uint16_t)syncModeOffset))) |
(0x1U << shadowModeOffset)) |
((((uint16_t)loadMode >> 2U) <<
syncModeOffset) | (((uint16_t)loadMode &
0x3U) << (uint16_t)aqModule)));
}
//*****************************************************************************
//
//! Disable Action Qualifier shadow load mode
//!
//! \param base is the base address of the EPWM module.
//! \param aqModule is the Action Qualifier module value.
//!
//! This function disables the Action Qualifier shadow load mode.
//! Valid values for the variables are:
//! - aqModule
//! - EPWM_ACTION_QUALIFIER_A - Action Qualifier A.
//! - EPWM_ACTION_QUALIFIER_B - Action Qualifier B.
//!
//! \return None.
//
//*****************************************************************************
static inline void
EPWM_disableActionQualifierShadowLoadMode(uint32_t base,
EPWM_ActionQualifierModule aqModule)
{
uint16_t shadowModeOffset;
//
// Check the arguments
//
;
shadowModeOffset = 4U + (uint16_t)aqModule;
//
// Disable shadow load mode. Action qualifier is loaded on
// immediate mode only.
//
(*((volatile uint16_t *)(base + 0x10U))) &= ~(1U << shadowModeOffset);
}
//*****************************************************************************
//
//! Set up Action qualifier trigger source for event T1
//!
//! \param base is the base address of the EPWM module.
//! \param trigger sources for Action Qualifier triggers.
//!
//! This function sets up the sources for Action Qualifier event T1.
//! Valid values for trigger are:
//! - EPWM_AQ_TRIGGER_EVENT_TRIG_DCA_1 - Digital compare event A 1
//! - EPWM_AQ_TRIGGER_EVENT_TRIG_DCA_2 - Digital compare event A 2
//! - EPWM_AQ_TRIGGER_EVENT_TRIG_DCB_1 - Digital compare event B 1
//! - EPWM_AQ_TRIGGER_EVENT_TRIG_DCB_2 - Digital compare event B 2
//! - EPWM_AQ_TRIGGER_EVENT_TRIG_TZ_1 - Trip zone 1
//! - EPWM_AQ_TRIGGER_EVENT_TRIG_TZ_2 - Trip zone 2
//! - EPWM_AQ_TRIGGER_EVENT_TRIG_TZ_3 - Trip zone 3
//! - EPWM_AQ_TRIGGER_EVENT_TRIG_EPWM_SYNCIN - ePWM sync
//! - EPWM_AQ_TRIGGER_EVENT_TRIG_DC_EVTFILT - Digital compare filter event
//!
//! \return None.
//
//*****************************************************************************
static inline void
EPWM_setActionQualifierT1TriggerSource(uint32_t base,
EPWM_ActionQualifierTriggerSource trigger)
{
//
// Check the arguments
//
;
//
// Set T1 trigger source
//
(*((volatile uint16_t *)(base + 0x11U))) =
(((*((volatile uint16_t *)(base + 0x11U))) & (~0xFU)) |
((uint16_t)trigger));
}
//*****************************************************************************
//
//! Set up Action qualifier trigger source for event T2
//!
//! \param base is the base address of the EPWM module.
//! \param trigger sources for Action Qualifier triggers.
//!
//! This function sets up the sources for Action Qualifier event T2.
//! Valid values for trigger are:
//! - EPWM_AQ_TRIGGER_EVENT_TRIG_DCA_1 - Digital compare event A 1
//! - EPWM_AQ_TRIGGER_EVENT_TRIG_DCA_2 - Digital compare event A 2
//! - EPWM_AQ_TRIGGER_EVENT_TRIG_DCB_1 - Digital compare event B 1
//! - EPWM_AQ_TRIGGER_EVENT_TRIG_DCB_2 - Digital compare event B 2
//! - EPWM_AQ_TRIGGER_EVENT_TRIG_TZ_1 - Trip zone 1
//! - EPWM_AQ_TRIGGER_EVENT_TRIG_TZ_2 - Trip zone 2
//! - EPWM_AQ_TRIGGER_EVENT_TRIG_TZ_3 - Trip zone 3
//! - EPWM_AQ_TRIGGER_EVENT_TRIG_EPWM_SYNCIN - ePWM sync
//! - EPWM_AQ_TRIGGER_EVENT_TRIG_DC_EVTFILT - Digital compare filter event
//!
//! \return None.
//
//*****************************************************************************
static inline void
EPWM_setActionQualifierT2TriggerSource(uint32_t base,
EPWM_ActionQualifierTriggerSource trigger)
{
//
// Check the arguments
//
;
//
// Set T2 trigger source
//
(*((volatile uint16_t *)(base + 0x11U))) =
(((*((volatile uint16_t *)(base + 0x11U))) & (~0xF0U)) |
((uint16_t)trigger << 4U));
}
//*****************************************************************************
//
//! Set up Action qualifier outputs
//!
//! \param base is the base address of the EPWM module.
//! \param epwmOutput is the ePWM pin type.
//! \param output is the Action Qualifier output.
//! \param event is the event that causes a change in output.
//!
//! This function sets up the Action Qualifier output on ePWM A or ePWMB,
//! depending on the value of epwmOutput, to a value specified by outPut based
//! on the input events - specified by event.
//! The following are valid values for the parameters.
//! - epwmOutput
//! - EPWM_AQ_OUTPUT_A - ePWMxA output
//! - EPWM_AQ_OUTPUT_B - ePWMxB output
//! - output
//! - EPWM_AQ_OUTPUT_NO_CHANGE - No change in the output pins
//! - EPWM_AQ_OUTPUT_LOW - Set output pins to low
//! - EPWM_AQ_OUTPUT_HIGH - Set output pins to High
//! - EPWM_AQ_OUTPUT_TOGGLE - Toggle the output pins
//! - event
//! - EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO - Time base counter equals
//! zero
//! - EPWM_AQ_OUTPUT_ON_TIMEBASE_PERIOD - Time base counter equals
//! period
//! - EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA - Time base counter up equals
//! COMPA
//! - EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPA - Time base counter down
//! equals COMPA
//! - EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPB - Time base counter up equals
//! COMPB
//! - EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPB - Time base counter down
//! equals COMPB
//! - EPWM_AQ_OUTPUT_ON_T1_COUNT_UP - T1 event on count up
//! - EPWM_AQ_OUTPUT_ON_T1_COUNT_DOWN - T1 event on count down
//! - EPWM_AQ_OUTPUT_ON_T2_COUNT_UP - T2 event on count up
//! - EPWM_AQ_OUTPUT_ON_T2_COUNT_DOWN - T2 event on count down
//!
//! \return None.
//
//*****************************************************************************
static inline void
EPWM_setActionQualifierAction(uint32_t base,
EPWM_ActionQualifierOutputModule epwmOutput,
EPWM_ActionQualifierOutput output,
EPWM_ActionQualifierOutputEvent event)
{
uint32_t registerOffset;
uint32_t registerTOffset;
//
// Check the arguments
//
;
//
// Get the register offset
//
registerOffset = 0x40U + (uint32_t)epwmOutput;
registerTOffset = 0x41U + (uint32_t)epwmOutput;
//
// If the event occurs on T1 or T2 events
//
if(((uint16_t)event & 0x1U) == 1U)
{
//
// Write to T1U,T1D,T2U or T2D of AQCTLA2 register
//
(*((volatile uint16_t *)(base + registerTOffset))) =
(((*((volatile uint16_t *)(base + registerTOffset))) & ~(3U << ((uint16_t)event - 1U))) |
((uint16_t)output << ((uint16_t)event - 1U)));
}
else
{
//
// Write to ZRO,PRD,CAU,CAD,CBU or CBD bits of AQCTLA register
//
(*((volatile uint16_t *)(base + registerOffset))) =
(((*((volatile uint16_t *)(base + registerOffset))) & ~(3U << (uint16_t)event)) |
((uint16_t)output << (uint16_t)event));
}
}
//*****************************************************************************
//
//! Set up Action qualifier event outputs
//!
//! \param base is the base address of the EPWM module.
//! \param epwmOutput is the ePWM pin type.
//! \param action is the desired action when the specified event occurs
//!
//! This function sets up the Action Qualifier output on ePWMA or ePWMB,
//! depending on the value of epwmOutput, to a value specified by action.
//! Valid action param values from different time base counter scenarios
//! should be OR'd together to configure complete action for a pwm output.
//! The following are valid values for the parameters.
//! - epwmOutput
//! - EPWM_AQ_OUTPUT_A - ePWMxA output
//! - EPWM_AQ_OUTPUT_B - ePWMxB output
//!
//! - action
//! - When time base counter equals zero
//! - EPWM_AQ_OUTPUT_NO_CHANGE_ZERO - Time base counter equals zero
//! and no change in output pins
//! - EPWM_AQ_OUTPUT_LOW_ZERO - Time base counter equals zero
//! and set output pins to low
//! - EPWM_AQ_OUTPUT_HIGH_ZERO - Time base counter equals zero
//! and set output pins to high
//! - EPWM_AQ_OUTPUT_TOGGLE_ZERO - Time base counter equals zero
//! and toggle the output pins
//! - When time base counter equals period
//! - EPWM_AQ_OUTPUT_NO_CHANGE_PERIOD - Time base counter equals period
//! and no change in output pins
//! - EPWM_AQ_OUTPUT_LOW_PERIOD - Time base counter equals period
//! and set output pins to low
//! - EPWM_AQ_OUTPUT_HIGH_PERIOD - Time base counter equals period
//! and set output pins to high
//! - EPWM_AQ_OUTPUT_TOGGLE_PERIOD - Time base counter equals period
//! and toggle the output pins
//! - When time base counter equals CMPA during up-count
//! - EPWM_AQ_OUTPUT_NO_CHANGE_UP_CMPA - Time base counter up equals
//! COMPA and no change in the
//! output pins
//! - EPWM_AQ_OUTPUT_LOW_UP_CMPA - Time base counter up equals
//! COMPA and set output pins low
//! - EPWM_AQ_OUTPUT_HIGH_UP_CMPA - Time base counter up equals
//! COMPA and set output pins high
//! - EPWM_AQ_OUTPUT_TOGGLE_UP_CMPA - Time base counter up equals
//! COMPA and toggle output pins
//! - When time base counter equals CMPA during down-count
//! - EPWM_AQ_OUTPUT_NO_CHANGE_DOWN_CMPA - Time base counter down equals
//! COMPA and no change in the
//! output pins
//! - EPWM_AQ_OUTPUT_LOW_DOWN_CMPA - Time base counter down equals
//! COMPA and set output pins low
//! - EPWM_AQ_OUTPUT_HIGH_DOWN_CMPA - Time base counter down equals
//! COMPA and set output pins high
//! - EPWM_AQ_OUTPUT_TOGGLE_DOWN_CMPA - Time base counter down equals
//! COMPA and toggle output pins
//! - When time base counter equals CMPB during up-count
//! - EPWM_AQ_OUTPUT_NO_CHANGE_UP_CMPB - Time base counter up equals
//! COMPB and no change in the
//! output pins
//! - EPWM_AQ_OUTPUT_LOW_UP_CMPB - Time base counter up equals
//! COMPB and set output pins low
//! - EPWM_AQ_OUTPUT_HIGH_UP_CMPB - Time base counter up equals
//! COMPB and set output pins high
//! - EPWM_AQ_OUTPUT_TOGGLE_UP_CMPB - Time base counter up equals
//! COMPB and toggle output pins
//! - When time base counter equals CMPB during down-count
//! - EPWM_AQ_OUTPUT_NO_CHANGE_DOWN_CMPB- Time base counter down equals
//! COMPB and no change in the
//! output pins
//! - EPWM_AQ_OUTPUT_LOW_DOWN_CMPB - Time base counter down equals
//! COMPB and set output pins low
//! - EPWM_AQ_OUTPUT_HIGH_DOWN_CMPB - Time base counter down equals
//! COMPB and set output pins high
//! - EPWM_AQ_OUTPUT_TOGGLE_DOWN_CMPB - Time base counter down equals
//! COMPB and toggle output pins
//!
//! \b note: A logical OR of the valid values should be passed as the action
//! parameter. Single action should be configured for each time base
//! counter scenario.
//!
//! \return None.
//
//*****************************************************************************
static inline void
EPWM_setActionQualifierActionComplete(uint32_t base,
EPWM_ActionQualifierOutputModule epwmOutput,
uint16_t action)
{
uint32_t registerOffset;
//
// Check the arguments
//
;
//
// Get the register offset
//
registerOffset = 0x40U + (uint32_t)epwmOutput;
//
// Write to ZRO, PRD, CAU, CAD, CBU or CBD bits of AQCTLA register
//
(*((volatile uint16_t *)(base + registerOffset))) = (uint16_t)action;
}
//*****************************************************************************
//
//! Set up Additional action qualifier event outputs
//!
//! \param base is the base address of the EPWM module.
//! \param epwmOutput is the ePWM pin type.
//! \param action is the desired action when the specified event occurs
//!
//! This function sets up the Additional Action Qualifier output on ePWMA or
//! ePWMB depending on the value of epwmOutput, to a value specified by action.
//! Valid action param values from different event scenarios should be OR'd
//! together to configure complete action for a pwm output.
//! The following are valid values for the parameters.
//! - epwmOutput
//! - EPWM_AQ_OUTPUT_A - ePWMxA output
//! - EPWM_AQ_OUTPUT_B - ePWMxB output
//! - action
//! - When T1 event occurs during up-count
//! - EPWM_AQ_OUTPUT_NO_CHANGE_UP_T1 - T1 event on count up
//! and no change in output pins
//! - EPWM_AQ_OUTPUT_LOW_UP_T1 - T1 event on count up
//! and set output pins to low
//! - EPWM_AQ_OUTPUT_HIGH_UP_T1 - T1 event on count up
//! and set output pins to high
//! - EPWM_AQ_OUTPUT_TOGGLE_UP_T1 - T1 event on count up
//! and toggle the output pins
//! - When T1 event occurs during down-count
//! - EPWM_AQ_OUTPUT_NO_CHANGE_DOWN_T1- T1 event on count down
//! and no change in output pins
//! - EPWM_AQ_OUTPUT_LOW_DOWN_T1 - T1 event on count down
//! and set output pins to low
//! - EPWM_AQ_OUTPUT_HIGH_DOWN_T1 - T1 event on count down
//! and set output pins to high
//! - EPWM_AQ_OUTPUT_TOGGLE_DOWN_T1 - T1 event on count down
//! and toggle the output pins
//! - When T2 event occurs during up-count
//! - EPWM_AQ_OUTPUT_NO_CHANGE_UP_T2 - T2 event on count up
//! and no change in output pins
//! - EPWM_AQ_OUTPUT_LOW_UP_T2 - T2 event on count up
//! and set output pins to low
//! - EPWM_AQ_OUTPUT_HIGH_UP_T2 - T2 event on count up
//! and set output pins to high
//! - EPWM_AQ_OUTPUT_TOGGLE_UP_T2 - T2 event on count up
//! and toggle the output pins
//! - When T2 event occurs during down-count
//! - EPWM_AQ_OUTPUT_NO_CHANGE_DOWN_T2 - T2 event on count down
//! and no change in output pins
//! - EPWM_AQ_OUTPUT_LOW_DOWN_T2 - T2 event on count down
//! and set output pins to low
//! - EPWM_AQ_OUTPUT_HIGH_DOWN_T2 - T2 event on count down
//! and set output pins to high
//! - EPWM_AQ_OUTPUT_TOGGLE_DOWN_T2 - T2 event on count down
//! and toggle the output pins
//!
//! \b note: A logical OR of the valid values should be passed as the action
//! parameter. Single action should be configured for each event
//! scenario.
//!
//! \return None.
//
//*****************************************************************************
static inline void
EPWM_setAdditionalActionQualifierActionComplete(uint32_t base,
EPWM_ActionQualifierOutputModule epwmOutput,
uint16_t action)
{
uint32_t registerTOffset;
//
// Check the arguments
//
;
//
// Get the register offset
//
registerTOffset = 0x41U + (uint32_t)epwmOutput;
//
// Write to T1U, T1D, T2U or T2D of AQCTLA2 register
//
(*((volatile uint16_t *)(base + registerTOffset))) = (uint16_t)action;
}
//*****************************************************************************
//
//! Sets up Action qualifier continuous software load mode.
//!
//! \param base is the base address of the EPWM module.
//! \param mode is the mode for shadow to active load mode.
//!
//! This function sets up the AQCFRSC register load mode for continuous
//! software force reload mode. The software force actions are determined by
//! the EPWM_setActionQualifierContSWForceAction() function.
//! Valid values for mode are:
//! - EPWM_AQ_SW_SH_LOAD_ON_CNTR_ZERO - shadow mode load when counter
//! equals zero
//! - EPWM_AQ_SW_SH_LOAD_ON_CNTR_PERIOD - shadow mode load when counter
//! equals period
//! - EPWM_AQ_SW_SH_LOAD_ON_CNTR_ZERO_PERIOD - shadow mode load when counter
//! equals zero or period
//! - EPWM_AQ_SW_IMMEDIATE_LOAD - immediate mode load only
//!
//! \return None.
//
//*****************************************************************************
static inline void
EPWM_setActionQualifierContSWForceShadowMode(uint32_t base,
EPWM_ActionQualifierContForce mode)
{
//
// Check the arguments
//
;
//
// Set the Action qualifier software action reload mode.
// Write to RLDCSF bit
//
(*((volatile uint16_t *)(base + 0x47U))) =
(((*((volatile uint16_t *)(base + 0x47U))) & ~0xC0U) |
((uint16_t)mode << 6U));
}
//*****************************************************************************
//
//! Triggers a continuous software forced event.
//!
//! \param base is the base address of the EPWM module.
//! \param epwmOutput is the ePWM pin type.
//! \param output is the Action Qualifier output.
//!
//! This function triggers a continuous software forced Action Qualifier output
//! on ePWM A or B based on the value of epwmOutput.
//! Valid values for the parameters are:
//! - epwmOutput
//! - EPWM_AQ_OUTPUT_A - ePWMxA output
//! - EPWM_AQ_OUTPUT_B - ePWMxB output
//! - output
//! - EPWM_AQ_SW_DISABLED - Software forcing disabled.
//! - EPWM_AQ_SW_OUTPUT_LOW - Set output pins to low
//! - EPWM_AQ_SW_OUTPUT_HIGH - Set output pins to High
//!
//! \return None.
//
//*****************************************************************************
static inline void
EPWM_setActionQualifierContSWForceAction(uint32_t base,
EPWM_ActionQualifierOutputModule epwmOutput,
EPWM_ActionQualifierSWOutput output)
{
//
// Check the arguments
//
;
//
// Initiate a continuous software forced output
//
if(epwmOutput == EPWM_AQ_OUTPUT_A)
{
(*((volatile uint16_t *)(base + 0x49U))) =
(((*((volatile uint16_t *)(base + 0x49U))) & ~0x3U) |
((uint16_t)output));
}
else
{
(*((volatile uint16_t *)(base + 0x49U))) =
(((*((volatile uint16_t *)(base + 0x49U))) & ~0xCU) |
((uint16_t)output << 2U)) ;
}
}
//*****************************************************************************
//
//! Set up one time software forced Action qualifier outputs
//!
//! \param base is the base address of the EPWM module.
//! \param epwmOutput is the ePWM pin type.
//! \param output is the Action Qualifier output.
//!
//! This function sets up the one time software forced Action Qualifier output
//! on ePWM A or ePWMB, depending on the value of epwmOutput to a value
//! specified by outPut.
//! The following are valid values for the parameters.
//! - epwmOutput
//! - EPWM_AQ_OUTPUT_A - ePWMxA output
//! - EPWM_AQ_OUTPUT_B - ePWMxB output
//! - output
//! - EPWM_AQ_OUTPUT_NO_CHANGE - No change in the output pins
//! - EPWM_AQ_OUTPUT_LOW - Set output pins to low
//! - EPWM_AQ_OUTPUT_HIGH - Set output pins to High
//! - EPWM_AQ_OUTPUT_TOGGLE - Toggle the output pins
//!
//! \return None.
//
//*****************************************************************************
static inline void
EPWM_setActionQualifierSWAction(uint32_t base,
EPWM_ActionQualifierOutputModule epwmOutput,
EPWM_ActionQualifierOutput output)
{
//
// Check the arguments
//
;
//
// Set the one time software forced action
//
if(epwmOutput == EPWM_AQ_OUTPUT_A)
{
(*((volatile uint16_t *)(base + 0x47U))) =
(((*((volatile uint16_t *)(base + 0x47U))) & ~0x3U) |
((uint16_t)output));
}
else
{
(*((volatile uint16_t *)(base + 0x47U))) =
(((*((volatile uint16_t *)(base + 0x47U))) & ~0x18U) |
((uint16_t)output << 3U));
}
}
//*****************************************************************************
//
//! Triggers a one time software forced event on Action qualifier
//!
//! \param base is the base address of the EPWM module.
//! \param epwmOutput is the ePWM pin type.
//!
//! This function triggers a one time software forced Action Qualifier event
//! on ePWM A or B based on the value of epwmOutput.
//! Valid values for epwmOutput are:
//! - EPWM_AQ_OUTPUT_A - ePWMxA output
//! - EPWM_AQ_OUTPUT_B - ePWMxB output
//!
//! \return None.
//
//*****************************************************************************
static inline void
EPWM_forceActionQualifierSWAction(uint32_t base,
EPWM_ActionQualifierOutputModule epwmOutput)
{
//
// Check the arguments
//
;
//
// Initiate a software forced event
//
if(epwmOutput == EPWM_AQ_OUTPUT_A)
{
(*((volatile uint16_t *)(base + 0x47U))) |= 0x4U;
}
else
{
(*((volatile uint16_t *)(base + 0x47U))) |= 0x20U;
}
}
//
// Dead Band Module related APIs
//
//*****************************************************************************
//
//! Sets Dead Band signal output swap mode.
//!
//! \param base is the base address of the EPWM module.
//! \param output is the ePWM Dead Band output.
//! \param enableSwapMode is the output swap mode.
//!
//! This function sets up the output signal swap mode. For example if the
//! output variable is set to EPWM_DB_OUTPUT_A and enableSwapMode is true, then
//! the ePWM A output gets its signal from the ePWM B signal path. Valid values
//! for the input variables are:
//! - output
//! - EPWM_DB_OUTPUT_A - ePWM output A
//! - EPWM_DB_OUTPUT_B - ePWM output B
//! - enableSwapMode
//! - true - the output is swapped
//! - false - the output and the signal path are the same.
//!
//! \return None.
//
//*****************************************************************************
static inline void
EPWM_setDeadBandOutputSwapMode(uint32_t base, EPWM_DeadBandOutput output,
_Bool enableSwapMode)
{
uint16_t mask;
//
// Check the arguments
//
;
mask = (uint16_t)1U << ((uint16_t)output + 12U);
if(enableSwapMode)
{
//
// Set the appropriate outswap bit to swap output
//
(*((volatile uint16_t *)(base + 0xCU))) = ((*((volatile uint16_t *)(base + 0xCU))) | mask);
}
else
{
//
// Clear the appropriate outswap bit to disable output swap
//
(*((volatile uint16_t *)(base + 0xCU))) = ((*((volatile uint16_t *)(base + 0xCU))) & ~mask);
}
}
//*****************************************************************************
//
//! Sets Dead Band signal output mode.
//!
//! \param base is the base address of the EPWM module.
//! \param delayMode is the Dead Band delay type.
//! \param enableDelayMode is the dead band delay mode.
//!
//! This function sets up the dead band delay mode. The delayMode variable
//! determines if the applied delay is Rising Edge or Falling Edge. The
//! enableDelayMode determines if a dead band delay should be applied.
//! Valid values for the variables are:
//! - delayMode
//! - EPWM_DB_RED - Rising Edge delay
//! - EPWM_DB_FED - Falling Edge delay
//! - enableDelayMode
//! - true - Falling edge or Rising edge delay is applied.
//! - false - Dead Band delay is bypassed.
//!
//! \return None.
//
//*****************************************************************************
static inline void
EPWM_setDeadBandDelayMode(uint32_t base, EPWM_DeadBandDelayMode delayMode,
_Bool enableDelayMode)
{
uint16_t mask;
//
// Check the arguments
//
;
mask = (uint16_t)1U << ((uint16_t)delayMode + 0U);
if(enableDelayMode)
{
//
// Set the appropriate outmode bit to enable Dead Band delay
//
(*((volatile uint16_t *)(base + 0xCU))) = ((*((volatile uint16_t *)(base + 0xCU))) | mask);
}
else
{
//
// Clear the appropriate outswap bit to disable output swap
//
(*((volatile uint16_t *)(base + 0xCU))) = ((*((volatile uint16_t *)(base + 0xCU))) & ~ mask);
}
}
//*****************************************************************************
//
//! Sets Dead Band delay polarity.
//!
//! \param base is the base address of the EPWM module.
//! \param delayMode is the Dead Band delay type.
//! \param polarity is the polarity of the delayed signal.
//!
//! This function sets up the polarity as determined by the variable polarity
//! of the Falling Edge or Rising Edge delay depending on the value of
//! delayMode. Valid values for the variables are:
//! - delayMode
//! - EPWM_DB_RED - Rising Edge delay
//! - EPWM_DB_FED - Falling Edge delay
//! - polarity
//! - EPWM_DB_POLARITY_ACTIVE_HIGH - polarity is not inverted.
//! - EPWM_DB_POLARITY_ACTIVE_LOW - polarity is inverted.
//!
//! \return None.
//
//*****************************************************************************
static inline void
EPWM_setDeadBandDelayPolarity(uint32_t base,
EPWM_DeadBandDelayMode delayMode,
EPWM_DeadBandPolarity polarity)
{
uint16_t shift;
//
// Check the arguments
//
;
shift = (((uint16_t)delayMode ^ 0x1U) + 2U);
//
// Set the appropriate polsel bits for dead band polarity
//
(*((volatile uint16_t *)(base + 0xCU))) =
(((*((volatile uint16_t *)(base + 0xCU))) & ~ (1U << shift)) |
((uint16_t)polarity << shift));
}
//*****************************************************************************
//
//! Sets Rising Edge Dead Band delay input.
//!
//! \param base is the base address of the EPWM module.
//! \param input is the input signal to the dead band.
//!
//! This function sets up the rising Edge delay input signal.
//! Valid values for input are:
//! - EPWM_DB_INPUT_EPWMA - Input signal is ePWMA( Valid for both Falling
//! Edge and Rising Edge)
//! - EPWM_DB_INPUT_EPWMB - Input signal is ePWMB( Valid for both Falling
//! Edge and Rising Edge)
//!
//! \return None.
//
//*****************************************************************************
static inline void
EPWM_setRisingEdgeDeadBandDelayInput(uint32_t base, uint16_t input)
{
//
// Check the arguments
//
;
;
//
// Set the Rising Edge Delay input
//
(*((volatile uint16_t *)(base + 0xCU))) =
(((*((volatile uint16_t *)(base + 0xCU))) & ~(1U << (4U))) |
(input << 4U));
}
//*****************************************************************************
//
//! Sets Dead Band delay input.
//!
//! \param base is the base address of the EPWM module.
//! \param input is the input signal to the dead band.
//!
//! This function sets up the rising Edge delay input signal.
//! Valid values for input are:
//! - EPWM_DB_INPUT_EPWMA - Input signal is ePWMA(Valid for both Falling
//! Edge and Rising Edge)
//! - EPWM_DB_INPUT_EPWMB - Input signal is ePWMB(Valid for both Falling
//! Edge and Rising Edge)
//! - EPWM_DB_INPUT_DB_RED - Input signal is the output of Rising
//! Edge delay.
//! (Valid only for Falling Edge delay)
//!
//! \return None.
//
//*****************************************************************************
static inline void
EPWM_setFallingEdgeDeadBandDelayInput(uint32_t base, uint16_t input)
{
//
// Check the arguments
//
;
;
if(input == 2U)
{
//
// Set the Falling Edge Delay input
//
(*((volatile uint16_t *)(base + 0xCU))) |= 0x4000U;
}
else
{
//
// Set the Falling Edge Delay input
//
(*((volatile uint16_t *)(base + 0xCU))) &= ~0x4000U;
//
// Set the Rising Edge Delay input
//
(*((volatile uint16_t *)(base + 0xCU))) =
(((*((volatile uint16_t *)(base + 0xCU))) & ~(1U << (4U + 1U))) |
(input << (4U + 1U)));
}
}
//*****************************************************************************
//
//! Set the Dead Band control shadow load mode.
//!
//! \param base is the base address of the EPWM module.
//! \param loadMode is the shadow to active load mode.
//!
//! This function enables and sets the Dead Band control register shadow
//! load mode.
//! Valid values for the \e loadMode parameter are:
//! - EPWM_DB_LOAD_ON_CNTR_ZERO - load when counter equals zero.
//! - EPWM_DB_LOAD_ON_CNTR_PERIOD - load when counter equals period.
//! - EPWM_DB_LOAD_ON_CNTR_ZERO_PERIOD - load when counter equals zero or
//! period.
//! - EPWM_DB_LOAD_FREEZE - Freeze shadow to active load.
//!
//! \return None.
//
//*****************************************************************************
static inline void
EPWM_setDeadBandControlShadowLoadMode(uint32_t base,
EPWM_DeadBandControlLoadMode loadMode)
{
//
// Check the arguments
//
;
//
// Enable the shadow mode and setup the load event
//
(*((volatile uint16_t *)(base + 0xDU))) =
(((*((volatile uint16_t *)(base + 0xDU))) & ~0x3U) |
(0x4U | (uint16_t)loadMode));
}
//*****************************************************************************
//
//! Disable Dead Band control shadow load mode.
//!
//! \param base is the base address of the EPWM module.
//!
//! This function disables the Dead Band control register shadow
//! load mode.
//!
//! \return None.
//
//*****************************************************************************
static inline void
EPWM_disableDeadBandControlShadowLoadMode(uint32_t base)
{
//
// Check the arguments
//
;
//
// Disable the shadow load mode. Only immediate load mode only.
//
(*((volatile uint16_t *)(base + 0xDU))) =
((*((volatile uint16_t *)(base + 0xDU))) & ~0x4U);
}
//*****************************************************************************
//
//! Set the RED (Rising Edge Delay) shadow load mode.
//!
//! \param base is the base address of the EPWM module.
//! \param loadMode is the shadow to active load event.
//!
//! This function sets the Rising Edge Delay register shadow load mode.
//! Valid values for the \e loadMode parameter are:
//! - EPWM_RED_LOAD_ON_CNTR_ZERO - load when counter equals zero.
//! - EPWM_RED_LOAD_ON_CNTR_PERIOD - load when counter equals period.
//! - EPWM_RED_LOAD_ON_CNTR_ZERO_PERIOD - load when counter equals zero or
//! period.
//! - EPWM_RED_LOAD_FREEZE - Freeze shadow to active load.
//!
//! \return None.
//
//*****************************************************************************
static inline void
EPWM_setRisingEdgeDelayCountShadowLoadMode(uint32_t base,
EPWM_RisingEdgeDelayLoadMode loadMode)
{
//
// Check the arguments
//
;
//
// Enable the shadow mode. Set-up the load mode
//
(*((volatile uint16_t *)(base + 0xCU))) =
(((*((volatile uint16_t *)(base + 0xCU))) & ~0xC0U) |
((uint16_t)0x400U |
((uint16_t)loadMode << 6U)));
}
//*****************************************************************************
//
//! Disable the RED (Rising Edge Delay) shadow load mode.
//!
//! \param base is the base address of the EPWM module.
//!
//! This function disables the Rising Edge Delay register shadow load mode.
//!
//! \return None.
//
//*****************************************************************************
static inline void
EPWM_disableRisingEdgeDelayCountShadowLoadMode(uint32_t base)
{
//
// Check the arguments
//
;
//
// Disable the shadow mode.
//
(*((volatile uint16_t *)(base + 0xCU))) =
((*((volatile uint16_t *)(base + 0xCU))) & ~0x400U);
}
//*****************************************************************************
//
//! Set the FED (Falling Edge Delay) shadow load mode.
//!
//! \param base is the base address of the EPWM module.
//! \param loadMode is the shadow to active load event.
//!
//! This function enables and sets the Falling Edge Delay register shadow load
//! mode. Valid values for the \e loadMode parameters are:
//! - EPWM_FED_LOAD_ON_CNTR_ZERO - load when counter equals zero.
//! - EPWM_FED_LOAD_ON_CNTR_PERIOD - load when counter equals period.
//! - EPWM_FED_LOAD_ON_CNTR_ZERO_PERIOD - load when counter equals zero or
//! period.
//! - EPWM_FED_LOAD_FREEZE - Freeze shadow to active load.
//!
//! \return None.
//
//*****************************************************************************
static inline void
EPWM_setFallingEdgeDelayCountShadowLoadMode(uint32_t base,
EPWM_FallingEdgeDelayLoadMode loadMode)
{
//
// Check the arguments
//
;
//
// Enable the shadow mode. Setup the load mode.
//
(*((volatile uint16_t *)(base + 0xCU))) =
(((*((volatile uint16_t *)(base + 0xCU))) & ~0x300U) |
(0x800U |
((uint16_t)loadMode << 8U)));
}
//*****************************************************************************
//
//! Disables the FED (Falling Edge Delay) shadow load mode.
//!
//! \param base is the base address of the EPWM module.
//!
//! This function disables the Falling Edge Delay register shadow load mode.
//! Valid values for the parameters are:
//!
//! \return None.
//
//*****************************************************************************
static inline void
EPWM_disableFallingEdgeDelayCountShadowLoadMode(uint32_t base)
{
//
// Check the arguments
//
;
//
// Disable the shadow mode.
//
(*((volatile uint16_t *)(base + 0xCU))) =
((*((volatile uint16_t *)(base + 0xCU))) & ~0x800U);
}
//*****************************************************************************
//
//! Sets Dead Band Counter clock rate.
//!
//! \param base is the base address of the EPWM module.
//! \param clockMode is the Dead Band counter clock mode.
//!
//! This function sets up the Dead Band counter clock rate with respect to
//! TBCLK (ePWM time base counter).
//! Valid values for clockMode are:
//! - EPWM_DB_COUNTER_CLOCK_FULL_CYCLE -Dead band counter runs at TBCLK
//! (ePWM Time Base Counter) rate.
//! - EPWM_DB_COUNTER_CLOCK_HALF_CYCLE -Dead band counter runs at 2*TBCLK
//! (twice ePWM Time Base Counter)rate.
//!
//! \return None.
//
//*****************************************************************************
static inline void
EPWM_setDeadBandCounterClock(uint32_t base,
EPWM_DeadBandClockMode clockMode)
{
//
// Check the arguments
//
;
//
// Set the DB clock mode
//
(*((volatile uint16_t *)(base + 0xCU))) =
(((*((volatile uint16_t *)(base + 0xCU))) & ~0x8000U) |
((uint16_t)clockMode << 15U));
}
//*****************************************************************************
//
//! Set ePWM RED count
//!
//! \param base is the base address of the EPWM module.
//! \param redCount is the RED(Rising Edge Delay) count.
//!
//! This function sets the RED (Rising Edge Delay) count value.
//! The value of redCount should be less than 0x4000U.
//!
//! \return None.
//
//*****************************************************************************
static inline void
EPWM_setRisingEdgeDelayCount(uint32_t base, uint16_t redCount)
{
//
// Check the arguments
//
;
;
//
// Set the RED (Rising Edge Delay) count
//
(*((volatile uint16_t *)(base + 0x51U))) = redCount;
}
//*****************************************************************************
//
//! Set ePWM FED count
//!
//! \param base is the base address of the EPWM module.
//! \param fedCount is the FED(Falling Edge Delay) count.
//!
//! This function sets the FED (Falling Edge Delay) count value.
//! The value of fedCount should be less than 0x4000U.
//!
//! \return None.
//
//*****************************************************************************
static inline void
EPWM_setFallingEdgeDelayCount(uint32_t base, uint16_t fedCount)
{
//
// Check the arguments
//
;
;
//
// Set the RED (Rising Edge Delay) count
//
(*((volatile uint16_t *)(base + 0x53U))) = fedCount;
}
//
// Chopper module related APIs
//
//*****************************************************************************
//
//! Enable chopper mode
//!
//! \param base is the base address of the EPWM module.
//!
//! This function enables ePWM chopper module.
//!
//! \return None.
//
//*****************************************************************************
static inline void
EPWM_enableChopper(uint32_t base)
{
//
// Check the arguments
//
;
//
// Set CHPEN bit. Enable Chopper
//
(*((volatile uint16_t *)(base + 0x14U))) |= 0x1U;
}
//*****************************************************************************
//
//! Disable chopper mode
//!
//! \param base is the base address of the EPWM module.
//!
//! This function disables ePWM chopper module.
//!
//! \return None.
//
//*****************************************************************************
static inline void
EPWM_disableChopper(uint32_t base)
{
//
// Check the arguments
//
;
//
// Clear CHPEN bit. Disable Chopper
//
(*((volatile uint16_t *)(base + 0x14U))) &= ~0x1U;
}
//*****************************************************************************
//
//! Set chopper duty cycle.
//!
//! \param base is the base address of the EPWM module.
//! \param dutyCycleCount is the chopping clock duty cycle count.
//!
//! This function sets the chopping clock duty cycle. The value of
//! dutyCycleCount should be less than 7. The dutyCycleCount value is converted
//! to the actual chopper duty cycle value base on the following equation:
//! chopper duty cycle = (dutyCycleCount + 1) / 8
//!
//! \return None.
//
//*****************************************************************************
static inline void
EPWM_setChopperDutyCycle(uint32_t base, uint16_t dutyCycleCount)
{
//
// Check the arguments
//
;
;
//
// Set the chopper duty cycle
//
(*((volatile uint16_t *)(base + 0x14U))) =
(((*((volatile uint16_t *)(base + 0x14U))) & ~0x700U) |
(dutyCycleCount << 8U));
}
//*****************************************************************************
//
//! Set chopper clock frequency scaler.
//!
//! \param base is the base address of the EPWM module.
//! \param freqDiv is the chopping clock frequency divider.
//!
//! This function sets the scaler for the chopping clock frequency. The value
//! of freqDiv should be less than 8. The chopping clock frequency is altered
//! based on the following equation.
//! chopper clock frequency = SYSCLKOUT / ( 1 + freqDiv)
//!
//! \return None.
//
//*****************************************************************************
static inline void
EPWM_setChopperFreq(uint32_t base, uint16_t freqDiv)
{
//
// Check the arguments
//
;
;
//
// Set the chopper clock
//
(*((volatile uint16_t *)(base + 0x14U))) =
(((*((volatile uint16_t *)(base + 0x14U))) &
~(uint16_t)0xE0U) |
(freqDiv << 5U));
}
//*****************************************************************************
//
//! Set chopper clock frequency scaler.
//!
//! \param base is the base address of the EPWM module.
//! \param firstPulseWidth is the width of the first pulse.
//!
//! This function sets the first pulse width of chopper output waveform. The
//! value of firstPulseWidth should be less than 0x10. The value of the first
//! pulse width in seconds is given using the following equation:
//! first pulse width = 1 / (((firstPulseWidth + 1) * SYSCLKOUT)/8)
//!
//! \return None.
//
//*****************************************************************************
static inline void
EPWM_setChopperFirstPulseWidth(uint32_t base, uint16_t firstPulseWidth)
{
//
// Check the arguments
//
;
;
//
// Set the chopper clock
//
(*((volatile uint16_t *)(base + 0x14U))) =
(((*((volatile uint16_t *)(base + 0x14U))) &
~(uint16_t)0x1EU) |
(firstPulseWidth << 1U));
}
//
// Trip Zone module related APIs
//
//*****************************************************************************
//
//! Enables Trip Zone signal.
//!
//! \param base is the base address of the EPWM module.
//! \param tzSignal is the Trip Zone signal.
//!
//! This function enables the Trip Zone signals specified by tzSignal as a
//! source for the Trip Zone module.
//! Valid values for tzSignal are:
//! - EPWM_TZ_SIGNAL_CBC1 - TZ1 Cycle By Cycle
//! - EPWM_TZ_SIGNAL_CBC2 - TZ2 Cycle By Cycle
//! - EPWM_TZ_SIGNAL_CBC3 - TZ3 Cycle By Cycle
//! - EPWM_TZ_SIGNAL_CBC4 - TZ4 Cycle By Cycle
//! - EPWM_TZ_SIGNAL_CBC5 - TZ5 Cycle By Cycle
//! - EPWM_TZ_SIGNAL_CBC6 - TZ6 Cycle By Cycle
//! - EPWM_TZ_SIGNAL_DCAEVT2 - DCAEVT2 Cycle By Cycle
//! - EPWM_TZ_SIGNAL_DCBEVT2 - DCBEVT2 Cycle By Cycle
//! - EPWM_TZ_SIGNAL_OSHT1 - One-shot TZ1
//! - EPWM_TZ_SIGNAL_OSHT2 - One-shot TZ2
//! - EPWM_TZ_SIGNAL_OSHT3 - One-shot TZ3
//! - EPWM_TZ_SIGNAL_OSHT4 - One-shot TZ4
//! - EPWM_TZ_SIGNAL_OSHT5 - One-shot TZ5
//! - EPWM_TZ_SIGNAL_OSHT6 - One-shot TZ6
//! - EPWM_TZ_SIGNAL_DCAEVT1 - One-shot DCAEVT1
//! - EPWM_TZ_SIGNAL_DCBEVT1 - One-shot DCBEVT1
//!
//! \b note: A logical OR of the valid values can be passed as the tzSignal
//! parameter.
//!
//! \return None.
//
//*****************************************************************************
static inline void
EPWM_enableTripZoneSignals(uint32_t base, uint16_t tzSignal)
{
//
// Check the arguments
//
;
//
// Set the trip zone bits
//
__eallow();
(*((volatile uint16_t *)(base + 0x80U))) |= tzSignal;
__edis();
}
//*****************************************************************************
//
//! Disables Trip Zone signal.
//!
//! \param base is the base address of the EPWM module.
//! \param tzSignal is the Trip Zone signal.
//!
//! This function disables the Trip Zone signal specified by tzSignal as a
//! source for the Trip Zone module.
//! Valid values for tzSignal are:
//! - EPWM_TZ_SIGNAL_CBC1 - TZ1 Cycle By Cycle
//! - EPWM_TZ_SIGNAL_CBC2 - TZ2 Cycle By Cycle
//! - EPWM_TZ_SIGNAL_CBC3 - TZ3 Cycle By Cycle
//! - EPWM_TZ_SIGNAL_CBC4 - TZ4 Cycle By Cycle
//! - EPWM_TZ_SIGNAL_CBC5 - TZ5 Cycle By Cycle
//! - EPWM_TZ_SIGNAL_CBC6 - TZ6 Cycle By Cycle
//! - EPWM_TZ_SIGNAL_DCAEVT2 - DCAEVT2 Cycle By Cycle
//! - EPWM_TZ_SIGNAL_DCBEVT2 - DCBEVT2 Cycle By Cycle
//! - EPWM_TZ_SIGNAL_OSHT1 - One-shot TZ1
//! - EPWM_TZ_SIGNAL_OSHT2 - One-shot TZ2
//! - EPWM_TZ_SIGNAL_OSHT3 - One-shot TZ3
//! - EPWM_TZ_SIGNAL_OSHT4 - One-shot TZ4
//! - EPWM_TZ_SIGNAL_OSHT5 - One-shot TZ5
//! - EPWM_TZ_SIGNAL_OSHT6 - One-shot TZ6
//! - EPWM_TZ_SIGNAL_DCAEVT1 - One-shot DCAEVT1
//! - EPWM_TZ_SIGNAL_DCBEVT1 - One-shot DCBEVT1
//!
//! \b note: A logical OR of the valid values can be passed as the tzSignal
//! parameter.
//!
//! \return None.
//
//*****************************************************************************
static inline void
EPWM_disableTripZoneSignals(uint32_t base, uint16_t tzSignal)
{
//
// Check the arguments
//
;
//
// Clear the trip zone bits
//
__eallow();
(*((volatile uint16_t *)(base + 0x80U))) &= ~tzSignal;
__edis();
}
//*****************************************************************************
//
//! Set Digital compare conditions that cause Trip Zone event.
//!
//! \param base is the base address of the EPWM module.
//! \param dcType is the Digital compare output type.
//! \param dcEvent is the Digital Compare output event.
//!
//! This function sets up the Digital Compare output Trip Zone event sources.
//! The dcType variable specifies the event source to be whether Digital
//! Compare output A or Digital Compare output B. The dcEvent parameter
//! specifies the event that causes Trip Zone.
//! Valid values for the parameters are:
//! - dcType
//! - EPWM_TZ_DC_OUTPUT_A1 - Digital Compare output 1 A
//! - EPWM_TZ_DC_OUTPUT_A2 - Digital Compare output 2 A
//! - EPWM_TZ_DC_OUTPUT_B1 - Digital Compare output 1 B
//! - EPWM_TZ_DC_OUTPUT_B2 - Digital Compare output 2 B
//! - dcEvent
//! - EPWM_TZ_EVENT_DC_DISABLED - Event Trigger is disabled
//! - EPWM_TZ_EVENT_DCXH_LOW - Trigger event when DCxH low
//! - EPWM_TZ_EVENT_DCXH_HIGH - Trigger event when DCxH high
//! - EPWM_TZ_EVENT_DCXL_LOW - Trigger event when DCxL low
//! - EPWM_TZ_EVENT_DCXL_HIGH - Trigger event when DCxL high
//! - EPWM_TZ_EVENT_DCXL_HIGH_DCXH_LOW - Trigger event when DCxL high
//! DCxH low
//!
//! \note x in DCxH/DCxL represents DCAH/DCAL or DCBH/DCBL
//!
//! \return None.
//
//*****************************************************************************
static inline void
EPWM_setTripZoneDigitalCompareEventCondition(uint32_t base,
EPWM_TripZoneDigitalCompareOutput dcType,
EPWM_TripZoneDigitalCompareOutputEvent dcEvent)
{
//
// Check the arguments
//
;
//
// Set Digital Compare Events conditions that cause a Digital Compare trip
//
__eallow();
(*((volatile uint16_t *)(base + 0x82U))) =
(((*((volatile uint16_t *)(base + 0x82U))) & ~(0x7U << (uint16_t)dcType)) |
((uint16_t)dcEvent << (uint16_t)dcType));
__edis();
}
//*****************************************************************************
//
//! Enable advanced Trip Zone event Action.
//!
//! \param base is the base address of the EPWM module.
//!
//! This function enables the advanced actions of the Trip Zone events. The
//! advanced features combine the trip zone events with the direction of the
//! counter.
//!
//! \return None.
//
//*****************************************************************************
static inline void
EPWM_enableTripZoneAdvAction(uint32_t base)
{
//
// Check the arguments
//
;
//
// Enable Advanced feature. Set ETZE bit
//
__eallow();
(*((volatile uint16_t *)(base + 0x85U))) |= 0x8000U;
__edis();
}
//*****************************************************************************
//
//! Disable advanced Trip Zone event Action.
//!
//! \param base is the base address of the EPWM module.
//!
//! This function disables the advanced actions of the Trip Zone events.
//!
//! \return None.
//
//*****************************************************************************
static inline void
EPWM_disableTripZoneAdvAction(uint32_t base)
{
//
// Check the arguments
//
;
//
// Disable Advanced feature. clear ETZE bit
//
__eallow();
(*((volatile uint16_t *)(base + 0x85U))) &= ~0x8000U;
__edis();
}
//*****************************************************************************
//
//! Set Trip Zone Action.
//!
//! \param base is the base address of the EPWM module.
//! \param tzEvent is the Trip Zone event type.
//! \param tzAction is the Trip zone Action.
//!
//! This function sets the Trip Zone Action to be taken when a Trip Zone event
//! occurs.
//! Valid values for the parameters are:
//! - tzEvent
//! - EPWM_TZ_ACTION_EVENT_DCBEVT2 - DCBEVT2 (Digital Compare B event 2)
//! - EPWM_TZ_ACTION_EVENT_DCBEVT1 - DCBEVT1 (Digital Compare B event 1)
//! - EPWM_TZ_ACTION_EVENT_DCAEVT2 - DCAEVT2 (Digital Compare A event 2)
//! - EPWM_TZ_ACTION_EVENT_DCAEVT1 - DCAEVT1 (Digital Compare A event 1)
//! - EPWM_TZ_ACTION_EVENT_TZB - TZ1 - TZ6, DCBEVT2, DCBEVT1
//! - EPWM_TZ_ACTION_EVENT_TZA - TZ1 - TZ6, DCAEVT2, DCAEVT1
//! - tzAction
//! - EPWM_TZ_ACTION_HIGH_Z - high impedance output
//! - EPWM_TZ_ACTION_HIGH - high output
//! - EPWM_TZ_ACTION_LOW - low low
//! - EPWM_TZ_ACTION_DISABLE - disable action
//!
//! \note Disable the advanced Trip Zone event using
//! EPWM_disableTripZoneAdvAction() before calling this function.
//! \note This function operates on both ePWMA and ePWMB depending on the
//! tzEvent parameter.
//!
//! \return None.
//
//*****************************************************************************
static inline void
EPWM_setTripZoneAction(uint32_t base, EPWM_TripZoneEvent tzEvent,
EPWM_TripZoneAction tzAction)
{
//
// Check the arguments
//
;
//
// Set the Action for Trip Zone events
//
__eallow();
(*((volatile uint16_t *)(base + 0x84U))) =
(((*((volatile uint16_t *)(base + 0x84U))) & ~(0x3U << (uint16_t)tzEvent)) |
((uint16_t)tzAction << (uint16_t)tzEvent)) ;
__edis();
}
//*****************************************************************************
//
//! Set Advanced Trip Zone Action.
//!
//! \param base is the base address of the EPWM module.
//! \param tzAdvEvent is the Trip Zone event type.
//! \param tzAdvAction is the Trip zone Action.
//!
//! This function sets the Advanced Trip Zone Action to be taken when an
//! advanced Trip Zone event occurs.
//!
//! Valid values for the parameters are:
//! - tzAdvEvent
//! - EPWM_TZ_ADV_ACTION_EVENT_TZB_D - TZ1 - TZ6, DCBEVT2, DCBEVT1 while
//! counting down
//! - EPWM_TZ_ADV_ACTION_EVENT_TZB_U - TZ1 - TZ6, DCBEVT2, DCBEVT1 while
//! counting up
//! - EPWM_TZ_ADV_ACTION_EVENT_TZA_D - TZ1 - TZ6, DCAEVT2, DCAEVT1 while
//! counting down
//! - EPWM_TZ_ADV_ACTION_EVENT_TZA_U - TZ1 - TZ6, DCAEVT2, DCAEVT1 while
//! counting up
//! - tzAdvAction
//! - EPWM_TZ_ADV_ACTION_HIGH_Z - high impedance output
//! - EPWM_TZ_ADV_ACTION_HIGH - high voltage state
//! - EPWM_TZ_ADV_ACTION_LOW - low voltage state
//! - EPWM_TZ_ADV_ACTION_TOGGLE - Toggle output
//! - EPWM_TZ_ADV_ACTION_DISABLE - disable action
//!
//! \note This function enables the advanced Trip Zone event.
//!
//! \note This function operates on both ePWMA and ePWMB depending on the
//! tzAdvEvent parameter.
//! \note Advanced Trip Zone events take into consideration the direction of
//! the counter in addition to Trip Zone events.
//!
//! \return None.
//
//*****************************************************************************
static inline void
EPWM_setTripZoneAdvAction(uint32_t base, EPWM_TripZoneAdvancedEvent tzAdvEvent,
EPWM_TripZoneAdvancedAction tzAdvAction)
{
//
// Check the arguments
//
;
//
// Set the Advanced Action for Trip Zone events
//
__eallow();
(*((volatile uint16_t *)(base + 0x85U))) =
(((*((volatile uint16_t *)(base + 0x85U))) & ~(0x7U << (uint16_t)tzAdvEvent)) |
((uint16_t)tzAdvAction << (uint16_t)tzAdvEvent));
(*((volatile uint16_t *)(base + 0x85U))) |= 0x8000U;
__edis();
}
//*****************************************************************************
//
//! Set Advanced Digital Compare Trip Zone Action on ePWMA.
//!
//! \param base is the base address of the EPWM module.
//! \param tzAdvDCEvent is the Digital Compare Trip Zone event type.
//! \param tzAdvDCAction is the Digital Compare Trip zone Action.
//!
//! This function sets the Digital Compare (DC) Advanced Trip Zone Action to be
//! taken on ePWMA when an advanced Digital Compare Trip Zone A event occurs.
//! Valid values for the parameters are:
//! - tzAdvDCEvent
//! - EPWM_TZ_ADV_ACTION_EVENT_DCxEVT2_D - Digital Compare event A2 while
//! counting down
//! - EPWM_TZ_ADV_ACTION_EVENT_DCxEVT2_U - Digital Compare event A2 while
//! counting up
//! - EPWM_TZ_ADV_ACTION_EVENT_DCxEVT1_D - Digital Compare event A1 while
//! counting down
//! - EPWM_TZ_ADV_ACTION_EVENT_DCxEVT1_U - Digital Compare event A1 while
//! counting up
//! - tzAdvDCAction
//! - EPWM_TZ_ADV_ACTION_HIGH_Z - high impedance output
//! - EPWM_TZ_ADV_ACTION_HIGH - high voltage state
//! - EPWM_TZ_ADV_ACTION_LOW - low voltage state
//! - EPWM_TZ_ADV_ACTION_TOGGLE - Toggle output
//! - EPWM_TZ_ADV_ACTION_DISABLE - disable action
//!
//! \note This function enables the advanced Trip Zone event.
//!
//! \note Advanced Trip Zone events take into consideration the direction of
//! the counter in addition to Digital Compare Trip Zone events.
//!
//! \return None.
//
//*****************************************************************************
static inline void
EPWM_setTripZoneAdvDigitalCompareActionA(uint32_t base,
EPWM_TripZoneAdvDigitalCompareEvent tzAdvDCEvent,
EPWM_TripZoneAdvancedAction tzAdvDCAction)
{
//
// Check the arguments
//
;
//
// Set the Advanced Action for Trip Zone events
//
__eallow();
(*((volatile uint16_t *)(base + 0x86U))) =
(((*((volatile uint16_t *)(base + 0x86U))) & ~(0x7U << (uint16_t)tzAdvDCEvent)) |
((uint16_t)tzAdvDCAction << (uint16_t)tzAdvDCEvent));
(*((volatile uint16_t *)(base + 0x85U))) |= 0x8000U;
__edis();
}
//*****************************************************************************
//
//! Set Advanced Digital Compare Trip Zone Action on ePWMB.
//!
//! \param base is the base address of the EPWM module.
//! \param tzAdvDCEvent is the Digital Compare Trip Zone event type.
//! \param tzAdvDCAction is the Digital Compare Trip zone Action.
//!
//! This function sets the Digital Compare (DC) Advanced Trip Zone Action to be
//! taken on ePWMB when an advanced Digital Compare Trip Zone B event occurs.
//! Valid values for the parameters are:
//! - tzAdvDCEvent
//! - EPWM_TZ_ADV_ACTION_EVENT_DCxEVT2_D - Digital Compare event B2 while
//! counting down
//! - EPWM_TZ_ADV_ACTION_EVENT_DCxEVT2_U - Digital Compare event B2 while
//! counting up
//! - EPWM_TZ_ADV_ACTION_EVENT_DCxEVT1_D - Digital Compare event B1 while
//! counting down
//! - EPWM_TZ_ADV_ACTION_EVENT_DCxEVT1_U - Digital Compare event B1 while
//! counting up
//! - tzAdvDCAction
//! - EPWM_TZ_ADV_ACTION_HIGH_Z - high impedance output
//! - EPWM_TZ_ADV_ACTION_HIGH - high voltage state
//! - EPWM_TZ_ADV_ACTION_LOW - low voltage state
//! - EPWM_TZ_ADV_ACTION_TOGGLE - Toggle output
//! - EPWM_TZ_ADV_ACTION_DISABLE - disable action
//!
//! \note This function enables the advanced Trip Zone event.
//!
//! \note Advanced Trip Zone events take into consideration the direction of
//! the counter in addition to Digital Compare Trip Zone events.
//!
//! \return None.
//
//*****************************************************************************
static inline void EPWM_setTripZoneAdvDigitalCompareActionB(uint32_t base,
EPWM_TripZoneAdvDigitalCompareEvent tzAdvDCEvent,
EPWM_TripZoneAdvancedAction tzAdvDCAction)
{
//
// Check the arguments
//
;
//
// Set the Advanced Action for Trip Zone events
//
__eallow();
(*((volatile uint16_t *)(base + 0x87U))) =
(((*((volatile uint16_t *)(base + 0x87U))) & ~(0x7U << (uint16_t)tzAdvDCEvent)) |
((uint16_t)tzAdvDCAction << (uint16_t)tzAdvDCEvent));
(*((volatile uint16_t *)(base + 0x85U))) |= 0x8000U;
__edis();
}
//*****************************************************************************
//
//! Enable Trip Zone interrupts.
//!
//! \param base is the base address of the EPWM module.
//! \param tzInterrupt is the Trip Zone interrupt.
//!
//! This function enables the Trip Zone interrupts.
//! Valid values for tzInterrupt are:
//! - EPWM_TZ_INTERRUPT_CBC - Trip Zones Cycle By Cycle interrupt
//! - EPWM_TZ_INTERRUPT_OST - Trip Zones One Shot interrupt
//! - EPWM_TZ_INTERRUPT_DCAEVT1 - Digital Compare A Event 1 interrupt
//! - EPWM_TZ_INTERRUPT_DCAEVT2 - Digital Compare A Event 2 interrupt
//! - EPWM_TZ_INTERRUPT_DCBEVT1 - Digital Compare B Event 1 interrupt
//! - EPWM_TZ_INTERRUPT_DCBEVT2 - Digital Compare B Event 2 interrupt
//!
//! \b note: A logical OR of the valid values can be passed as the tzInterrupt
//! parameter.
//!
//! \return None.
//
//*****************************************************************************
static inline void
EPWM_enableTripZoneInterrupt(uint32_t base, uint16_t tzInterrupt)
{
//
// Check the arguments
//
;
;
//
// Enable Trip zone interrupts
//
__eallow();
(*((volatile uint16_t *)(base + 0x8DU))) |= tzInterrupt;
__edis();
}
//*****************************************************************************
//
//! Disable Trip Zone interrupts.
//!
//! \param base is the base address of the EPWM module.
//! \param tzInterrupt is the Trip Zone interrupt.
//!
//! This function disables the Trip Zone interrupts.
//! Valid values for tzInterrupt are:
//! - EPWM_TZ_INTERRUPT_CBC - Trip Zones Cycle By Cycle interrupt
//! - EPWM_TZ_INTERRUPT_OST - Trip Zones One Shot interrupt
//! - EPWM_TZ_INTERRUPT_DCAEVT1 - Digital Compare A Event 1 interrupt
//! - EPWM_TZ_INTERRUPT_DCAEVT2 - Digital Compare A Event 2 interrupt
//! - EPWM_TZ_INTERRUPT_DCBEVT1 - Digital Compare B Event 1 interrupt
//! - EPWM_TZ_INTERRUPT_DCBEVT2 - Digital Compare B Event 2 interrupt
//!
//! \b note: A logical OR of the valid values can be passed as the tzInterrupt
//! parameter.
//!
//! \return None.
//
//***************************************************************************
static inline void
EPWM_disableTripZoneInterrupt(uint32_t base, uint16_t tzInterrupt)
{
//
// Check the arguments
//
;
;
//
// Disable Trip zone interrupts
//
__eallow();
(*((volatile uint16_t *)(base + 0x8DU))) &= ~tzInterrupt;
__edis();
}
//*****************************************************************************
//
//! Gets the Trip Zone status flag
//!
//! \param base is the base address of the EPWM module.
//!
//! This function returns the Trip Zone status flag.
//!
//! \return The function returns the following or the bitwise OR value
//! of the following values.
//! - EPWM_TZ_INTERRUPT - Trip Zone interrupt was generated
//! due to the following TZ events.
//! - EPWM_TZ_FLAG_CBC - Trip Zones Cycle By Cycle event status flag
//! - EPWM_TZ_FLAG_OST - Trip Zones One Shot event status flag
//! - EPWM_TZ_FLAG_DCAEVT1 - Digital Compare A Event 1 status flag
//! - EPWM_TZ_FLAG_DCAEVT2 - Digital Compare A Event 2 status flag
//! - EPWM_TZ_FLAG_DCBEVT1 - Digital Compare B Event 1 status flag
//! - EPWM_TZ_FLAG_DCBEVT2 - Digital Compare B Event 2 status flag
//
//***************************************************************************
static inline uint16_t
EPWM_getTripZoneFlagStatus(uint32_t base)
{
//
// Check the arguments
//
;
//
// Return the Trip zone flag status
//
return((*((volatile uint16_t *)(base + 0x93U))) & 0x7FU);
}
//*****************************************************************************
//
//! Gets the Trip Zone Cycle by Cycle flag status
//!
//! \param base is the base address of the EPWM module.
//!
//! This function returns the specific Cycle by Cycle Trip Zone flag
//! status.
//!
//! \return The function returns the following values.
//! - EPWM_TZ_CBC_FLAG_1 - CBC 1 status flag
//! - EPWM_TZ_CBC_FLAG_2 - CBC 2 status flag
//! - EPWM_TZ_CBC_FLAG_3 - CBC 3 status flag
//! - EPWM_TZ_CBC_FLAG_4 - CBC 4 status flag
//! - EPWM_TZ_CBC_FLAG_5 - CBC 5 status flag
//! - EPWM_TZ_CBC_FLAG_6 - CBC 6 status flag
//! - EPWM_TZ_CBC_FLAG_DCAEVT2 - CBC status flag for Digital compare
//! event A2
//! - EPWM_TZ_CBC_FLAG_DCBEVT2 - CBC status flag for Digital compare
//! event B2
//
//***************************************************************************
static inline uint16_t
EPWM_getCycleByCycleTripZoneFlagStatus(uint32_t base)
{
//
// Check the arguments
//
;
//
// Return the Cycle By Cycle Trip zone flag status
//
return((*((volatile uint16_t *)(base + 0x94U))) & 0xFFU);
}
//*****************************************************************************
//
//! Gets the Trip Zone One Shot flag status
//!
//! \param base is the base address of the EPWM module.
//!
//! This function returns the specific One Shot Trip Zone flag status.
//!
//! \return The function returns the bitwise OR of the following flags.
//! - EPWM_TZ_OST_FLAG_OST1 - OST status flag for OST1
//! - EPWM_TZ_OST_FLAG_OST2 - OST status flag for OST2
//! - EPWM_TZ_OST_FLAG_OST3 - OST status flag for OST3
//! - EPWM_TZ_OST_FLAG_OST4 - OST status flag for OST4
//! - EPWM_TZ_OST_FLAG_OST5 - OST status flag for OST5
//! - EPWM_TZ_OST_FLAG_OST6 - OST status flag for OST6
//! - EPWM_TZ_OST_FLAG_DCAEVT1 - OST status flag for Digital
//! compare event A1
//! - EPWM_TZ_OST_FLAG_DCBEVT1 - OST status flag for Digital
//! compare event B1
//
//***************************************************************************
static inline uint16_t
EPWM_getOneShotTripZoneFlagStatus(uint32_t base)
{
//
// Check the arguments
//
;
//
// Return the One Shot Trip zone flag status
//
return((*((volatile uint16_t *)(base + 0x95U))) & 0xFFU);
}
//*****************************************************************************
//
//! Set the Trip Zone CBC pulse clear event.
//!
//! \param base is the base address of the EPWM module.
//! \param clearEvent is the CBC trip zone clear event.
//!
//! This function set the event which automatically clears the
//! CBC (Cycle by Cycle) latch.
//! Valid values for clearEvent are:
//! - EPWM_TZ_CBC_PULSE_CLR_CNTR_ZERO - Clear CBC pulse when counter
//! equals zero
//! - EPWM_TZ_CBC_PULSE_CLR_CNTR_PERIOD - Clear CBC pulse when counter
//! equals period
//! - EPWM_TZ_CBC_PULSE_CLR_CNTR_ZERO_PERIOD - Clear CBC pulse when counter
//! equals zero or period
//!
//! \return None.
//
//**************************************************************************
static inline void
EPWM_selectCycleByCycleTripZoneClearEvent(uint32_t base,
EPWM_CycleByCycleTripZoneClearMode clearEvent)
{
//
// Check the arguments
//
;
//
// Set the Cycle by Cycle Trip Latch mode
//
__eallow();
(*((volatile uint16_t *)(base + 0x97U))) =
(((*((volatile uint16_t *)(base + 0x97U))) & ~0xC000U) |
((uint16_t)clearEvent << 14U));
__edis();
}
//*****************************************************************************
//
//! Clear Trip Zone flag
//!
//! \param base is the base address of the EPWM module.
//! \param tzFlags is the Trip Zone flags.
//!
//! This function clears the Trip Zone flags
//! Valid values for tzFlags are:
//! - EPWM_TZ_INTERRUPT - Global Trip Zone interrupt flag
//! - EPWM_TZ_FLAG_CBC - Trip Zones Cycle By Cycle flag
//! - EPWM_TZ_FLAG_OST - Trip Zones One Shot flag
//! - EPWM_TZ_FLAG_DCAEVT1 - Digital Compare A Event 1 flag
//! - EPWM_TZ_FLAG_DCAEVT2 - Digital Compare A Event 2 flag
//! - EPWM_TZ_FLAG_DCBEVT1 - Digital Compare B Event 1 flag
//! - EPWM_TZ_FLAG_DCBEVT2 - Digital Compare B Event 2 flag
//!
//! \b note: A bitwise OR of the valid values can be passed as the tzFlags
//! parameter.
//!
//! \return None.
//
//***************************************************************************
static inline void
EPWM_clearTripZoneFlag(uint32_t base, uint16_t tzFlags)
{
//
// Check the arguments
//
;
;
//
// Clear Trip zone event flag
//
__eallow();
(*((volatile uint16_t *)(base + 0x97U))) |= tzFlags;
__edis();
}
//*****************************************************************************
//
//! Clear the Trip Zone Cycle by Cycle flag.
//!
//! \param base is the base address of the EPWM module.
//! \param tzCBCFlags is the CBC flag to be cleared.
//!
//! This function clears the specific Cycle by Cycle Trip Zone flag.
//! The following are valid values for tzCBCFlags.
//! - EPWM_TZ_CBC_FLAG_1 - CBC 1 flag
//! - EPWM_TZ_CBC_FLAG_2 - CBC 2 flag
//! - EPWM_TZ_CBC_FLAG_3 - CBC 3 flag
//! - EPWM_TZ_CBC_FLAG_4 - CBC 4 flag
//! - EPWM_TZ_CBC_FLAG_5 - CBC 5 flag
//! - EPWM_TZ_CBC_FLAG_6 - CBC 6 flag
//! - EPWM_TZ_CBC_FLAG_DCAEVT2 - CBC flag Digital compare
//! event A2
//! - EPWM_TZ_CBC_FLAG_DCBEVT2 - CBC flag Digital compare
//! event B2
//!
//! \return None.
//
//***************************************************************************
static inline void
EPWM_clearCycleByCycleTripZoneFlag(uint32_t base, uint16_t tzCBCFlags)
{
//
// Check the arguments
//
;
;
//
// Clear the Cycle By Cycle Trip zone flag
//
__eallow();
(*((volatile uint16_t *)(base + 0x98U))) |= tzCBCFlags;
__edis();
}
//*****************************************************************************
//
//! Clear the Trip Zone One Shot flag.
//!
//! \param base is the base address of the EPWM module.
//! \param tzOSTFlags is the OST flags to be cleared.
//!
//! This function clears the specific One Shot (OST) Trip Zone flag.
//! The following are valid values for tzOSTFlags.
//! - EPWM_TZ_OST_FLAG_OST1 - OST flag for OST1
//! - EPWM_TZ_OST_FLAG_OST2 - OST flag for OST2
//! - EPWM_TZ_OST_FLAG_OST3 - OST flag for OST3
//! - EPWM_TZ_OST_FLAG_OST4 - OST flag for OST4
//! - EPWM_TZ_OST_FLAG_OST5 - OST flag for OST5
//! - EPWM_TZ_OST_FLAG_OST6 - OST flag for OST6
//! - EPWM_TZ_OST_FLAG_DCAEVT1 - OST flag for Digital compare event A1
//! - EPWM_TZ_OST_FLAG_DCBEVT1 - OST flag for Digital compare event B1
//!
//! \return None.
//
//***************************************************************************
static inline void
EPWM_clearOneShotTripZoneFlag(uint32_t base, uint16_t tzOSTFlags)
{
//
// Check the arguments
//
;
;
//
// Clear the Cycle By Cycle Trip zone flag
//
__eallow();
(*((volatile uint16_t *)(base + 0x99U))) |= tzOSTFlags;
__edis();
}
//*****************************************************************************
//
//! Force Trip Zone events.
//!
//! \param base is the base address of the EPWM module.
//! \param tzForceEvent is the forced Trip Zone event.
//!
//! This function forces a Trip Zone event.
//! Valid values for tzForceEvent are:
//! - EPWM_TZ_FORCE_EVENT_CBC - Force Trip Zones Cycle By Cycle event
//! - EPWM_TZ_FORCE_EVENT_OST - Force Trip Zones One Shot Event
//! - EPWM_TZ_FORCE_EVENT_DCAEVT1 - Force Digital Compare A Event 1
//! - EPWM_TZ_FORCE_EVENT_DCAEVT2 - Force Digital Compare A Event 2
//! - EPWM_TZ_FORCE_EVENT_DCBEVT1 - Force Digital Compare B Event 1
//! - EPWM_TZ_FORCE_EVENT_DCBEVT2 - Force Digital Compare B Event 2
//!
//! \return None.
//
//***************************************************************************
static inline void
EPWM_forceTripZoneEvent(uint32_t base, uint16_t tzForceEvent)
{
//
// Check the arguments
//
;
;
//
// Force a Trip Zone event
//
__eallow();
(*((volatile uint16_t *)(base + 0x9BU))) |= tzForceEvent;
__edis();
}
//
// Event Trigger related APIs
//
//*****************************************************************************
//
//! Enable ePWM interrupt.
//!
//! \param base is the base address of the EPWM module.
//!
//! This function enables the ePWM interrupt.
//!
//! \return None.
//
//*****************************************************************************
static inline void
EPWM_enableInterrupt(uint32_t base)
{
//
// Check the arguments
//
;
//
// Enable ePWM interrupt
//
(*((volatile uint16_t *)(base + 0xA4U))) |= 0x8U;
}
//*****************************************************************************
//
//! disable ePWM interrupt.
//!
//! \param base is the base address of the EPWM module.
//!
//! This function disables the ePWM interrupt.
//!
//! \return None.
//
//*****************************************************************************
static inline void
EPWM_disableInterrupt(uint32_t base)
{
//
// Check the arguments
//
;
//
// Disable ePWM interrupt
//
(*((volatile uint16_t *)(base + 0xA4U))) &= ~0x8U;
}
//*****************************************************************************
//
//! Sets the ePWM interrupt source.
//!
//! \param base is the base address of the EPWM module.
//! \param interruptSource is the ePWM interrupt source.
//!
//! This function sets the ePWM interrupt source.
//! Valid values for interruptSource are:
//! - EPWM_INT_TBCTR_DISABLED - Time-base counter is disabled
//! - EPWM_INT_TBCTR_ZERO - Time-base counter equal to zero
//! - EPWM_INT_TBCTR_PERIOD - Time-base counter equal to period
//! - EPWM_INT_TBCTR_ZERO_OR_PERIOD - Time-base counter equal to zero or
//! period
//! - EPWM_INT_TBCTR_ZERO_OR_PERIOD - Time-base counter equal to zero or
//! period
//! - EPWM_INT_TBCTR_U_CMPx - Where x is A,B,C or D
//! Time-base counter equal to CMPA, CMPB,
//! CMPC or CMPD (depending the value of x)
//! when the timer is incrementing
//! - EPWM_INT_TBCTR_D_CMPx - Where x is A,B,C or D
//! Time-base counter equal to CMPA, CMPB,
//! CMPC or CMPD (depending the value of x)
//! when the timer is decrementing
//!
//! \return None.
//
//*****************************************************************************
static inline void
EPWM_setInterruptSource(uint32_t base, uint16_t interruptSource)
{
uint16_t intSource;
//
// Check the arguments
//
;
;
if((interruptSource == 8U) ||
(interruptSource == 12U) ||
(interruptSource == 10U) ||
(interruptSource == 14U))
{
//
// Shift the interrupt source by 1
//
intSource = interruptSource >> 1U;
//
// Enable events based on comp C or comp D
//
(*((volatile uint16_t *)(base + 0xA4U))) |= 0x40U;
}
else if((interruptSource == 4U) ||
(interruptSource == 6U) ||
(interruptSource == 5U) ||
(interruptSource == 7U))
{
intSource = interruptSource;
//
// Enable events based on comp A or comp B
//
(*((volatile uint16_t *)(base + 0xA4U))) &= ~0x40U;
}
else
{
intSource = interruptSource;
}
//
// Set the interrupt source
//
(*((volatile uint16_t *)(base + 0xA4U))) =
(((*((volatile uint16_t *)(base + 0xA4U))) & ~0x7U) | intSource);
}
//*****************************************************************************
//
//! Sets the ePWM interrupt event counts.
//!
//! \param base is the base address of the EPWM module.
//! \param eventCount is the event count for interrupt scale
//!
//! This function sets the interrupt event count that determines the number of
//! events that have to occur before an interrupt is issued.
//! Maximum value for eventCount is 15.
//!
//! \return None.
//
//*****************************************************************************
static inline void
EPWM_setInterruptEventCount(uint32_t base, uint16_t eventCount)
{
//
// Check the arguments
//
;
;
//
// Enable advanced feature of interrupt every up to 15 events
//
(*((volatile uint16_t *)(base + 0xA6U))) |= 0x10U;
(*((volatile uint16_t *)(base + 0xAEU))) =
(((*((volatile uint16_t *)(base + 0xAEU))) & ~0xFU) |
eventCount);
}
//*****************************************************************************
//
//! Return the interrupt status.
//!
//! \param base is the base address of the EPWM module.
//!
//! This function returns the ePWM interrupt status.
//! \b Note This function doesn't return the Trip Zone status.
//!
//! \return Returns true if ePWM interrupt was generated.
//! Returns false if no interrupt was generated
//
//*****************************************************************************
static inline _Bool
EPWM_getEventTriggerInterruptStatus(uint32_t base)
{
//
// Check the arguments
//
;
//
// Return INT bit of ETFLG register
//
return((((*((volatile uint16_t *)(base + 0xA8U))) & 0x1U) == 0x1U) ? 1 : 0);
}
//*****************************************************************************
//
//! Clear interrupt flag.
//!
//! \param base is the base address of the EPWM module.
//!
//! This function clears the ePWM interrupt flag.
//!
//! \return None
//
//*****************************************************************************
static inline void
EPWM_clearEventTriggerInterruptFlag(uint32_t base)
{
//
// Check the arguments
//
;
//
// Clear INT bit of ETCLR register
//
(*((volatile uint16_t *)(base + 0xAAU))) |= 0x1U;
}
//*****************************************************************************
//
//! Enable Pre-interrupt count load.
//!
//! \param base is the base address of the EPWM module.
//!
//! This function enables the ePWM interrupt counter to be pre-interrupt loaded
//! with a count value.
//!
//! \note This is valid only for advanced/expanded interrupt mode
//!
//! \return None.
//
//*****************************************************************************
static inline void
EPWM_enableInterruptEventCountInit(uint32_t base)
{
//
// Check the arguments
//
;
//
// Enable interrupt event count initializing/loading
//
(*((volatile uint16_t *)(base + 0xB2U))) |= 0x2000U;
}
//*****************************************************************************
//
//! Disable interrupt count load.
//!
//! \param base is the base address of the EPWM module.
//!
//! This function disables the ePWM interrupt counter from being loaded with
//! pre-interrupt count value.
//!
//! \return None.
//
//*****************************************************************************
static inline void
EPWM_disableInterruptEventCountInit(uint32_t base)
{
//
// Check the arguments
//
;
//
// Disable interrupt event count initializing/loading
//
(*((volatile uint16_t *)(base + 0xB2U))) &= ~0x2000U;
}
//*****************************************************************************
//
//! Force a software pre interrupt event counter load.
//!
//! \param base is the base address of the EPWM module.
//!
//! This function forces the ePWM interrupt counter to be loaded with the
//! contents set by EPWM_setPreInterruptEventCount().
//!
//! \note make sure the EPWM_enablePreInterruptEventCountLoad() function is
//! is called before invoking this function.
//!
//! \return None.
//
//*****************************************************************************
static inline void
EPWM_forceInterruptEventCountInit(uint32_t base)
{
//
// Check the arguments
//
;
//
// Load the Interrupt Event counter value
//
(*((volatile uint16_t *)(base + 0xB2U))) |= 0x400U;
}
//*****************************************************************************
//
//! Set interrupt count.
//!
//! \param base is the base address of the EPWM module.
//! \param eventCount is the ePWM interrupt count value.
//!
//! This function sets the ePWM interrupt count. eventCount is the value of the
//! pre-interrupt value that is to be loaded. The maximum value of eventCount
//! is 15.
//!
//! \return None.
//
//*****************************************************************************
static inline void
EPWM_setInterruptEventCountInitValue(uint32_t base, uint16_t eventCount)
{
//
// Check the arguments
//
;
;
//
// Set the Pre-interrupt event count
//
(*((volatile uint16_t *)(base + 0xB4U))) =
(((*((volatile uint16_t *)(base + 0xB4U))) & ~0xFU) |
(uint16_t)(eventCount & 0xFU));
}
//*****************************************************************************
//
//! Get the interrupt count.
//!
//! \param base is the base address of the EPWM module.
//!
//! This function returns the ePWM interrupt event count.
//!
//! \return The interrupt event counts that have occurred.
//
//*****************************************************************************
static inline uint16_t
EPWM_getInterruptEventCount(uint32_t base)
{
//
// Check the arguments
//
;
//
// Return the interrupt event count
//
return((((*((volatile uint16_t *)(base + 0xAEU))) & 0xF0U) >>
4U));
}
//*****************************************************************************
//
//! Force ePWM interrupt.
//!
//! \param base is the base address of the EPWM module.
//!
//! This function forces an ePWM interrupt.
//!
//! \return None
//
//*****************************************************************************
static inline void
EPWM_forceEventTriggerInterrupt(uint32_t base)
{
//
// Check the arguments
//
;
//
// Set INT bit of ETFRC register
//
(*((volatile uint16_t *)(base + 0xACU))) |= 0x1U;
}
//
// ADC SOC configuration related APIs
//
//*****************************************************************************
//
//! Enable ADC SOC event.
//!
//! \param base is the base address of the EPWM module.
//! \param adcSOCType is the ADC SOC type.
//!
//! This function enables the ePWM module to trigger an ADC SOC event.
//! Valid values for adcSOCType are:
//! - EPWM_SOC_A - SOC A
//! - EPWM_SOC_B - SOC B
//!
//! \return None.
//
//*****************************************************************************
static inline void
EPWM_enableADCTrigger(uint32_t base, EPWM_ADCStartOfConversionType adcSOCType)
{
//
// Check the arguments
//
;
//
// Enable an SOC
//
if(adcSOCType == EPWM_SOC_A)
{
(*((volatile uint16_t *)(base + 0xA4U))) |= 0x800U;
}
else
{
(*((volatile uint16_t *)(base + 0xA4U))) |= 0x8000U;
}
}
//*****************************************************************************
//
//! Disable ADC SOC event.
//!
//! \param base is the base address of the EPWM module.
//! \param adcSOCType is the ADC SOC type.
//!
//! This function disables the ePWM module from triggering an ADC SOC event.
//! Valid values for adcSOCType are:
//! - EPWM_SOC_A - SOC A
//! - EPWM_SOC_B - SOC B
//!
//! \return None.
//
//*****************************************************************************
static inline void
EPWM_disableADCTrigger(uint32_t base, EPWM_ADCStartOfConversionType adcSOCType)
{
//
// Check the arguments
//
;
//
// Disable an SOC
//
if(adcSOCType == EPWM_SOC_A)
{
(*((volatile uint16_t *)(base + 0xA4U))) &= ~0x800U;
}
else
{
(*((volatile uint16_t *)(base + 0xA4U))) &= ~0x8000U;
}
}
//*****************************************************************************
//
//! Sets the ePWM SOC source.
//!
//! \param base is the base address of the EPWM module.
//! \param adcSOCType is the ADC SOC type.
//! \param socSource is the SOC source.
//!
//! This function sets the ePWM ADC SOC source.
//! Valid values for socSource are:
//! - adcSOCType
//! - EPWM_SOC_A - SOC A
//! - EPWM_SOC_B - SOC B
//! - socSource
//! - EPWM_SOC_DCxEVT1 - Event is based on DCxEVT1
//! - EPWM_SOC_TBCTR_ZERO - Time-base counter equal to zero
//! - EPWM_SOC_TBCTR_PERIOD - Time-base counter equal to period
//! - EPWM_SOC_TBCTR_ZERO_OR_PERIOD - Time-base counter equal to zero or
//! period
//! - EPWM_SOC_TBCTR_U_CMPx - Where x is A,B,C or D
//! Time-base counter equal to CMPA, CMPB,
//! CMPC or CMPD(depending the value of x)
//! when the timer is incrementing
//! - EPWM_SOC_TBCTR_D_CMPx - Where x is A,B,C or D
//! Time-base counter equal to CMPA, CMPB,
//! CMPC or CMPD(depending the value of x)
//! when the timer is decrementing
//!
//! \return None.
//
//*****************************************************************************
static inline void
EPWM_setADCTriggerSource(uint32_t base,
EPWM_ADCStartOfConversionType adcSOCType,
EPWM_ADCStartOfConversionSource socSource)
{
uint16_t source;
//
// Check the arguments
//
;
if((socSource == EPWM_SOC_TBCTR_U_CMPC) ||
(socSource == EPWM_SOC_TBCTR_U_CMPD) ||
(socSource == EPWM_SOC_TBCTR_D_CMPC) ||
(socSource == EPWM_SOC_TBCTR_D_CMPD))
{
source = (uint16_t)socSource >> 1U;
}
else
{
source = (uint16_t)socSource;
}
if(adcSOCType == EPWM_SOC_A)
{
//
// Set the SOC source
//
(*((volatile uint16_t *)(base + 0xA4U))) =
(((*((volatile uint16_t *)(base + 0xA4U))) & ~0x700U) |
(source << 8U));
//
// Enable the comparator selection
//
if((socSource == EPWM_SOC_TBCTR_U_CMPA) ||
(socSource == EPWM_SOC_TBCTR_U_CMPB) ||
(socSource == EPWM_SOC_TBCTR_D_CMPA) ||
(socSource == EPWM_SOC_TBCTR_D_CMPB))
{
//
// Enable events based on comp A or comp B
//
(*((volatile uint16_t *)(base + 0xA4U))) &= ~0x10U;
}
else if((socSource == EPWM_SOC_TBCTR_U_CMPC) ||
(socSource == EPWM_SOC_TBCTR_U_CMPD) ||
(socSource == EPWM_SOC_TBCTR_D_CMPC) ||
(socSource == EPWM_SOC_TBCTR_D_CMPD))
{
//
// Enable events based on comp C or comp D
//
(*((volatile uint16_t *)(base + 0xA4U))) |= 0x10U;
}
else
{
//
// No action required for the other socSource options
//
}
}
else
{
//
// Enable the comparator selection
//
(*((volatile uint16_t *)(base + 0xA4U))) =
(((*((volatile uint16_t *)(base + 0xA4U))) & ~0x7000U) |
(source << 12U));
//
// Enable the comparator selection
//
if((socSource == EPWM_SOC_TBCTR_U_CMPA) ||
(socSource == EPWM_SOC_TBCTR_U_CMPB) ||
(socSource == EPWM_SOC_TBCTR_D_CMPA) ||
(socSource == EPWM_SOC_TBCTR_D_CMPB))
{
//
// Enable events based on comp A or comp B
//
(*((volatile uint16_t *)(base + 0xA4U))) &= ~0x20U;
}
else if((socSource == EPWM_SOC_TBCTR_U_CMPC) ||
(socSource == EPWM_SOC_TBCTR_U_CMPD) ||
(socSource == EPWM_SOC_TBCTR_D_CMPC) ||
(socSource == EPWM_SOC_TBCTR_D_CMPD))
{
//
// Enable events based on comp C or comp D
//
(*((volatile uint16_t *)(base + 0xA4U))) |= 0x20U;
}
else
{
//
// No action required for the other socSource options
//
}
}
}
//*****************************************************************************
//
//! Sets the ePWM SOC event counts.
//!
//! \param base is the base address of the EPWM module.
//! \param adcSOCType is the ADC SOC type.
//! \param preScaleCount is the event count number.
//!
//! This function sets the SOC event count that determines the number of
//! events that have to occur before an SOC is issued.
//! Valid values for the parameters are:
//! - adcSOCType
//! - EPWM_SOC_A - SOC A
//! - EPWM_SOC_B - SOC B
//! - preScaleCount
//! - [1 - 15] - Generate SOC pulse every preScaleCount
//! up to 15 events.
//!
//! \note A preScaleCount value of 0 disables the prescale.
//!
//! \return None.
//
//*****************************************************************************
static inline void
EPWM_setADCTriggerEventPrescale(uint32_t base,
EPWM_ADCStartOfConversionType adcSOCType,
uint16_t preScaleCount)
{
//
// Check the arguments
//
;
;
//
// Enable advanced feature of SOC every up to 15 events
//
(*((volatile uint16_t *)(base + 0xA6U))) |= 0x20U;
if(adcSOCType == EPWM_SOC_A)
{
//
// Set the count for SOC A
//
(*((volatile uint16_t *)(base + 0xB0U))) =
(((*((volatile uint16_t *)(base + 0xB0U))) & ~0xFU) |
preScaleCount);
}
else
{
//
// Set the count for SOC B
//
(*((volatile uint16_t *)(base + 0xB0U))) =
(((*((volatile uint16_t *)(base + 0xB0U))) & ~0xF00U) |
(preScaleCount << 8U));
}
}
//*****************************************************************************
//
//! Return the SOC event status.
//!
//! \param base is the base address of the EPWM module.
//! \param adcSOCType is the ADC SOC type.
//!
//! This function returns the ePWM SOC status.
//! Valid values for adcSOCType are:
//! - EPWM_SOC_A - SOC A
//! - EPWM_SOC_B - SOC B
//!
//! \return Returns true if the selected adcSOCType SOC was generated.
//! Returns false if the selected adcSOCType SOC was not generated.
//
//*****************************************************************************
static inline _Bool
EPWM_getADCTriggerFlagStatus(uint32_t base,
EPWM_ADCStartOfConversionType adcSOCType)
{
//
// Check the arguments
//
;
//
// Return the SOC A/ B status
//
return(((((*((volatile uint16_t *)(base + 0xA8U))) >>
((uint16_t)adcSOCType + 2U)) & 0x1U) == 0x1U) ? 1 : 0);
}
//*****************************************************************************
//
//! Clear SOC flag.
//!
//! \param base is the base address of the EPWM module.
//! \param adcSOCType is the ADC SOC type.
//!
//! This function clears the ePWM SOC flag.
//! Valid values for adcSOCType are:
//! - EPWM_SOC_A - SOC A
//! - EPWM_SOC_B - SOC B
//!
//! \return None
//
//*****************************************************************************
static inline void
EPWM_clearADCTriggerFlag(uint32_t base,
EPWM_ADCStartOfConversionType adcSOCType)
{
//
// Check the arguments
//
;
//
// Clear SOC A/B bit of ETCLR register
//
(*((volatile uint16_t *)(base + 0xAAU))) |= 1U << ((uint16_t)adcSOCType + 2U);
}
//*****************************************************************************
//
//! Enable Pre-SOC event count load.
//!
//! \param base is the base address of the EPWM module.
//! \param adcSOCType is the ADC SOC type.
//!
//! This function enables the ePWM SOC event counter which is set by the
//! EPWM_setADCTriggerEventCountInitValue() function to be loaded before
//! an SOC event.
//! Valid values for adcSOCType are:
//! - EPWM_SOC_A - SOC A
//! - EPWM_SOC_B - SOC B
//!
//! \note This is valid only for advanced/expanded SOC mode
//!
//! \return None.
//
//*****************************************************************************
static inline void
EPWM_enableADCTriggerEventCountInit(uint32_t base,
EPWM_ADCStartOfConversionType adcSOCType)
{
//
// Check the arguments
//
;
//
// Enable SOC event count initializing/loading
//
(*((volatile uint16_t *)(base + 0xB2U))) |= 1U << ((uint16_t)adcSOCType + 14U);
}
//*****************************************************************************
//
//! Disable Pre-SOC event count load.
//!
//! \param base is the base address of the EPWM module.
//! \param adcSOCType is the ADC SOC type.
//!
//! This function disables the ePWM SOC event counter from being loaded before
//! an SOC event (only an SOC event causes an increment of the counter value).
//! Valid values for adcSOCType are:
//! - EPWM_SOC_A - SOC A
//! - EPWM_SOC_B - SOC B
//!
//! \note This is valid only for advanced/expanded SOC mode
//!
//! \return None.
//
//*****************************************************************************
static inline void
EPWM_disableADCTriggerEventCountInit(uint32_t base,
EPWM_ADCStartOfConversionType adcSOCType)
{
//
// Check the arguments
//
;
//
// Disable SOC event count initializing/loading
//
(*((volatile uint16_t *)(base + 0xB2U))) &=
~(1U << ((uint16_t)adcSOCType + 14U));
}
//*****************************************************************************
//
//! Force a software pre SOC event counter load.
//!
//! \param base is the base address of the EPWM module.
//! \param adcSOCType is the ADC SOC type
//!
//! This function forces the ePWM SOC counter to be loaded with the
//! contents set by EPWM_setPreADCStartOfConversionEventCount().
//!
//! \note make sure the EPWM_enableADCTriggerEventCountInit()
//! function is called before invoking this function.
//!
//! \return None.
//
//*****************************************************************************
static inline void
EPWM_forceADCTriggerEventCountInit(uint32_t base,
EPWM_ADCStartOfConversionType adcSOCType)
{
//
// Check the arguments
//
;
//
// Load the Interrupt Event counter value
//
(*((volatile uint16_t *)(base + 0xB2U))) |= 1U << ((uint16_t)adcSOCType + 11U);
}
//*****************************************************************************
//
//! Set ADC Trigger count values.
//!
//! \param base is the base address of the EPWM module.
//! \param adcSOCType is the ADC SOC type.
//! \param eventCount is the ePWM interrupt count value.
//!
//! This function sets the ePWM ADC Trigger count values.
//! Valid values for adcSOCType are:
//! - EPWM_SOC_A - SOC A
//! - EPWM_SOC_B - SOC B
//! The eventCount has a maximum value of 15.
//!
//! \return None.
//
//*****************************************************************************
static inline void
EPWM_setADCTriggerEventCountInitValue(uint32_t base,
EPWM_ADCStartOfConversionType adcSOCType,
uint16_t eventCount)
{
//
// Check the arguments
//
;
;
//
// Set the ADC Trigger event count
//
if(adcSOCType == EPWM_SOC_A)
{
(*((volatile uint16_t *)(base + 0xB4U))) =
(((*((volatile uint16_t *)(base + 0xB4U))) & ~0xF0U) |
(uint16_t)(eventCount << 4U));
}
else
{
(*((volatile uint16_t *)(base + 0xB4U))) =
(((*((volatile uint16_t *)(base + 0xB4U))) & ~0xF00U) |
(eventCount << 8U));
}
}
//*****************************************************************************
//
//! Get the SOC event count.
//!
//! \param base is the base address of the EPWM module.
//! \param adcSOCType is the ADC SOC type.
//!
//! This function returns the ePWM SOC event count.
//! Valid values for adcSOCType are:
//! - EPWM_SOC_A - SOC A
//! - EPWM_SOC_B - SOC B
//!
//! \return The SOC event counts that have occurred.
//
//*****************************************************************************
static inline uint16_t
EPWM_getADCTriggerEventCount(uint32_t base,
EPWM_ADCStartOfConversionType adcSOCType)
{
uint16_t eventCount;
//
// Check the arguments
//
;
//
// Return the SOC event count
//
if(adcSOCType == EPWM_SOC_A)
{
eventCount = ((*((volatile uint16_t *)(base + 0xB0U))) >>
4U) & 0xFU;
}
else
{
eventCount = ((*((volatile uint16_t *)(base + 0xB0U))) >>
12U) & 0xFU;
}
return(eventCount);
}
//*****************************************************************************
//
//! Force SOC event.
//!
//! \param base is the base address of the EPWM module.
//! \param adcSOCType is the ADC SOC type.
//!
//! This function forces an ePWM SOC event.
//! Valid values for adcSOCType are:
//! - EPWM_SOC_A - SOC A
//! - EPWM_SOC_B - SOC B
//!
//! \return None
//
//*****************************************************************************
static inline void
EPWM_forceADCTrigger(uint32_t base, EPWM_ADCStartOfConversionType adcSOCType)
{
//
// Check the arguments
//
;
//
// Set SOC A/B bit of ETFRC register
//
(*((volatile uint16_t *)(base + 0xACU))) |= 1U << ((uint16_t)adcSOCType + 2U);
}
//
// Digital Compare module related APIs
//
//*****************************************************************************
//
//! Set the DC trip input.
//!
//! \param base is the base address of the EPWM module.
//! \param tripSource is the tripSource.
//! \param dcType is the Digital Compare type.
//!
//! This function sets the trip input to the Digital Compare (DC). For a given
//! dcType the function sets the tripSource to be the input to the DC.
//! Valid values for the parameter are:
//! - tripSource
//! - EPWM_DC_TRIP_TRIPINx - Trip x,where x ranges from 1 to 15 excluding 13
//! - EPWM_DC_TRIP_COMBINATION - selects all the Trip signals whose input
//! is enabled by the following function
//! EPWM_enableDigitalCompareTripCombinationInput()
//! - dcType
//! - EPWM_DC_TYPE_DCAH - Digital Compare A High
//! - EPWM_DC_TYPE_DCAL - Digital Compare A Low
//! - EPWM_DC_TYPE_DCBH - Digital Compare B High
//! - EPWM_DC_TYPE_DCBL - Digital Compare B Low
//!
//! \return None
//
//*****************************************************************************
static inline void
EPWM_selectDigitalCompareTripInput(uint32_t base,
EPWM_DigitalCompareTripInput tripSource,
EPWM_DigitalCompareType dcType)
{
//
// Check the arguments
//
;
//
// Set the DC trip input
//
__eallow();
(*((volatile uint16_t *)(base + 0xC0U))) =
(((*((volatile uint16_t *)(base + 0xC0U))) & ~(0xFU << ((uint16_t)dcType << 2U))) |
((uint16_t)tripSource << ((uint16_t)dcType << 2U)));
__edis();
}
//
// DCFILT
//
//*****************************************************************************
//
//! Enable DC filter blanking window.
//!
//! \param base is the base address of the EPWM module.
//!
//! This function enables the DC filter blanking window.
//!
//! \return None
//
//*****************************************************************************
static inline void
EPWM_enableDigitalCompareBlankingWindow(uint32_t base)
{
//
// Check the arguments
//
;
//
// Enable DC filter blanking window
//
__eallow();
(*((volatile uint16_t *)(base + 0xC7U))) |= 0x4U;
__edis();
}
//*****************************************************************************
//
//! Disable DC filter blanking window.
//!
//! \param base is the base address of the EPWM module.
//!
//! This function disables the DC filter blanking window.
//!
//! \return None
//
//*****************************************************************************
static inline void
EPWM_disableDigitalCompareBlankingWindow(uint32_t base)
{
//
// Check the arguments
//
;
//
// Disable DC filter blanking window
//
__eallow();
(*((volatile uint16_t *)(base + 0xC7U))) &= ~0x4U;
__edis();
}
//*****************************************************************************
//
//! Enable Digital Compare Window inverse mode.
//!
//! \param base is the base address of the EPWM module.
//!
//! This function enables the Digital Compare Window inverse mode. This will
//! invert the blanking window.
//!
//! \return None
//
//*****************************************************************************
static inline void
EPWM_enableDigitalCompareWindowInverseMode(uint32_t base)
{
//
// Check the arguments
//
;
//
// Enable DC window inverse mode.
//
__eallow();
(*((volatile uint16_t *)(base + 0xC7U))) |= 0x8U;
__edis();
}
//*****************************************************************************
//
//! Disable Digital Compare Window inverse mode.
//!
//! \param base is the base address of the EPWM module.
//!
//! This function disables the Digital Compare Window inverse mode.
//!
//! \return None
//
//*****************************************************************************
static inline void
EPWM_disableDigitalCompareWindowInverseMode(uint32_t base)
{
//
// Check the arguments
//
;
//
// Disable DC window inverse mode.
//
__eallow();
(*((volatile uint16_t *)(base + 0xC7U))) &= ~0x8U;
__edis();
}
//*****************************************************************************
//
//! Set the Digital Compare filter blanking pulse.
//!
//! \param base is the base address of the EPWM module.
//! \param blankingPulse is Pulse that starts blanking window.
//!
//! This function sets the input pulse that starts the Digital Compare blanking
//! window.
//! Valid values for blankingPulse are:
//! - EPWM_DC_WINDOW_START_TBCTR_PERIOD - Time base counter equals period
//! - EPWM_DC_WINDOW_START_TBCTR_ZERO - Time base counter equals zero
//! - EPWM_DC_WINDOW_START_TBCTR_ZERO_PERIOD - Time base counter equals zero
//! or period.
//!
//! \return None
//
//*****************************************************************************
static inline void
EPWM_setDigitalCompareBlankingEvent(uint32_t base,
EPWM_DigitalCompareBlankingPulse blankingPulse)
{
//
// Check the arguments
//
;
//
// Set DC blanking event
//
__eallow();
(*((volatile uint16_t *)(base + 0xC7U))) =
(((*((volatile uint16_t *)(base + 0xC7U))) & ~0x30U) |
((uint16_t)((uint32_t)blankingPulse << 4U)));
__edis();
}
//*****************************************************************************
//
//! Set up the Digital Compare filter input.
//!
//! \param base is the base address of the EPWM module.
//! \param filterInput is Digital Compare signal source.
//!
//! This function sets the signal input source that will be filtered by the
//! Digital Compare module.
//! Valid values for filterInput are:
//! - EPWM_DC_WINDOW_SOURCE_DCAEVT1 - DC filter signal source is DCAEVT1
//! - EPWM_DC_WINDOW_SOURCE_DCAEVT2 - DC filter signal source is DCAEVT2
//! - EPWM_DC_WINDOW_SOURCE_DCBEVT1 - DC filter signal source is DCBEVT1
//! - EPWM_DC_WINDOW_SOURCE_DCBEVT2 - DC filter signal source is DCBEVT2
//!
//! \return None
//
//*****************************************************************************
static inline void
EPWM_setDigitalCompareFilterInput(uint32_t base,
EPWM_DigitalCompareFilterInput filterInput)
{
//
// Check the arguments
//
;
//
// Set the signal source that will be filtered
//
__eallow();
(*((volatile uint16_t *)(base + 0xC7U))) =
(((*((volatile uint16_t *)(base + 0xC7U))) & ~0x3U) |
((uint16_t)filterInput));
__edis();
}
//
// DC Edge Filter
//
//*****************************************************************************
//
//! Enable Digital Compare Edge Filter.
//!
//! \param base is the base address of the EPWM module.
//!
//! This function enables the Digital Compare Edge filter to generate event
//! after configured number of edges.
//!
//! \return None
//
//*****************************************************************************
static inline void
EPWM_enableDigitalCompareEdgeFilter(uint32_t base)
{
//
// Check the arguments
//
;
//
// Enable DC Edge Filter
//
__eallow();
(*((volatile uint16_t *)(base + 0xC7U))) |= 0x40U;
__edis();
}
//*****************************************************************************
//
//! Disable Digital Compare Edge Filter.
//!
//! \param base is the base address of the EPWM module.
//!
//! This function disables the Digital Compare Edge filter.
//!
//! \return None
//
//*****************************************************************************
static inline void
EPWM_disableDigitalCompareEdgeFilter(uint32_t base)
{
//
// Check the arguments
//
;
//
// Disable DC Edge Filter
//
__eallow();
(*((volatile uint16_t *)(base + 0xC7U))) &= ~0x40U;
__edis();
}
//*****************************************************************************
//
//! Set the Digital Compare Edge Filter Mode.
//!
//! \param base is the base address of the EPWM module.
//! \param edgeMode is Digital Compare Edge filter mode.
//!
//! This function sets the Digital Compare Event filter mode. Valid values
//! for edgeMode are:
//! - EPWM_DC_EDGEFILT_MODE_RISING - DC edge filter mode is rising edge
//! - EPWM_DC_EDGEFILT_MODE_FALLING - DC edge filter mode is falling edge
//! - EPWM_DC_EDGEFILT_MODE_BOTH - DC edge filter mode is both edges
//!
//! \return None
//
//*****************************************************************************
static inline void
EPWM_setDigitalCompareEdgeFilterMode(uint32_t base,
EPWM_DigitalCompareEdgeFilterMode edgeMode)
{
//
// Check the arguments
//
;
//
// Set DC Edge filter mode
//
__eallow();
(*((volatile uint16_t *)(base + 0xC7U))) =
((*((volatile uint16_t *)(base + 0xC7U))) & ~0x300U) |
((uint16_t)edgeMode << 8U);
__edis();
}
//*****************************************************************************
//
//! Set the Digital Compare Edge Filter Edge Count.
//!
//! \param base is the base address of the EPWM module.
//! \param edgeCount is Digital Compare event filter count
//!
//! This function sets the Digital Compare Event filter Edge Count to generate
//! events. Valid values for edgeCount can be:
//! - EPWM_DC_EDGEFILT_EDGECNT_0 - No edge is required to generate event
//! - EPWM_DC_EDGEFILT_EDGECNT_1 - 1 edge is required for event generation
//! - EPWM_DC_EDGEFILT_EDGECNT_2 - 2 edges are required for event generation
//! - EPWM_DC_EDGEFILT_EDGECNT_3 - 3 edges are required for event generation
//! - EPWM_DC_EDGEFILT_EDGECNT_4 - 4 edges are required for event generation
//! - EPWM_DC_EDGEFILT_EDGECNT_5 - 5 edges are required for event generation
//! - EPWM_DC_EDGEFILT_EDGECNT_6 - 6 edges are required for event generation
//! - EPWM_DC_EDGEFILT_EDGECNT_7 - 7 edges are required for event generation
//!
//! \return None
//
//*****************************************************************************
static inline void
EPWM_setDigitalCompareEdgeFilterEdgeCount(uint32_t base, uint16_t edgeCount)
{
//
// Check the arguments
//
;
//
// Set DC Edge filter edge count
//
__eallow();
(*((volatile uint16_t *)(base + 0xC7U))) = ((*((volatile uint16_t *)(base + 0xC7U))) &
~0x1C00U) |
(edgeCount << 10U);
__edis();
}
//*****************************************************************************
//
//! Returns the Digital Compare Edge Filter Edge Count.
//!
//! \param base is the base address of the EPWM module.
//!
//! This function returns the configured Digital Compare Edge filter edge
//! count required to generate events. It can return values from 0-7.
//!
//! \return Returns the configured DigitalCompare Edge filter edge count.
//
//*****************************************************************************
static inline uint16_t
EPWM_getDigitalCompareEdgeFilterEdgeCount(uint32_t base)
{
//
// Check the arguments
//
;
//
// Return configured DC edge filter edge count
//
return(((*((volatile uint16_t *)(base + 0xC7U))) & 0x1C00U) >>
10U);
}
//*****************************************************************************
//
//! Returns the Digital Compare Edge filter captured edge count status.
//!
//! \param base is the base address of the EPWM module.
//!
//! This function returns the count of edges captured by Digital Compare Edge
//! filter. It can return values from 0-7.
//!
//! \return Returns the count of captured edges
//
//*****************************************************************************
static inline uint16_t
EPWM_getDigitalCompareEdgeFilterEdgeStatus(uint32_t base)
{
//
// Check the arguments
//
;
//
// Return captured edge count by DC Edge filter
//
return(((*((volatile uint16_t *)(base + 0xC7U))) & 0xE000U) >>
13U);
}
//*****************************************************************************
//
//! Set up the Digital Compare filter window offset
//!
//! \param base is the base address of the EPWM module.
//! \param windowOffsetCount is blanking window offset length.
//!
//! This function sets the offset between window start pulse and blanking
//! window in TBCLK count.
//! The function take a 16bit count value for the offset value.
//!
//! \return None
//
//*****************************************************************************
static inline void
EPWM_setDigitalCompareWindowOffset(uint32_t base, uint16_t windowOffsetCount)
{
//
// Check the arguments
//
;
//
// Set the blanking window offset in TBCLK counts
//
(*((volatile uint16_t *)(base + 0xC9U))) = windowOffsetCount;
}
//*****************************************************************************
//
//! Set up the Digital Compare filter window length
//!
//! \param base is the base address of the EPWM module.
//! \param windowLengthCount is blanking window length.
//!
//! This function sets up the Digital Compare filter blanking window length in
//! TBCLK count.The function takes a 16bit count value for the window length.
//!
//! \return None
//
//*****************************************************************************
static inline void
EPWM_setDigitalCompareWindowLength(uint32_t base, uint16_t windowLengthCount)
{
//
// Check the arguments
//
;
//
// Set the blanking window length in TBCLK counts
//
(*((volatile uint16_t *)(base + 0xCBU))) = windowLengthCount;
}
//*****************************************************************************
//
//! Return DC filter blanking window offset count.
//!
//! \param base is the base address of the EPWM module.
//!
//! This function returns DC filter blanking window offset count.
//!
//! \return None
//
//*****************************************************************************
static inline uint16_t
EPWM_getDigitalCompareBlankingWindowOffsetCount(uint32_t base)
{
//
// Check the arguments
//
;
//
// Return the Blanking Window Offset count
//
return((*((volatile uint16_t *)(base + 0xCAU))));
}
//*****************************************************************************
//
//! Return DC filter blanking window length count.
//!
//! \param base is the base address of the EPWM module.
//!
//! This function returns DC filter blanking window length count.
//!
//! \return None
//
//*****************************************************************************
static inline uint16_t
EPWM_getDigitalCompareBlankingWindowLengthCount(uint32_t base)
{
//
// Check the arguments
//
;
//
// Return the Blanking Window Length count
//
return((*((volatile uint16_t *)(base + 0xCCU))));
}
//*****************************************************************************
//
//! Set up the Digital Compare Event source.
//!
//! \param base is the base address of the EPWM module.
//! \param dcModule is the Digital Compare module.
//! \param dcEvent is the Digital Compare Event number.
//! \param dcEventSource is the - Digital Compare Event source.
//!
//! This function sets up the Digital Compare module Event sources.
//! The following are valid values for the parameters.
//! - dcModule
//! - EPWM_DC_MODULE_A - Digital Compare Module A
//! - EPWM_DC_MODULE_B - Digital Compare Module B
//! - dcEvent
//! - EPWM_DC_EVENT_1 - Digital Compare Event number 1
//! - EPWM_DC_EVENT_2 - Digital Compare Event number 2
//! - dcEventSource
//! - EPWM_DC_EVENT_SOURCE_FILT_SIGNAL - signal source is filtered
//! \note The signal source for this option is DCxEVTy, where the
//! value of x is dependent on dcModule and the value of y is
//! dependent on dcEvent. Possible signal sources are DCAEVT1,
//! DCBEVT1, DCAEVT2 or DCBEVT2 depending on the value of both
//! dcModule and dcEvent.
//! - EPWM_DC_EVENT_SOURCE_ORIG_SIGNAL - signal source is unfiltered
//! The signal source for this option is DCxEVTy.
//! \return None
//
//*****************************************************************************
static inline void
EPWM_setDigitalCompareEventSource(uint32_t base,
EPWM_DigitalCompareModule dcModule,
EPWM_DigitalCompareEvent dcEvent,
EPWM_DigitalCompareEventSource dcEventSource)
{
uint32_t registerOffset;
//
// Check the arguments
//
;
registerOffset = 0xC3U + (uint32_t)dcModule;
//
// Set the DC event 1 source source
//
__eallow();
if(dcEvent == EPWM_DC_EVENT_1)
{
(*((volatile uint16_t *)(base + registerOffset))) =
(((*((volatile uint16_t *)(base + registerOffset))) & ~0x1U) |
(uint16_t)dcEventSource);
}
else
{
(*((volatile uint16_t *)(base + registerOffset))) =
(((*((volatile uint16_t *)(base + registerOffset))) & ~0x100U) |
((uint16_t)dcEventSource << 8U));
}
__edis();
}
//*****************************************************************************
//
//! Set up the Digital Compare input sync mode.
//!
//! \param base is the base address of the EPWM module.
//! \param dcModule is the Digital Compare module.
//! \param dcEvent is the Digital Compare Event number.
//! \param syncMode is the Digital Compare Event sync mode.
//!
//! This function sets up the Digital Compare module Event sources.
//! The following are valid values for the parameters.
//! - dcModule
//! - EPWM_DC_MODULE_A - Digital Compare Module A
//! - EPWM_DC_MODULE_B - Digital Compare Module B
//! - dcEvent
//! - EPWM_DC_EVENT_1 - Digital Compare Event number 1
//! - EPWM_DC_EVENT_2 - Digital Compare Event number 2
//! - syncMode
//! - EPWM_DC_EVENT_INPUT_SYNCED - DC input signal is synced with
//! TBCLK
//! - EPWM_DC_EVENT_INPUT_NOT SYNCED - DC input signal is not synced with
//! TBCLK
//!
//! \return None
//
//*****************************************************************************
static inline void
EPWM_setDigitalCompareEventSyncMode(uint32_t base,
EPWM_DigitalCompareModule dcModule,
EPWM_DigitalCompareEvent dcEvent,
EPWM_DigitalCompareSyncMode syncMode)
{
uint32_t registerOffset;
//
// Check the arguments
//
;
registerOffset = 0xC3U + (uint32_t)dcModule;
//
// Set the DC event sync mode
//
__eallow();
if(dcEvent == EPWM_DC_EVENT_1)
{
(*((volatile uint16_t *)(base + registerOffset))) =
(((*((volatile uint16_t *)(base + registerOffset))) & ~0x2U) |
((uint16_t)syncMode << 1U));
}
else
{
(*((volatile uint16_t *)(base + registerOffset))) =
(((*((volatile uint16_t *)(base + registerOffset))) & ~0x200U) |
((uint16_t)syncMode << 9U));
}
__edis();
}
//*****************************************************************************
//
//! Enable Digital Compare to generate Start of Conversion.
//!
//! \param base is the base address of the EPWM module.
//! \param dcModule is the Digital Compare module.
//!
//! This function enables the Digital Compare Event 1 to generate Start of
//! Conversion.
//! The following are valid values for the \e dcModule parameter.
//! - EPWM_DC_MODULE_A - Digital Compare Module A
//! - EPWM_DC_MODULE_B - Digital Compare Module B
//!
//! \return None
//
//*****************************************************************************
static inline void
EPWM_enableDigitalCompareADCTrigger(uint32_t base,
EPWM_DigitalCompareModule dcModule)
{
uint32_t registerOffset;
//
// Check the arguments
//
;
registerOffset = 0xC3U + (uint32_t)dcModule;
//
// Enable Digital Compare start of conversion generation
//
__eallow();
(*((volatile uint16_t *)(base + registerOffset))) =
((*((volatile uint16_t *)(base + registerOffset))) | 0x4U);
__edis();
}
//*****************************************************************************
//
//! Disable Digital Compare from generating Start of Conversion.
//!
//! \param base is the base address of the EPWM module.
//! \param dcModule is the Digital Compare module.
//!
//! This function disables the Digital Compare Event 1 from generating Start of
//! Conversion.
//! The following are valid values for the \e dcModule parameter.
//! - EPWM_DC_MODULE_A - Digital Compare Module A
//! - EPWM_DC_MODULE_B - Digital Compare Module B
//!
//! \return None
//
//*****************************************************************************
static inline void
EPWM_disableDigitalCompareADCTrigger(uint32_t base,
EPWM_DigitalCompareModule dcModule)
{
uint32_t registerOffset;
//
// Check the arguments
//
;
registerOffset = 0xC3U + (uint32_t)dcModule;
//
// Disable Digital Compare start of conversion generation
//
__eallow();
(*((volatile uint16_t *)(base + registerOffset))) =
((*((volatile uint16_t *)(base + registerOffset))) & ~0x4U);
__edis();
}
//*****************************************************************************
//
//! Enable Digital Compare to generate sync out pulse.
//!
//! \param base is the base address of the EPWM module.
//! \param dcModule is the Digital Compare module.
//!
//! This function enables the Digital Compare Event 1 to generate sync out
//! pulse
//! The following are valid values for the \e dcModule parameter.
//! - EPWM_DC_MODULE_A - Digital Compare Module A
//! - EPWM_DC_MODULE_B - Digital Compare Module B
//!
//! \return None
//
//*****************************************************************************
static inline void
EPWM_enableDigitalCompareSyncEvent(uint32_t base,
EPWM_DigitalCompareModule dcModule)
{
uint32_t registerOffset;
//
// Check the arguments
//
;
registerOffset = 0xC3U + (uint32_t)dcModule;
//
// Enable Digital Compare sync out pulse generation
//
__eallow();
(*((volatile uint16_t *)(base + registerOffset))) =
((*((volatile uint16_t *)(base + registerOffset))) | 0x8U);
__edis();
}
//*****************************************************************************
//
//! Disable Digital Compare from generating Start of Conversion.
//!
//! \param base is the base address of the EPWM module.
//! \param dcModule is the Digital Compare module.
//!
//! This function disables the Digital Compare Event 1 from generating synch
//! out pulse.
//! The following are valid values for the \e dcModule parameters.
//! - EPWM_DC_MODULE_A - Digital Compare Module A
//! - EPWM_DC_MODULE_B - Digital Compare Module B
//!
//! \return None
//
//*****************************************************************************
static inline void
EPWM_disableDigitalCompareSyncEvent(uint32_t base,
EPWM_DigitalCompareModule dcModule)
{
uint32_t registerOffset;
//
// Check the arguments
//
;
registerOffset = 0xC3U + (uint32_t)dcModule;
//
// Disable Digital Compare sync out pulse generation
//
__eallow();
(*((volatile uint16_t *)(base + registerOffset))) =
((*((volatile uint16_t *)(base + registerOffset))) & ~0x8U);
__edis();
}
//*****************************************************************************
//
//! Set up the Digital Compare CBC latch mode.
//!
//! \param base is the base address of the EPWM module.
//! \param dcModule is the Digital Compare module.
//! \param dcEvent is the Digital Compare Event number.
//! \param latchMode is the Digital Compare CBC latch mode.
//!
//! This function sets up the Digital Compare CBC latch mode.
//! The following are valid values for the parameters.
//! - dcModule
//! - EPWM_DC_MODULE_A - Digital Compare Module A
//! - EPWM_DC_MODULE_B - Digital Compare Module B
//! - dcEvent
//! - EPWM_DC_EVENT_1 - Digital Compare Event number 1
//! - EPWM_DC_EVENT_2 - Digital Compare Event number 2
//! - latchMode
//! - EPWM_DC_CBC_LATCH_DISABLED - DC cycle-by-cycle(CBC) latch is disabled
//! - EPWM_DC_CBC_LATCH_ENABLED - DC cycle-by-cycle(CBC) latch is enabled
//!
//! \return None
//
//*****************************************************************************
static inline void
EPWM_setDigitalCompareCBCLatchMode(uint32_t base,
EPWM_DigitalCompareModule dcModule,
EPWM_DigitalCompareEvent dcEvent,
EPWM_DigitalCompareCBCLatchMode latchMode)
{
uint32_t registerOffset;
//
// Check the arguments
//
;
registerOffset = 0xC3U + (uint32_t)dcModule;
//
// Set the DC CBC Latch Mode
//
__eallow();
if(dcEvent == EPWM_DC_EVENT_1)
{
(*((volatile uint16_t *)(base + registerOffset))) =
(((*((volatile uint16_t *)(base + registerOffset))) & ~0x10U) |
((uint16_t)latchMode << 4U));
}
else
{
(*((volatile uint16_t *)(base + registerOffset))) =
(((*((volatile uint16_t *)(base + registerOffset))) & ~0x1000U) |
((uint16_t)latchMode << 12U));
}
__edis();
}
//*****************************************************************************
//
//! Sets the Digital Compare CBC latch clear event.
//!
//! \param base is the base address of the EPWM module.
//! \param dcModule is the Digital Compare module.
//! \param dcEvent is the Digital Compare Event number.
//! \param clearEvent is the Digital Compare CBC latch clear event.
//!
//! This function sets the Digital Compare CBC latch clear event.
//! The following are valid values for the parameters.
//! - dcModule
//! - EPWM_DC_MODULE_A - Digital Compare Module A
//! - EPWM_DC_MODULE_B - Digital Compare Module B
//! - dcEvent
//! - EPWM_DC_EVENT_1 - Digital Compare Event number 1
//! - EPWM_DC_EVENT_2 - Digital Compare Event number 2
//! - clearEvent
//! - EPWM_DC_CBC_LATCH_CLR_CNTR_ZERO - DC CBC latch is cleared when
//! counter is zero
//! - EPWM_DC_CBC_LATCH_CLR_ON_CNTR_PERIOD - DC CBC latch is cleared when
//! counter is equal to period
//! - EPWM_DC_CBC_LATCH_CLR_ON_CNTR_ZERO_PERIOD - DC CBC latch is cleared
//! when either counter is
//! zero or equal to period
//!
//! \return None
//
//*****************************************************************************
static inline void
EPWM_selectDigitalCompareCBCLatchClearEvent(uint32_t base,
EPWM_DigitalCompareModule dcModule,
EPWM_DigitalCompareEvent dcEvent,
EPWM_DigitalCompareCBCLatchClearEvent clearEvent)
{
uint32_t registerOffset;
//
// Check the arguments
//
;
registerOffset = 0xC3U + (uint32_t)dcModule;
//
// Set the DC CBC Latch Clear Event
//
__eallow();
if(dcEvent == EPWM_DC_EVENT_1)
{
(*((volatile uint16_t *)(base + registerOffset))) =
(((*((volatile uint16_t *)(base + registerOffset))) & ~0x60U) |
((uint16_t)clearEvent << 5U));
}
else
{
(*((volatile uint16_t *)(base + registerOffset))) =
(((*((volatile uint16_t *)(base + registerOffset))) & ~0x6000U) |
((uint16_t)clearEvent << 13U));
}
__edis();
}
//*****************************************************************************
//
//! Gets the Digital Compare CBC latch status
//!
//! \param base is the base address of the EPWM module.
//! \param dcModule is the Digital Compare module.
//! \param dcEvent is the Digital Compare Event number.
//!
//! This function returns the Digital Compare module cycle-by-cycle(CBC) latch
//! status.
//! The following are valid values for the parameters.
//! - dcModule
//! - EPWM_DC_MODULE_A - Digital Compare Module A
//! - EPWM_DC_MODULE_B - Digital Compare Module B
//! - dcEvent
//! - EPWM_DC_EVENT_1 - Digital Compare Event number 1
//! - EPWM_DC_EVENT_2 - Digital Compare Event number 2
//!
//! \return Returns Digital Compare CBC latch status.
//! -\b true - CBC latch is enabled
//! -\b false - CBC latch is disabled
//
//*****************************************************************************
static inline _Bool
EPWM_getDigitalCompareCBCLatchStatus(uint32_t base,
EPWM_DigitalCompareModule dcModule,
EPWM_DigitalCompareEvent dcEvent)
{
uint32_t registerOffset;
uint16_t status;
//
// Check the arguments
//
;
registerOffset = 0xC3U + (uint32_t)dcModule;
//
// Get DC CBC Latch Clear Event
//
if(dcEvent == EPWM_DC_EVENT_1)
{
status = (*((volatile uint16_t *)(base + registerOffset))) & 0x80U;
}
else
{
status = (*((volatile uint16_t *)(base + registerOffset))) & 0x8000U;
}
return(status != 0U);
}
//
// DC capture mode
//
//*****************************************************************************
//
//! Enables the Time Base Counter Capture controller.
//!
//! \param base is the base address of the EPWM module.
//!
//! This function enables the time Base Counter Capture.
//!
//! \return None.
//
//*****************************************************************************
static inline void
EPWM_enableDigitalCompareCounterCapture(uint32_t base)
{
//
// Check the arguments
//
;
//
// Enable Time base counter capture
//
__eallow();
(*((volatile uint16_t *)(base + 0xC8U))) |= 0x1U;
__edis();
}
//*****************************************************************************
//
//! Disables the Time Base Counter Capture controller.
//!
//! \param base is the base address of the EPWM module.
//!
//! This function disable the time Base Counter Capture.
//!
//! \return None.
//
//*****************************************************************************
static inline void
EPWM_disableDigitalCompareCounterCapture(uint32_t base)
{
//
// Check the arguments
//
;
//
// Disable Time base counter capture
//
__eallow();
(*((volatile uint16_t *)(base + 0xC8U))) &= ~0x1U;
__edis();
}
//*****************************************************************************
//
//! Set the Time Base Counter Capture mode.
//!
//! \param base is the base address of the EPWM module.
//! \param enableShadowMode is the shadow read mode flag.
//!
//! This function sets the mode the Time Base Counter value is read from. If
//! enableShadowMode is true, CPU reads of the DCCAP register will return the
//! shadow register contents.If enableShadowMode is false, CPU reads of the
//! DCCAP register will return the active register contents.
//!
//! \return None.
//
//*****************************************************************************
static inline void
EPWM_setDigitalCompareCounterShadowMode(uint32_t base, _Bool enableShadowMode)
{
//
// Check the arguments
//
;
__eallow();
if(enableShadowMode)
{
//
// Enable DC counter shadow mode
//
(*((volatile uint16_t *)(base + 0xC8U))) &= ~0x2U;
}
else
{
//
// Disable DC counter shadow mode
//
(*((volatile uint16_t *)(base + 0xC8U))) |= 0x2U;
}
__edis();
}
//*****************************************************************************
//
//! Return the DC Capture event status.
//!
//! \param base is the base address of the EPWM module.
//!
//! This function returns the DC capture event status.
//!
//! \return Returns true if a DC capture event has occurs.
//! Returns false if no DC Capture event has occurred.
//!
//! \return None.
//
//*****************************************************************************
static inline _Bool
EPWM_getDigitalCompareCaptureStatus(uint32_t base)
{
//
// Check the arguments
//
;
//
// Return the DC compare status
//
return(((*((volatile uint16_t *)(base + 0xC8U))) & 0x2000U) ==
0x2000U);
}
//*****************************************************************************
//
//! Clears DC capture latched status flag
//!
//! \param base is the base address of the EPWM module.
//! This function is used to clear the CAPSTS (set) condition.
//!
//! \return None.
//*****************************************************************************
static inline void
EPWM_clearDigitalCompareCaptureStatusFlag(uint32_t base)
{
//
// Check the arguments
//
;
//
// Clear digital compare capture status flag
//
__eallow();
(*((volatile uint16_t *)(base + 0xC8U))) &= ~0x4000U;
__edis();
}
//*****************************************************************************
//
//! Configures DC capture operating mode
//!
//! \param base is the base address of the EPWM module.
//! \param disableClearMode is the clear mode bit.
//!
//! This function is used to configure the DC capture operating mode. If
//! \e disableClearMode is false, the TBCNT value is captured in active register
//! on occurance of DCEVTFILT event. The trip events are ignored until next
//! PRD or ZRO event re-triggers the capture mechanism.
//! If \e disableClearMode is true, the TBCNT value is captured, CAPSTS flag is
//! set and further trips are ignored until CAPSTS bit is cleared.
//!
//! \return None.
//*****************************************************************************
static inline void
EPWM_configureDigitalCompareCounterCaptureMode(uint32_t base,
_Bool disableClearMode)
{
//
// Check the arguments
//
;
__eallow();
if(disableClearMode)
{
//
// Disable DC counter auto-clear on PULSESEL event
//
(*((volatile uint16_t *)(base + 0xC8U))) |= 0x8000U;
}
else
{
//
// Enable DC counter clear on PULSESEL events
//
(*((volatile uint16_t *)(base + 0xC8U))) &= ~0x8000U;
}
__edis();
}
//*****************************************************************************
//
//! Return the DC Time Base Counter capture value.
//!
//! \param base is the base address of the EPWM module.
//!
//! This function returns the DC Time Base Counter capture value. The value
//! read is determined by the mode as set in the
//! EPWM_setTimeBaseCounterReadMode() function.
//!
//! \return Returns the DC Time Base Counter Capture count value.
//
//*****************************************************************************
static inline uint16_t
EPWM_getDigitalCompareCaptureCount(uint32_t base)
{
//
// Check the arguments
//
;
//
// Return the DC Time Base Counter Capture count value
//
return((*((volatile uint16_t *)(base + 0xCFU))));
}
//*****************************************************************************
//
//! Enable DC TRIP combinational input.
//!
//! \param base is the base address of the EPWM module.
//! \param tripInput is the Trip number.
//! \param dcType is the Digital Compare module.
//!
//! This function enables the specified Trip input.
//! Valid values for the parameters are:
//! - tripInput
//! - EPWM_DC_COMBINATIONAL_TRIPINx, where x is 1,2,...12,14,15
//! - dcType
//! - EPWM_DC_TYPE_DCAH - Digital Compare A High
//! - EPWM_DC_TYPE_DCAL - Digital Compare A Low
//! - EPWM_DC_TYPE_DCBH - Digital Compare B High
//! - EPWM_DC_TYPE_DCBL - Digital Compare B Low
//!
//! \return None.
//
//*****************************************************************************
static inline void
EPWM_enableDigitalCompareTripCombinationInput(uint32_t base,
uint16_t tripInput,
EPWM_DigitalCompareType dcType)
{
uint32_t registerOffset;
//
// Check the arguments
//
;
//
// Get the DCAHTRIPSEL, DCALTRIPSEL, DCBHTRIPSEL, DCBLTRIPSEL register
// offset with respect to DCAHTRIPSEL
//
registerOffset = 0xD2U + (uint32_t)dcType;
//
// Set the DC trip input
//
__eallow();
(*((volatile uint16_t *)(base + registerOffset))) =
((*((volatile uint16_t *)(base + registerOffset))) | tripInput);
//
// Enable the combination input
//
(*((volatile uint16_t *)(base + 0xC0U))) =
((*((volatile uint16_t *)(base + 0xC0U))) | (0xFU << ((uint16_t)dcType << 2U)));
__edis();
}
//*****************************************************************************
//
//! Disable DC TRIP combinational input.
//!
//! \param base is the base address of the EPWM module.
//! \param tripInput is the Trip number.
//! \param dcType is the Digital Compare module.
//!
//! This function disables the specified Trip input.
//! Valid values for the parameters are:
//! - tripInput
//! - EPWM_DC_COMBINATIONAL_TRIPINx, where x is 1,2,...12,14,15
//! - dcType
//! - EPWM_DC_TYPE_DCAH - Digital Compare A High
//! - EPWM_DC_TYPE_DCAL - Digital Compare A Low
//! - EPWM_DC_TYPE_DCBH - Digital Compare B High
//! - EPWM_DC_TYPE_DCBL - Digital Compare B Low
//!
//! \return None.
//
//*****************************************************************************
static inline void
EPWM_disableDigitalCompareTripCombinationInput(uint32_t base,
uint16_t tripInput,
EPWM_DigitalCompareType dcType)
{
uint32_t registerOffset;
//
// Check the arguments
//
;
//
// Get the DCAHTRIPSEL, DCALTRIPSEL, DCBHTRIPSEL, DCBLTRIPSEL register
// offset with respect to DCAHTRIPSEL
//
registerOffset = 0xD2U + (uint32_t)dcType;
//
// Set the DC trip input
//
__eallow();
(*((volatile uint16_t *)(base + registerOffset))) =
((*((volatile uint16_t *)(base + registerOffset))) & ~tripInput);
__edis();
}
//
// Valley switching
//
//*****************************************************************************
//
//! Enable valley capture mode.
//!
//! \param base is the base address of the EPWM module.
//!
//! This function enables Valley Capture mode.
//!
//! \return None.
//
//*****************************************************************************
static inline void
EPWM_enableValleyCapture(uint32_t base)
{
//
// Check the arguments
//
;
//
// Set VCAPE bit
//
__eallow();
(*((volatile uint16_t *)(base + 0x18U))) |= 0x1U;
__edis();
}
//*****************************************************************************
//
//! Disable valley capture mode.
//!
//! \param base is the base address of the EPWM module.
//!
//! This function disables Valley Capture mode.
//!
//! \return None.
//
//*****************************************************************************
static inline void
EPWM_disableValleyCapture(uint32_t base)
{
//
// Check the arguments
//
;
//
// Clear VCAPE bit
//
__eallow();
(*((volatile uint16_t *)(base + 0x18U))) &= ~0x1U;
__edis();
}
//*****************************************************************************
//
//! Start valley capture mode.
//!
//! \param base is the base address of the EPWM module.
//!
//! This function starts Valley Capture sequence.
//!
//! \b Make sure you invoke EPWM_setValleyTriggerSource with the trigger
//! variable set to EPWM_VALLEY_TRIGGER_EVENT_SOFTWARE before calling this
//! function.
//!
//! \return None.
//
//*****************************************************************************
static inline void
EPWM_startValleyCapture(uint32_t base)
{
//
// Check the arguments
//
;
//
// Set VCAPSTART bit
//
__eallow();
(*((volatile uint16_t *)(base + 0x18U))) |= 0x2U;
__edis();
}
//*****************************************************************************
//
//! Set valley capture trigger.
//!
//! \param base is the base address of the EPWM module.
//! \param trigger is the Valley counter trigger.
//!
//! This function sets the trigger value that initiates Valley Capture sequence
//!
//! \b Set the number of Trigger source events for starting and stopping the
//! valley capture using EPWM_setValleyTriggerEdgeCounts().
//!
//! \return None.
//
//*****************************************************************************
static inline void
EPWM_setValleyTriggerSource(uint32_t base, EPWM_ValleyTriggerSource trigger)
{
//
// Check the arguments
//
;
//
// Write to TRIGSEL bits
//
__eallow();
(*((volatile uint16_t *)(base + 0x18U))) =
(((*((volatile uint16_t *)(base + 0x18U))) & ~0x1CU) |
((uint16_t)trigger << 2U));
__edis();
}
//*****************************************************************************
//
//! Set valley capture trigger source count.
//!
//! \param base is the base address of the EPWM module.
//! \param startCount
//! \param stopCount
//!
//! This function sets the number of trigger events required to start and stop
//! the valley capture count.
//! Maximum values for both startCount and stopCount is 15 corresponding to the
//! 15th edge of the trigger event.
//!
//! \b Note:
//! A startCount value of 0 prevents starting the valley counter.
//! A stopCount value of 0 prevents the valley counter from stopping.
//!
//! \return None.
//
//*****************************************************************************
static inline void
EPWM_setValleyTriggerEdgeCounts(uint32_t base, uint16_t startCount,
uint16_t stopCount)
{
//
// Check the arguments
//
;
;
//
// Write to STARTEDGE and STOPEDGE bits
//
__eallow();
(*((volatile uint16_t *)(base + 0x19U))) =
(((*((volatile uint16_t *)(base + 0x19U))) &
~(0xFU | 0xF00U)) |
(startCount | (stopCount << 8U)));
__edis();
}
//*****************************************************************************
//
//! Enable valley switching delay.
//!
//! \param base is the base address of the EPWM module.
//!
//! This function enables Valley switching delay.
//!
//! \return None.
//
//*****************************************************************************
static inline void
EPWM_enableValleyHWDelay(uint32_t base)
{
//
// Check the arguments
//
;
//
// Set EDGEFILTDLYSEL bit
//
__eallow();
(*((volatile uint16_t *)(base + 0x18U))) |= 0x400U;
__edis();
}
//*****************************************************************************
//
//! Disable valley switching delay.
//!
//! \param base is the base address of the EPWM module.
//!
//! This function disables Valley switching delay.
//!
//! \return None.
//
//*****************************************************************************
static inline void
EPWM_disableValleyHWDelay(uint32_t base)
{
//
// Check the arguments
//
;
//
// Clear EDGEFILTDLYSEL bit
//
__eallow();
(*((volatile uint16_t *)(base + 0x18U))) &= ~0x400U;
__edis();
}
//*****************************************************************************
//
//! Set Valley delay values.
//!
//! \param base is the base address of the EPWM module.
//! \param delayOffsetValue is the software defined delay offset value.
//!
//! This function sets the Valley delay value.
//!
//! \return None.
//
//*****************************************************************************
static inline void
EPWM_setValleySWDelayValue(uint32_t base, uint16_t delayOffsetValue)
{
//
// Check the arguments
//
;
//
// Write to SWVDELVAL bits
//
(*((volatile uint16_t *)(base + 0x77U))) = delayOffsetValue;
}
//*****************************************************************************
//
//! Set Valley delay mode.
//!
//! \param base is the base address of the EPWM module.
//! \param delayMode is the Valley delay mode.
//!
//! This function sets the Valley delay mode values.
//!
//! \return None.
//
//*****************************************************************************
static inline void
EPWM_setValleyDelayDivider(uint32_t base, EPWM_ValleyDelayMode delayMode)
{
//
// Check the arguments
//
;
//
// Write to VDELAYDIV bits
//
__eallow();
(*((volatile uint16_t *)(base + 0x18U))) =
(((*((volatile uint16_t *)(base + 0x18U))) & ~0x380U) |
((uint16_t)delayMode << 7U));
__edis();
}
//*****************************************************************************
//
//! Get the valley edge status bit.
//!
//! \param base is the base address of the EPWM module.
//! \param edge is the start or stop edge.
//!
//! This function returns the status of the start or stop valley status
//! depending on the value of edge.
//! If a start or stop edge has occurred, the function returns true, if not it
//! returns false.
//!
//! \return Returns true if the specified edge has occurred,
//! Returns false if the specified edge has not occurred.
//
//*****************************************************************************
static inline _Bool
EPWM_getValleyEdgeStatus(uint32_t base, EPWM_ValleyCounterEdge edge)
{
//
// Check the arguments
//
;
if(edge == EPWM_VALLEY_COUNT_START_EDGE)
{
//
// Returns STARTEDGESTS status
//
return((((*((volatile uint16_t *)(base + 0x19U))) & 0x80U) ==
0x80U ) ? 1 : 0);
}
else
{
//
// Returns STOPEDGESTS status
//
return((((*((volatile uint16_t *)(base + 0x19U))) & 0x8000U) ==
0x8000U) ? 1 : 0);
}
}
//*****************************************************************************
//
//! Get the Valley Counter value.
//!
//! \param base is the base address of the EPWM module.
//!
//! This function returns the valley time base count value which is captured
//! upon occurrence of the stop edge condition selected by
//! EPWM_setValleyTriggerSource() and by the stopCount variable of the
//! EPWM_setValleyTriggerEdgeCounts() function.
//!
//! \return Returns the valley base time count.
//
//*****************************************************************************
static inline uint16_t
EPWM_getValleyCount(uint32_t base)
{
//
// Check the arguments
//
;
//
// Read VCNTVAL register
//
return((*((volatile uint16_t *)(base + 0xFEU))));
}
//*****************************************************************************
//
//! Get the Valley delay value.
//!
//! \param base is the base address of the EPWM module.
//!
//! This function returns the hardware valley delay count.
//!
//! \return Returns the valley delay count.
//
//*****************************************************************************
static inline uint16_t
EPWM_getValleyHWDelay(uint32_t base)
{
//
// Check the arguments
//
;
//
// Read HWVDELVAL register
//
return((*((volatile uint16_t *)(base + 0xFDU))));
}
//*****************************************************************************
//
//! Enable Global shadow load mode.
//!
//! \param base is the base address of the EPWM module.
//!
//! This function enables Global shadow to active load mode of registers.
//! The trigger source for loading shadow to active is determined by
//! EPWM_setGlobalLoadTrigger() function.
//!
//! \return None.
//
//*****************************************************************************
static inline void
EPWM_enableGlobalLoad(uint32_t base)
{
//
// Check the arguments
//
;
//
// Shadow to active load is controlled globally
//
__eallow();
(*((volatile uint16_t *)(base + 0x34U))) |= 0x1U;
__edis();
}
//*****************************************************************************
//
//! Disable Global shadow load mode.
//!
//! \param base is the base address of the EPWM module.
//!
//! This function disables Global shadow to active load mode of registers.
//! Loading shadow to active is determined individually.
//!
//! \return None.
//
//*****************************************************************************
static inline void
EPWM_disableGlobalLoad(uint32_t base)
{
//
// Check the arguments
//
;
//
// Shadow to active load is controlled individually
//
__eallow();
(*((volatile uint16_t *)(base + 0x34U))) &= ~0x1U;
__edis();
}
//*****************************************************************************
//
//! Set the Global shadow load pulse.
//!
//! \param base is the base address of the EPWM module.
//! \param loadTrigger is the pulse that causes global shadow load.
//!
//! This function sets the pulse that causes Global shadow to active load.
//! Valid values for the loadTrigger parameter are:
//!
//! - EPWM_GL_LOAD_PULSE_CNTR_ZERO - load when counter is equal
//! to zero
//! - EPWM_GL_LOAD_PULSE_CNTR_PERIOD - load when counter is equal
//! to period
//! - EPWM_GL_LOAD_PULSE_CNTR_ZERO_PERIOD - load when counter is equal
//! to zero or period
//! - EPWM_GL_LOAD_PULSE_SYNC - load on sync event
//! - EPWM_GL_LOAD_PULSE_SYNC_OR_CNTR_ZERO - load on sync event or when
//! counter is equal to zero
//! - EPWM_GL_LOAD_PULSE_SYNC_OR_CNTR_PERIOD - load on sync event or when
//! counter is equal to period
//! - EPWM_GL_LOAD_PULSE_SYNC_CNTR_ZERO_PERIOD - load on sync event or when
//! counter is equal to period
//! or zero
//! - EPWM_GL_LOAD_PULSE_GLOBAL_FORCE - load on global force
//!
//! \return None.
//
//*****************************************************************************
static inline void
EPWM_setGlobalLoadTrigger(uint32_t base, EPWM_GlobalLoadTrigger loadTrigger)
{
//
// Check the arguments
//
;
//
// Set the Global shadow to active load pulse
//
__eallow();
(*((volatile uint16_t *)(base + 0x34U))) =
(((*((volatile uint16_t *)(base + 0x34U))) & ~0x1EU) |
((uint16_t)loadTrigger << 1U));
__edis();
}
//*****************************************************************************
//
//! Set the number of Global load pulse event counts
//!
//! \param base is the base address of the EPWM module.
//! \param prescalePulseCount is the pulse event counts.
//!
//! This function sets the number of Global Load pulse events that have to
//! occurred before a global load pulse is issued. Valid values for
//! prescaleCount range from 0 to 7. 0 being no event (disables counter), and 7
//! representing 7 events.
//!
//! \return None.
//
//*****************************************************************************
static inline void
EPWM_setGlobalLoadEventPrescale(uint32_t base, uint16_t prescalePulseCount)
{
//
// Check the arguments
//
;
;
//
// Set the number of counts that have to occur before
// a load strobe is issued
//
__eallow();
(*((volatile uint16_t *)(base + 0x34U))) =
(((*((volatile uint16_t *)(base + 0x34U))) & ~0x380U) |
(prescalePulseCount << 7U));
__edis();
}
//*****************************************************************************
//
//! Return the number of Global load pulse event counts
//!
//! \param base is the base address of the EPWM module.
//!
//! This function returns the number of Global Load pulse events that have
//! occurred. These pulse events are set by the EPWM_setGlobalLoadTrigger()
//! function.
//!
//! \return None.
//
//*****************************************************************************
static inline uint16_t
EPWM_getGlobalLoadEventCount(uint32_t base)
{
//
// Check the arguments
//
;
//
// Return the number of events that have occurred
//
return(((*((volatile uint16_t *)(base + 0x34U))) >> 10U) & 0x7U);
}
//*****************************************************************************
//
//! Enable continuous global shadow to active load.
//!
//! \param base is the base address of the EPWM module.
//!
//! This function enables global continuous shadow to active load. Register
//! load happens every time the event set by the
//! EPWM_setGlobalLoadTrigger() occurs.
//!
//! \return None.
//
//*****************************************************************************
static inline void
EPWM_disableGlobalLoadOneShotMode(uint32_t base)
{
//
// Check the arguments
//
;
//
// Enable global continuous shadow to active load
//
__eallow();
(*((volatile uint16_t *)(base + 0x34U))) &= ~0x20U;
__edis();
}
//*****************************************************************************
//
//! Enable One shot global shadow to active load.
//!
//! \param base is the base address of the EPWM module.
//!
//! This function enables a one time global shadow to active load. Register
//! load happens every time the event set by the
//! EPWM_setGlobalLoadTrigger() occurs.
//!
//! \return None.
//
//*****************************************************************************
static inline void
EPWM_enableGlobalLoadOneShotMode(uint32_t base)
{
//
// Check the arguments
//
;
//
// Enable global continuous shadow to active load
//
__eallow();
(*((volatile uint16_t *)(base + 0x34U))) |= 0x20U;
__edis();
}
//*****************************************************************************
//
//! Set One shot global shadow to active load pulse.
//!
//! \param base is the base address of the EPWM module.
//!
//! This function sets a one time global shadow to active load pulse. The pulse
//! propagates to generate a load signal if any of the events set by
//! EPWM_setGlobalLoadTrigger() occur.
//!
//! \return None.
//
//*****************************************************************************
static inline void
EPWM_setGlobalLoadOneShotLatch(uint32_t base)
{
//
// Check the arguments
//
;
//
// Set a one shot Global shadow load pulse.
//
__eallow();
(*((volatile uint16_t *)(base + 0x74U))) |= 0x1U;
__edis();
}
//*****************************************************************************
//
//! Force a software One shot global shadow to active load pulse.
//!
//! \param base is the base address of the EPWM module.
//!
//! This function forces a software a one time global shadow to active load
//! pulse.
//!
//! \return None.
//
//*****************************************************************************
static inline void
EPWM_forceGlobalLoadOneShotEvent(uint32_t base)
{
//
// Check the arguments
//
;
//
// Force a Software Global shadow load pulse
//
__eallow();
(*((volatile uint16_t *)(base + 0x74U))) |= 0x2U;
__edis();
}
//*****************************************************************************
//
//! Enable a register to be loaded Globally.
//!
//! \param base is the base address of the EPWM module.
//! \param loadRegister is the register.
//!
//! This function enables the register specified by loadRegister to be globally
//! loaded.
//! Valid values for loadRegister are:
//! - EPWM_GL_REGISTER_TBPRD_TBPRDHR - Register TBPRD:TBPRDHR
//! - EPWM_GL_REGISTER_CMPA_CMPAHR - Register CMPA:CMPAHR
//! - EPWM_GL_REGISTER_CMPB_CMPBHR - Register CMPB:CMPBHR
//! - EPWM_GL_REGISTER_CMPC - Register CMPC
//! - EPWM_GL_REGISTER_CMPD - Register CMPD
//! - EPWM_GL_REGISTER_DBRED_DBREDHR - Register DBRED:DBREDHR
//! - EPWM_GL_REGISTER_DBFED_DBFEDHR - Register DBFED:DBFEDHR
//! - EPWM_GL_REGISTER_DBCTL - Register DBCTL
//! - EPWM_GL_REGISTER_AQCTLA_AQCTLA2 - Register AQCTLA/A2
//! - EPWM_GL_REGISTER_AQCTLB_AQCTLB2 - Register AQCTLB/B2
//! - EPWM_GL_REGISTER_AQCSFRC - Register AQCSFRC
//!
//! \return None.
//
//*****************************************************************************
static inline void
EPWM_enableGlobalLoadRegisters(uint32_t base, uint16_t loadRegister)
{
//
// Check the arguments
//
;
;
//
// The register specified by loadRegister is loaded globally
//
__eallow();
(*((volatile uint16_t *)(base + 0x35U))) |= loadRegister;
__edis();
}
//*****************************************************************************
//
//! Disable a register to be loaded Globally.
//!
//! \param base is the base address of the EPWM module.
//! \param loadRegister is the register.
//!
//! This function disables the register specified by loadRegister from being
//! loaded globally. The shadow to active load happens as specified by the
//! register control
//! Valid values for loadRegister are:
//! - EPWM_GL_REGISTER_TBPRD_TBPRDHR - Register TBPRD:TBPRDHR
//! - EPWM_GL_REGISTER_CMPA_CMPAHR - Register CMPA:CMPAHR
//! - EPWM_GL_REGISTER_CMPB_CMPBHR - Register CMPB:CMPBHR
//! - EPWM_GL_REGISTER_CMPC - Register CMPC
//! - EPWM_GL_REGISTER_CMPD - Register CMPD
//! - EPWM_GL_REGISTER_DBRED_DBREDHR - Register DBRED:DBREDHR
//! - EPWM_GL_REGISTER_DBFED_DBFEDHR - Register DBFED:DBFEDHR
//! - EPWM_GL_REGISTER_DBCTL - Register DBCTL
//! - EPWM_GL_REGISTER_AQCTLA_AQCTLA2 - Register AQCTLA/A2
//! - EPWM_GL_REGISTER_AQCTLB_AQCTLB2 - Register AQCTLB/B2
//! - EPWM_GL_REGISTER_AQCSFRC - Register AQCSFRC
//!
//! \return None.
//
//*****************************************************************************
static inline void
EPWM_disableGlobalLoadRegisters(uint32_t base, uint16_t loadRegister)
{
//
// Check the arguments
//
;
;
//
// The register specified by loadRegister is loaded by individual
// register configuration setting
//
__eallow();
(*((volatile uint16_t *)(base + 0x35U))) &= ~loadRegister;
__edis();
}
//*****************************************************************************
//
//! Lock EALLOW protected register groups
//!
//! \param base is the base address of the EPWM module.
//! \param registerGroup is the EALLOW register groups.
//!
//! This functions locks the EALLOW protected register groups specified by
//! the registerGroup variable.
//!
//! \return None.
//
//*****************************************************************************
static inline void
EPWM_lockRegisters(uint32_t base, EPWM_LockRegisterGroup registerGroup)
{
//
// Check the arguments
//
;
//
// Write the Key to EPWMLOCK register
//
(*((volatile uint32_t *)(base + 0xFAU))) =
(0xA5A50000UL | ((uint32_t)registerGroup));
}
//*****************************************************************************
//
//! Set emulation mode
//!
//! \param base is the base address of the EPWM module.
//! \param emulationMode is the emulation mode.
//!
//! This function sets the emulation behaviours of the time base counter. Valid
//! values for emulationMode are:
//! - EPWM_EMULATION_STOP_AFTER_NEXT_TB - Stop after next Time Base counter
//! increment or decrement.
//! - EPWM_EMULATION_STOP_AFTER_FULL_CYCLE - Stop when counter completes whole
//! cycle.
//! - EPWM_EMULATION_FREE_RUN - Free run.
//!
//! \return None.
//
//*****************************************************************************
extern void
EPWM_setEmulationMode(uint32_t base, EPWM_EmulationMode emulationMode);
//*****************************************************************************
//
//! Configures ePWM signal with desired frequency & duty
//!
//! \param base is the base address of the EPWM module.
//! \param signalParams is the desired signal parameters.
//!
//! This function configures the ePWM module to generate a signal with
//! desired frequency & duty.
//!
//! \return None.
//
//*****************************************************************************
extern void
EPWM_configureSignal(uint32_t base, const EPWM_SignalParams *signalParams);
//*****************************************************************************
//
// Close the Doxygen group.
//! @}
//
//*****************************************************************************
//*****************************************************************************
//
// Mark the end of the C bindings section for C++ compilers.
//
//*****************************************************************************
//###########################################################################
//
// FILE: eqep.h
//
// TITLE: C28x eQEP driver.
//
//###########################################################################
// $Copyright:
// Copyright (C) 2023 Texas Instruments Incorporated - http://www.ti.com/
//
// 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 Texas Instruments Incorporated 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
// OWNER 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.
// $
//###########################################################################
//*****************************************************************************
//
// If building with a C++ compiler, make all of the definitions in this header
// have a C binding.
//
//*****************************************************************************
//*****************************************************************************
//
//! \addtogroup eqep_api eQEP
//! @{
//
//*****************************************************************************
//###########################################################################
//
// FILE: hw_eqep.h
//
// TITLE: Definitions for the EQEP registers.
//
//###########################################################################
// $Copyright:
// Copyright (C) 2023 Texas Instruments Incorporated - http://www.ti.com/
//
// 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 Texas Instruments Incorporated 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
// OWNER 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.
// $
//###########################################################################
//*************************************************************************************************
//
// The following are defines for the EQEP register offsets
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the QDECCTL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the QEPCTL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the QCAPCTL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the QPOSCTL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the QEINT register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the QFLG register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the QCLR register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the QFRC register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the QEPSTS register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the REV register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the QEPSTROBESEL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the QMACTRL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the QEPSRCSEL register
//
//*************************************************************************************************
//*****************************************************************************
//
// Values that can be passed to EQEP_setDecoderConfig() as the config
// parameter.
//
//*****************************************************************************
//
// Operation Mode
//
//
// Resolution
//
//
// Swap QEPA and QEPB
//
//
// Index pulse gating option
//
//*****************************************************************************
//
// Values that can be passed to EQEP_setCompareConfig() as the config
// parameter.
//
//*****************************************************************************
//
// Sync pulse pin
//
//
// Shadow register use
//
//*****************************************************************************
//
// Values that can be passed to EQEP_enableInterrupt(),
// EQEP_disableInterrupt(), and EQEP_clearInterruptStatus() as the
// intFlags parameter and returned by EQEP_clearInterruptStatus().
//
//*****************************************************************************
//*****************************************************************************
//
// Values that can be returned by EQEP_getStatus().
//
//*****************************************************************************
//! Unit position event detected
//! Direction was clockwise on first index event
//! Direction is CW (forward)
//! Direction was CW on index
//! Capture timer overflow
//! Direction changed between position capture events
//! First index pulse occurred
//! Position counter error
//*****************************************************************************
//
// Values that can be passed to EQEP_setLatchMode() as the latchMode parameter.
//
//*****************************************************************************
//
// Position counter latch event
//
//
// Strobe position counter latch event
//
//! On rising edge of strobe
//! On rising edge when clockwise, on falling when counter clockwise
//
// Index position counter latch event
//
//*****************************************************************************
//
// Values that can be passed to EQEP_setPositionInitMode() as the initMode
// parameter.
//
//*****************************************************************************
//
// Strobe events
//
//! On rising edge of strobe
//! On rising edge when clockwise, on falling when counter clockwise
//
// Index events
//
//*****************************************************************************
//
//! Values that can be passed to EQEP_setPositionCounterConfig() as the \e mode
//! parameter.
//
//*****************************************************************************
typedef enum
{
//! Reset position on index pulse
EQEP_POSITION_RESET_IDX = 0x0000,
//! Reset position on maximum position
EQEP_POSITION_RESET_MAX_POS = 0x1000,
//! Reset position on the first index pulse
EQEP_POSITION_RESET_1ST_IDX = 0x2000,
//! Reset position on a unit time event
EQEP_POSITION_RESET_UNIT_TIME_OUT = 0x3000
} EQEP_PositionResetMode;
//*****************************************************************************
//
//! Values that can be passed to EQEP_setCaptureConfig() as the \e capPrescale
//! parameter. CAPCLK is the capture timer clock frequency.
//
//*****************************************************************************
typedef enum
{
EQEP_CAPTURE_CLK_DIV_1 = 0x00, //!< CAPCLK = SYSCLKOUT/1
EQEP_CAPTURE_CLK_DIV_2 = 0x10, //!< CAPCLK = SYSCLKOUT/2
EQEP_CAPTURE_CLK_DIV_4 = 0x20, //!< CAPCLK = SYSCLKOUT/4
EQEP_CAPTURE_CLK_DIV_8 = 0x30, //!< CAPCLK = SYSCLKOUT/8
EQEP_CAPTURE_CLK_DIV_16 = 0x40, //!< CAPCLK = SYSCLKOUT/16
EQEP_CAPTURE_CLK_DIV_32 = 0x50, //!< CAPCLK = SYSCLKOUT/32
EQEP_CAPTURE_CLK_DIV_64 = 0x60, //!< CAPCLK = SYSCLKOUT/64
EQEP_CAPTURE_CLK_DIV_128 = 0x70 //!< CAPCLK = SYSCLKOUT/128
} EQEP_CAPCLKPrescale;
//*****************************************************************************
//
//! Values that can be passed to EQEP_setCaptureConfig() as the \e evntPrescale
//! parameter. UPEVNT is the unit position event frequency.
//
//*****************************************************************************
typedef enum
{
EQEP_UNIT_POS_EVNT_DIV_1, //!< UPEVNT = QCLK/1
EQEP_UNIT_POS_EVNT_DIV_2, //!< UPEVNT = QCLK/2
EQEP_UNIT_POS_EVNT_DIV_4, //!< UPEVNT = QCLK/4
EQEP_UNIT_POS_EVNT_DIV_8, //!< UPEVNT = QCLK/8
EQEP_UNIT_POS_EVNT_DIV_16, //!< UPEVNT = QCLK/16
EQEP_UNIT_POS_EVNT_DIV_32, //!< UPEVNT = QCLK/32
EQEP_UNIT_POS_EVNT_DIV_64, //!< UPEVNT = QCLK/64
EQEP_UNIT_POS_EVNT_DIV_128, //!< UPEVNT = QCLK/128
EQEP_UNIT_POS_EVNT_DIV_256, //!< UPEVNT = QCLK/256
EQEP_UNIT_POS_EVNT_DIV_512, //!< UPEVNT = QCLK/512
EQEP_UNIT_POS_EVNT_DIV_1024, //!< UPEVNT = QCLK/1024
EQEP_UNIT_POS_EVNT_DIV_2048 //!< UPEVNT = QCLK/2048
} EQEP_UPEVNTPrescale;
//*****************************************************************************
//
//! Values that can be passed to EQEP_setStrobeSource() as the \e strobeSrc
//! parameter.
//
//*****************************************************************************
typedef enum
{
EQEP_STROBE_FROM_GPIO = 0, //!< Strobe signal comes from GPIO
EQEP_STROBE_OR_ADCSOCA = 2, //!< Strobe signal is OR'd with ADCSOCA
EQEP_STROBE_OR_ADCSOCB = 3 //!< Strobe signal is OR'd with ADCSOCB
} EQEP_StrobeSource;
//*****************************************************************************
//
//! Values that can be passed to EQEP_setQMAModuleMode() as the \e qmaMode
//! parameter.
//
//*****************************************************************************
typedef enum
{
EQEP_QMA_MODE_BYPASS, //!< QMA module is bypassed
EQEP_QMA_MODE_1, //!< QMA mode-1 operation is selected
EQEP_QMA_MODE_2 //!< QMA mode-2 operation is selected
} EQEP_QMAMode;
//*****************************************************************************
//
//! Possible values of sources for QEPA,QEPB and Index signal which are passed
//! as a structure to EQEP_selectSource() as \e sourceConfig
//
//*****************************************************************************
typedef enum
{
EQEP_SOURCE_DEVICE_PIN = 0x0000U, //!< signal comes from Device Pin
EQEP_SOURCE_CMPSS1 = 0x0001U, //!< signal comes from CMPSS1
EQEP_SOURCE_CMPSS2 = 0x0002U, //!< signal comes from CMPSS2
EQEP_SOURCE_CMPSS3 = 0x0003U, //!< signal comes from CMPSS3
EQEP_SOURCE_CMPSS4 = 0x0004U, //!< signal comes from CMPSS4
EQEP_SOURCE_ZERO = 0x0008U, //!< signal tied to zero
EQEP_SOURCE_PWMXBAR1 = 0x0009U, //!< signal comes from PWMXBAR1
EQEP_SOURCE_PWMXBAR2 = 0x000AU, //!< signal comes from PWMXBAR2
EQEP_SOURCE_PWMXBAR3 = 0x000BU, //!< signal comes from PWMXBAR3
EQEP_SOURCE_PWMXBAR4 = 0x000CU, //!< signal comes from PWMXBAR4
EQEP_SOURCE_PWMXBAR5 = 0x000DU, //!< signal comes from PWMXBAR5
EQEP_SOURCE_PWMXBAR6 = 0x000EU, //!< signal comes from PWMXBAR6
EQEP_SOURCE_PWMXBAR7 = 0x000FU, //!< signal comes from PWMXBAR7
} EQEP_Source;
//*****************************************************************************
//
//! Structure to be passed to EQEP_selectSource() as \e sourceConfig
//
//*****************************************************************************
typedef struct {
EQEP_Source sourceA;
EQEP_Source sourceB;
EQEP_Source sourceIndex;
}EQEP_SourceSelect;
//*****************************************************************************
//
//! Values that can be passed to EQEP_setEmulationMode() as the \e emuMode
//! parameter.
//
//*****************************************************************************
typedef enum
{
EQEP_EMULATIONMODE_STOPIMMEDIATELY, //!< Counters stop immediately
EQEP_EMULATIONMODE_STOPATROLLOVER, //!< Counters stop at period rollover
EQEP_EMULATIONMODE_RUNFREE //!< Counter unaffected by suspend
}EQEP_EmulationMode;
//*****************************************************************************
//
// Prototypes for the APIs.
//
//*****************************************************************************
//*****************************************************************************
//
//! \internal
//! Checks an eQEP base address.
//!
//! \param base specifies the eQEP module base address.
//!
//! This function determines if a eQEP module base address is valid.
//!
//! \return Returns \b true if the base address is valid and \b false
//! otherwise.
//
//*****************************************************************************
//*****************************************************************************
//
//! Enables the eQEP module.
//!
//! \param base is the base address of the eQEP module.
//!
//! This function enables operation of the enhanced quadrature encoder pulse
//! (eQEP) module. The module must be configured before it is enabled.
//!
//! \sa EQEP_setConfig()
//!
//! \return None.
//
//*****************************************************************************
static inline void
EQEP_enableModule(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Enable the eQEP module.
//
(*((volatile uint16_t *)(base + 0x15U))) |= 0x8U;
}
//*****************************************************************************
//
//! Disables the eQEP module.
//!
//! \param base is the base address of the enhanced quadrature encoder pulse
//! (eQEP) module
//!
//! This function disables operation of the eQEP module.
//!
//! \return None.
//
//*****************************************************************************
static inline void
EQEP_disableModule(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Disable the eQEP module.
//
(*((volatile uint16_t *)(base + 0x15U))) &= ~(0x8U);
}
//*****************************************************************************
//
//! Configures eQEP module's quadrature decoder unit.
//!
//! \param base is the base address of the eQEP module.
//! \param config is the configuration for the eQEP module decoder unit.
//!
//! This function configures the operation of the eQEP module's quadrature
//! decoder unit. The \e config parameter provides the configuration
//! of the decoder and is the logical OR of several values:
//!
//! - \b EQEP_CONFIG_2X_RESOLUTION or \b EQEP_CONFIG_1X_RESOLUTION specify
//! if both rising and falling edges should be counted or just rising edges.
//! - \b EQEP_CONFIG_QUADRATURE, \b EQEP_CONFIG_CLOCK_DIR,
//! \b EQEP_CONFIG_UP_COUNT, or \b EQEP_CONFIG_DOWN_COUNT specify if
//! quadrature signals are being provided on QEPA and QEPB, if a direction
//! signal and a clock are being provided, or if the direction should be
//! hard-wired for a single direction with QEPA used for input.
//! - \b EQEP_CONFIG_NO_SWAP or \b EQEP_CONFIG_SWAP to specify if the
//! signals provided on QEPA and QEPB should be swapped before being
//! processed.
//! - \b EQEP_CONFIG_IGATE_DISABLE or \b EQEP_CONFIG_IGATE_ENABLE to specify
//! if the gating of the index pulse should be enabled or disabled
//!
//! \return None.
//
//*****************************************************************************
static inline void
EQEP_setDecoderConfig(uint32_t base, uint16_t config)
{
//
// Check the arguments.
//
;
//
// Write the new decoder configuration to the hardware.
//
(*((volatile uint16_t *)(base + 0x14U))) = ((*((volatile uint16_t *)(base + 0x14U))) &
~(0x400U |
0x800U |
0xC000U |
0x200U)) | config;
}
//*****************************************************************************
//
//! Configures eQEP module position counter unit.
//!
//! \param base is the base address of the eQEP module.
//! \param mode is the configuration for the eQEP module position counter.
//! \param maxPosition specifies the maximum position value.
//!
//! This function configures the operation of the eQEP module position
//! counter. The \e mode parameter determines the event on which the position
//! counter gets reset. It should be passed one of the following values:
//! \b EQEP_POSITION_RESET_IDX, \b EQEP_POSITION_RESET_MAX_POS,
//! \b EQEP_POSITION_RESET_1ST_IDX, or \b EQEP_POSITION_RESET_UNIT_TIME_OUT.
//!
//! \e maxPosition is the maximum value of the position counter and is
//! the value used to reset the position capture when moving in the reverse
//! (negative) direction.
//!
//! \return None.
//
//*****************************************************************************
static inline void
EQEP_setPositionCounterConfig(uint32_t base, EQEP_PositionResetMode mode,
uint32_t maxPosition)
{
//
// Check the arguments.
//
;
//
// Write the position counter reset configuration to the hardware.
//
(*((volatile uint16_t *)(base + 0x15U))) = ((*((volatile uint16_t *)(base + 0x15U))) &
~0x3000U) | (uint16_t)mode;
//
// Set the maximum position.
//
(*((volatile uint32_t *)(base + 0x4U))) = maxPosition;
}
//*****************************************************************************
//
//! Gets the current encoder position.
//!
//! \param base is the base address of the eQEP module.
//!
//! This function returns the current position of the encoder. Depending upon
//! the configuration of the encoder, and the incident of an index pulse, this
//! value may or may not contain the expected data (that is, if in reset on
//! index mode, if an index pulse has not been encountered, the position
//! counter is not yet aligned with the index pulse).
//!
//! \return The current position of the encoder.
//
//*****************************************************************************
static inline uint32_t
EQEP_getPosition(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Return the current position counter.
//
return((*((volatile uint32_t *)(base + 0x0U))));
}
//*****************************************************************************
//
//! Sets the current encoder position.
//!
//! \param base is the base address of the eQEP module.
//! \param position is the new position for the encoder.
//!
//! This function sets the current position of the encoder; the encoder
//! position is then measured relative to this value.
//!
//! \return None.
//
//*****************************************************************************
static inline void
EQEP_setPosition(uint32_t base, uint32_t position)
{
//
// Check the arguments.
//
;
//
// Set the position counter.
//
(*((volatile uint32_t *)(base + 0x0U))) = position;
}
//*****************************************************************************
//
//! Gets the current direction of rotation.
//!
//! \param base is the base address of the eQEP module.
//!
//! This function returns the current direction of rotation. In this case,
//! current means the most recently detected direction of the encoder; it may
//! not be presently moving but this is the direction it last moved before it
//! stopped.
//!
//! \return Returns 1 if moving in the forward direction or -1 if moving in the
//! reverse direction.
//
//*****************************************************************************
static inline int16_t
EQEP_getDirection(uint32_t base)
{
int16_t direction;
//
// Check the arguments.
//
;
//
// Return the direction of rotation.
//
if(((*((volatile uint16_t *)(base + 0x1CU))) & 0x20U) != 0U)
{
direction = 1;
}
else
{
direction = -1;
}
return(direction);
}
//*****************************************************************************
//
//! Enables individual eQEP module interrupt sources.
//!
//! \param base is the base address of the eQEP module.
//! \param intFlags is a bit mask of the interrupt sources to be enabled.
//!
//! This function enables eQEP module interrupt sources. The \e intFlags
//! parameter can be any of the following values OR'd together:
//! - \b EQEP_INT_POS_CNT_ERROR - Position counter error
//! - \b EQEP_INT_PHASE_ERROR - Quadrature phase error
//! - \b EQEP_INT_DIR_CHANGE - Quadrature direction change
//! - \b EQEP_INT_WATCHDOG - Watchdog time-out
//! - \b EQEP_INT_UNDERFLOW - Position counter underflow
//! - \b EQEP_INT_OVERFLOW - Position counter overflow
//! - \b EQEP_INT_POS_COMP_READY - Position-compare ready
//! - \b EQEP_INT_POS_COMP_MATCH - Position-compare match
//! - \b EQEP_INT_STROBE_EVNT_LATCH - Strobe event latch
//! - \b EQEP_INT_INDEX_EVNT_LATCH - Index event latch
//! - \b EQEP_INT_UNIT_TIME_OUT - Unit time-out
//! - \b EQEP_INT_QMA_ERROR - QMA error
//!
//! \return None.
//
//*****************************************************************************
static inline void
EQEP_enableInterrupt(uint32_t base, uint16_t intFlags)
{
//
// Check the arguments.
//
;
//
// Enable the specified interrupts.
//
(*((volatile uint16_t *)(base + 0x18U))) |= intFlags;
}
//*****************************************************************************
//
//! Disables individual eQEP module interrupt sources.
//!
//! \param base is the base address of the eQEP module.
//! \param intFlags is a bit mask of the interrupt sources to be disabled.
//!
//! This function disables eQEP module interrupt sources. The \e intFlags
//! parameter can be any of the following values OR'd together:
//! - \b EQEP_INT_POS_CNT_ERROR - Position counter error
//! - \b EQEP_INT_PHASE_ERROR - Quadrature phase error
//! - \b EQEP_INT_DIR_CHANGE - Quadrature direction change
//! - \b EQEP_INT_WATCHDOG - Watchdog time-out
//! - \b EQEP_INT_UNDERFLOW - Position counter underflow
//! - \b EQEP_INT_OVERFLOW - Position counter overflow
//! - \b EQEP_INT_POS_COMP_READY - Position-compare ready
//! - \b EQEP_INT_POS_COMP_MATCH - Position-compare match
//! - \b EQEP_INT_STROBE_EVNT_LATCH - Strobe event latch
//! - \b EQEP_INT_INDEX_EVNT_LATCH - Index event latch
//! - \b EQEP_INT_UNIT_TIME_OUT - Unit time-out
//! - \b EQEP_INT_QMA_ERROR - QMA error
//!
//! \return None.
//
//*****************************************************************************
static inline void
EQEP_disableInterrupt(uint32_t base, uint16_t intFlags)
{
//
// Check the arguments.
//
;
//
// Disable the specified interrupts.
//
(*((volatile uint16_t *)(base + 0x18U))) &= ~(intFlags);
}
//*****************************************************************************
//
//! Gets the current interrupt status.
//!
//! \param base is the base address of the eQEP module.
//!
//! This function returns the interrupt status for the eQEP module
//! module.
//!
//! \return Returns the current interrupt status, enumerated as a bit field of
//! the following values:
//! - \b EQEP_INT_GLOBAL - Global interrupt flag
//! - \b EQEP_INT_POS_CNT_ERROR - Position counter error
//! - \b EQEP_INT_PHASE_ERROR - Quadrature phase error
//! - \b EQEP_INT_DIR_CHANGE - Quadrature direction change
//! - \b EQEP_INT_WATCHDOG - Watchdog time-out
//! - \b EQEP_INT_UNDERFLOW - Position counter underflow
//! - \b EQEP_INT_OVERFLOW - Position counter overflow
//! - \b EQEP_INT_POS_COMP_READY - Position-compare ready
//! - \b EQEP_INT_POS_COMP_MATCH - Position-compare match
//! - \b EQEP_INT_STROBE_EVNT_LATCH - Strobe event latch
//! - \b EQEP_INT_INDEX_EVNT_LATCH - Index event latch
//! - \b EQEP_INT_UNIT_TIME_OUT - Unit time-out
//! - \b EQEP_INT_QMA_ERROR - QMA error
//
//*****************************************************************************
static inline uint16_t
EQEP_getInterruptStatus(uint32_t base)
{
//
// Check the arguments.
//
;
return((*((volatile uint16_t *)(base + 0x19U))));
}
//*****************************************************************************
//
//! Clears eQEP module interrupt sources.
//!
//! \param base is the base address of the eQEP module.
//! \param intFlags is a bit mask of the interrupt sources to be cleared.
//!
//! This function clears eQEP module interrupt flags. The \e intFlags
//! parameter can be any of the following values OR'd together:
//! - \b EQEP_INT_GLOBAL - Global interrupt flag
//! - \b EQEP_INT_POS_CNT_ERROR - Position counter error
//! - \b EQEP_INT_PHASE_ERROR - Quadrature phase error
//! - \b EQEP_INT_DIR_CHANGE - Quadrature direction change
//! - \b EQEP_INT_WATCHDOG - Watchdog time-out
//! - \b EQEP_INT_UNDERFLOW - Position counter underflow
//! - \b EQEP_INT_OVERFLOW - Position counter overflow
//! - \b EQEP_INT_POS_COMP_READY - Position-compare ready
//! - \b EQEP_INT_POS_COMP_MATCH - Position-compare match
//! - \b EQEP_INT_STROBE_EVNT_LATCH - Strobe event latch
//! - \b EQEP_INT_INDEX_EVNT_LATCH - Index event latch
//! - \b EQEP_INT_UNIT_TIME_OUT - Unit time-out
//! - \b EQEP_INT_QMA_ERROR - QMA error
//!
//! Note that the \b EQEP_INT_GLOBAL value is the global interrupt flag. In
//! order to get any further eQEP interrupts, this flag must be cleared.
//!
//! \return None.
//
//*****************************************************************************
static inline void
EQEP_clearInterruptStatus(uint32_t base, uint16_t intFlags)
{
//
// Check the arguments.
//
;
//
// Clear the requested interrupt sources.
//
(*((volatile uint16_t *)(base + 0x1AU))) = intFlags;
}
//*****************************************************************************
//
//! Forces individual eQEP module interrupts.
//!
//! \param base is the base address of the eQEP module.
//! \param intFlags is a bit mask of the interrupt sources to be forced.
//!
//! This function forces eQEP module interrupt flags. The \e intFlags
//! parameter can be any of the following values OR'd together:
//! - \b EQEP_INT_POS_CNT_ERROR
//! - \b EQEP_INT_PHASE_ERROR
//! - \b EQEP_INT_DIR_CHANGE
//! - \b EQEP_INT_WATCHDOG
//! - \b EQEP_INT_UNDERFLOW
//! - \b EQEP_INT_OVERFLOW
//! - \b EQEP_INT_POS_COMP_READY
//! - \b EQEP_INT_POS_COMP_MATCH
//! - \b EQEP_INT_STROBE_EVNT_LATCH
//! - \b EQEP_INT_INDEX_EVNT_LATCH
//! - \b EQEP_INT_UNIT_TIME_OUT
//! - \b EQEP_INT_QMA_ERROR
//!
//! \return None.
//
//*****************************************************************************
static inline void
EQEP_forceInterrupt(uint32_t base, uint16_t intFlags)
{
//
// Check the arguments.
//
;
//
// Force the specified interrupts.
//
(*((volatile uint16_t *)(base + 0x1BU))) |= intFlags;
}
//*****************************************************************************
//
//! Gets the encoder error indicator.
//!
//! \param base is the base address of the eQEP module.
//!
//! This function returns the error indicator for the eQEP module. It is an
//! error for both of the signals of the quadrature input to change at the same
//! time.
//!
//! \return Returns \b true if an error has occurred and \b false otherwise.
//
//*****************************************************************************
static inline _Bool
EQEP_getError(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Return the error indicator.
//
return(((*((volatile uint16_t *)(base + 0x19U))) & 0x4U) != 0U);
}
//*****************************************************************************
//
//! Returns content of the eQEP module status register
//!
//! \param base is the base address of the eQEP module.
//!
//! This function returns the contents of the status register. The value it
//! returns is an OR of the following values:
//!
//! - \b EQEP_STS_UNIT_POS_EVNT - Unit position event detected
//! - \b EQEP_STS_DIR_ON_1ST_IDX - If set, clockwise rotation (forward
//! movement) occurred on the first index event
//! - \b EQEP_STS_DIR_FLAG - If set, movement is clockwise rotation
//! - \b EQEP_STS_DIR_LATCH - If set, clockwise rotation occurred on last
//! index event marker
//! - \b EQEP_STS_CAP_OVRFLW_ERROR - Overflow occurred in eQEP capture timer
//! - \b EQEP_STS_CAP_DIR_ERROR - Direction change occurred between position
//! capture events
//! - \b EQEP_STS_1ST_IDX_FLAG - Set by the occurrence of the first index
//! pulse
//! - \b EQEP_STS_POS_CNT_ERROR - Position counter error occurred
//!
//! \return Returns the value of the QEP status register.
//
//*****************************************************************************
static inline uint16_t
EQEP_getStatus(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Return the status register.
//
return((*((volatile uint16_t *)(base + 0x1CU))) & 0x00FFU);
}
//*****************************************************************************
//
//! Clears selected fields of the eQEP module status register
//!
//! \param base is the base address of the eQEP module.
//! \param statusFlags is the bit mask of the status flags to be cleared.
//!
//! This function clears the status register fields indicated by
//! \e statusFlags. The \e statusFlags parameter is the logical OR of any of
//! the following:
//!
//! - \b EQEP_STS_UNIT_POS_EVNT - Unit position event detected
//! - \b EQEP_STS_CAP_OVRFLW_ERROR - Overflow occurred in eQEP capture timer
//! - \b EQEP_STS_CAP_DIR_ERROR - Direction change occurred between position
//! capture events
//! - \b EQEP_STS_1ST_IDX_FLAG - Set by the occurrence of the first index
//! pulse
//!
//! \note Only the above status fields can be cleared. All others are
//! read-only, non-sticky fields.
//!
//! \return None.
//
//*****************************************************************************
static inline void
EQEP_clearStatus(uint32_t base, uint16_t statusFlags)
{
//
// Check the arguments.
//
;
//
// Clear the requested interrupt sources.
//
(*((volatile uint16_t *)(base + 0x1CU))) = statusFlags;
}
//*****************************************************************************
//
//! Configures eQEP module edge-capture unit.
//!
//! \param base is the base address of the eQEP module.
//! \param capPrescale is the prescaler setting of the eQEP capture timer clk.
//! \param evntPrescale is the prescaler setting of the unit position event
//! frequency.
//!
//! This function configures the operation of the eQEP module edge-capture
//! unit. The \e capPrescale parameter provides the configuration of the eQEP
//! capture timer clock rate. It determines by which power of 2 between 1 and
//! 128 inclusive SYSCLKOUT is divided. The macros for this parameter are in
//! the format of EQEP_CAPTURE_CLK_DIV_X, where X is the divide value. For
//! example, \b EQEP_CAPTURE_CLK_DIV_32 will give a capture timer clock
//! frequency that is SYSCLKOUT/32.
//!
//! The \e evntPrescale parameter determines how frequently a unit position
//! event occurs. The macro that can be passed this parameter is in the format
//! EQEP_UNIT_POS_EVNT_DIV_X, where X is the number of quadrature clock
//! periods between unit position events. For example,
//! \b EQEP_UNIT_POS_EVNT_DIV_16 will result in a unit position event
//! frequency of QCLK/16.
//!
//! \return None.
//
//*****************************************************************************
static inline void
EQEP_setCaptureConfig(uint32_t base, EQEP_CAPCLKPrescale capPrescale,
EQEP_UPEVNTPrescale evntPrescale)
{
//
// Check the arguments.
//
;
//
// Write new prescaler configurations to the appropriate registers.
//
(*((volatile uint16_t *)(base + 0x16U))) =
((*((volatile uint16_t *)(base + 0x16U))) &
~(0xFU | 0x70U)) |
((uint16_t)evntPrescale | (uint16_t)capPrescale);
}
//*****************************************************************************
//
//! Enables the eQEP module edge-capture unit.
//!
//! \param base is the base address of the eQEP module.
//!
//! This function enables operation of the eQEP module's edge-capture unit.
//!
//! \return None.
//
//*****************************************************************************
static inline void
EQEP_enableCapture(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Enable edge capture.
//
(*((volatile uint16_t *)(base + 0x16U))) |= 0x8000U;
}
//*****************************************************************************
//
//! Disables the eQEP module edge-capture unit.
//!
//! \param base is the base address of the eQEP module.
//!
//! This function disables operation of the eQEP module's edge-capture unit.
//!
//! \return None.
//
//*****************************************************************************
static inline void
EQEP_disableCapture(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Disable edge capture.
//
(*((volatile uint16_t *)(base + 0x16U))) &= ~(0x8000U);
}
//*****************************************************************************
//
//! Gets the encoder capture period.
//!
//! \param base is the base address of the eQEP module.
//!
//! This function returns the period count value between the last successive
//! eQEP position events.
//!
//! \return The period count value between the last successive position events.
//
//*****************************************************************************
static inline uint16_t
EQEP_getCapturePeriod(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Return the capture period.
//
return((*((volatile uint16_t *)(base + 0x1EU))));
}
//*****************************************************************************
//
//! Gets the encoder capture timer value.
//!
//! \param base is the base address of the eQEP module.
//!
//! This function returns the time base for the edge capture unit.
//!
//! \return The capture timer value.
//
//*****************************************************************************
static inline uint16_t
EQEP_getCaptureTimer(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Return the capture timer value.
//
return((*((volatile uint16_t *)(base + 0x1DU))));
}
//*****************************************************************************
//
//! Enables the eQEP module position-compare unit.
//!
//! \param base is the base address of the eQEP module.
//!
//! This function enables operation of the eQEP module's position-compare unit.
//!
//! \return None.
//
//*****************************************************************************
static inline void
EQEP_enableCompare(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Enable position compare.
//
(*((volatile uint16_t *)(base + 0x17U))) |= 0x1000U;
}
//*****************************************************************************
//
//! Disables the eQEP module position-compare unit.
//!
//! \param base is the base address of the eQEP module.
//!
//! This function disables operation of the eQEP module's position-compare
//! unit.
//!
//! \return None.
//
//*****************************************************************************
static inline void
EQEP_disableCompare(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Disable position compare.
//
(*((volatile uint16_t *)(base + 0x17U))) &= ~(0x1000U);
}
//*****************************************************************************
//
//! Configures the position-compare unit's sync output pulse width.
//!
//! \param base is the base address of the eQEP module.
//! \param cycles is the width of the pulse that can be generated on a
//! position-compare event. It is in units of 4 SYSCLKOUT cycles.
//!
//! This function configures the width of the sync output pulse. The width of
//! the pulse will be \e cycles * 4 * the width of a SYSCLKOUT cycle. The
//! maximum width is 4096 * 4 * SYSCLKOUT cycles.
//!
//! \return None.
//
//*****************************************************************************
static inline void
EQEP_setComparePulseWidth(uint32_t base, uint16_t cycles)
{
//
// Check the arguments.
//
;
;
//
// Set the pulse width.
//
(*((volatile uint16_t *)(base + 0x17U))) = ((*((volatile uint16_t *)(base + 0x17U))) &
~(uint16_t)0xFFFU) |
(cycles - 1U);
}
//*****************************************************************************
//
//! Loads the eQEP module unit timer period as number of SYSCLK cycles.
//!
//! \param base is the base address of the eQEP module.
//! \param period is period value at which a unit time-out interrupt is set.
//!
//! This function sets the unit time-out interrupt when it matches the value
//! specified by \e period
//! The unit timer is clocked by SYSCLKOUT
//!
//! \return None.
//
//*****************************************************************************
static inline void
EQEP_loadUnitTimer(uint32_t base, uint32_t period)
{
//
// Check the arguments.
//
;
//
// Set the period of the unit timer.
//
(*((volatile uint32_t *)(base + 0x10U))) = period;
}
//*****************************************************************************
//
//! Enables the eQEP module unit timer.
//!
//! \param base is the base address of the eQEP module.
//! \param period is period value at which a unit time-out interrupt is set.
//!
//! This function enables operation of the eQEP module's peripheral unit timer.
//! The unit timer is clocked by SYSCLKOUT and will set the unit time-out
//! interrupt when it matches the value specified by \e period.
//!
//! \return None.
//
//*****************************************************************************
static inline void
EQEP_enableUnitTimer(uint32_t base, uint32_t period)
{
//
// Check the arguments.
//
;
//
// Set the period of the unit timer.
//
(*((volatile uint32_t *)(base + 0x10U))) = period;
//
// Enable peripheral unit timer.
//
(*((volatile uint16_t *)(base + 0x15U))) |= 0x2U;
}
//*****************************************************************************
//
//! Disables the eQEP module unit timer.
//!
//! \param base is the base address of the eQEP module.
//!
//! This function disables operation of the eQEP module's peripheral
//! unit timer.
//!
//! \return None.
//
//*****************************************************************************
static inline void
EQEP_disableUnitTimer(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Disable peripheral unit timer.
//
(*((volatile uint16_t *)(base + 0x15U))) &= ~(0x2U);
}
//*****************************************************************************
//
//! Enables the eQEP module watchdog timer.
//!
//! \param base is the base address of the eQEP module.
//! \param period is watchdog period value at which a time-out will occur if
//! no quadrature-clock event is detected.
//!
//! This function enables operation of the eQEP module's peripheral watchdog
//! timer.
//!
//! \note When selecting \e period, note that the watchdog timer is clocked
//! from SYSCLKOUT/64.
//!
//! \return None.
//
//*****************************************************************************
static inline void
EQEP_enableWatchdog(uint32_t base, uint16_t period)
{
//
// Check the arguments.
//
;
//
// Set the timeout count for the eQEP peripheral watchdog timer.
//
(*((volatile uint16_t *)(base + 0x13U))) = period;
//
// Enable peripheral watchdog.
//
(*((volatile uint16_t *)(base + 0x15U))) |= 0x1U;
}
//*****************************************************************************
//
//! Disables the eQEP module watchdog timer.
//!
//! \param base is the base address of the eQEP module.
//!
//! This function disables operation of the eQEP module's peripheral watchdog
//! timer.
//!
//! \return None.
//
//*****************************************************************************
static inline void
EQEP_disableWatchdog(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Disable peripheral watchdog.
//
(*((volatile uint16_t *)(base + 0x15U))) &= ~(0x1U);
}
//*****************************************************************************
//
//! Sets the eQEP module watchdog timer value.
//!
//! \param base is the base address of the eQEP module.
//! \param value is the value to be written to the watchdog timer.
//!
//! This function sets the eQEP module's watchdog timer value.
//!
//! \return None.
//
//*****************************************************************************
static inline void
EQEP_setWatchdogTimerValue(uint32_t base, uint16_t value)
{
//
// Check the arguments.
//
;
//
// Write the value to the watchdog timer register.
//
(*((volatile uint16_t *)(base + 0x12U))) = value;
}
//*****************************************************************************
//
//! Gets the eQEP module watchdog timer value.
//!
//! \param base is the base address of the eQEP module.
//!
//! \return Returns the current watchdog timer value.
//
//*****************************************************************************
static inline uint16_t
EQEP_getWatchdogTimerValue(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Read the value from the watchdog timer register.
//
return((*((volatile uint16_t *)(base + 0x12U))));
}
//*****************************************************************************
//
//! Configures the mode in which the position counter is initialized.
//!
//! \param base is the base address of the eQEP module.
//! \param initMode is the configuration for initializing the position count.
//! See below for a description of this parameter.
//!
//! This function configures the events on which the position count can be
//! initialized. The \e initMode parameter provides the mode as either
//! \b EQEP_INIT_DO_NOTHING (no action configured) or one of the following
//! strobe events, index events, or a logical OR of both a strobe event and an
//! index event.
//!
//! - \b EQEP_INIT_RISING_STROBE or \b EQEP_INIT_EDGE_DIR_STROBE specify
//! which strobe event will initialize the position counter.
//! - \b EQEP_INIT_RISING_INDEX or \b EQEP_INIT_FALLING_INDEX specify
//! which index event will initialize the position counter.
//!
//! Use EQEP_setSWPositionInit() to cause a software initialization and
//! EQEP_setInitialPosition() to set the value that gets loaded into the
//! position counter upon initialization.
//!
//! \return None.
//
//*****************************************************************************
static inline void
EQEP_setPositionInitMode(uint32_t base, uint16_t initMode)
{
//
// Check the arguments.
//
;
//
// Set the init mode in the QEP Control register.
//
(*((volatile uint16_t *)(base + 0x15U))) = ((*((volatile uint16_t *)(base + 0x15U))) &
~(0x300U | 0xC00U)) |
initMode;
}
//*****************************************************************************
//
//! Sets the software initialization of the encoder position counter.
//!
//! \param base is the base address of the eQEP module.
//! \param initialize is a flag to specify if software initialization of the
//! position counter is enabled.
//!
//! This function does a software initialization of the position counter when
//! the \e initialize parameter is \b true. When \b false, the QEPCTL[SWI] bit
//! is cleared and no action is taken.
//!
//! The init value to be loaded into the position counter can be set with
//! EQEP_setInitialPosition(). Additional initialization causes can be
//! configured with EQEP_setPositionInitMode().
//!
//! \return None.
//
//*****************************************************************************
static inline void
EQEP_setSWPositionInit(uint32_t base, _Bool initialize)
{
//
// Check the arguments.
//
;
//
// Set or clear the software initialization bit.
//
if(initialize)
{
(*((volatile uint16_t *)(base + 0x15U))) |= 0x80U;
}
else
{
(*((volatile uint16_t *)(base + 0x15U))) &= ~0x80U;
}
}
//*****************************************************************************
//
//! Sets the init value for the encoder position counter.
//!
//! \param base is the base address of the eQEP module.
//! \param position is the value to be written to the position counter upon.
//! initialization.
//!
//! This function sets the init value for position of the encoder. See
//! EQEP_setPositionInitMode() to set the initialization cause or
//! EQEP_setSWPositionInit() to cause a software initialization.
//!
//! \return None.
//
//*****************************************************************************
static inline void
EQEP_setInitialPosition(uint32_t base, uint32_t position)
{
//
// Check the arguments.
//
;
//
// Write position to position counter init register
//
(*((volatile uint32_t *)(base + 0x2U))) = position;
}
//*****************************************************************************
//
//! Configures the quadrature modes in which the position count can be latched.
//!
//! \param base is the base address of the eQEP module.
//! \param latchMode is the configuration for latching of the position count
//! and several other registers. See below for a description of this
//! parameter.
//!
//! This function configures the events on which the position count and several
//! other registers can be latched. The \e latchMode parameter provides the
//! mode as the logical OR of several values.
//!
//! - \b EQEP_LATCH_CNT_READ_BY_CPU or \b EQEP_LATCH_UNIT_TIME_OUT specify
//! the event that latches the position counter. This latch register can be
//! read using EQEP_getPositionLatch(). The capture timer and capture
//! period are also latched based on this setting, and can be read using
//! EQEP_getCaptureTimerLatch() and EQEP_getCapturePeriodLatch().
//! - \b EQEP_LATCH_RISING_STROBE or \b EQEP_LATCH_EDGE_DIR_STROBE
//! specify which strobe event will latch the position counter into the
//! strobe position latch register. This register can be read with
//! EQEP_getStrobePositionLatch().
//! - \b EQEP_LATCH_RISING_INDEX, \b EQEP_LATCH_FALLING_INDEX, or
//! \b EQEP_LATCH_SW_INDEX_MARKER specify which index event will latch the
//! position counter into the index position latch register. This register
//! can be read with EQEP_getIndexPositionLatch().
//!
//! \return None.
//
//*****************************************************************************
static inline void
EQEP_setLatchMode(uint32_t base, uint32_t latchMode)
{
//
// Check the arguments.
//
;
//
// Set the latch mode in the QEP Control register.
//
(*((volatile uint16_t *)(base + 0x15U))) = ((*((volatile uint16_t *)(base + 0x15U))) &
~(0x4U | 0x30U |
0x40U)) | latchMode;
}
//*****************************************************************************
//
//! Gets the encoder position that was latched on an index event.
//!
//! \param base is the base address of the eQEP module.
//!
//! This function returns the value in the index position latch register. The
//! position counter is latched into this register on either a rising index
//! edge, a falling index edge, or a software index marker. This is configured
//! using EQEP_setLatchMode().
//!
//! \return The position count latched on an index event.
//
//*****************************************************************************
static inline uint32_t
EQEP_getIndexPositionLatch(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Return the current position counter.
//
return((*((volatile uint32_t *)(base + 0x8U))));
}
//*****************************************************************************
//
//! Gets the encoder position that was latched on a strobe event.
//!
//! \param base is the base address of the eQEP module.
//!
//! This function returns the value in the strobe position latch register. The
//! position counter can be configured to be latched into this register on
//! rising strobe edges only or on rising strobe edges while moving clockwise
//! and falling strobe edges while moving counter-clockwise. This is configured
//! using EQEP_setLatchMode().
//!
//! \return The position count latched on a strobe event.
//
//*****************************************************************************
static inline uint32_t
EQEP_getStrobePositionLatch(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Return the current position counter.
//
return((*((volatile uint32_t *)(base + 0xAU))));
}
//*****************************************************************************
//
//! Gets the encoder position that was latched on a unit time-out event.
//!
//! \param base is the base address of the eQEP module.
//!
//! This function returns the value in the position latch register. The
//! position counter is latched into this register either on a unit time-out
//! event.
//!
//! \return The position count latch register value.
//
//*****************************************************************************
static inline uint32_t
EQEP_getPositionLatch(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Return the current position counter.
//
return((*((volatile uint32_t *)(base + 0xCU))));
}
//*****************************************************************************
//
//! Gets the encoder capture timer latch.
//!
//! \param base is the base address of the eQEP module.
//!
//! This function returns the value in the capture timer latch register. The
//! capture timer value is latched into this register either on a unit time-out
//! event or upon the CPU reading the eQEP position counter. This is configured
//! using EQEP_setLatchMode().
//!
//! \return The edge-capture timer latch value.
//
//*****************************************************************************
static inline uint16_t
EQEP_getCaptureTimerLatch(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Return the current position counter.
//
return((*((volatile uint16_t *)(base + 0x1FU))));
}
//*****************************************************************************
//
//! Gets the encoder capture period latch.
//!
//! \param base is the base address of the eQEP module.
//!
//! This function returns the value in the capture period latch register. The
//! capture period value is latched into this register either on a unit
//! time-out event or upon the CPU reading the eQEP position counter. This is
//! configured using EQEP_setLatchMode().
//!
//! \return The edge-capture period latch value.
//
//*****************************************************************************
static inline uint16_t
EQEP_getCapturePeriodLatch(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Return the current position counter.
//
return((*((volatile uint16_t *)(base + 0x20U))));
}
//*****************************************************************************
//
//! Set the quadrature mode adapter (QMA) module mode
//!
//! \param base is the base address of the eQEP module.
//! \param qmaMode is the mode in which the QMA module will operate.
//!
//! This function sets the quadrature mode adapter module mode. The possible
//! modes are passed to the function through the \e qmaMode parameter which
//! can take the values EQEP_QMA_MODE_BYPASS, EQEP_QMA_MODE_1, or
//! EQEP_QMA_MODE_2.
//!
//! To use the QMA module, you must first put the eQEP module into
//! direction-count mode (\b EQEP_CONFIG_CLOCK_DIR) using EQEP_setConfig().
//!
//! \return None.
//
//*****************************************************************************
static inline void
EQEP_setQMAModuleMode(uint32_t base, EQEP_QMAMode qmaMode)
{
//
// Check the arguments.
//
;
//
// Write the QMA module mode into the appropriate register.
//
(*((volatile uint16_t *)(base + 0x34U))) =
((*((volatile uint16_t *)(base + 0x34U))) & ~0x7U) |
(uint16_t)qmaMode;
}
//*****************************************************************************
//
//! Set the strobe input source of the eQEP module.
//!
//! \param base is the base address of the eQEP module.
//! \param strobeSrc is the source of the strobe signal.
//!
//! This function sets the source of the eQEP module's strobe signal. The
//! possible values of the \e strobeSrc parameter are
//! - \b EQEP_STROBE_FROM_GPIO - The strobe is used as-is after passing through
//! the polarity select logic.
//! - \b EQEP_STROBE_OR_ADCSOCA - The strobe is OR'd with the ADCSOCA signal
//! after passing through the polarity select logic.
//! - \b EQEP_STROBE_OR_ADCSOCB - The strobe is OR'd with the ADCSOCB signal
//! after passing through the polarity select logic.
//!
//! \return None.
//
//*****************************************************************************
static inline void
EQEP_setStrobeSource(uint32_t base, EQEP_StrobeSource strobeSrc)
{
//
// Check the arguments.
//
;
//
// Write the strobe source selection into the appropriate register.
//
(*((volatile uint16_t *)(base + 0x32U))) =
((*((volatile uint16_t *)(base + 0x32U))) & ~0x3U) |
(uint16_t)strobeSrc;
}
//*****************************************************************************
//
//! Enables the index direction enhancement mode of the eQEP module
//!
//! \param base is the base address of the eQEP module.
//!
//! This function enables the enhancement mode for direction change
//! during Index event
//!
//! \return None.
//
//*****************************************************************************
static inline void
EQEP_enableDirectionChangeDuringIndex(uint32_t base)
{
//
// Check the arguments.
//
;
//
//Sets the index direction enhancement bit
//
(*((volatile uint16_t *)(base + 0x14U))) |= 0x1U;
}
//*****************************************************************************
//
//! Disables the index direction enhancement mode of the eQEP module
//!
//! \param base is the base address of the eQEP module.
//!
//! This function disables the enhancement mode for direction change
//! during Index event
//!
//! \return None.
//
//*****************************************************************************
static inline void
EQEP_disableDirectionChangeDuringIndex(uint32_t base)
{
//
// Check the arguments.
//
;
//
//Clears the index direction enhancement bit
//
(*((volatile uint16_t *)(base + 0x14U))) &= ~(0x1U);
}
//*****************************************************************************
//
//! Selects the source for eQEPA/B/I signals
//!
//! \param base is the base address of the enhanced quadrature encoder pulse
//! (eQEP) module
//! \param sourceConfig is the structure that contains source configuration
//!
//! This function configures the sources for QEPA,QEPB and Index of eQEP module
//!
//! \return None.
//
//*****************************************************************************
static inline void
EQEP_selectSource(uint32_t base, EQEP_SourceSelect sourceConfig )
{
//
// Check the arguments.
//
;
//
// Selecting sources for eQEP signals
//
(*((volatile uint32_t *)(base + 0x36U))) =
((*((volatile uint32_t *)(base + 0x36U))) & ~(0xFU |
0xF0U | 0xF00U)) |
((uint32_t)((uint32_t)(sourceConfig.sourceA) <<
0U) |
(uint32_t)((uint32_t)(sourceConfig.sourceB) <<
4U) |
(uint32_t)((uint32_t)(sourceConfig.sourceIndex) <<
8U));
}
//*****************************************************************************
//
//! Set the emulation mode of the eQEP module.
//!
//! \param base is the base address of the eQEP module.
//! \param emuMode is the mode operation upon an emulation suspend.
//!
//! This function sets the eQEP module's emulation mode. This mode determines
//! how the timers are affected by an emulation suspend. Valid values for the
//! \e emuMode parameter are the following:
//!
//! - \b EQEP_EMULATIONMODE_STOPIMMEDIATELY - The position counter, watchdog
//! counter, unit timer, and capture timer all stop immediately.
//! - \b EQEP_EMULATIONMODE_STOPATROLLOVER - The position counter, watchdog
//! counter, unit timer all count until period rollover. The capture timer
//! counts until the next unit period event.
//! - \b EQEP_EMULATIONMODE_RUNFREE - The position counter, watchdog counter,
//! unit timer, and capture timer are all unaffected by an emulation suspend.
//!
//! \return None.
//
//*****************************************************************************
static inline void
EQEP_setEmulationMode(uint32_t base, EQEP_EmulationMode emuMode)
{
//
// Check the arguments.
//
;
//
// Write the emulation mode to the FREE_SOFT bits.
//
(*((volatile uint16_t *)(base + 0x15U))) =
((*((volatile uint16_t *)(base + 0x15U))) & ~0xC000U) |
((uint16_t)emuMode << 14U);
}
//*****************************************************************************
//
//! Configures eQEP module position-compare unit.
//!
//! \param base is the base address of the eQEP module.
//! \param config is the configuration for the eQEP module
//! position-compare unit. See below for a description of this parameter.
//! \param compareValue is the value to which the position count value is
//! compared for a position-compare event.
//! \param cycles is the width of the pulse that can be generated on a
//! position-compare event. It is in units of 4 SYSCLKOUT cycles.
//!
//! This function configures the operation of the eQEP module position-compare
//! unit. The \e config parameter provides the configuration of the
//! position-compare unit and is the logical OR of several values:
//!
//! - \b EQEP_COMPARE_NO_SYNC_OUT, \b EQEP_COMPARE_IDX_SYNC_OUT, or
//! \b EQEP_COMPARE_STROBE_SYNC_OUT specify if there is a sync output pulse
//! and which pin should be used.
//! - \b EQEP_COMPARE_NO_SHADOW, \b EQEP_COMPARE_LOAD_ON_ZERO, or
//! \b EQEP_COMPARE_LOAD_ON_MATCH specify if a shadow is enabled and when
//! should the load should occur--QPOSCNT = 0 or QPOSCNT = QPOSCOMP.
//!
//! The \e cycles is used to select the width of the sync output pulse. The
//! width of the resulting pulse will be \e cycles * 4 * the width of a
//! SYSCLKOUT cycle. The maximum width is 4096 * 4 * SYSCLKOUT cycles.
//!
//! \note You can set the sync pulse width independently using the
//! EQEP_setComparePulseWidth() function.
//!
//! \return None.
//
//*****************************************************************************
extern void
EQEP_setCompareConfig(uint32_t base, uint16_t config, uint32_t compareValue,
uint16_t cycles);
//*****************************************************************************
//
//! Sets the polarity of the eQEP module's input signals.
//!
//! \param base is the base address of the eQEP module.
//! \param invertQEPA is the flag to negate the QEPA input.
//! \param invertQEPB is the flag to negate the QEPA input.
//! \param invertIndex is the flag to negate the index input.
//! \param invertStrobe is the flag to negate the strobe input.
//!
//! This function configures the polarity of the inputs to the eQEP module. To
//! negate the polarity of any of the input signals, pass \b true into its
//! corresponding parameter in this function. Pass \b false to leave it as-is.
//!
//! \return None.
//
//*****************************************************************************
extern void
EQEP_setInputPolarity(uint32_t base, _Bool invertQEPA, _Bool invertQEPB,
_Bool invertIndex, _Bool invertStrobe);
//*****************************************************************************
//
// Close the Doxygen group.
//! @}
//
//*****************************************************************************
//*****************************************************************************
//
// Mark the end of the C bindings section for C++ compilers.
//
//*****************************************************************************
//###########################################################################
//
// FILE: erad.h
//
// TITLE: C28x ERAD driver.
//
//###########################################################################
// $Copyright:
// Copyright (C) 2023 Texas Instruments Incorporated - http://www.ti.com/
//
// 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 Texas Instruments Incorporated 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
// OWNER 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.
// $
//###########################################################################
//*****************************************************************************
//
// If building with a C++ compiler, make all of the definitions in this header
// have a C binding.
//
//*****************************************************************************
//*****************************************************************************
//
//! \addtogroup erad_api ERAD
//! @{
//
//*****************************************************************************
//###########################################################################
//
// FILE: hw_erad.h
//
// TITLE: Definitions for the ERAD registers.
//
//###########################################################################
// $Copyright:
// Copyright (C) 2023 Texas Instruments Incorporated - http://www.ti.com/
//
// 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 Texas Instruments Incorporated 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
// OWNER 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.
// $
//###########################################################################
//*************************************************************************************************
//
// The following are defines for the ERAD register offsets
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the GLBL_EVENT_STAT register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the GLBL_HALT_STAT register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the GLBL_ENABLE register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the GLBL_CTM_RESET register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the GLBL_NMI_CTL register
//
//*************************************************************************************************
// enable
// enable
// enable
// enable
// enable
// enable
// enable
// enable
//*************************************************************************************************
//
// The following are defines for the bit fields in the GLBL_OWNER register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the GLBL_EVENT_AND_MASK register
//
//*************************************************************************************************
// Event Mask1
// Event Mask1
// Event Mask1
// Event Mask1
// Event Mask1
// Event Mask1
// Event Mask1
// Event Mask1
// Event Mask2
// Event Mask2
// Event Mask2
// Event Mask2
// Event Mask2
// Event Mask2
// Event Mask2
// Event Mask2
// Event Mask3
// Event Mask3
// Event Mask3
// Event Mask3
// Event Mask3
// Event Mask3
// Event Mask3
// Event Mask3
// Event Mask4
// Event Mask4
// Event Mask4
// Event Mask4
// Event Mask4
// Event Mask4
// Event Mask4
// Event Mask4
//*************************************************************************************************
//
// The following are defines for the bit fields in the GLBL_EVENT_OR_MASK register
//
//*************************************************************************************************
// Event Mask1
// Event Mask1
// Event Mask1
// Event Mask1
// Event Mask1
// Event Mask1
// Event Mask1
// Event Mask1
// Event Mask2
// Event Mask2
// Event Mask2
// Event Mask2
// Event Mask2
// Event Mask2
// Event Mask2
// Event Mask2
// Event Mask3
// Event Mask3
// Event Mask3
// Event Mask3
// Event Mask3
// Event Mask3
// Event Mask3
// Event Mask3
// Event Mask4
// Event Mask4
// Event Mask4
// Event Mask4
// Event Mask4
// Event Mask4
// Event Mask4
// Event Mask4
//*************************************************************************************************
//
// The following are defines for the bit fields in the GLBL_AND_EVENT_INT_MASK register
//
//*************************************************************************************************
// AND events
// AND events
// AND events
// AND events
//*************************************************************************************************
//
// The following are defines for the bit fields in the GLBL_OR_EVENT_INT_MASK register
//
//*************************************************************************************************
// events
// events
// events
// events
//*************************************************************************************************
//
// The following are defines for the bit fields in the HWBP_CLEAR register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the HWBP_CNTL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the HWBP_STATUS register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the CTM_CNTL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the CTM_STATUS register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the CTM_INPUT_SEL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the CTM_CLEAR register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the CTM_INPUT_SEL_2 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the CTM_INPUT_COND register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the CRC_GLOBAL_CTRL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the CRC_QUALIFIER register
//
//*************************************************************************************************
//*****************************************************************************
//
// Useful defines used within the driver functions. Not intended for use by
// application code.
//
//*****************************************************************************
//
// Macros for but positions of some register bit fields
//
//
// Macro function for getting the instance number from the base address
//
//
// Macro function to get the HWBP event number from the base address
//
//*****************************************************************************
//
//! Values that can be passed to ERAD_enableModules() or
//! ERAD_disableModules() as \e instances parameter.
//
//*****************************************************************************
//*****************************************************************************
//
//! Values that can be passed to ERAD_setCounterInputConditioning() as options
//! parameter.
//
//*****************************************************************************
//*****************************************************************************
//
//! Values that can be passed to ERAD_initModule() as \e owner parameter to
//! set owner of ERAD.
//
//*****************************************************************************
typedef enum
{
ERAD_OWNER_NOOWNER = 0, //!< No owner
ERAD_OWNER_APPLICATION = 1, //!< Application owned
ERAD_OWNER_DEBUGGER = 2 //!< Debugger owned
} ERAD_Owner;
//*****************************************************************************
//
//! Values that can are returned by ERAD_getBusCompStatus() and
//! ERAD_getCounterStatus() to indicate the state of the respective module.
//
//*****************************************************************************
typedef enum
{
ERAD_STATE_IDLE = 0, //!< Module is idle
ERAD_STATE_ENABLED = 2, //!< Module is enabled
ERAD_STATE_COMPLETED = 3 //!< Module was enabled and an event occurred
} ERAD_Status;
//*****************************************************************************
//
//! Values that can be passed to ERAD_configBusComp() and ERAD_profile()
//! as \e config_params.bus_sel parameter to choose which CPU bus to monitor.
//
//*****************************************************************************
typedef enum
{
ERAD_BUSCOMP_BUS_PAB = 0, //!< Use the Program Address Bus
ERAD_BUSCOMP_BUS_VPC = 1, //!< Use the Virtual Program Counter
ERAD_BUSCOMP_BUS_DWAB = 2, //!< Use the Data Write Address Bus
ERAD_BUSCOMP_BUS_DRAB = 3, //!< Use the Data Read Address Bus
ERAD_BUSCOMP_BUS_DWDB = 4, //!< Use the Data Write Data Bus
ERAD_BUSCOMP_BUS_DRDB = 5, //!< Use the Data Read Data Bus
ERAD_BUSCOMP_BUS_VPC_I_ALIGNED = 6, //!< Use VPC Instruction aligned match
ERAD_BUSCOMP_BUS_VPC_R1_ALIGNED = 7, //!< Use VPC R1 aligned match
ERAD_BUSCOMP_BUS_VPC_R2_ALIGNED = 8, //!< Use VPC R2 aligned match
ERAD_BUSCOMP_BUS_VPC_W_ALIGNED = 9, //!< Use VPC Word aligned match
} ERAD_BusComp_Bus_Select;
//*****************************************************************************
//
//! Values that can be passed to ERAD_configBusComp() and ERAD_profile()
//! as \e config_params.comp_mode to indicate what kind of comparison to use
//! for the bus comparators.
//
//*****************************************************************************
typedef enum
{
ERAD_BUSCOMP_COMPMODE_GT = 4, //!< Check for greater than
ERAD_BUSCOMP_COMPMODE_GE = 5, //!< Check for greater than equal to
ERAD_BUSCOMP_COMPMODE_LT = 6, //!< Check for lesser than
ERAD_BUSCOMP_COMPMODE_LE = 7, //!< Check for lesser than equal to
ERAD_BUSCOMP_COMPMODE_EQ = 0 //!< Check for only equality
} ERAD_BusComp_Comp_Mode;
//*****************************************************************************
//
//! Values that can be passed to ERAD_configCounterInStartStopMode()
//! and ERAD_configCounterInCountingMode() as \e config_params.event_mode to
//! indicate whether to count rising edges or the number of CPU clock cycles an
//! is active.
//
//*****************************************************************************
typedef enum
{
ERAD_COUNTER_MODE_ACTIVE = 0, //!< Count number of CPU
//! Cycles event is active for
ERAD_COUNTER_MODE_RISING_EDGE = 1 //!< Count number of Rising
//! Edges of event
} ERAD_Counter_Event_Mode;
//*****************************************************************************
//
//! Values that can be passed to ERAD_configCounterInStartStopMode()
//! and ERAD_configCounterInCountingMode() as \e config_params.event to
//! indicate what event to consider as input. Also may be passed to
//! ERAD_configCounterInStartStopMode() as \e start_event and \e stop_event
//! to indicate start and stop events for the counter.
//
//*****************************************************************************
typedef enum
{
ERAD_EVENT_HWBP1 = 0,
ERAD_EVENT_HWBP2 = 1,
ERAD_EVENT_HWBP3 = 2,
ERAD_EVENT_HWBP4 = 3,
ERAD_EVENT_HWBP5 = 4,
ERAD_EVENT_HWBP6 = 5,
ERAD_EVENT_HWBP7 = 6,
ERAD_EVENT_HWBP8 = 7,
ERAD_EVENT_COUNTER1_EVENT = 8,
ERAD_EVENT_COUNTER2_EVENT = 9,
ERAD_EVENT_COUNTER3_EVENT = 10,
ERAD_EVENT_COUNTER4_EVENT = 11,
ERAD_EVENT_ERAD_OR_MASK0 = 12,
ERAD_EVENT_ERAD_OR_MASK1 = 13,
ERAD_EVENT_ERAD_OR_MASK2 = 14,
ERAD_EVENT_ERAD_OR_MASK3 = 15,
ERAD_EVENT_ERAD_AND_MASK0 = 16,
ERAD_EVENT_ERAD_AND_MASK1 = 17,
ERAD_EVENT_ERAD_AND_MASK2 = 18,
ERAD_EVENT_ERAD_AND_MASK3 = 19,
ERAD_EVENT_PIE_INT1 = 20,
ERAD_EVENT_PIE_INT2 = 21,
ERAD_EVENT_PIE_INT3 = 22,
ERAD_EVENT_PIE_INT4 = 23,
ERAD_EVENT_PIE_INT5 = 24,
ERAD_EVENT_PIE_INT6 = 25,
ERAD_EVENT_PIE_INT7 = 26,
ERAD_EVENT_PIE_INT8 = 27,
ERAD_EVENT_PIE_INT9 = 28,
ERAD_EVENT_PIE_INT10 = 29,
ERAD_EVENT_PIE_INT11 = 30,
ERAD_EVENT_PIE_INT12 = 31,
ERAD_EVENT_TIMER1_TINT0 = 32,
ERAD_EVENT_TIMER1_TINT1 = 33,
ERAD_EVENT_TIMER2_TINT2 = 34,
ERAD_EVENT_DMACH1INT = 35,
ERAD_EVENT_DMACH2INT = 36,
ERAD_EVENT_DMACH3INT = 37,
ERAD_EVENT_DMACH4INT = 38,
ERAD_EVENT_DMACH5INT = 39,
ERAD_EVENT_DMACH6INT = 40,
ERAD_EVENT_FSI_DATA_PKT_RCVD = 41,
ERAD_EVENT_FSI_ERROR_PKT_RCVD = 42,
ERAD_EVENT_FSI_PING_PKT_RCVD = 43,
ERAD_EVENT_FSI_PING_FRAME_TAG_MATCH = 44,
ERAD_EVENT_FSI_DATA_FRAME_TAG_MATCH = 45,
ERAD_EVENT_FSI_ERROR_FRAME_TAG_MATCH = 46,
ERAD_EVENT_FSI_FRAME_DONE = 47,
ERAD_EVENT_ADCAEVTINT = 48,
ERAD_EVENT_ADCCEVTINT = 49,
ERAD_EVENT_MCANA_EVT0 = 50,
ERAD_EVENT_MCANA_EVT1 = 51,
ERAD_EVENT_MCANA_EVT2 = 52,
ERAD_EVENT_ADCSOCA = 53,
ERAD_EVENT_ADCSOCB = 54,
ERAD_EVENT_CLATASKRUN1 = 55,
ERAD_EVENT_CLATASKRUN2 = 56,
ERAD_EVENT_CLATASKRUN3 = 57,
ERAD_EVENT_CLATASKRUN4 = 58,
ERAD_EVENT_CLATASKRUN5 = 59,
ERAD_EVENT_CLATASKRUN6 = 60,
ERAD_EVENT_CLATASKRUN7 = 61,
ERAD_EVENT_CLATASKRUN8 = 62,
ERAD_EVENT_EPWMXBAR_OUT1 = 63,
ERAD_EVENT_EPWMXBAR_OUT2 = 64,
ERAD_EVENT_EPWMXBAR_OUT3 = 65,
ERAD_EVENT_EPWMXBAR_OUT4 = 66,
ERAD_EVENT_EPWMXBAR_OUT5 = 67,
ERAD_EVENT_EPWMXBAR_OUT6 = 68,
ERAD_EVENT_EPWMXBAR_OUT7 = 69,
ERAD_EVENT_EPWMXBAR_OUT8 = 70,
ERAD_EVENT_INPUTXBAR0 = 71,
ERAD_EVENT_INPUTXBAR1 = 72,
ERAD_EVENT_INPUTXBAR2 = 73,
ERAD_EVENT_INPUTXBAR3 = 74,
ERAD_EVENT_INPUTXBAR4 = 75,
ERAD_EVENT_INPUTXBAR5 = 76,
ERAD_EVENT_INPUTXBAR6 = 77,
ERAD_EVENT_INPUTXBAR7 = 78,
ERAD_EVENT_INPUTXBAR8 = 79,
ERAD_EVENT_INPUTXBAR9 = 80,
ERAD_EVENT_INPUTXBAR10 = 81,
ERAD_EVENT_INPUTXBAR11 = 82,
ERAD_EVENT_INPUTXBAR12 = 83,
ERAD_EVENT_INPUTXBAR13 = 84,
ERAD_EVENT_INPUTXBAR14 = 85,
ERAD_EVENT_INPUTXBAR15 = 86,
ERAD_EVENT_CPUx_CPUSTAT = 87,
ERAD_EVENT_CPUx_DBGACK = 88,
ERAD_EVENT_CPUx_NMI = 89,
ERAD_EVENT_CMPSS1_CTRIPH_OR_CTRIPL = 90,
ERAD_EVENT_CMPSS2_CTRIPH_OR_CTRIPL = 91,
ERAD_EVENT_CMPSS3_CTRIPH_OR_CTRIPL = 92,
ERAD_EVENT_CMPSS4_CTRIPH_OR_CTRIPL = 93,
ERAD_EVENT_SD1FLT1_COMPH_OR_COMPL = 98,
ERAD_EVENT_SD1FLT2_COMPH_OR_COMPL = 99,
ERAD_EVENT_SD1FLT3_COMPH_OR_COMPL = 100,
ERAD_EVENT_SD1FLT4_COMPH_OR_COMPL = 101,
ERAD_EVENT_SD2FLT1_COMPH_OR_COMPL = 102,
ERAD_EVENT_SD2FLT2_COMPH_OR_COMPL = 103,
ERAD_EVENT_SD2FLT3_COMPH_OR_COMPL = 104,
ERAD_EVENT_SD2FLT4_COMPH_OR_COMPL = 105,
ERAD_EVENT_ADCAINT1 = 106,
ERAD_EVENT_ADCAINT2 = 107,
ERAD_EVENT_ADCAINT3 = 108,
ERAD_EVENT_ADCAINT4 = 109,
ERAD_EVENT_ADCBINT1 = 110,
ERAD_EVENT_ADCBINT2 = 111,
ERAD_EVENT_ADCBINT3 = 112,
ERAD_EVENT_ADCBINT4 = 113,
ERAD_EVENT_ADCCINT1 = 114,
ERAD_EVENT_ADCCINT2 = 115,
ERAD_EVENT_ADCCINT3 = 116,
ERAD_EVENT_ADCCINT4 = 117,
ERAD_EVENT_HIC_nOE = 122,
ERAD_EVENT_HIC_nWE = 123,
ERAD_EVENT_HIC_nRDY = 124,
ERAD_EVENT_ADCBEVTINT = 125,
ERAD_EVENT_NO_EVENT = 256
} ERAD_Counter_Input_Event;
typedef enum
{
ERAD_AND_MASK1 = 0,
ERAD_AND_MASK2 = 1,
ERAD_AND_MASK3 = 2,
ERAD_AND_MASK4 = 3,
ERAD_OR_MASK1 = 4,
ERAD_OR_MASK2 = 5,
ERAD_OR_MASK3 = 6,
ERAD_OR_MASK4 = 7
} ERAD_Mask;
//*****************************************************************************
//
//! Values that can be passed to ERAD_setCRCQualifier() as the \e qualifier
//! paramter to specify which events to set as the qualifier for the CRC unit.
//
//*****************************************************************************
typedef enum
{
ERAD_CRC_QUAL_NONE = 0, //!< Use every valid event as qualifier
//!< for CRC computation
ERAD_CRC_QUAL_HWBP1 = 1, //!< CRC Compute Qualified by HWBP_EVENT1
ERAD_CRC_QUAL_HWBP2 = 2, //!< CRC Compute Qualified by HWBP_EVENT2
ERAD_CRC_QUAL_HWBP3 = 3, //!< CRC Compute Qualified by HWBP_EVENT3
ERAD_CRC_QUAL_HWBP4 = 4, //!< CRC Compute Qualified by HWBP_EVENT4
ERAD_CRC_QUAL_HWBP5 = 5, //!< CRC Compute Qualified by HWBP_EVENT5
ERAD_CRC_QUAL_HWBP6 = 6, //!< CRC Compute Qualified by HWBP_EVENT6
ERAD_CRC_QUAL_HWBP7 = 7, //!< CRC Compute Qualified by HWBP_EVENT7
ERAD_CRC_QUAL_HWBP8 = 8, //!< CRC Compute Qualified by HWBP_EVENT8
ERAD_CRC_QUAL_HWBP_OR1 = 9, //!< CRC Compute Qualified by HWBP_EVENT_OR1
ERAD_CRC_QUAL_HWBP_OR2 = 10, //!< CRC Compute Qualified by HWBP_EVENT_OR1
ERAD_CRC_QUAL_HWBP_OR3 = 11, //!< CRC Compute Qualified by HWBP_EVENT_OR1
ERAD_CRC_QUAL_HWBP_OR4 = 12, //!< CRC Compute Qualified by HWBP_EVENT_OR1
ERAD_CRC_QUAL_HWBP_AND1 = 13, //!< CRC Compute Qualified by HWBP_EVENT_AND2
ERAD_CRC_QUAL_HWBP_AND2 = 14, //!< CRC Compute Qualified by HWBP_EVENT_AND2
ERAD_CRC_QUAL_HWBP_AND3 = 15, //!< CRC Compute Qualified by HWBP_EVENT_AND2
ERAD_CRC_QUAL_HWBP_AND4 = 16 //!< CRC Compute Qualified by HWBP_EVENT_AND2
} ERAD_CRC_Qualifiers;
//*****************************************************************************
//
//! Values that can be passed to ERAD_setCounterInputConditioning() as
//! \e input_type parameter. To specify which input to condition.
//
//*****************************************************************************
typedef enum
{
ERAD_COUNTER_COUNT_INPUT = 0,
ERAD_COUNTER_START_INPUT = 1,
ERAD_COUNTER_STOP_INPUT = 2,
ERAD_COUNTER_RESET_INPUT = 3
} ERAD_Counter_Input_Type;
//*****************************************************************************
//
//! Structure that is passed to ERAD_configBusComp() as \e config_params
//! to configure a bus comparator.
//
//*****************************************************************************
typedef struct
{
uint32_t mask; //!< Mask to be used for comparing
uint32_t reference; //!< Reference value to be compared
ERAD_BusComp_Comp_Mode comp_mode; //!< Comparison mode
_Bool enable_int; //!< Enable Interrupt on event match
_Bool enable_stop; //!< Enable CPU halt on event match
ERAD_BusComp_Bus_Select bus_sel; //!< Bus to be monitored
} ERAD_BusComp_Config;
//*****************************************************************************
//
//! Structure that is passed to ERAD_profile() as \e config_params to setup
//! the required modules appropriately for each use case.
//
//*****************************************************************************
typedef struct
{
uint32_t start_address; //!< Start address
uint32_t end_address; //!< End address
ERAD_BusComp_Bus_Select bus_sel; //!< Bus to be monitored
uint32_t busComp_base1; //!< Bus comparators to be used
uint32_t busComp_base2; //!< Bus comparators to be used
uint32_t counter_base; //!< Counter to be used
} ERAD_Profile_Params;
//*****************************************************************************
//
//! Structure that is passed to ERAD_configCounterInStartStopMode() and
//! ERA_configCounterInCountingMode() as \e config_params to setup a
//! counter appropriately.
//
//*****************************************************************************
typedef struct
{
ERAD_Counter_Input_Event event; //!< Input Event to be counted
ERAD_Counter_Event_Mode event_mode; //!< Active / rising edge
uint32_t reference; //!< Reference to be compared
_Bool rst_on_match; //!< Enable counter reset on match
_Bool enable_int; //!< Enable Interrupt on match
_Bool enable_stop; //!< Enable CPU halt on match
} ERAD_Counter_Config;
//*****************************************************************************
//
//! Structure that is passed to ERAD_enableInterruptOnAddressHit() and
//! ERAD_countAddressHits() as \e config_params to select the bus and the
//! address to compare. \e bus_Sel can be one of the following:
//! \b ERAD_BUSCOMP_BUS_PAB : for instruction fetch at the address
//! \b ERAD_BUSCOMP_BUS_DWAB : for data write access to the address
//! \b ERAD_BUSCOMP_BUS_DRAB : for data read access to the address
//
//*****************************************************************************
typedef struct
{
uint32_t address; //!< Address to compare
uint32_t mask; //!< Mask for the address compare
ERAD_BusComp_Bus_Select bus_sel; //!< Bus to be monitored
} ERAD_AddressHit_Params;
//*****************************************************************************
//
// Prototypes for the APIs.
//
//*****************************************************************************
//*****************************************************************************
//
//! Gets the current owner of ERAD.
//!
//! \param None.
//!
//! This function returns the current owner of ERAD.
//!
//! \return Owner of ERAD.
//
//*****************************************************************************
static inline ERAD_Owner
ERAD_getOwnership(void)
{
//
// Read Global Owner register and return value
//
return((ERAD_Owner)((uint16_t)(((*((volatile uint16_t *)(0x0005E800U + 0xAU))) &
0x3U) >> 0U)));
}
//*****************************************************************************
//
//! Sets the current owner of ERAD.
//!
//! \param owner is the Owner of ERAD that is to be set
//!
//! This function sets the current owner of ERAD.
//!
//! \return None.
//
//*****************************************************************************
static inline void
ERAD_setOwnership(ERAD_Owner owner)
{
//
// Set the Global Owner as owner
//
__eallow();
(*((volatile uint16_t *)(0x0005E800U + 0xAU))) =
((uint16_t)owner & 0x3U) << 0U;
__edis();
}
//*****************************************************************************
//
//! Resets the counter using the global registers.
//!
//! \param instances is the OR'd value of counter instances to be reset.
//! Following macros can be used:
//! - \b ERAD_INST_COUNTER1
//! - \b ERAD_INST_COUNTER2
//! - \b ERAD_INST_COUNTER3
//! - \b ERAD_INST_COUNTER4
//!
//! This function resets the selected counters using the global registers.
//!
//! \return None.
//
//*****************************************************************************
static inline void
ERAD_resetCounter(uint16_t instances)
{
//
// Resets the counter by writing into the global registers
//
__eallow();
(*((volatile uint16_t *)(0x0005E800U + 0x6U))) |= instances >> 8U;
__edis();
}
//*****************************************************************************
//
//! Enables counters and bus comparators.
//!
//! \param instances is the OR'd value of instances of the counters and bus
//! comparators. Following macros can be used:
//! - \b ERAD_INST_BUSCOMP1
//! - \b ERAD_INST_BUSCOMP2
//! - \b ERAD_INST_BUSCOMP3
//! - \b ERAD_INST_BUSCOMP4
//! - \b ERAD_INST_BUSCOMP5
//! - \b ERAD_INST_BUSCOMP6
//! - \b ERAD_INST_BUSCOMP7
//! - \b ERAD_INST_BUSCOMP8
//! - \b ERAD_INST_COUNTER1
//! - \b ERAD_INST_COUNTER2
//! - \b ERAD_INST_COUNTER3
//! - \b ERAD_INST_COUNTER4
//!
//! This function enables bus comparators and counters whose instances are
//! passed.
//!
//! \return None.
//
//*****************************************************************************
static inline void
ERAD_enableModules(uint16_t instances)
{
//
// Write into Global register for enabling the required modules
//
__eallow();
(*((volatile uint16_t *)(0x0005E800U + 0x4U))) |= instances;
__edis();
}
//*****************************************************************************
//
//! Disables counters and bus comparators.
//!
//! \param instances is the OR'd value of instances of the counters and bus
//! comparators. Following macros can be used:
//! - \b ERAD_INST_BUSCOMP1
//! - \b ERAD_INST_BUSCOMP2
//! - \b ERAD_INST_BUSCOMP3
//! - \b ERAD_INST_BUSCOMP4
//! - \b ERAD_INST_BUSCOMP5
//! - \b ERAD_INST_BUSCOMP6
//! - \b ERAD_INST_BUSCOMP7
//! - \b ERAD_INST_BUSCOMP8
//! - \b ERAD_INST_COUNTER1
//! - \b ERAD_INST_COUNTER2
//! - \b ERAD_INST_COUNTER3
//! - \b ERAD_INST_COUNTER4
//!
//! This function disables bus comparators and counters whose instances are
//! passed.
//!
//! \return None.
//
//*****************************************************************************
static inline void
ERAD_disableModules(uint16_t instances)
{
//
// Write into Global register for disabling the required modules
//
__eallow();
(*((volatile uint16_t *)(0x0005E800U + 0x4U))) &= (~instances);
__edis();
}
//*****************************************************************************
//
//! Initialises ERAD.
//!
//! \param owner is the owner of ERAD that is to be set.
//!
//! This function resets all the counters and disables all bus comparators and
//! counters.
//! Also sets the owner of the ERAD to the required owner.
//!
//! \return None.
//
//*****************************************************************************
static inline void
ERAD_initModule(ERAD_Owner owner)
{
//
// Set the owner of ERAD as required
//
ERAD_setOwnership(owner);
//
// Disable all counters and bus comparators
//
ERAD_disableModules(0x00000001UL | 0x00000002UL |
0x00000004UL | 0x00000008UL |
0x00000010UL | 0x00000020UL |
0x00000040UL | 0x00000080UL |
0x00000100UL | 0x00000200UL |
0x00000400UL | 0x00000800UL);
//
// Reset all counters
//
ERAD_resetCounter(0x00000100UL | 0x00000200UL |
0x00000400UL | 0x00000800UL);
}
//*****************************************************************************
//
//! Returns the completed status of any of the modules.
//!
//! \param None.
//!
//! This function returns the completed status of the counters and bus
//! comparators as stored in the global registers. This allows us to read just
//! one register and see if any of the modules are in a completed state.
//!
//! \return Completed status of all the modules as stored in the global
//! register.
//
//*****************************************************************************
static inline uint16_t
ERAD_getHaltStatus(void)
{
//
// Read and return from the global register
//
return((*((volatile uint16_t *)(0x0005E800U + 0x2U))));
}
//*****************************************************************************
//
//! Returns the event fired status of any of the modules.
//!
//! \param None.
//!
//! This function returns the event fired status of the counters and bus
//! comparators as stored in the global registers. This allows us to read just
//! one register and see if any of the modules have fired.
//!
//! \return Event fired status of all the modules as stored in the global
//! register.
//
//*****************************************************************************
static inline uint16_t
ERAD_getEventStatus(void)
{
//
// Read and return from the global register
//
return((*((volatile uint16_t *)(0x0005E800U + 0x0U))));
}
//*****************************************************************************
//
//! Enables an NMI for the specified modules.
//!
//! \param instances is the OR'd value of the instances of the counters and
//! bus comparator units that need to have an NMI enabled. Following macros can
//! be used:
//! - \b ERAD_INST_BUSCOMP1
//! - \b ERAD_INST_BUSCOMP2
//! - \b ERAD_INST_BUSCOMP3
//! - \b ERAD_INST_BUSCOMP4
//! - \b ERAD_INST_BUSCOMP5
//! - \b ERAD_INST_BUSCOMP6
//! - \b ERAD_INST_BUSCOMP7
//! - \b ERAD_INST_BUSCOMP8
//! - \b ERAD_INST_COUNTER1
//! - \b ERAD_INST_COUNTER2
//! - \b ERAD_INST_COUNTER3
//! - \b ERAD_INST_COUNTER4
//!
//! This function enables an NMI to be generated whenever any of the specified
//! counters or bus comparator units generate and event.
//!
//! \return None.
//
//*****************************************************************************
static inline void
ERAD_enableNMI(uint16_t instances)
{
__eallow();
(*((volatile uint16_t *)(0x0005E800U + 0x8U))) |= instances;
__edis();
}
//*****************************************************************************
//
//! Disables an NMI for the specified modules.
//!
//! \param instances is the OR'd value of the instances of the counters and
//! bus comparator units that need to have an NMI disabled. Following macros can
//! be used:
//! - \b ERAD_INST_BUSCOMP1
//! - \b ERAD_INST_BUSCOMP2
//! - \b ERAD_INST_BUSCOMP3
//! - \b ERAD_INST_BUSCOMP4
//! - \b ERAD_INST_BUSCOMP5
//! - \b ERAD_INST_BUSCOMP6
//! - \b ERAD_INST_BUSCOMP7
//! - \b ERAD_INST_BUSCOMP8
//! - \b ERAD_INST_COUNTER1
//! - \b ERAD_INST_COUNTER2
//! - \b ERAD_INST_COUNTER3
//! - \b ERAD_INST_COUNTER4
//!
//! This function disables the NMI for the specified counters and bus
//! comparator units.
//!
//! \return None.
//
//*****************************************************************************
static inline void
ERAD_disableNMI(uint16_t instances)
{
__eallow();
(*((volatile uint16_t *)(0x0005E800U + 0x8U))) &= (~instances);
__edis();
}
//*****************************************************************************
//
//! Returns the status of a bus comparator.
//!
//! \param base is the base of the bus comparator.
//!
//! This function returns the status of the bus comparator whose base was
//! passed. It may be either \b ERAD_STATE_IDLE, \b ERAD_STATE_ENABLED or
//! \b ERAD_STATE_COMPLETED.
//!
//! \return Status of bus comparator.
//
//*****************************************************************************
static inline ERAD_Status
ERAD_getBusCompStatus(uint32_t base)
{
//
// Check if the base is valid
//
;
//
// Read and return status of bus comparator
//
return((ERAD_Status)((uint16_t)(((*((volatile uint16_t *)(base + 0x7U))) &
0xC000U) >> 14U)));
}
//*****************************************************************************
//
//! Clears the event fired status of any of the modules.
//!
//! \param base is the base of the bus comparator.
//!
//! This function clears the event fired status of the bus comparator and
//! brings the module and brings the module back to \b ERAD_STATE_IDLE .
//!
//! \return None
//
//*****************************************************************************
static inline void
ERAD_clearBusCompEvent(uint32_t base)
{
//
// Check if the base is valid
//
;
//
// Clear the event fired bit by writing into EVENT_CLR register
//
__eallow();
(*((volatile uint16_t *)(base + 0x4U))) = 0x1U;
__edis();
}
//*****************************************************************************
//
//! Returns the status of a counter.
//!
//! \param base is the base of the counter.
//!
//! This function returns the status of the counter whose base was
//! passed. It may be either \b ERAD_STATE_IDLE, \b ERAD_STATE_ENABLED or
//! \b ERAD_STATE_COMPLETED.
//!
//! \return Status of counter.
//
//*****************************************************************************
static inline ERAD_Status
ERAD_getCounterStatus(uint32_t base)
{
//
// Check if the base is valid
//
;
//
// Read and return status of the counter
//
return((ERAD_Status)((uint16_t)(((*((volatile uint16_t *)(base + 0x1U))) &
0xF000U) >> 12U)));
}
//*****************************************************************************
//
//! Configures the bus comparators.
//!
//! \param base is the base of the bus comparator to be configured.
//! \param config_params are the configuration parameters to be used to
//! configure the bus comparator.
//!
//! This function configures the bus comparator with the given parameters.
//!
//! \return None.
//
//*****************************************************************************
extern void
ERAD_configBusComp(uint32_t base, ERAD_BusComp_Config config_params);
//*****************************************************************************
//
//! Configures the counter in Counting mode.
//!
//! \param base is the base of the counter to be configured.
//! \param config_params are the configuration parameters to be used to
//! configure the counter.
//!
//! This function configures the counter with the given parameters. The counter
//! is setup in Counting mode, which means counting begins as soon as the
//! counter is enabled.
//! NOTE: This function does not enable the counter. The counter must be
//! enabled using the \b ERAD_enableModules method to begin counting.
//!
//! \return None.
//
//*****************************************************************************
extern void
ERAD_configCounterInCountingMode(uint32_t base,
ERAD_Counter_Config config_params);
//*****************************************************************************
//
//! Configures the counter in Start-Stop mode.
//!
//! \param base is the base of the counter to be configured.
//! \param config_params are the configuration parameters to be used to
//! configure the counter.
//! \param start_event is the event that starts the counter
//! \param stop_event is the event which stops that counter
//!
//! This function configures the counter with the given parameters. The counter
//! is setup in Start-Stop mode, which means counting will happen only between
//! two specified events. The event that will be counted can be any of the
//! \b ERAD_Counter_Input_Event and not only CPU cycles.
//! NOTE: \b ERAD_EVENT_NO_EVENT causes the counter to use the CPU cycles.
//! NOTE: This function does not enable the counter. The counter must be
//! enabled using the \b ERAD_enableModules method to begin counting.
//!
//! \return None.
//
//*****************************************************************************
extern void
ERAD_configCounterInStartStopMode(uint32_t base,
ERAD_Counter_Config config_params,
ERAD_Counter_Input_Event start_event,
ERAD_Counter_Input_Event stop_event);
//*****************************************************************************
//
//! Configures the counter in Start-Stop Cumulative mode.
//!
//! \param base is the base of the counter to be configured.
//! \param config_params are the configuration parameters to be used to
//! configure the counter.
//! \param start_event is the event that starts the counter
//! \param stop_event is the event which stops that counter
//!
//! This function configures the counter with the given parameters. The counter
//! is setup in Cumulative mode, which means counting will happen only between
//! two specified events and the counter will not reset on \b stop_event. The
//! event that will be counted can be any of the \b ERAD_Counter_Input_Event
//! and not only CPU cycles.
//! NOTE: \b ERAD_EVENT_NO_EVENT causes the counter to use the CPU cycles.
//! NOTE: This function does not enable the counter. The counter must be
//! enabled using the \b ERAD_enableModules method to begin counting.
//!
//! \return None.
//
//*****************************************************************************
extern void
ERAD_configCounterInCumulativeMode(uint32_t base,
ERAD_Counter_Config config_params,
ERAD_Counter_Input_Event start_event,
ERAD_Counter_Input_Event stop_event);
//*****************************************************************************
//
//! Configures the AND and OR masks
//!
//! \param mask is the Mask to be used.
//!
//! \param instances is the OR'd value of the instances of the bus comparator
//! units whose events need to be used for the mask. Following macros can be
//! used:
//! - \b ERAD_INST_BUSCOMP1
//! - \b ERAD_INST_BUSCOMP2
//! - \b ERAD_INST_BUSCOMP3
//! - \b ERAD_INST_BUSCOMP4
//! - \b ERAD_INST_BUSCOMP5
//! - \b ERAD_INST_BUSCOMP6
//! - \b ERAD_INST_BUSCOMP7
//! - \b ERAD_INST_BUSCOMP8
//! - \b ERAD_INST_COUNTER1
//! - \b ERAD_INST_COUNTER2
//! - \b ERAD_INST_COUNTER3
//! - \b ERAD_INST_COUNTER4
//!
//! \param enable_int True if interrupt needs to be enabled, False if not
//!
//! This function enables the event generated from the specified bus comparator
//! units to be used for the specified Mask. It also configures the interrupt
//! generation when the mask event occurs.
//!
//! \return None.
//
//*****************************************************************************
extern void
ERAD_configMask(ERAD_Mask mask, uint32_t instances, _Bool enable_int);
//*****************************************************************************
//
//! Configures the reset event of the counter.
//!
//! \param base is the base of the counter to be configured.
//! \param reset_event is the event upon which the counter must be reset.
//!
//! This function sets the event upon which the counter must reset and enables
//! reset upon such an event.
//!
//! \return None.
//
//*****************************************************************************
static inline void
ERAD_enableCounterResetInput(uint32_t base,
ERAD_Counter_Input_Event reset_event)
{
//
// Check if the base is valid
//
;
//
// Setup up the counter such that the reset event is set and enabled
//
__eallow();
(*((volatile uint32_t *)(base + 0x0U))) |= 0x400U;
(*((volatile uint32_t *)(base + 0xAU))) =
((*((volatile uint32_t *)(base + 0xAU))) &
~0x7F00U) |
((uint16_t)reset_event << 8U);
__edis();
}
//*****************************************************************************
//
//! Disables the reset event of the counter.
//!
//! \param base is the base of the counter.
//!
//! This function disables the reset event that may have been set earlier
//!
//! \return None.
//
//*****************************************************************************
static inline void
ERAD_disableCounterResetInput(uint32_t base)
{
//
// Check if the base is valid
//
;
//
// Disable the reset bit
//
__eallow();
(*((volatile uint16_t *)(base + 0x0U))) &= (~0x400U);
__edis();
}
//*****************************************************************************
//
//! Clears an event that may have fired in the counter upon match.
//!
//! \param base is the base of the counter.
//!
//! This function clears a counter event that may have fired when the counter
//! hit a match.
//!
//! \return None.
//
//*****************************************************************************
static inline void
ERAD_clearCounterEvent(uint32_t base)
{
//
// Check if the base is valid
//
;
//
// Clear the event by writing into CTM_CLEAR register
//
__eallow();
(*((volatile uint16_t *)(base + 0x9U))) = 0x1U;
__edis();
}
//*****************************************************************************
//
//! Clears an overflow that may have occured in the counter.
//!
//! \param base is the base of the counter.
//!
//! This function clears the overflow bit that may have got set when the
//! counter may have crossed 0xFFFFFFFF.
//!
//! \return None.
//
//*****************************************************************************
static inline void
ERAD_clearCounterOverflow(uint32_t base)
{
//
// Check if the base is valid
//
;
//
// Clear the overflow bit by writing into the CTM_CLEAR register
//
__eallow();
(*((volatile uint16_t *)(base + 0x9U))) = 0x2U;
__edis();
}
//*****************************************************************************
//
//! Gets the current count of a counter.
//!
//! \param base is the base of the counter.
//!
//! This function returns the current count of the counter which was
//! configured earlier.
//!
//! \return Returns the value of the current count of the counter.
//
//*****************************************************************************
static inline uint32_t
ERAD_getCurrentCount(uint32_t base)
{
//
// Check if the base is valid
//
;
//
// Return the current count
//
return((*((volatile uint32_t *)(base + 0x4U))));
}
//*****************************************************************************
//
//! Sets the current count of a counter.
//!
//! \param base is the base of the counter.
//! \param value is the value to be written as the current count.
//!
//! This function sets the current count of the counter which was
//! configured earlier. This can be used to reset the counter or start at
//! a value other than 0.
//!
//! \return None.
//
//*****************************************************************************
static inline void
ERAD_setCurrentCount(uint32_t base, uint32_t value)
{
//
// Check if owner is APPLICATION or NO_OWNER
//
;
//
// Check if the base is valid
//
;
//
// Write the value into CTM_COUNT register
//
__eallow();
(*((volatile uint32_t *)(base + 0x4U))) = value;
__edis();
}
//*****************************************************************************
//
//! Gets the maximum count of a counter.
//!
//! \param base is the base of the counter.
//!
//! This function returns the current maximum count of the counter which was
//! configured earlier.
//!
//! \return Returns the value of the current maximum count of the counter.
//
//*****************************************************************************
static inline uint32_t
ERAD_getMaxCount(uint32_t base)
{
//
// Check if the base is valid
//
;
//
// Return the maximum value
//
return((*((volatile uint32_t *)(base + 0x6U))));
}
//*****************************************************************************
//
//! Sets the maximum count of a counter.
//!
//! \param base is the base of the counter.
//! \param value is the value to be written as the maximum count.
//!
//! This function sets the current maximum count of the counter which was
//! configured earlier.
//!
//! \return None.
//
//*****************************************************************************
static inline void
ERAD_setMaxCount(uint32_t base, uint32_t value)
{
//
// Check if owner is APPLICATION or NO_OWNER
//
;
//
// Check if the base is valid
//
;
//
// Write the value into the CTM_MAX_COUNT register
//
__eallow();
(*((volatile uint32_t *)(base + 0x6U))) = value;
__edis();
}
//*****************************************************************************
//
//! Sets conditioning on the inputs to the counter.
//!
//! \param base is the base value of the counter to be configured
//! \param input_type defines which input needs to be conditioned
//! \param options is the kind of conditioning that needs to applied. This will
//! be an OR'd value of \b ERAD_INVERT_ENABLE, \b ERAD_INVERT_DISABLE,
//! \b ERAD_SYNC_ENABLE or \b ERAD_SYNC_DISABLE.
//!
//! This function conditions the inputs to the counter specified. This includes
//! inverting the input and enabling a 2-stage synchronizer for any 4 of the
//! inputs: \e reset, \e stop, \e start, \e count_input.
//!
//! \return None.
//
//*****************************************************************************
static inline void
ERAD_setCounterInputConditioning(uint32_t base,
ERAD_Counter_Input_Type input_type,
uint16_t options)
{
//
// Write into the Input Conditioning register
//
__eallow();
(*((volatile uint16_t *)(base + 0xBU))) =
((*((volatile uint16_t *)(base + 0xBU))) &
~(0x03U << (uint16_t)input_type)) |
(options << (uint16_t)input_type);
__edis();
}
//*****************************************************************************
//
//! Initialises the CRC unit.
//!
//! \param instances is the OR'd value of CRC instances. Following macros can
//! be used:
//! - \b ERAD_INST_CRC1
//! - \b ERAD_INST_CRC2
//! - \b ERAD_INST_CRC3
//! - \b ERAD_INST_CRC4
//! - \b ERAD_INST_CRC5
//! - \b ERAD_INST_CRC6
//! - \b ERAD_INST_CRC7
//! - \b ERAD_INST_CRC8
//!
//! This function initialises the specified CRC units.
//!
//! \return None.
//
//*****************************************************************************
static inline void
ERAD_initCRC(uint16_t instances)
{
//
// Write into the CRC GLOBAL CTRL register
//
__eallow();
(*((volatile uint16_t *)(0x0005EA00U + 0x0U))) |= instances;
__edis();
}
//*****************************************************************************
//
//! Enables the CRC unit.
//!
//! \param instances is the OR'd value of CRC instances. Following macros can
//! be used:
//! - \b ERAD_INST_CRC1
//! - \b ERAD_INST_CRC2
//! - \b ERAD_INST_CRC3
//! - \b ERAD_INST_CRC4
//! - \b ERAD_INST_CRC5
//! - \b ERAD_INST_CRC6
//! - \b ERAD_INST_CRC7
//! - \b ERAD_INST_CRC8
//!
//! This function enables the specified CRC units.
//!
//! \return None.
//
//*****************************************************************************
static inline void
ERAD_enableCRC(uint16_t instances)
{
//
// Write into the CRC GLOBAL CTRL register
//
__eallow();
(*((volatile uint16_t *)(0x0005EA00U + 0x0U))) |= instances << 8;
__edis();
}
//*****************************************************************************
//
//! Disables the CRC unit.
//!
//! \param instances is the OR'd value of CRC instances. Following macros can
//! be used:
//! - \b ERAD_INST_CRC1
//! - \b ERAD_INST_CRC2
//! - \b ERAD_INST_CRC3
//! - \b ERAD_INST_CRC4
//! - \b ERAD_INST_CRC5
//! - \b ERAD_INST_CRC6
//! - \b ERAD_INST_CRC7
//! - \b ERAD_INST_CRC8
//!
//! This function disables the specified CRC units.
//!
//! \return None.
//
//*****************************************************************************
static inline void
ERAD_disableCRC(uint16_t instances)
{
//
// Write into the CRC GLOBAL CTRL register
//
__eallow();
(*((volatile uint16_t *)(0x0005EA00U + 0x0U))) &= ~(instances << 8);
__edis();
}
//*****************************************************************************
//
//! Gets the current value of the CRC unit.
//!
//! \param base is the base value of CRC unit
//!
//! This function returns the current value of te specified CRC unit.
//!
//! \return Current CRC value.
//
//*****************************************************************************
static inline uint32_t
ERAD_getCurrentCRC(uint32_t base)
{
//
// Check if base is valid
//
;
//
// Read from the current value register of the specified CRC unit
//
return((*((volatile uint32_t *)(base + 0x0U))));
}
//*****************************************************************************
//
//! Sets the seed value of the CRC unit
//!
//! \param base is the base value of the CRC unit
//! \param seed is the value of seed to be set
//!
//! This function sets a seed value of the CRC unit.
//! Note: The corresponding CRC unit must be disabled before setting the seed
//! value.
//!
//! \return None.
//
//*****************************************************************************
static inline void
ERAD_setSeed(uint32_t base, uint32_t seed)
{
//
// Check if base is valid
//
;
//
// Check if the unit is disabled
//
;
//
// Write into the CRC SEED register
//
__eallow();
(*((volatile uint16_t *)(base + 0x2U))) = seed;
__edis();
}
//*****************************************************************************
//
//! Sets the qualifier event of the CRC unit
//!
//! \param base is the base value of the CRC unit
//! \param qualifier is the type of qualifier to be set
//!
//! This function sets a qualifier to decide which events require a CRC
//! computation.
//! Note: The corresponding CRC unit must be disabled before setting the
//! qualifier.
//!
//! \return None.
//
//*****************************************************************************
static inline void
ERAD_setCRCQualifier(uint32_t base, ERAD_CRC_Qualifiers qualifier)
{
//
// Check if base is valid
//
;
//
// Check if the unit is disabled
//
;
//
// Write into the CRC Qualifier register
//
__eallow();
(*((volatile uint16_t *)(base + 0x4U))) = qualifier;
__edis();
}
//*****************************************************************************
//
//! Configures the ERAD to profile a certain piece of code
//!
//! \param config_params are the parameters that will be used to configure ERAD
//!
//! This function configures 2 bus comparators and 1 counter to profile a
//! certain piece of code. The base address of the bus comparators and the
//! counter to be used are specified in \e config_params.
//! Note: Use \b ERAD_getMaxCount to get the latest profiled value. The
//! maximum count of the counter being used must be reset to 0x0 to get the
//! correct value everytime.
//!
//! \return None.
//
//*****************************************************************************
extern void
ERAD_profile(ERAD_Profile_Params config_params);
//*****************************************************************************
//
//! Enables an RTOS interrupt at a specified address.
//!
//! \param config_params contrains the bus to be monitored and the address
//! \param busComp_base is the base of the bus compoarator to be used
//!
//! This function enables an RTOS interrupt to be generated when an address
//! in memory or instruction is hit.
//!
//! If the selected bus is \b ERAD_BUSCOMP_BUS_PAB, then the ERAD will be
//! configured to trigger an interrupt when there is instruction fetch happening
//! at the specified address. Similary, if \b ERAD_BUSCOMP_BUS_DWAB is selected,
//! the ERAD will be configured to trigger an interrupt when there write
//! access to the specified address, and so on.
//!
//! Use \e
//!
//! \return None.
//
//*****************************************************************************
extern void
ERAD_enableInterruptOnAddressHit(ERAD_AddressHit_Params config_params,
uint32_t busComp_base);
//*****************************************************************************
//
//! Configures the ERAD to count the number of times a the specified address
//! is hit
//!
//! \param config_params are the parameters that will be used to configure ERAD
//! \param busComp_base is the base of the bus compoarator to be used
//! \param counter_base is the base of the counter to be used
//!
//! This function configures 1 bus comparator and 1 counter to count how many
//! times a the specified address is hit.
//!
//! If the selected bus is \b ERAD_BUSCOMP_BUS_PAB, then the ERAD will be
//! configured to count the number of times an instruction fetch happens
//! at the specified address. Similary, if \b ERAD_BUSCOMP_BUS_DWAB is selected,
//! the ERAD will be configured to count the number of times there is a write
//! access to the specified address, and so on.
//!
//! \return None.
//
//*****************************************************************************
extern void
ERAD_countAddressHits(ERAD_AddressHit_Params config_params,
uint32_t busComp_base, uint32_t counter_base);
//*****************************************************************************
//
// Close the Doxygen group.
//! @}
//
//*****************************************************************************
//*****************************************************************************
//
// Mark the end of the C bindings section for C++ compilers.
//
//*****************************************************************************
//###########################################################################
//
// FILE: flash.h
//
// TITLE: C28x Flash driver.
//
//###########################################################################
// $Copyright:
// Copyright (C) 2023 Texas Instruments Incorporated - http://www.ti.com/
//
// 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 Texas Instruments Incorporated 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
// OWNER 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.
// $
//###########################################################################
//*****************************************************************************
//
// If building with a C++ compiler, make all of the definitions in this header
// have a C binding.
//
//*****************************************************************************
//*****************************************************************************
//
//! \addtogroup flash_api Flash
//! @{
//
//*****************************************************************************
//###########################################################################
//
// FILE: hw_flash.h
//
// TITLE: Definitions for the FLASH registers.
//
//###########################################################################
// $Copyright:
// Copyright (C) 2023 Texas Instruments Incorporated - http://www.ti.com/
//
// 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 Texas Instruments Incorporated 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
// OWNER 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.
// $
//###########################################################################
//*************************************************************************************************
//
// The following are defines for the FLASH register offsets
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the FRDCNTL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the FBAC register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the FBFALLBACK register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the FBPRDY register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the FPAC1 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the FPAC2 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the FMSTAT register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the FRD_INTF_CTRL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the ECC_ENABLE register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the ERR_STATUS register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the ERR_POS register
//
//*************************************************************************************************
// bits
// bits
//*************************************************************************************************
//
// The following are defines for the bit fields in the ERR_STATUS_CLR register
//
//*************************************************************************************************
// Value 0 Clear
// Value 1 Clear
// occurred Clear
// Value 0 Clear
// Value 1 Clear
// occurred Clear
//*************************************************************************************************
//
// The following are defines for the bit fields in the ERR_CNT register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the ERR_THRESHOLD register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the ERR_INTFLG register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the ERR_INTCLR register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the FADDR_TEST register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the FECC_TEST register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the FECC_CTRL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the FECC_STATUS register
//
//*************************************************************************************************
#pragma CODE_SECTION(Flash_setBankPowerMode, ".TI.ramfunc");
#pragma CODE_SECTION(Flash_setPumpPowerMode, ".TI.ramfunc");
#pragma CODE_SECTION(Flash_disableCache, ".TI.ramfunc");
#pragma CODE_SECTION(Flash_disablePrefetch, ".TI.ramfunc");
#pragma CODE_SECTION(Flash_setWaitstates, ".TI.ramfunc");
#pragma CODE_SECTION(Flash_enableCache, ".TI.ramfunc");
#pragma CODE_SECTION(Flash_enablePrefetch, ".TI.ramfunc");
#pragma CODE_SECTION(Flash_enableECC, ".TI.ramfunc");
//*****************************************************************************
//
//! Values that can be passed to Flash_setBankPowerMode() as the bank parameter
//
//*****************************************************************************
typedef enum
{
FLASH_BANK0 = 0x0, //!< Bank 0
FLASH_BANK1 = 0x1, //!< Bank 1
FLASH_BANK2 = 0x2 //!< Bank 2
} Flash_BankNumber;
//*****************************************************************************
//
//! Values that can be passed to Flash_setBankPowerMode() as the powerMode
//! parameter.
//
//*****************************************************************************
typedef enum
{
FLASH_BANK_PWR_SLEEP = 0x0, //!< Sleep fallback mode
FLASH_BANK_PWR_STANDBY = 0x1, //!< Standby fallback mode
FLASH_BANK_PWR_ACTIVE = 0x3 //!< Active fallback mode
} Flash_BankPowerMode;
//*****************************************************************************
//
//! Values that can be passed to Flash_setPumpPowerMode() as the powerMode
//! parameter.
//
//*****************************************************************************
typedef enum
{
FLASH_PUMP_PWR_SLEEP = 0x0, //!< Sleep fallback mode
FLASH_PUMP_PWR_ACTIVE = 0x1 //!< Active fallback mode
} Flash_PumpPowerMode;
//*****************************************************************************
//
//! Type that correspond to values returned from Flash_getLowErrorStatus() and
//! Flash_getHighErrorStatus() determining the error status code.
//
//*****************************************************************************
typedef enum
{
FLASH_NO_ERR = 0x0, //!< No error
FLASH_FAIL_0 = 0x1, //!< Fail on 0
FLASH_FAIL_1 = 0x2, //!< Fail on 1
FLASH_UNC_ERR = 0x4 //!< Uncorrectable error
} Flash_ErrorStatus;
//*****************************************************************************
//
//! Values that can be returned from Flash_getLowErrorType() and
//! Flash_getHighErrorType() determining the error type.
//
//*****************************************************************************
typedef enum
{
FLASH_DATA_ERR = 0x0, //!< Data error
FLASH_ECC_ERR = 0x1 //!< ECC error
} Flash_ErrorType;
//*****************************************************************************
//
//! Values that can be returned from Flash_getECCTestSingleBitErrorType().
//
//*****************************************************************************
typedef enum
{
FLASH_DATA_BITS = 0x0, //!< Data bits
FLASH_CHECK_BITS = 0x1 //!< ECC bits
} Flash_SingleBitErrorIndicator;
//*****************************************************************************
//
// Values that can be passed to Flash_clearLowErrorStatus and
// Flash_clearHighErrorStatus.
//
//*****************************************************************************
//*****************************************************************************
//
// Values that can be returned from Flash_getInterruptFlag and
// Flash_getECCTestStatus.
//
//*****************************************************************************
//*****************************************************************************
//
// Delay instruction that allows for register configuration to complete.
//
//*****************************************************************************
//*****************************************************************************
//
// Prototypes for the APIs.
//
//*****************************************************************************
//*****************************************************************************
//
//! \internal
//! Checks a flash wrapper base address for the control registers.
//!
//! \param ctrlBase is the base address of the flash wrapper control registers.
//!
//! This function determines if a flash wrapper control base address is valid.
//!
//! \return Returns \b true if the base address is valid and \b false
//! otherwise.
//
//*****************************************************************************
//*****************************************************************************
//
//! \internal
//! Checks a flash wrapper base address for the ECC registers.
//!
//! \param eccBase is the base address of the flash wrapper ECC registers.
//!
//! This function determines if a flash wrapper ECC base address is valid.
//!
//! \return Returns \b true if the base address is valid and \b false
//! otherwise.
//
//*****************************************************************************
//*****************************************************************************
//
//! Sets the random read wait state amount.
//!
//! \param ctrlBase is the base address of the flash wrapper control registers.
//! \param waitstates is the wait-state value.
//!
//! This function sets the number of wait states for a flash read access. The
//! \e waitstates parameter is a number between 0 and 15. It is \b important
//! to look at your device's datasheet for information about what the required
//! minimum flash wait-state is for your selected SYSCLK frequency.
//!
//! By default the wait state amount is configured to the maximum 15.
//!
//! \return None.
//
//*****************************************************************************
static inline void
Flash_setWaitstates(uint32_t ctrlBase, uint16_t waitstates)
{
//
// Check the arguments.
//
;
//
// waitstates is 4 bits wide.
//
;
__eallow();
//
// Write flash read wait-state amount to appropriate register.
//
(*((volatile uint32_t *)(ctrlBase + 0x0U))) =
((*((volatile uint32_t *)(ctrlBase + 0x0U))) &
~(uint32_t)0xF00U) |
((uint32_t)waitstates << 8U);
__edis();
}
//*****************************************************************************
//
//! Sets the fallback power mode of a flash bank.
//!
//! \param ctrlBase is the base address of the flash wrapper registers.
//! \param bank is the flash bank that is being configured.
//! \param powerMode is the power mode to be entered.
//!
//! This function sets the fallback power mode of the flash bank specified by
//! them \e bank parameter. The power mode is specified by the \e powerMode
//! parameter with one of the following values:
//!
//! - \b FLASH_BANK_PWR_SLEEP - Sense amplifiers and sense reference disabled.
//! - \b FLASH_BANK_PWR_STANDBY - Sense amplifiers disabled but sense reference
//! enabled.
//! - \b FLASH_BANK_PWR_ACTIVE - Sense amplifiers and sense reference enabled.
//!
//! \return None.
//
//*****************************************************************************
static inline void
Flash_setBankPowerMode(uint32_t ctrlBase, Flash_BankNumber bank,
Flash_BankPowerMode powerMode)
{
//
// Check the arguments.
//
;
__eallow();
//
// Write the power mode to the appropriate register.
//
(*((volatile uint32_t *)(ctrlBase + 0x20U))) =
((*((volatile uint32_t *)(ctrlBase + 0x20U))) &
~((0x3U) << ((uint32_t)bank * 2U))) |
((uint32_t)powerMode << ((uint32_t)bank * 2U));
__edis();
}
//*****************************************************************************
//
//! Sets the fallback power mode of the charge pump.
//!
//! \param ctrlBase is the base address of the flash wrapper control registers.
//! \param powerMode is the power mode to be entered.
//!
//! This function sets the fallback power mode flash charge pump.
//!
//! - \b FLASH_PUMP_PWR_SLEEP - All circuits disabled.
//! - \b FLASH_PUMP_PWR_ACTIVE - All pump circuits active.
//!
//! \return None.
//
//*****************************************************************************
static inline void
Flash_setPumpPowerMode(uint32_t ctrlBase, Flash_PumpPowerMode powerMode)
{
//
// Check the arguments.
//
;
__eallow();
//
// Write the power mode to the appropriate register.
//
(*((volatile uint32_t *)(ctrlBase + 0x24U))) =
((*((volatile uint32_t *)(ctrlBase + 0x24U))) &
~(uint32_t)0x1U) | (uint32_t)powerMode;
__edis();
}
//*****************************************************************************
//
//! Enables prefetch mechanism.
//!
//! \param ctrlBase is the base address of the flash wrapper control registers.
//!
//! \return None.
//
//*****************************************************************************
static inline void
Flash_enablePrefetch(uint32_t ctrlBase)
{
//
// Check the arguments.
//
;
__eallow();
//
// Set the prefetch enable bit.
//
(*((volatile uint32_t *)(ctrlBase + 0x180U))) |=
0x1U;
__edis();
}
//*****************************************************************************
//
//! Disables prefetch mechanism.
//!
//! \param ctrlBase is the base address of the flash wrapper control registers.
//!
//! \return None.
//
//*****************************************************************************
static inline void
Flash_disablePrefetch(uint32_t ctrlBase)
{
//
// Check the arguments.
//
;
__eallow();
//
// Clear the prefetch enable bit.
//
(*((volatile uint32_t *)(ctrlBase + 0x180U))) &=
~(uint32_t)0x1U;
__edis();
}
//*****************************************************************************
//
//! Enables data cache.
//!
//! \param ctrlBase is the base address of the flash wrapper control registers.
//!
//! \return None.
//
//*****************************************************************************
static inline void
Flash_enableCache(uint32_t ctrlBase)
{
//
// Check the arguments.
//
;
__eallow();
//
// Set the data cache enable bit.
//
(*((volatile uint32_t *)(ctrlBase + 0x180U))) |=
0x2U;
__edis();
}
//*****************************************************************************
//
//! Disables data cache.
//!
//! \param ctrlBase is the base address of the flash wrapper control registers.
//!
//! \return None.
//
//*****************************************************************************
static inline void
Flash_disableCache(uint32_t ctrlBase)
{
//
// Check the arguments.
//
;
__eallow();
//
// Clear the data cache enable bit.
//
(*((volatile uint32_t *)(ctrlBase + 0x180U))) &=
~(uint32_t)0x2U;
__edis();
}
//*****************************************************************************
//
//! Enables flash error correction code (ECC) protection.
//!
//! \param eccBase is the base address of the flash wrapper ECC registers.
//!
//! \return None.
//
//*****************************************************************************
static inline void
Flash_enableECC(uint32_t eccBase)
{
//
// Check the arguments.
//
;
__eallow();
//
// Write the key value 0xA to ECC_ENABLE register.
//
(*((volatile uint32_t *)(eccBase + 0x0U))) =
((*((volatile uint32_t *)(eccBase + 0x0U))) &
~(uint32_t)0xFU) | 0xAU;
__edis();
}
//*****************************************************************************
//
//! Disables flash error correction code (ECC) protection.
//!
//! \param eccBase is the base address of the flash wrapper ECC registers.
//!
//! \return None.
//
//*****************************************************************************
static inline void
Flash_disableECC(uint32_t eccBase)
{
//
// Check the arguments.
//
;
__eallow();
//
// Clear ECC enable field with the one's complement of the key.
//
(*((volatile uint32_t *)(eccBase + 0x0U))) =
((*((volatile uint32_t *)(eccBase + 0x0U))) &
~(uint32_t)0xFU) | 0x5U;
__edis();
}
//*****************************************************************************
//
//! Sets the bank active grace period.
//!
//! \param ctrlBase is the base address of the flash wrapper control registers.
//! \param period is the starting count value for the BAGP down counter.
//!
//! This function sets the bank active grace period specified by the
//! \e period parameter. The \e period is a value between 0 and 255. This
//! value must be greater than 1 when the fallback mode is not Active.
//!
//! \return None.
//
//*****************************************************************************
static inline void
Flash_setBankActiveGracePeriod(uint32_t ctrlBase, uint32_t period)
{
//
// Check the arguments.
//
;
;
__eallow();
//
// Write period to the BAGP of the FBAC register.
//
(*((volatile uint32_t *)(ctrlBase + 0x1EU))) =
((*((volatile uint32_t *)(ctrlBase + 0x1EU))) &
~(uint32_t)0xFF00U) | (period << 8U);
__edis();
}
//*****************************************************************************
//
//! Sets the pump active grace period.
//!
//! \param ctrlBase is the base address of the flash wrapper control registers.
//! \param period is the starting count value for the PAGP down counter.
//!
//! This function sets the pump active grace period specified by the
//! \e period parameter. The \e period is a value between 0 and 65535. The
//! counter is reloaded after any flash access. After the counter expires, the
//! charge pump falls back to the power mode determined by FPAC1, bit PMPPWR.
//!
//! \return None.
//
//*****************************************************************************
static inline void
Flash_setPumpActiveGracePeriod(uint32_t ctrlBase, uint16_t period)
{
//
// Check the arguments.
//
;
__eallow();
//
// Write period to the PAGP of the FPAC2 register.
//
(*((volatile uint32_t *)(ctrlBase + 0x26U))) =
((*((volatile uint32_t *)(ctrlBase + 0x26U))) &
~(uint32_t)0xFFFFU) |
((uint32_t)period << 0U);
__edis();
}
//*****************************************************************************
//
//! Sets the pump wake up time.
//!
//! \param ctrlBase is the base address of the flash wrapper control registers.
//! \param sysclkCycles is the number of SYSCLK cycles it takes for the pump
//! to wakeup.
//!
//! This function sets the wakeup time with \e sysclkCycles parameter.
//! The \e sysclkCycles is a value between 0 and 8190. When the charge pump
//! exits sleep power mode, it will take sysclkCycles to wakeup.
//!
//! \return None.
//
//*****************************************************************************
static inline void
Flash_setPumpWakeupTime(uint32_t ctrlBase, uint16_t sysclkCycles)
{
//
// Check the arguments.
//
;
//
// PSLEEP = sysclkCycles/2. PSLEEP maximum value is 4095(12 bits wide)
//
;
__eallow();
//
// Write sysclkCycles/2 to PSLEEP of the FPAC1 register.
//
(*((volatile uint32_t *)(ctrlBase + 0x24U))) =
((*((volatile uint32_t *)(ctrlBase + 0x24U))) &
~(uint32_t)0xFFF0000U) |
(((uint32_t)sysclkCycles / (uint32_t)2) <<
(uint32_t)16U);
__edis();
}
//*****************************************************************************
//
//! Reads the bank active power state.
//!
//! \param ctrlBase is the base address of the flash wrapper control registers.
//! \param bank is the flash bank that is being used.
//!
//! \return Returns \b true if the Bank is in Active power state and \b false
//! otherwise.
//
//*****************************************************************************
static inline _Bool
Flash_isBankReady(uint32_t ctrlBase, Flash_BankNumber bank)
{
//
// Check the arguments.
//
;
_Bool ready;
uint32_t bitMask = (uint32_t)0x1U << (uint32_t)bank;
//
// Return the BANKXRDY bit in FBPRDY.
//
if(((*((volatile uint32_t *)(ctrlBase + 0x22U))) & bitMask) == bitMask)
{
ready = 1;
}
else
{
ready = 0;
}
return(ready);
}
//*****************************************************************************
//
//! Reads the pump active power state.
//!
//! \param ctrlBase is the base address of the flash wrapper control registers.
//!
//! \return Returns \b true if the Pump is in Active power state and \b false
//! otherwise.
//
//*****************************************************************************
static inline _Bool
Flash_isPumpReady(uint32_t ctrlBase)
{
//
// Check the arguments.
//
;
_Bool ready;
//
// Return the PUMPRDY bit in FBPRDY.
//
if(((*((volatile uint32_t *)(ctrlBase + 0x22U))) &
(uint32_t)0x8000U) == 0x8000U)
{
ready = 1;
}
else
{
ready = 0;
}
return(ready);
}
//*****************************************************************************
//
//! Gets the single error address low.
//!
//! \param eccBase is the base address of the flash wrapper ECC registers.
//!
//! This function returns the 32-bit address of the single bit error that
//! occurred in the lower 64-bits of a 128-bit memory-aligned data. The
//! returned address is to that 64-bit aligned data.
//!
//! \return Returns the 32 bits of a 64-bit aligned address where a single bit
//! error occurred.
//
//*****************************************************************************
static inline uint32_t
Flash_getSingleBitErrorAddressLow(uint32_t eccBase)
{
//
// Check the arguments.
//
;
return((*((volatile uint32_t *)(eccBase + 0x2U))));
}
//*****************************************************************************
//
//! Gets the single error address high.
//!
//! \param eccBase is the base address of the flash wrapper ECC registers.
//!
//! This function returns the 32-bit address of the single bit error that
//! occurred in the upper 64-bits of a 128-bit memory-aligned data. The
//! returned address is to that 64-bit aligned data.
//!
//! \return Returns the 32 bits of a 64-bit aligned address where a single bit
//! error occurred.
//
//*****************************************************************************
static inline uint32_t
Flash_getSingleBitErrorAddressHigh(uint32_t eccBase)
{
//
// Check the arguments.
//
;
return((*((volatile uint32_t *)(eccBase + 0x4U))));
}
//*****************************************************************************
//
//! Gets the uncorrectable error address low.
//!
//! \param eccBase is the base address of the flash wrapper ECC registers.
//!
//! This function returns the 32-bit address of the uncorrectable error that
//! occurred in the lower 64-bits of a 128-bit memory-aligned data. The
//! returned address is to that 64-bit aligned data.
//!
//! \return Returns the 32 bits of a 64-bit aligned address where an
//! uncorrectable error occurred.
//
//*****************************************************************************
static inline uint32_t
Flash_getUncorrectableErrorAddressLow(uint32_t eccBase)
{
//
// Check the arguments.
//
;
return((*((volatile uint32_t *)(eccBase + 0x6U))));
}
//*****************************************************************************
//
//! Gets the uncorrectable error address high.
//!
//! \param eccBase is the base address of the flash wrapper ECC base.
//!
//! This function returns the 32-bit address of the uncorrectable error that
//! occurred in the upper 64-bits of a 128-bit memory-aligned data. The
//! returned address is to that 64-bit aligned data.
//!
//! \return Returns the 32 bits of a 64-bit aligned address where an
//! uncorrectable error occurred.
//
//*****************************************************************************
static inline uint32_t
Flash_getUncorrectableErrorAddressHigh(uint32_t eccBase)
{
//
// Check the arguments.
//
;
return((*((volatile uint32_t *)(eccBase + 0x8U))));
}
//*****************************************************************************
//
//! Gets the error status of the Lower 64-bits.
//!
//! \param eccBase is the base address of the flash wrapper ECC registers.
//!
//! This function returns the error status of the lower 64-bits of a 128-bit
//! aligned address.
//!
//! \return Returns value of the low error status bits which can be used with
//! Flash_ErrorStatus type.
//
//*****************************************************************************
static inline Flash_ErrorStatus
Flash_getLowErrorStatus(uint32_t eccBase)
{
uint32_t errorStatus;
//
// Check the arguments.
//
;
//
// Get the Low Error Status bits
//
errorStatus = ((*((volatile uint32_t *)(eccBase + 0xAU))) & 0x7UL);
return((Flash_ErrorStatus)errorStatus);
}
//*****************************************************************************
//
//! Gets the error status of the Upper 64-bits.
//!
//! \param eccBase is the base address of the flash wrapper ECC registers.
//!
//! This function returns the error status of the upper 64-bits of a 128-bit
//! aligned address.
//!
//! \return Returns value of the high error status bits which can be used with
//! Flash_ErrorStatus type.
//
//*****************************************************************************
static inline Flash_ErrorStatus
Flash_getHighErrorStatus(uint32_t eccBase)
{
uint32_t errorStatus;
//
// Check the arguments.
//
;
//
// Get the High Error Status bits
//
errorStatus = (((*((volatile uint32_t *)(eccBase + 0xAU))) >> 16U) & 0x7UL);
return((Flash_ErrorStatus)errorStatus);
}
//*****************************************************************************
//
//! Gets the error position of the lower 64-bits for a single bit error.
//!
//! \param eccBase is the base address of the flash wrapper ECC registers.
//!
//! This function returns the error position of the lower 64-bits. If the
//! error type is FLASH_ECC_ERR, the position ranges from 0-7 else it ranges
//! from 0-63 for FLASH_DATA_ERR.
//!
//! \return Returns the position of the lower error bit.
//
//*****************************************************************************
static inline uint32_t
Flash_getLowErrorPosition(uint32_t eccBase)
{
//
// Check the arguments.
//
;
return(((*((volatile uint32_t *)(eccBase + 0xCU))) &
(uint32_t)0x3FU) >>
0U);
}
//*****************************************************************************
//
//! Gets the error position of the upper 64-bits for a single bit error.
//!
//! \param eccBase is the base address of the flash wrapper ECC registers.
//!
//! This function returns the error position of the upper 64-bits. If the
//! error type is FLASH_ECC_ERR, the position ranges from 0-7 else it ranges
//! from 0-63 for FLASH_DATA_ERR.
//!
//! \return Returns the position of the upper error bit.
//
//*****************************************************************************
static inline uint32_t
Flash_getHighErrorPosition(uint32_t eccBase)
{
//
// Check the arguments.
//
;
return(((*((volatile uint32_t *)(eccBase + 0xCU))) &
(uint32_t)0x3F0000U) >>
16U);
}
//*****************************************************************************
//
//! Clears the error position bit of the lower 64-bits for a single bit error.
//!
//! \param eccBase is the base address of the flash wrapper ECC registers.
//!
//! This function clears the error position bit of the lower 64-bits.
//!
//! \return None
//
//*****************************************************************************
static inline void
Flash_clearLowErrorPosition(uint32_t eccBase)
{
//
// Check the arguments.
//
;
__eallow();
(*((volatile uint32_t *)(eccBase + 0xCU))) &= ~(uint32_t)0x3FU;
__edis();
}
//*****************************************************************************
//
//! Clears the error position of the upper 64-bits for a single bit error.
//!
//! \param eccBase is the base address of the flash wrapper ECC registers.
//!
//! This function clears the error position bit of the upper 64-bits.
//!
//! \return None.
//
//*****************************************************************************
static inline void
Flash_clearHighErrorPosition(uint32_t eccBase)
{
//
// Check the arguments.
//
;
__eallow();
(*((volatile uint32_t *)(eccBase + 0xCU))) &= ~(uint32_t)0x3F0000U;
__edis();
}
//*****************************************************************************
//
//! Gets the error type of the lower 64-bits.
//!
//! \param eccBase is the base address of the flash wrapper ECC registers.
//!
//! This function returns the error type of the lower 64-bits. The error type
//! can be FLASH_ECC_ERR or FLASH_DATA_ERR.
//!
//! \return Returns the type of the lower 64-bit error.
//
//*****************************************************************************
static inline Flash_ErrorType
Flash_getLowErrorType(uint32_t eccBase)
{
Flash_ErrorType errorType;
//
// Check the arguments.
//
;
//
// Check which error type.
// If bit is 1 then ECC error, else it is a Data error.
//
if(((*((volatile uint32_t *)(eccBase + 0xCU))) & 0x100U)
== 0x100U)
{
errorType = FLASH_ECC_ERR;
}
else
{
errorType = FLASH_DATA_ERR;
}
return(errorType);
}
//*****************************************************************************
//
//! Gets the error type of the upper 64-bits.
//!
//! \param eccBase is the base address of the flash wrapper ECC registers.
//!
//! This function returns the error type of the upper 64-bits. The error type
//! can be FLASH_ECC_ERR or FLASH_DATA_ERR.
//!
//! \return Returns the type of the upper 64-bit error.
//
//*****************************************************************************
static inline Flash_ErrorType
Flash_getHighErrorType(uint32_t eccBase)
{
Flash_ErrorType errorType;
//
// Check the arguments.
//
;
//
// Check which error type.
// If bit is 1 then ECC error, else it is a Data error.
//
if(((*((volatile uint32_t *)(eccBase + 0xCU))) & 0x1000000U)
== 0x1000000U)
{
errorType = FLASH_ECC_ERR;
}
else
{
errorType = FLASH_DATA_ERR;
}
return(errorType);
}
//*****************************************************************************
//
//! Clears the error type bit of the lower 64-bits for a single bit error.
//!
//! \param eccBase is the base address of the flash wrapper ECC registers.
//!
//! This function clears the error type bit of the lower 64-bits.
//!
//! \return None
//
//*****************************************************************************
static inline void
Flash_clearLowErrorType(uint32_t eccBase)
{
//
// Check the arguments.
//
;
__eallow();
(*((volatile uint32_t *)(eccBase + 0xCU))) &= ~(uint32_t)0x100U;
__edis();
}
//*****************************************************************************
//
//! Clears the error type of the upper 64-bits for a single bit error.
//!
//! \param eccBase is the base address of the flash wrapper ECC registers.
//!
//! This function clears the error type bit of the upper 64-bits.
//!
//! \return None.
//
//*****************************************************************************
static inline void
Flash_clearHighErrorType(uint32_t eccBase)
{
//
// Check the arguments.
//
;
__eallow();
(*((volatile uint32_t *)(eccBase + 0xCU))) &= ~(uint32_t)0x1000000U;
__edis();
}
//*****************************************************************************
//
//! Clears the errors status of the lower 64-bits.
//!
//! \param eccBase is the base address of the flash wrapper ECC registers.
//! \param errorStatus is the error status to clear. errorStatus is a uint16_t.
//! errorStatus is a bitwise OR of the following value:
//!
//! - \b FLASH_FAIL_0_CLR
//! - \b FLASH_FAIL_1_CLR
//! - \b FLASH_UNC_ERR_CLR
//!
//! \return None.
//
//*****************************************************************************
static inline void
Flash_clearLowErrorStatus(uint32_t eccBase, uint16_t errorStatus)
{
//
// Check the arguments.
//
;
;
__eallow();
(*((volatile uint32_t *)(eccBase + 0xEU))) |= ((uint32_t)errorStatus);
__edis();
}
//*****************************************************************************
//
//! Clears the errors status of the upper 64-bits.
//!
//! \param eccBase is the base address of the flash wrapper ECC registers.
//! \param errorStatus is the error status to clear. errorStatus is a uint16_t.
//! errorStatus is a bitwise OR of the following value:
//!
//! - \b FLASH_FAIL_0_CLR
//! - \b FLASH_FAIL_1_CLR
//! - \b FLASH_UNC_ERR_CLR
//!
//! \return None.
//
//*****************************************************************************
static inline void
Flash_clearHighErrorStatus(uint32_t eccBase, uint16_t errorStatus)
{
//
// Check the arguments.
//
;
;
__eallow();
(*((volatile uint32_t *)(eccBase + 0xEU))) |= ((uint32_t)errorStatus << 16U);
__edis();
}
//*****************************************************************************
//
//! Gets the single bit error count.
//!
//! \param eccBase is the base address of the flash wrapper ECC registers.
//!
//! \return Returns the single bit error count.
//
//*****************************************************************************
static inline uint32_t
Flash_getErrorCount(uint32_t eccBase)
{
//
// Check the arguments.
//
;
return((*((volatile uint32_t *)(eccBase + 0x10U))) &
(uint32_t)0xFFFFU);
}
//*****************************************************************************
//
//! Sets the single bit error threshold.
//!
//! \param eccBase is the base address of the flash wrapper ECC registers.
//! \param threshold is the single bit error threshold. Valid ranges are from
//! 0-65535.
//!
//! \return None.
//
//*****************************************************************************
static inline void
Flash_setErrorThreshold(uint32_t eccBase, uint16_t threshold)
{
//
// Check the arguments.
//
;
__eallow();
(*((volatile uint32_t *)(eccBase + 0x12U))) = ((uint32_t)threshold &
(uint32_t)0xFFFFU);
__edis();
}
//*****************************************************************************
//
//! Gets the error interrupt.
//!
//! \param eccBase is the base address of the flash wrapper ECC registers.
//!
//! This function returns the type of error interrupt that occurred. The
//! values can be used with
//! - \b FLASH_NO_ERROR
//! - \b FLASH_SINGLE_ERROR
//! - \b FLASH_UNC_ERROR
//!
//! \return Returns the interrupt flag.
//
//*****************************************************************************
static inline uint32_t
Flash_getInterruptFlag(uint32_t eccBase)
{
//
// Check the arguments.
//
;
//
// Read which type of error occurred.
//
return(((*((volatile uint32_t *)(eccBase + 0x14U))) & (uint32_t)0x3U));
}
//*****************************************************************************
//
//! Clears the single error interrupt flag.
//!
//! \param eccBase is the base address of the flash wrapper ECC registers.
//!
//! \return None.
//
//*****************************************************************************
static inline void
Flash_clearSingleErrorInterruptFlag(uint32_t eccBase)
{
//
// Check the arguments.
//
;
__eallow();
(*((volatile uint32_t *)(eccBase + 0x16U))) |=
0x1U;
__edis();
}
//*****************************************************************************
//
//! Clears the uncorrectable error interrupt flag.
//!
//! \param eccBase is the base address of the flash wrapper ECC registers.
//!
//! \return None.
//
//*****************************************************************************
static inline void
Flash_clearUncorrectableInterruptFlag(uint32_t eccBase)
{
//
// Check the arguments.
//
;
__eallow();
(*((volatile uint32_t *)(eccBase + 0x16U))) |=
0x2U;
__edis();
}
//*****************************************************************************
//
//! Sets the Data Low Test register for ECC testing.
//!
//! \param eccBase is the base address of the flash wrapper ECC registers.
//! \param data is a 32-bit value that is the low double word of selected
//! 64-bit data
//!
//! \return None.
//
//*****************************************************************************
static inline void
Flash_setDataLowECCTest(uint32_t eccBase, uint32_t data)
{
//
// Check the arguments.
//
;
__eallow();
(*((volatile uint32_t *)(eccBase + 0x1AU))) = data;
__edis();
}
//*****************************************************************************
//
//! Sets the Data High Test register for ECC testing.
//!
//! \param eccBase is the base address of the flash wrapper ECC registers.
//! \param data is a 32-bit value that is the high double word of selected
//! 64-bit data
//!
//! \return None.
//
//*****************************************************************************
static inline void
Flash_setDataHighECCTest(uint32_t eccBase, uint32_t data)
{
//
// Check the arguments.
//
;
__eallow();
(*((volatile uint32_t *)(eccBase + 0x18U))) = data;
__edis();
}
//*****************************************************************************
//
//! Sets the test address register for ECC testing.
//!
//! \param eccBase is the base address of the flash wrapper ECC registers.
//! \param address is a 32-bit value containing an address. Bits 21-3 will be
//! used as the flash word (128-bit) address.
//!
//! This function left shifts the address 1 bit to convert it to a byte address
//!
//! \return None.
//
//*****************************************************************************
static inline void
Flash_setECCTestAddress(uint32_t eccBase, uint32_t address)
{
//
// Check the arguments.
//
;
//
// Left shift the address 1 bit to make it byte-addressable
//
uint32_t byteAddress = address << 1;
__eallow();
//
// Write bits 21-3 to the register.
//
(*((volatile uint32_t *)(eccBase + 0x1CU))) = byteAddress;
__edis();
}
//*****************************************************************************
//
//! Sets the ECC test bits for ECC testing.
//!
//! \param eccBase is the base address of the flash wrapper ECC registers.
//! \param ecc is a 32-bit value. The least significant 8 bits are used as
//! the ECC Control Bits in the ECC Test.
//!
//! \return None.
//
//*****************************************************************************
static inline void
Flash_setECCTestECCBits(uint32_t eccBase, uint16_t ecc)
{
//
// Check the arguments.
//
;
;
__eallow();
//
// Write the 8 ECC Control Bits.
//
(*((volatile uint32_t *)(eccBase + 0x1EU))) =
((uint32_t)ecc & (uint32_t)0xFFU);
__edis();
}
//*****************************************************************************
//
//! Enables ECC Test mode.
//!
//! \param eccBase is the base address of the flash wrapper ECC registers.
//!
//! \return None.
//
//*****************************************************************************
static inline void
Flash_enableECCTestMode(uint32_t eccBase)
{
//
// Check the arguments.
//
;
__eallow();
(*((volatile uint32_t *)(eccBase + 0x20U))) |= 0x1U;
__edis();
}
//*****************************************************************************
//
//! Disables ECC Test mode.
//!
//! \param eccBase is the base address of the flash wrapper ECC registers.
//!
//! \return None.
//
//*****************************************************************************
static inline void
Flash_disableECCTestMode(uint32_t eccBase)
{
//
// Check the arguments.
//
;
__eallow();
(*((volatile uint32_t *)(eccBase + 0x20U))) &=
~(uint32_t)0x1U;
__edis();
}
//*****************************************************************************
//
//! Selects the ECC block on bits [63:0] of bank data.
//!
//! \param eccBase is the base address of the flash wrapper ECC registers.
//!
//! \return None.
//
//*****************************************************************************
static inline void
Flash_selectLowECCBlock(uint32_t eccBase)
{
//
// Check the arguments.
//
;
__eallow();
(*((volatile uint32_t *)(eccBase + 0x20U))) &=
~(uint32_t)0x2U;
__edis();
}
//*****************************************************************************
//
//! Selects the ECC block on bits [127:64] of bank data.
//!
//! \param eccBase is the base address of the flash wrapper ECC registers.
//!
//! \return None.
//
//*****************************************************************************
static inline void
Flash_selectHighECCBlock(uint32_t eccBase)
{
//
// Check the arguments.
//
;
__eallow();
(*((volatile uint32_t *)(eccBase + 0x20U))) |= 0x2U;
__edis();
}
//*****************************************************************************
//
//! Performs the ECC calculation on the test block.
//!
//! \param eccBase is the base address of the flash wrapper ECC registers.
//!
//! \return None.
//
//*****************************************************************************
static inline void
Flash_performECCCalculation(uint32_t eccBase)
{
//
// Check the arguments.
//
;
__eallow();
(*((volatile uint32_t *)(eccBase + 0x20U))) |= 0x4U;
__edis();
}
//*****************************************************************************
//
//! Gets the ECC Test data out high 63:32 bits.
//!
//! \param eccBase is the base address of the flash wrapper ECC registers.
//!
//! \return Returns the ECC TEst data out High.
//
//*****************************************************************************
static inline uint32_t
Flash_getTestDataOutHigh(uint32_t eccBase)
{
//
// Check the arguments.
//
;
return((*((volatile uint32_t *)(eccBase + 0x22U))));
}
//*****************************************************************************
//
//! Gets the ECC Test data out low 31:0 bits.
//!
//! \param eccBase is the base address of the flash wrapper ECC registers.
//!
//! \return Returns the ECC Test data out Low.
//
//*****************************************************************************
static inline uint32_t
Flash_getTestDataOutLow(uint32_t eccBase)
{
//
// Check the arguments.
//
;
return((*((volatile uint32_t *)(eccBase + 0x24U))));
}
//*****************************************************************************
//
//! Gets the ECC Test status.
//!
//! \param eccBase is the base address of the flash wrapper ECC registers.
//!
//! This function returns the ECC test status. The values can be used with
//! - \b FLASH_NO_ERROR
//! - \b FLASH_SINGLE_ERROR
//! - \b FLASH_UNC_ERROR
//!
//! \return Returns the ECC test status.
//
//*****************************************************************************
static inline uint32_t
Flash_getECCTestStatus(uint32_t eccBase)
{
//
// Check the arguments.
//
;
//
// Read which type of error occurred.
//
return(((*((volatile uint32_t *)(eccBase + 0x26U)))) & (uint32_t)0x3U);
}
//*****************************************************************************
//
//! Gets the ECC Test single bit error position.
//!
//! \param eccBase is the base address of the flash wrapper ECC registers.
//!
//! \return Returns the ECC Test single bit error position. If the error type
//! is check bits than the position can range from 0 to 7. If the error type
//! is data bits than the position can range from 0 to 63.
//
//*****************************************************************************
static inline uint32_t
Flash_getECCTestErrorPosition(uint32_t eccBase)
{
//
// Check the arguments.
//
;
//
// Read the position bits and shift it to the right.
//
return(((*((volatile uint32_t *)(eccBase + 0x26U))) &
(uint32_t)0xFCU) >>
2U);
}
//*****************************************************************************
//
//! Gets the single bit error type.
//!
//! \param eccBase is the base address of the flash wrapper ECC registers.
//!
//! \return Returns the single bit error type as a
//! Flash_SingleBitErrorIndicator. FLASH_DATA_BITS and FLASH_CHECK_BITS
//! indicate where the single bit error occurred.
//
//*****************************************************************************
static inline Flash_SingleBitErrorIndicator
Flash_getECCTestSingleBitErrorType(uint32_t eccBase)
{
uint32_t errorType;
//
// Check the arguments.
//
;
//
// Read the ERR_TYPE bit to see where the single bit error was.
//
errorType = (((*((volatile uint32_t *)(eccBase + 0x26U))) &
(uint32_t)0x100U) >> 8U);
return((Flash_SingleBitErrorIndicator)errorType);
}
//*****************************************************************************
//
//! Initializes the flash control registers.
//!
//! \param ctrlBase is the base address of the flash wrapper control registers.
//! \param eccBase is the base address of the flash wrapper ECC registers.
//! \param waitstates is the wait-state value.
//!
//! This function initializes the flash control registers. At reset bank and
//! pump are in sleep. A flash access will power up the bank and pump
//! automatically. This function will power up Flash bank and pump and set the
//! fallback mode of flash and pump as active.
//!
//! This function also sets the number of wait-states for a flash access
//! (see Flash_setWaitstates() for more details), and enables cache, the
//! prefetch mechanism, and ECC.
//!
//! \return None.
//
//*****************************************************************************
extern void
Flash_initModule(uint32_t ctrlBase, uint32_t eccBase, uint16_t waitstates);
//*****************************************************************************
//
//! Powers down the flash.
//!
//! \param ctrlBase is the base address of the flash wrapper control registers.
//!
//! This function powers down the flash bank(s) and the flash pump.
//!
//! \return None.
//
//*****************************************************************************
extern void
Flash_powerDown(uint32_t ctrlBase);
//*****************************************************************************
//
//! Wakes the flash from low power mode.
//!
//! \param ctrlBase is the base address of the flash wrapper control registers.
//!
//! This function will power up Flash bank and pump and set the
//! fallback mode of flash and pump as active.
//!
//! \return None.
//
//*****************************************************************************
extern void
Flash_wakeFromLPM(uint32_t ctrlBase);
//*****************************************************************************
//
// Close the Doxygen group.
//! @}
//
//*****************************************************************************
//*****************************************************************************
//
// Mark the end of the C bindings section for C++ compilers.
//
//*****************************************************************************
//###########################################################################
//
// FILE: fsi.h
//
// TITLE: C28x FSI Driver API header file
//
//###########################################################################
// $Copyright:
// Copyright (C) 2023 Texas Instruments Incorporated - http://www.ti.com/
//
// 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 Texas Instruments Incorporated 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
// OWNER 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.
// $
//###########################################################################
//*****************************************************************************
//
// If building with a C++ compiler, make all of the definitions in this header
// have a C binding.
//
//*****************************************************************************
//*****************************************************************************
//
//! \addtogroup fsi_api FSI
//! @{
//
//*****************************************************************************
//###########################################################################
//
// FILE: hw_fsi.h
//
// TITLE: Definitions for the FSI registers.
//
//###########################################################################
// $Copyright:
// Copyright (C) 2023 Texas Instruments Incorporated - http://www.ti.com/
//
// 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 Texas Instruments Incorporated 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
// OWNER 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.
// $
//###########################################################################
//*************************************************************************************************
//
// The following are defines for the FSI register offsets
//
//*************************************************************************************************
// register
// buffer
// RX_INT1
// RX_INT2
// buffer
//*************************************************************************************************
//
// The following are defines for the bit fields in the TX_MASTER_CTRL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the TX_CLK_CTRL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the TX_OPER_CTRL_LO register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the TX_OPER_CTRL_HI register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the TX_FRAME_CTRL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the TX_FRAME_TAG_UDATA register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the TX_BUF_PTR_LOAD register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the TX_BUF_PTR_STS register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the TX_PING_CTRL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the TX_PING_TAG register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the TX_INT_CTRL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the TX_DMA_CTRL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the TX_LOCK_CTRL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the TX_EVT_STS register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the TX_EVT_CLR register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the TX_EVT_FRC register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the TX_USER_CRC register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the TX_ECC_DATA register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the TX_ECC_VAL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the TX_DLYLINE_CTRL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the RX_MASTER_CTRL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the RX_OPER_CTRL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the RX_FRAME_INFO register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the RX_FRAME_TAG_UDATA register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the RX_DMA_CTRL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the RX_EVT_STS register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the RX_CRC_INFO register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the RX_EVT_CLR register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the RX_EVT_FRC register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the RX_BUF_PTR_LOAD register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the RX_BUF_PTR_STS register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the RX_FRAME_WD_CTRL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the RX_PING_WD_CTRL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the RX_PING_TAG register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the RX_INT1_CTRL register
//
//*************************************************************************************************
// Interrupt to INT1
// Interrupt to INT1
// to INT1
// to INT1
// Interrupt to INT1
// INT1
// Interrupt to INT1
// Interrupt to INT1
// INT1
// Interrupt to INT1
// Interrupt to INT1
// Interrupt to INT1
// Interrupt to INT1
//*************************************************************************************************
//
// The following are defines for the bit fields in the RX_INT2_CTRL register
//
//*************************************************************************************************
// Interrupt to INT2
// Interrupt to INT2
// to INT2
// to INT2
// INT2
// INT2
// Interrupt to INT2
// Interrupt to INT2
// INT2
// Interrupt to INT2
// Interrupt to INT2
// Interrupt to INT2
// Interrupt to INT2
//*************************************************************************************************
//
// The following are defines for the bit fields in the RX_LOCK_CTRL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the RX_ECC_DATA register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the RX_ECC_VAL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the RX_ECC_LOG register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the RX_FRAME_TAG_CMP register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the RX_PING_TAG_CMP register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the RX_TRIG_CTRL_0 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the RX_TRIG_WIDTH_0 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the RX_DLYLINE_CTRL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the RX_TRIG_CTRL_1 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the RX_TRIG_CTRL_2 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the RX_TRIG_CTRL_3 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the RX_VIS_1 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the RX_UDATA_FILTER register
//
//*************************************************************************************************
//*****************************************************************************
// PMBUS
//*****************************************************************************
//*****************************************************************************
// FSI
//*****************************************************************************
//*****************************************************************************
// SPI
//*****************************************************************************
//*****************************************************************************
// I2C
//*****************************************************************************
//*****************************************************************************
// LIN
//*****************************************************************************
//*****************************************************************************
//
// FSI Tx defines
//
//*****************************************************************************
//*****************************************************************************
//
// FSI Tx events defines
//
// Values that can be passed to APIs to enable/disable interrupts and
// also to set/get/clear event status on FSI Tx operation.
//
// There are 4 supported interrupts related to Tx events-
// All are available as event status as well except 4th one.
//
//*****************************************************************************
//*****************************************************************************
//
//! \brief Flag for event status not available as interrupt
//!
//! Ping frame transmission upon hardware trigger(ping watchdog or
//! external trigger) is shown as event status.
//
//*****************************************************************************
//*****************************************************************************
//
//! \brief Mask of all Tx Events, ORing all event defines
//
//*****************************************************************************
//*****************************************************************************
//
//! \brief Maximum number of external input for triggering frame-transmission
//
//*****************************************************************************
//*****************************************************************************
//
//! \brief Shifts needed to control FSI Tx interrupt generation on INT2
//
//*****************************************************************************
//*****************************************************************************
//
// FSI Rx Defines
//
//*****************************************************************************
//*****************************************************************************
//
// FSI Rx event defines
//
// Values that can be passed to APIs to enable/disable interrupts and
// also to set/get/clear event status on FSI Rx operation.
//
// There are 15 supported interrupts related to Rx events.
// All are available as event status as well.
//
//*****************************************************************************
//*****************************************************************************
//
//! \brief Mask of all Rx Events, ORing all event defines
//
//*****************************************************************************
//*****************************************************************************
//
//! \brief Maximum value in Rx delay line tap control
//
//*****************************************************************************
//*****************************************************************************
//
// Common defines for both FSI Tx and Rx
//
//*****************************************************************************
//*****************************************************************************
//
//! \brief Maximum data length(16 words) for user/software defined data frame
//
//*****************************************************************************
//*****************************************************************************
//
//! \brief Maximum value for user data field(8 bits)
//
//*****************************************************************************
//*****************************************************************************
//
//! \brief Maximum value of Buffer pointer offset(4 bits)
//
//*****************************************************************************
//*****************************************************************************
//
//! \brief Key value for writing some FSI Tx/Rx registers
//
//*****************************************************************************
//*****************************************************************************
//
// typedefs
//
//*****************************************************************************
//*****************************************************************************
//
//! \brief Data lines used for transmit/receive operation
//!
//! \details Supported number of data lines is only 2 - 1 lane or 2 lanes
//
//*****************************************************************************
typedef enum
{
FSI_DATA_WIDTH_1_LANE = 0x0000U,
FSI_DATA_WIDTH_2_LANE = 0x0001U
} FSI_DataWidth;
//*****************************************************************************
//
//! \brief List of TX submodules that can be reset, can be used with reset APIs
//!
//! \details Three kind of resets can be made-
//! 1) reset entire Tx Module
//! 2) reset only TX clock
//! 3) reset ping timeout counter
//
//*****************************************************************************
typedef enum
{
FSI_TX_MAIN_CORE_RESET = 0x0000U,
FSI_TX_CLOCK_RESET = 0x0001U,
FSI_TX_PING_TIMEOUT_CNT_RESET = 0x0002U
} FSI_TxSubmoduleInReset;
//*****************************************************************************
//
//! \brief Start Mode for Tx frame transmission
//!
//! \details Three start modes(that is, how transmission will start) are
//! supported-
//! 1. SW write of START bit in \b TX_PKT_CTRL register
//! 2. Rising edge on external trigger
//! 3. Either SW write of START bit or Frame completion
//
//*****************************************************************************
typedef enum
{
FSI_TX_START_FRAME_CTRL = 0x0000U,
FSI_TX_START_EXT_TRIG = 0x0001U,
FSI_TX_START_FRAME_CTRL_OR_UDATA_TAG = 0x0002U
} FSI_TxStartMode;
//*****************************************************************************
//
//! \brief Various FSI frame types
//!
//! \details Three frame types exist-
//! - \b Ping: Used for checking line integrity, can be sent by
//! software or automatically by hardware.
//! - \b Error: Used typically during error conditions or when one
//! side wants to signal the other side for attention.
//! - \b Data: Two subtypes exist based on data-length-
//! a) \b Fixed (1/2/4/6 words)
//! b) \b Nwords Software programs number of data words
//!
//! \note 4 bit code for frame types- 0x1, 0x2 and 0x8 to 0xE are reserved
//
//*****************************************************************************
typedef enum
{
FSI_FRAME_TYPE_PING = 0x0000U,
FSI_FRAME_TYPE_ERROR = 0x000FU,
FSI_FRAME_TYPE_1WORD_DATA = 0x0004U,
FSI_FRAME_TYPE_2WORD_DATA = 0x0005U,
FSI_FRAME_TYPE_4WORD_DATA = 0x0006U,
FSI_FRAME_TYPE_6WORD_DATA = 0x0007U,
FSI_FRAME_TYPE_NWORD_DATA = 0x0003U
} FSI_FrameType;
//*****************************************************************************
//
//! \brief Possible values of a FSI frame
//!
//! \details 4 bit field inside FSI frame is available to set tag value(0-15)
//
//*****************************************************************************
typedef enum
{
FSI_FRAME_TAG0 = 0x0000U,
FSI_FRAME_TAG1 = 0x0001U,
FSI_FRAME_TAG2 = 0x0002U,
FSI_FRAME_TAG3 = 0x0003U,
FSI_FRAME_TAG4 = 0x0004U,
FSI_FRAME_TAG5 = 0x0005U,
FSI_FRAME_TAG6 = 0x0006U,
FSI_FRAME_TAG7 = 0x0007U,
FSI_FRAME_TAG8 = 0x0008U,
FSI_FRAME_TAG9 = 0x0009U,
FSI_FRAME_TAG10 = 0x000AU,
FSI_FRAME_TAG11 = 0x000BU,
FSI_FRAME_TAG12 = 0x000CU,
FSI_FRAME_TAG13 = 0x000DU,
FSI_FRAME_TAG14 = 0x000EU,
FSI_FRAME_TAG15 = 0x000FU
} FSI_FrameTag;
//*****************************************************************************
//
//! \brief Ping timeout mode
//!
//! \details Ping timeout can reset and restart only on hardware initiated PING
//! frames (PING Watchdog timeout)
//! OR
//! on any software initiated frame being sent out also based on
//! which mode is selected
//
//*****************************************************************************
typedef enum
{
FSI_PINGTIMEOUT_ON_HWINIT_PING_FRAME = 0x0000U,
FSI_PINGTIMEOUT_ON_HWSWINIT_PING_FRAME = 0x0001U
} FSI_PingTimeoutMode;
//! \brief ECC Computation width- 16 bit or 32 bit
//!
typedef enum
{
FSI_32BIT_ECC_COMPUTE = 0x0000U,
FSI_16BIT_ECC_COMPUTE = 0x0001U
} FSI_ECCComputeWidth;
//*****************************************************************************
//
//! \brief Interrupt lines supported in FSI
//!
//! \details Any event on FSI Tx or Rx can be enabled to trigger interrupt on 2
//! interrupt lines to CPU/CLA- \b INT1 and \b INT2
//
//*****************************************************************************
typedef enum
{
FSI_INT1 = 0x0000U,
FSI_INT2 = 0x0001U
} FSI_InterruptNum;
//*****************************************************************************
//
//! \brief List of RX modules that can be reset, can be used with reset APIs
//!
//! \details Three submodules can be reset-
//! 1) RX main core
//! 2) frame watchdog counter
//! 3) ping watchdog counter
//
//*****************************************************************************
typedef enum
{
FSI_RX_MAIN_CORE_RESET = 0x0000U,
FSI_RX_FRAME_WD_CNT_RESET = 0x0001U,
FSI_RX_PING_WD_CNT_RESET = 0x0002U
} FSI_RxSubmoduleInReset;
//*****************************************************************************
//
//! \brief Available Rx lines for delay tap selection
//!
//! \details Delay tapping can be done on 3 lines- 1)RXCLK 2)RXD0 and 3)RXD1
//
//*****************************************************************************
typedef enum
{
FSI_RX_DELAY_CLK = 0x0000U,
FSI_RX_DELAY_D0 = 0x0001U,
FSI_RX_DELAY_D1 = 0x0002U
} FSI_RxDelayTapType;
//*****************************************************************************
//
//! \brief Indexes of available EPWM SOC triggers
//!
//
//*****************************************************************************
typedef enum
{
FSI_EXT_TRIGSRC_EPWM_XBARTRIP4 = 0U,
FSI_EXT_TRIGSRC_EPWM_XBARTRIP5 = 1U,
FSI_EXT_TRIGSRC_EPWM_XBARTRIP7 = 2U,
FSI_EXT_TRIGSRC_EPWM_XBARTRIP8 = 3U,
FSI_EXT_TRIGSRC_EPWM_XBARTRIP9 = 4U,
FSI_EXT_TRIGSRC_EPWM_XBARTRIP10 = 5U,
FSI_EXT_TRIGSRC_EPWM_XBARTRIP11 = 6U,
FSI_EXT_TRIGSRC_EPWM_XBARTRIP12 = 7U,
FSI_EXT_TRIGSRC_EPWM1_SOCA = 8U,
FSI_EXT_TRIGSRC_EPWM1_SOCB = 9U,
FSI_EXT_TRIGSRC_EPWM2_SOCA = 10U,
FSI_EXT_TRIGSRC_EPWM2_SOCB = 11U,
FSI_EXT_TRIGSRC_EPWM3_SOCA = 12U,
FSI_EXT_TRIGSRC_EPWM3_SOCB = 13U,
FSI_EXT_TRIGSRC_EPWM4_SOCA = 14U,
FSI_EXT_TRIGSRC_EPWM4_SOCB = 15U,
FSI_EXT_TRIGSRC_EPWM5_SOCA = 16U,
FSI_EXT_TRIGSRC_EPWM5_SOCB = 17U,
FSI_EXT_TRIGSRC_EPWM6_SOCA = 18U,
FSI_EXT_TRIGSRC_EPWM6_SOCB = 19U,
FSI_EXT_TRIGSRC_EPWM7_SOCA = 20U,
FSI_EXT_TRIGSRC_EPWM7_SOCB = 21U,
FSI_EXT_TRIGSRC_EPWM8_SOCA = 22U,
FSI_EXT_TRIGSRC_EPWM8_SOCB = 23U,
FSI_EXT_TRIGSRC_CLB1_CLBOUT30 = 40U,
FSI_EXT_TRIGSRC_CLB1_CLBOUT31 = 41U,
FSI_EXT_TRIGSRC_CLB2_CLBOUT30 = 42U,
FSI_EXT_TRIGSRC_CLB2_CLBOUT31 = 43U,
FSI_EXT_TRIGSRC_ADC_SOCA = 52U,
FSI_EXT_TRIGSRC_ADC_SOCB = 53U,
FSI_EXT_TRIGSRC_CPU1_TIMER0INT = 54U,
FSI_EXT_TRIGSRC_CPU1_TIMER1INT = 55U,
FSI_EXT_TRIGSRC_CPU1_TIMER2INT = 56U
} FSI_ExtFrameTriggerSrc;
//*****************************************************************************
//
// FSI Tx function prototypes/defintion
//
//*****************************************************************************
//*****************************************************************************
//
//! \brief Validates if FSI-Tx base address is correct
//!
//! \param[in] base is the base address of the FSI-Tx module
//!
//! \return returns \b true if the base address is valid and \b false otherwise
//
//*****************************************************************************
//*****************************************************************************
//
//! \brief Sends FLUSH pattern
//!
//! \details FLUSH pattern (toggle data lines followed by toggle on clocks)
//! should be sent only when FSI Tx is not under \b SOFT_RESET and the
//! clock to the transmit core has been turned ON.
//!
//! \param[in] base is the FSI Tx module base address
//!
//! \return None.
//
//*****************************************************************************
static inline void
FSI_sendTxFlush(uint32_t base)
{
//
// Check the arguments.
//
;
__eallow();
(*((volatile uint16_t *)(base + 0x0U))) |= ((uint16_t)0x2U |
((0x00A5U) <<
8U));
__edis();
}
//*****************************************************************************
//
//! \brief Stops FLUSH pattern transmission
//!
//! \details Transmission of FLUSH pattern should be stopped before starting
//! sending frames. Generally during initilization a pair of send/stop
//! APIs for FLUSH pattern is called to clear data/clock lines.
//!
//! \param[in] base is the FSI Tx module base address
//!
//! \return None.
//
//*****************************************************************************
static inline void
FSI_stopTxFlush(uint32_t base)
{
//
// Check the arguments.
//
;
__eallow();
(*((volatile uint16_t *)(base + 0x0U))) = (((~0x2U) &
(*((volatile uint16_t *)(base + 0x0U)))) |
((0x00A5U) <<
8U));
__edis();
}
//*****************************************************************************
//
//! \brief Selects PLL clock as source for clock dividers
//!
//! \param[in] base is the FSI Tx module base address
//!
//! \return None.
//
//*****************************************************************************
static inline void
FSI_selectTxPLLClock(uint32_t base)
{
//
// Check the arguments.
//
;
__eallow();
//
// Set PLLCLK as source for clock divider
//
(*((volatile uint16_t *)(base + 0x4U))) |= 0x100U;
__edis();
}
//*****************************************************************************
//
//! \brief sets clock division prescalar and enables the transmit clock
//!
//! \param[in] base is the FSI Tx module base address
//!
//! \return None.
//
//*****************************************************************************
static inline void
FSI_enableTxClock(uint32_t base)
{
//
// Check the arguments.
//
;
__eallow();
//
// Enable Tx clock
//
(*((volatile uint16_t *)(base + 0x2U))) |= 0x2U;
__edis();
}
//*****************************************************************************
//
//! \brief Disables transmit clock
//!
//! \param[in] base is the FSI Tx module base address
//!
//! \return None.
//
//*****************************************************************************
static inline void
FSI_disableTxClock(uint32_t base)
{
//
// Check the arguments.
//
;
__eallow();
//
// Disable Tx clock
//
(*((volatile uint16_t *)(base + 0x2U))) &= ~0x2U;
__edis();
}
//*****************************************************************************
//
//! \brief Sets the prescalar clock keeping the transmit clock in reset
//!
//! \param[in] base is the FSI Tx module base address
//! \param[in] preScaleValue used to generate transmit clock, it defines the
//! division value of /2,/3,/4,etc. of \b PLLCLK. Prescale value is
//! is to be set while keeping the clock in reset.
//!
//! \return None.
//
//*****************************************************************************
static inline void
FSI_configPrescalar(uint32_t base, uint16_t preScaleValue)
{
//
// Check the arguments.
//
;
;
__eallow();
//
// Disable Tx clock
//
(*((volatile uint16_t *)(base + 0x2U))) &= ~0x2U;
//
// Set prescalar value
//
(*((volatile uint16_t *)(base + 0x2U))) = ((*((volatile uint16_t *)(base + 0x2U))) &
(~0x3FCU)) |
(preScaleValue <<
2U);
__edis();
}
//*****************************************************************************
//
//! \brief Sets Data width for transmission
//!
//! \param[in] base is the FSI Tx module base address
//! \param[in] dataWidth selection between 1 or 2 lane transmission
//!
//! \return None.
//
//*****************************************************************************
static inline void
FSI_setTxDataWidth(uint32_t base, FSI_DataWidth dataWidth)
{
//
// Check the arguments.
//
;
__eallow();
(*((volatile uint16_t *)(base + 0x4U))) =
((*((volatile uint16_t *)(base + 0x4U))) &
(~0x3U)) |
(uint16_t)dataWidth;
__edis();
}
//*****************************************************************************
//
//! \brief Enables SPI compatible mode
//!
//! \details FSI supports a \b compatibility mode in order to communicate with
//! \b legacy peripherals like \b SPI. Only the 16-bit mode of SPI will
//! be supported. All the frame structures, CRC checks and will be
//! identical to the normal FSI frames.
//!
//! \param[in] base is the FSI Tx module base address
//!
//! \return None.
//
//*****************************************************************************
static inline void
FSI_enableTxSPIMode(uint32_t base)
{
//
// Check the arguments.
//
;
__eallow();
(*((volatile uint16_t *)(base + 0x4U))) |= 0x4U;
__edis();
}
//*****************************************************************************
//
//! \brief Disables SPI compatible mode
//!
//! \param[in] base is the FSI Tx module base address
//!
//! \return None.
//
//*****************************************************************************
static inline void
FSI_disableTxSPIMode(uint32_t base)
{
//
// Check the arguments.
//
;
__eallow();
(*((volatile uint16_t *)(base + 0x4U))) &= ~0x4U;
__edis();
}
//*****************************************************************************
//
//! \brief Sets start mode for any frame transmission
//!
//! \param[in] base is the FSI Tx module base address
//! \param[in] txStartMode is one of supported 3 start modes in transmission
//!
//! \return None.
//
//*****************************************************************************
static inline void
FSI_setTxStartMode(uint32_t base, FSI_TxStartMode txStartMode)
{
//
// Check the arguments.
//
;
__eallow();
(*((volatile uint16_t *)(base + 0x4U))) =
((*((volatile uint16_t *)(base + 0x4U))) &
(~0x38U)) |
((uint16_t)txStartMode << 3U);
__edis();
}
//*****************************************************************************
//
//! \brief Setting for when Ping timeout can reset and restart
//!
//! \param[in] base is the FSI Tx module base address
//! \param[in] pingTimeoutMode can be HW or both HW/SW initiated
//!
//! \return None.
//
//*****************************************************************************
static inline void
FSI_setTxPingTimeoutMode(uint32_t base, FSI_PingTimeoutMode pingTimeoutMode)
{
//
// Check the arguments.
//
;
__eallow();
if(pingTimeoutMode == FSI_PINGTIMEOUT_ON_HWSWINIT_PING_FRAME)
{
(*((volatile uint16_t *)(base + 0x4U))) |=
0x80U;
}
else
{
(*((volatile uint16_t *)(base + 0x4U))) &=
~0x80U;
}
__edis();
}
//*****************************************************************************
//
//! \brief Enables the Tx TDM mode for multi-node configuration
//!
//! \param[in] base is the FSI Tx module base address
//!
//! \return None.
//
//*****************************************************************************
static inline void
FSI_enableTxTDMMode(uint32_t base)
{
//
// Check the arguments.
//
;
__eallow();
//
// Enable Tx TDM Mode
//
(*((volatile uint16_t *)(base + 0x4U))) |= 0x200U;
__edis();
}
//*****************************************************************************
//
//! \brief Disables the Tx TDM mode.
//!
//! \param[in] base is the FSI Tx module base address
//!
//! \return None.
//
//*****************************************************************************
static inline void
FSI_disableTxTDMMode(uint32_t base)
{
//
// Check the arguments.
//
;
__eallow();
(*((volatile uint16_t *)(base + 0x4U))) &= ~0x200U;
__edis();
}
//*****************************************************************************
//
//! \brief Enables RX TDM as TDM source.
//!
//! \param[in] base is the FSI Tx module base address
//!
//! \return None.
//
//*****************************************************************************
static inline void
FSI_enableRxTDMMode(uint32_t base)
{
//
// Check the arguments.
//
;
__eallow();
//
// Enable Tx TDM Mode
//
(*((volatile uint16_t *)(base + 0x4U))) |= 0x400U;
__edis();
}
//*****************************************************************************
//
//! \brief Disables the Rx TDM mode.
//!
//! \param[in] base is the FSI Tx module base address
//!
//! \return None.
//
//*****************************************************************************
static inline void
FSI_disableRxTDMMode(uint32_t base)
{
//
// Check the arguments.
//
;
__eallow();
(*((volatile uint16_t *)(base + 0x4U))) &= ~0x400U;
__edis();
}
//*****************************************************************************
//
//! \brief Sets a particular external input to trigger transmission
//!
//! \param[in] base is the FSI Tx module base address
//! \param[in] extInputNum can be one of ports from 0 to 63. See also
//! FSI_ExtFrameTriggerSrc enum members for valid external triggers.
//!
//! \return None.
//
//*****************************************************************************
static inline void
FSI_setTxExtFrameTrigger(uint32_t base, uint16_t extInputNum)
{
//
// Check the arguments.
//
;
;
__eallow();
(*((volatile uint16_t *)(base + 0x5U))) =
((*((volatile uint16_t *)(base + 0x5U))) &
(~0x1F80U)) |
(extInputNum << 7U);
__edis();
}
//*****************************************************************************
//
//! \brief Enables CRC value of a data frame to be forced to zero
//!
//! \details CRC value of the data frame will be forced to 0 whenever there is
//! a transmission and buffer over-run or under-run condition happens.
//! The idea is to force a corruption of the CRC since the data is not
//! guaranteed to be reliable
//!
//! \param[in] base is the FSI Tx module base address
//!
//! \return None.
//
//*****************************************************************************
static inline void
FSI_enableTxCRCForceError(uint32_t base)
{
//
// Check the arguments.
//
;
__eallow();
(*((volatile uint16_t *)(base + 0x5U))) |= 0x20U;
__edis();
}
//*****************************************************************************
//
//! \brief Disables forcing of CRC value of a data frame to zero
//!
//! \param[in] base is the FSI Tx module base address
//!
//! \return None.
//
//*****************************************************************************
static inline void
FSI_disableTxCRCForceError(uint32_t base)
{
//
// Check the arguments.
//
;
__eallow();
(*((volatile uint16_t *)(base + 0x5U))) &= ~0x20U;
__edis();
}
//*****************************************************************************
//
//! \brief Select between 16-bit and 32-bit ECC computation
//!
//! \param[in] base is the FSI Tx module base address
//! \param[in] eccComputeWidth is ECC Computation width
//!
//! \return None.
//
//*****************************************************************************
static inline void
FSI_setTxECCComputeWidth(uint32_t base, FSI_ECCComputeWidth eccComputeWidth)
{
//
// Check the arguments.
//
;
__eallow();
if(eccComputeWidth == FSI_16BIT_ECC_COMPUTE)
{
(*((volatile uint16_t *)(base + 0x5U))) |= 0x40U;
}
else
{
(*((volatile uint16_t *)(base + 0x5U))) &= ~0x40U;
}
__edis();
}
//*****************************************************************************
//
//! \brief Sets frame type for transmission
//!
//! \param[in] base is the FSI Tx module base address
//! \param[in] frameType value of frame type
//!
//! \return None.
//
//*****************************************************************************
static inline void
FSI_setTxFrameType(uint32_t base, FSI_FrameType frameType)
{
//
// Check the arguments.
//
;
(*((volatile uint16_t *)(base + 0x6U))) = ((*((volatile uint16_t *)(base + 0x6U))) &
(~0xFU)) |
(uint16_t)frameType;
}
//*****************************************************************************
//
//! \brief Sets the frame size if frame type is user/software defined frame
//!
//! \param[in] base is the FSI Tx module base address
//! \param[in] nWords is number of data words in a software defined frame
//!
//! \return None.
//
//*****************************************************************************
static inline void
FSI_setTxSoftwareFrameSize(uint32_t base, uint16_t nWords)
{
//
// Check the arguments.
//
;
;
(*((volatile uint16_t *)(base + 0x6U))) = ((*((volatile uint16_t *)(base + 0x6U))) &
(~0xF0U)) |
((nWords - 1U) <<
4U);
}
//*****************************************************************************
//
//! \brief Starts transmitting frames
//!
//! \param[in] base is the FSI Tx module base address
//!
//! \return None.
//
//*****************************************************************************
static inline void
FSI_startTxTransmit(uint32_t base)
{
//
// Check the arguments.
//
;
(*((volatile uint16_t *)(base + 0x6U))) |= 0x8000U;
}
//*****************************************************************************
//
//! \brief Sets frame tag for transmission
//!
//! \param[in] base is the FSI Tx module base address
//! \param[in] frameTag value of frame tag, 4 bit value (0 to 15)
//!
//! \return None.
//
//*****************************************************************************
static inline void
FSI_setTxFrameTag(uint32_t base, FSI_FrameTag frameTag)
{
//
// Check the arguments.
//
;
(*((volatile uint16_t *)(base + 0x7U))) =
((*((volatile uint16_t *)(base + 0x7U))) &
(~0xFU)) |
(uint16_t)frameTag;
}
//*****************************************************************************
//
//! \brief Sets user defined data for transmission
//! It is an extra data field(8 bit) apart from regular data
//!
//! \param[in] base is the FSI Tx module base address
//! \param[in] userDefData 8 bit user defined data value
//!
//! \return None.
//
//*****************************************************************************
static inline void
FSI_setTxUserDefinedData(uint32_t base, uint16_t userDefData)
{
//
// Check the arguments.
//
;
;
(*((volatile uint16_t *)(base + 0x7U))) =
((*((volatile uint16_t *)(base + 0x7U))) &
(~0xFF00U)) |
(userDefData << 8U);
}
//*****************************************************************************
//
//! \brief Sets the value for transmit buffer pointer at desired location
//!
//! \param[in] base is the FSI Tx module base address
//! \param[in] bufPtrOff 4 bit offset pointer in Tx buffer where transmitter
//! will pick the data
//!
//! \return None.
//
//*****************************************************************************
static inline void
FSI_setTxBufferPtr(uint32_t base, uint16_t bufPtrOff)
{
//
// Check the arguments.
//
;
;
__eallow();
(*((volatile uint16_t *)(base + 0x8U))) = bufPtrOff;
__edis();
}
//*****************************************************************************
//
//! \brief Returns current buffer pointer location
//!
//! \param[in] base is the FSI Tx module base address
//!
//! \return current buffer pointer location
//!
//! \note there could be lag due to synchronization hence value is accurate
//! only when no current transmission is happening
//
//*****************************************************************************
static inline uint16_t
FSI_getTxBufferPtr(uint32_t base)
{
//
// Check the arguments.
//
;
return((*((volatile uint16_t *)(base + 0x9U))) &
0xFU);
}
//*****************************************************************************
//
//! \brief Returns valid number of data words present in buffer which have not
//! been transmitted yet
//!
//! \param[in] base is the FSI Tx module base address
//!
//! \return number of data words present in buffer which have not been
//! transmitted yet
//! \note there could be lag due to synchronization hence value is accurate
//! only when no current transmission is happening
//
//*****************************************************************************
static inline uint16_t
FSI_getTxWordCount(uint32_t base)
{
//
// Check the arguments.
//
;
return(((*((volatile uint16_t *)(base + 0x9U))) &
0x1F00U) >>
8U);
}
//*****************************************************************************
//
//! \brief Enables ping timer logic and once set time elapses it sends signal
//! to transmitter to send ping frame
//!
//! \param[in] base is the FSI Tx module base address
//! \param[in] refValue 32 bit reference value for ping time-out counter
//! \param[in] pingFrameTag 4 bit tag value for ping time-out counter
//!
//! \return None.
//
//*****************************************************************************
static inline void
FSI_enableTxPingTimer(uint32_t base, uint32_t refValue,
FSI_FrameTag pingFrameTag)
{
//
// Check the arguments.
//
;
(*((volatile uint16_t *)(base + 0xBU))) = (uint16_t)pingFrameTag;
__eallow();
(*((volatile uint32_t *)(base + 0xCU))) = refValue;
(*((volatile uint16_t *)(base + 0xAU))) |= 0x2U;
__edis();
}
//*****************************************************************************
//
//! \brief Sets the ping tag value, used by either timeout counter initiated
//! PING frame transfer or by external ping trigger input.
//!
//! \param[in] base is the FSI Tx module base address
//! \param[in] frameTag 4 bit tag value for ping time-out counter
//!
//! \return None.
//
//*****************************************************************************
static inline void
FSI_setTxPingTag(uint32_t base, FSI_FrameTag frameTag)
{
//
// Check the arguments.
//
;
(*((volatile uint16_t *)(base + 0xBU))) = (uint16_t)frameTag;
}
//*****************************************************************************
//
//! \brief Disables ping timer logic
//!
//! \param[in] base is the FSI Tx module base address
//!
//! \return None.
//
//*****************************************************************************
static inline void
FSI_disableTxPingTimer(uint32_t base)
{
//
// Check the arguments.
//
;
__eallow();
(*((volatile uint16_t *)(base + 0xAU))) &= ~0x2U;
__edis();
}
//*****************************************************************************
//
//! \brief Enables external trigger to transmit a ping frame
//!
//! \param[in] base is the FSI Tx module base address
//! \param[in] extTrigSel can be one of the external inputs from 0 to 63.
//!
//! \return None.
//
//*****************************************************************************
static inline void
FSI_enableTxExtPingTrigger(uint32_t base, uint16_t extTrigSel)
{
//
// Check the arguments.
//
;
;
__eallow();
//
// Select external input trigger
//
(*((volatile uint16_t *)(base + 0xAU))) = ((*((volatile uint16_t *)(base + 0xAU))) &
(~0x1F8U)) |
(extTrigSel <<
3U);
//
// Enable ping frame transmission through external trigger
//
(*((volatile uint16_t *)(base + 0xAU))) |= 0x4U;
__edis();
}
//*****************************************************************************
//
//! \brief Disables external trigger logic
//!
//! \param[in] base is the FSI Tx module base address
//!
//! \return None.
//
//*****************************************************************************
static inline void
FSI_disableTxExtPingTrigger(uint32_t base)
{
//
// Check the arguments.
//
;
__eallow();
(*((volatile uint16_t *)(base + 0xAU))) &= ~0x4U;
__edis();
}
//*****************************************************************************
//
//! \brief Gives Current value of Ping Timeout Logic Counter
//!
//! \param[in] base is the FSI Tx module base address
//!
//! \return Current value of counter is returned
//
//*****************************************************************************
static inline uint32_t
FSI_getTxCurrentPingTimeoutCounter(uint32_t base)
{
//
// Check the arguments.
//
;
return((*((volatile uint32_t *)(base + 0xEU))));
}
//*****************************************************************************
//
//! \brief Enables to generate DMA event on completion of a frame transfer
//!
//! \param[in] base is the FSI Tx module base address
//!
//! \return None.
//
//*****************************************************************************
static inline void
FSI_enableTxDMAEvent(uint32_t base)
{
//
// Check the arguments.
//
;
__eallow();
(*((volatile uint16_t *)(base + 0x11U))) |= 0x1U;
__edis();
}
//*****************************************************************************
//
//! \brief Disable to generate DMA event on completion of a frame transfer
//!
//! \param[in] base is the FSI Tx module base address
//!
//! \return None.
//
//*****************************************************************************
static inline void
FSI_disableTxDMAEvent(uint32_t base)
{
//
// Check the arguments.
//
;
__eallow();
(*((volatile uint16_t *)(base + 0x11U))) &= ~0x1U;
__edis();
}
//*****************************************************************************
//
//! \brief Locks the control of all transmit control registers,once locked
//! further writes will not take effect until system reset occurs
//!
//! \param[in] base is the FSI Tx module base address
//!
//! \note System reset only can unlock registers once locked.
//!
//! \return None.
//
//*****************************************************************************
static inline void
FSI_lockTxCtrl(uint32_t base)
{
//
// Check the arguments.
//
;
__eallow();
(*((volatile uint16_t *)(base + 0x12U))) = ((uint16_t)0x1U |
((0x00A5U) <<
8U));
__edis();
}
//*****************************************************************************
//
//! \brief Returns current status of all the error flags
//!
//! \param[in] base is the FSI Tx module base address
//!
//! \return the status of error flags,each bit of integer is associated with
//! one error flag.
//!
//! Example Usage - function will set the bits corresponding to respective
//! error flag in return value
//! evtStatus = FSI_getTxEventStatus(FSI_base)
//! if bit value of evtStatus is 12(01100) means
//! FSI_TX_EVT_OVERRUN and FSI_TX_EVT_PING_HW_TRIG flags are set
//
//*****************************************************************************
static inline uint16_t
FSI_getTxEventStatus(uint32_t base)
{
//
// Check the arguments.
//
;
return((*((volatile uint16_t *)(base + 0x14U))) & (0x000FU));
}
//*****************************************************************************
//
//! \brief Enables user to set TX error flags
//!
//! \param[in] base is the FSI Tx module base address
//! \param[in] evtFlags contains list of event and error flags that are
//! supposed to be set.
//!
//! \details Writing a 1 to this bit position will cause the corresponding bit
//! in \b TX_EVT_ERR_STATUS register to get set. The purpose of this
//! register is to allow software to simulate the effect of the event
//! and test the associated software/ISR.
//!
//! Example Usage
//! evtFlags = FSI_TX_EVT_FRAME_DONE & FSI_TX_EVT_OVERRUN
//! FSI_forceTxEvents(FSI_base,evtFlags)
//! Above call sets error flag to frameDone and overRun events
//!
//! \return None.
//
//*****************************************************************************
static inline void
FSI_forceTxEvents(uint32_t base, uint16_t evtFlags)
{
//
// Check the arguments.
//
;
__eallow();
(*((volatile uint16_t *)(base + 0x17U))) = (evtFlags & (0x000FU));
__edis();
}
//*****************************************************************************
//
//! \brief Enables user to clear TX error flags
//!
//! \param[in] base is the FSI Tx module base address
//! \param[in] evtFlags contains list of event and error flags that are
//! supposed to be cleared.
//!
//! \details Writing a 1 to this bit position will cause the corresponding bit
//! in the TX_EVT_ERR_STATUS register to get cleared to 0
//!
//! \return None.
//
//*****************************************************************************
static inline void
FSI_clearTxEvents(uint32_t base, uint16_t evtFlags)
{
//
// Check the arguments.
//
;
__eallow();
(*((volatile uint16_t *)(base + 0x16U))) = (evtFlags & (0x000FU));
__edis();
}
//*****************************************************************************
//
//! \brief Sets the CRC value to be picked transmission if transmission is
//! configured to use user defined SW CRC
//!
//! \param[in] base is the FSI Tx module base address
//! \param[in] userCRCValue is user defined CRC
//!
//! \return None.
//
//*****************************************************************************
static inline void
FSI_enableTxUserCRC(uint32_t base, uint16_t userCRCValue)
{
//
// Check the arguments.
//
;
__eallow();
(*((volatile uint16_t *)(base + 0x4U))) |= 0x40U;
__edis();
(*((volatile uint16_t *)(base + 0x18U))) = userCRCValue;
}
//*****************************************************************************
//
//! \brief Sets the CRC value to be picked transmission if transmission is
//! configured to use user defined SW CRC
//!
//! \param[in] base is the FSI Tx module base address
//!
//! \return None.
//
//*****************************************************************************
static inline void
FSI_disableTxUserCRC(uint32_t base)
{
//
// Check the arguments.
//
;
__eallow();
(*((volatile uint16_t *)(base + 0x4U))) &= ~0x40U;
__edis();
}
//*****************************************************************************
//
//! \brief Sets data for ECC logic computaion
//!
//! \param[in] base is the FSI Tx module base address
//! \param[in] data data value for which ECC needs to be computed
//!
//! \return None.
//
//*****************************************************************************
static inline void
FSI_setTxECCdata(uint32_t base, uint32_t data)
{
//
// Check the arguments.
//
;
(*((volatile uint32_t *)(base + 0x20U))) = data;
}
//*****************************************************************************
//
//! \brief Returns ECC value evaluated for 16/32 bit data
//!
//! \param[in] base is the FSI Tx module base address
//!
//! \return ECC value for input data
//
//*****************************************************************************
static inline uint16_t
FSI_getTxECCValue(uint32_t base)
{
//
// Check the arguments.
//
;
return((*((volatile uint16_t *)(base + 0x22U))) & 0x7FU);
}
//*****************************************************************************
//
//! \brief Enables user to generate interrupt on occurrence of FSI_TxEventList
//! events
//!
//! \param[in] base is the FSI Tx module base address
//! \param[in] intNum is the type of interrupt to be generated
//! interrupt1 or interrupt2
//! \param[in] intFlags contains list of events on which interrupt
//! should be generated.
//!
//! Example Usage
//! intFlags = FSI_TX_EVT_FRAME_DONE && FSI_TX_EVT_BUF_OVERRUN
//! && FSI_TX_EVT_PING_TIMEOUT
//! FSI_enableTxInterrupt(FSI_base, FSI_INT1, intFlags)
//! above configuration will generate signal on interrupt line 1 upon
//! frameDone, BufOverRun and PingTimeOut event
//!
//! \return None.
//
//*****************************************************************************
static inline void
FSI_enableTxInterrupt(uint32_t base, FSI_InterruptNum intNum,
uint16_t intFlags)
{
//
// Check the arguments.
//
;
__eallow();
if(intNum == FSI_INT1)
{
(*((volatile uint16_t *)(base + 0x10U))) |= (intFlags & (0x000FU));
}
else
{
(*((volatile uint16_t *)(base + 0x10U))) |= ((intFlags & (0x000FU)) <<
(0x8U));
}
__edis();
}
//*****************************************************************************
//
//! \brief Enables user to disable generation interrupt on occurrence of
//! FSI_TxEventList events
//!
//! \param[in] base is the FSI Tx module base address
//! \param[in] intNum is the type of interrupt to be generated
//! interrupt1 or interrupt2
//! \param[in] intFlags contains list of events on which interrupt
//! generation has to be disabled.
//!
//! \return None.
//
//*****************************************************************************
static inline void
FSI_disableTxInterrupt(uint32_t base, FSI_InterruptNum intNum,
uint16_t intFlags)
{
//
// Check the arguments.
//
;
__eallow();
if(intNum == FSI_INT1)
{
(*((volatile uint16_t *)(base + 0x10U))) &= ~(intFlags & (0x000FU));
}
else
{
(*((volatile uint16_t *)(base + 0x10U))) &= ((~(intFlags & (0x000FU)) <<
(0x8U)) | 0xFFU);
}
__edis();
}
//*****************************************************************************
//
//! \brief Returns address of Tx data buffer
//!
//! \details Data buffer is consisting of 16 words from offset- 0x40 to 0x4e
//!
//! \param[in] base is the FSI Tx module base address
//!
//! \return Tx data buffer address
//
//*****************************************************************************
static inline uint32_t
FSI_getTxBufferAddress(uint32_t base)
{
//
// Check the arguments.
//
;
return(base + (0x40U + (0U)));
}
//*****************************************************************************
//
//! \brief Resets clock or ping timeout counter or entire TX module
//!
//! \param[in] base is the FSI Tx module base address
//! \param[in] submodule the name of submodule which is supposed to be reset
//!
//! \return None.
//
//*****************************************************************************
extern void
FSI_resetTxModule(uint32_t base, FSI_TxSubmoduleInReset submodule);
//*****************************************************************************
//
//! \brief Clears reset on clock or ping timeout counter or entire TX module
//!
//! \param[in] base is the FSI Tx module base address
//! \param[in] submodule the name of submodule, to be brought out of reset
//!
//! \return None.
//
//*****************************************************************************
extern void
FSI_clearTxModuleReset(uint32_t base, FSI_TxSubmoduleInReset submodule);
//*****************************************************************************
//
//! \brief Writes data in FSI Tx buffer
//!
//! \param[in] base is the FSI Tx module base address
//! \param[in] array is the address of the array of words to be transmitted.
//! \param[in] length is the number of words in the array to be transmitted.
//! \param[in] bufOffset is the offset in Tx buffer where data will be written
//!
//! \note Data Overwrite protection is implemented in this function by ensuring
//! not more than 16 words are written and also wrap around case is taken
//! care when more words need to be written if last write happens at
//! maximum offset in Tx buffer
//!
//! \return None.
//
//*****************************************************************************
extern void
FSI_writeTxBuffer(uint32_t base, const uint16_t array[], uint16_t length,
uint16_t bufOffset);
//*****************************************************************************
//*****************************************************************************
//
// FSI Rx function prototypes/definitions
//
//*****************************************************************************
//*****************************************************************************
//
//! \brief Checks the FSI-Rx base address
//!
//! \param base is the base address of the FSI-Rx module
//!
//! \return returns \b true if the base address is valid and \b false otherwise
//
//*****************************************************************************
//*****************************************************************************
//
//! \brief Enables internal loopback where mux will select
//! internal pins coming from TX module instead of what comes from pins
//!
//! \param[in] base is the FSI Rx module base address
//!
//! \return None.
//
//*****************************************************************************
static inline void
FSI_enableRxInternalLoopback(uint32_t base)
{
//
// Check the arguments.
//
;
__eallow();
(*((volatile uint16_t *)(base + 0x0U))) |=
((uint16_t)0x2U |
((0x00A5U) << 8U));
__edis();
}
//*****************************************************************************
//
//! \brief Disables internal loopback where mux will not use internal pins
//! coming from TX module
//!
//! \param[in] base is the FSI Rx module base address
//!
//! \return None.
//
//*****************************************************************************
static inline void
FSI_disableRxInternalLoopback(uint32_t base)
{
//
// Check the arguments.
//
;
__eallow();
(*((volatile uint16_t *)(base + 0x0U))) =
((*((volatile uint16_t *)(base + 0x0U))) &
(~0x2U)) |
((0x00A5U) << 8U);
__edis();
}
//*****************************************************************************
//
//! \brief Receive clock is selected from the internal port coming
//! from TX module
//!
//! \param[in] base is the FSI Rx module base address
//!
//! \return None.
//
//*****************************************************************************
static inline void
FSI_enableRxSPIPairing(uint32_t base)
{
//
// Check the arguments.
//
;
__eallow();
(*((volatile uint16_t *)(base + 0x0U))) |=
((uint16_t)0x4U |
((0x00A5U) << 8U));
__edis();
}
//*****************************************************************************
//
//! \brief Selects regular receive clock coming from the pins
//!
//! \param[in] base is the FSI Rx module base address
//!
//! \return None.
//
//*****************************************************************************
static inline void
FSI_disableRxSPIPairing(uint32_t base)
{
//
// Check the arguments.
//
;
__eallow();
(*((volatile uint16_t *)(base + 0x0U))) = ((*((volatile uint16_t *)(base + 0x0U))) &
(~0x4U)) |
((0x00A5U) <<
8U);
__edis();
}
//*****************************************************************************
//
//! \brief Selects number of data lines used for receiving
//!
//! \param[in] base is the FSI Rx module base address
//! \param[in] dataWidth selection between 1 or 2 lane receive operation
//!
//! \return None.
//
//*****************************************************************************
static inline void
FSI_setRxDataWidth(uint32_t base, FSI_DataWidth dataWidth)
{
//
// Check the arguments.
//
;
__eallow();
(*((volatile uint16_t *)(base + 0x4U))) = ((*((volatile uint16_t *)(base + 0x4U))) &
(~0x3U)) |
(uint16_t)dataWidth;
__edis();
}
//*****************************************************************************
//
//! \brief Enables SPI compatible mode in FSI Rx
//!
//! \param[in] base is the FSI Rx module base address
//!
//! \return None.
//
//*****************************************************************************
static inline void
FSI_enableRxSPIMode(uint32_t base)
{
//
// Check the arguments.
//
;
__eallow();
(*((volatile uint16_t *)(base + 0x4U))) |= 0x4U;
__edis();
}
//*****************************************************************************
//
//! \brief Disables SPI compatible mode in FSI Rx
//!
//! \param[in] base is the FSI Rx module base address
//!
//! \return None.
//
//*****************************************************************************
static inline void
FSI_disableRxSPIMode(uint32_t base)
{
//
// Check the arguments.
//
;
__eallow();
(*((volatile uint16_t *)(base + 0x4U))) &= ~0x4U;
__edis();
}
//*****************************************************************************
//
//! \brief Sets the frame size if frame type is user/software defined frame
//!
//! \param[in] base is the FSI Rx module base address
//! \param[in] nWords is number of data words in a software defined frame
//!
//! \return None.
//
//*****************************************************************************
static inline void
FSI_setRxSoftwareFrameSize(uint32_t base, uint16_t nWords)
{
//
// Check the arguments.
//
;
;
__eallow();
(*((volatile uint16_t *)(base + 0x4U))) = ((*((volatile uint16_t *)(base + 0x4U))) &
(~0x78U)) |
((nWords - 1U) <<
3U);
__edis();
}
//*****************************************************************************
//
//! \brief Select between 16-bit and 32-bit ECC computation
//!
//! \param[in] base is the FSI Rx module base address
//! \param[in] eccComputeWidth is ECC Computation width
//!
//! \return None.
//
//*****************************************************************************
static inline void
FSI_setRxECCComputeWidth(uint32_t base, FSI_ECCComputeWidth eccComputeWidth)
{
//
// Check the arguments.
//
;
__eallow();
if(eccComputeWidth == FSI_16BIT_ECC_COMPUTE)
{
(*((volatile uint16_t *)(base + 0x4U))) |= 0x80U;
}
else
{
(*((volatile uint16_t *)(base + 0x4U))) &= ~0x80U;
}
__edis();
}
//*****************************************************************************
//
//! \brief Setting for when Ping timeout can reset and restart
//!
//! \param[in] base is the FSI Rx module base address
//! \param[in] pingTimeoutMode can be HW or both HW/SW initiated
//!
//! \return None.
//
//*****************************************************************************
static inline void
FSI_setRxPingTimeoutMode(uint32_t base, FSI_PingTimeoutMode pingTimeoutMode)
{
//
// Check the arguments.
//
;
__eallow();
if(pingTimeoutMode == FSI_PINGTIMEOUT_ON_HWSWINIT_PING_FRAME)
{
(*((volatile uint16_t *)(base + 0x4U))) |= 0x100U;
}
else
{
(*((volatile uint16_t *)(base + 0x4U))) &= ~0x100U;
}
__edis();
}
//*****************************************************************************
//
//! \brief Gets frame type received in the last successful frame
//!
//! \param[in] base is the FSI Rx module base address
//!
//! \return value of Frame type received on last successful frame
//
//*****************************************************************************
static inline FSI_FrameType
FSI_getRxFrameType(uint32_t base)
{
//
// Check the arguments.
//
;
return((FSI_FrameType)((*((volatile uint16_t *)(base + 0x6U))) &
0xFU));
}
//*****************************************************************************
//
//! \brief Enables to generate DMA event on completion of a successful
//! frame reception
//!
//! \param[in] base is the FSI Rx module base address
//!
//! \return None.
//
//*****************************************************************************
static inline void
FSI_enableRxDMAEvent(uint32_t base)
{
//
// Check the arguments.
//
;
__eallow();
(*((volatile uint16_t *)(base + 0x8U))) |= 0x1U;
__edis();
}
//*****************************************************************************
//
//! \brief Disables the DMA event generation on completion of a successful
//! frame reception
//!
//! \param[in] base is the FSI Rx module base address
//!
//! \return None.
//
//*****************************************************************************
static inline void
FSI_disableRxDMAEvent(uint32_t base)
{
//
// Check the arguments.
//
;
__eallow();
(*((volatile uint16_t *)(base + 0x8U))) &= ~0x1U;
__edis();
}
//*****************************************************************************
//
//! \brief Returns Frame tag received for the last successful frame
//!
//! \param[in] base is the FSI Rx module base address
//!
//! \return frame tag value.
//
//*****************************************************************************
static inline uint16_t
FSI_getRxFrameTag(uint32_t base)
{
//
// Check the arguments.
//
;
return(((*((volatile uint16_t *)(base + 0x7U))) &
0x1EU) >>
1U);
}
//*****************************************************************************
//
//! \brief Returns User-Data(8-bit) field for received data frame.
//!
//! \param[in] base is the FSI Rx module base address
//!
//! \return user data field value.
//
//*****************************************************************************
static inline uint16_t
FSI_getRxUserDefinedData(uint32_t base)
{
//
// Check the arguments.
//
;
return(((*((volatile uint16_t *)(base + 0x7U))) &
0xFF00U) >>
8U);
}
//*****************************************************************************
//
//! \brief Returns current status of all the evetn/error flags
//!
//! \param[in] base is the FSI Rx module base address
//!
//! \return the status of error flags,each bit of integer is associated
//! with one error flag.
//!
//! Example Usage - function will set the bits corresponding to respective
//! error flag in return value
//! evtFlags = FSI_getRxEventStatus(FSI_base)
//! if value of evtFlags is 1036(0100000001100) means
//! FSI_RX_EVT_FRAME_OVERRUN,FSI_RX_EVT_TYPE_ERR and
//! FSI_RX_EVT_CRC_ERR flags are set
//
//*****************************************************************************
static inline uint16_t
FSI_getRxEventStatus(uint32_t base)
{
//
// Check the arguments.
//
;
return((*((volatile uint16_t *)(base + 0xAU))) & (0x7FFFU));
}
//*****************************************************************************
//
//! \brief Enables user to set RX event/error flags
//!
//! \param[in] base is the FSI Rx module base address
//! \param[in] evtFlags contains list of error flags to be set
//!
//! \return None.
//!
//! Example Usage
//! evtFlags = FSI_RX_EVT_EOF_ERR && FSI_RX_EVT_TYPE_ERR
//! FSI_forceRxEvents(FSI_base,evtFlags)
//! Above call sets error flag to FSI_RX_ERR_EOF_ERR and
//! FSI_RX_ERR_TYPE_ERR events
//
//*****************************************************************************
static inline void
FSI_forceRxEvents(uint32_t base, uint16_t evtFlags)
{
//
// Check the arguments.
//
;
__eallow();
(*((volatile uint16_t *)(base + 0xDU))) = (evtFlags & (0x7FFFU));
__edis();
}
//*****************************************************************************
//
//! \brief Enables user to clear RX event/error flags
//!
//! \param[in] base is the FSI Rx module base address
//! \param[in] evtFlags contains list of error flags to be cleared
//!
//! \return None.
//
//*****************************************************************************
static inline void
FSI_clearRxEvents(uint32_t base, uint16_t evtFlags)
{
//
// Check the arguments.
//
;
__eallow();
(*((volatile uint16_t *)(base + 0xCU))) = (evtFlags & (0x7FFFU));
__edis();
}
//*****************************************************************************
//
//! \brief Returns CRC value received in data frame/frame
//!
//! \param[in] base is the FSI Rx module base address
//!
//! \return CRC value received in data frame
//
//*****************************************************************************
static inline uint16_t
FSI_getRxReceivedCRC(uint32_t base)
{
//
// Check the arguments.
//
;
return((*((volatile uint16_t *)(base + 0xBU))) & 0xFFU);
}
//*****************************************************************************
//
//! \brief Computes and returns CRC value for data received
//!
//! \param[in] base is the FSI Rx module base address
//!
//! \return CRC value computed on received data
//
//*****************************************************************************
static inline uint16_t
FSI_getRxComputedCRC(uint32_t base)
{
//
// Check the arguments.
//
;
return(((*((volatile uint16_t *)(base + 0xBU))) &
0xFF00U) >> 8U);
}
//*****************************************************************************
//
//! \brief Sets the value for receive buffer pointer at desired location
//!
//! \param[in] base is the FSI Rx module base address
//! \param[in] bufPtrOff 4 bit offset pointer in Rx buffer from where received
//! data will be read
//!
//! \return None.
//
//*****************************************************************************
static inline void
FSI_setRxBufferPtr(uint32_t base, uint16_t bufPtrOff)
{
//
// Check the arguments.
//
;
;
__eallow();
(*((volatile uint16_t *)(base + 0xEU))) = bufPtrOff;
__edis();
}
//*****************************************************************************
//
//! \brief Returns current buffer pointer location
//!
//! \param[in] base is the FSI Rx module base address
//!
//! \return current buffer pointer location
//!
//! \note there could be lag due to synchronization, hence value is accurate
//! only when no current reception is happening
//
//*****************************************************************************
static inline uint16_t
FSI_getRxBufferPtr(uint32_t base)
{
//
// Check the arguments.
//
;
return((*((volatile uint16_t *)(base + 0xFU))) &
0xFU);
}
//*****************************************************************************
//
//! \brief Returns valid number of data words present in buffer which have
//! not been read out yet
//!
//! \param[in] base is the FSI Rx module base address
//!
//! \return number of data words present in buffer which have not been read
//! out yet
//!
//! \note there could be lag due to synchronization, hence value is accurate
//! only when no current reception is happening
//
//*****************************************************************************
static inline uint16_t
FSI_getRxWordCount(uint32_t base)
{
//
// Check the arguments.
//
;
return(((*((volatile uint16_t *)(base + 0xFU))) &
0x1F00U) >>
8U);
}
//*****************************************************************************
//
//! \brief Enables the frame watchdog counter logic to count every time it
//! start to receive a frame
//!
//! \param[in] base is the FSI Rx module base address
//! \param[in] wdRef reference value for ping watchdog time-out counter
//!
//! \return None.
//
//*****************************************************************************
static inline void
FSI_enableRxFrameWatchdog(uint32_t base, uint32_t wdRef)
{
//
// Check the arguments.
//
;
__eallow();
(*((volatile uint32_t *)(base + 0x12U))) = wdRef;
(*((volatile uint16_t *)(base + 0x10U))) |= 0x2U;
__edis();
}
//*****************************************************************************
//
//! \brief Disables the frame watchdog counter logic
//!
//! \param[in] base is the FSI Rx module base address
//!
//! \return None.
//
//*****************************************************************************
static inline void
FSI_disableRxFrameWatchdog(uint32_t base)
{
//
// Check the arguments.
//
;
__eallow();
(*((volatile uint16_t *)(base + 0x10U))) &= ~0x2U;
__edis();
}
//*****************************************************************************
//
//! \brief Returns current value of frame watchdog counter
//!
//! \param[in] base is the FSI Rx module base address
//!
//! \return current value of frame watchdog counter
//
//*****************************************************************************
static inline uint32_t
FSI_getRxFrameWatchdogCounter(uint32_t base)
{
//
// Check the arguments.
//
;
return((*((volatile uint32_t *)(base + 0x14U))));
}
//*****************************************************************************
//
//! \brief Enables the ping watchdog counter logic and once the set time
//! elapses it will indicate ping watchdog time-out has occurred
//!
//! \param[in] base is the FSI Rx module base address
//! \param[in] wdRef reference value for ping watchdog time-out counter
//!
//! \return None.
//
//*****************************************************************************
static inline void
FSI_enableRxPingWatchdog(uint32_t base, uint32_t wdRef)
{
//
// Check the arguments.
//
;
__eallow();
(*((volatile uint32_t *)(base + 0x18U))) = wdRef;
(*((volatile uint16_t *)(base + 0x16U))) |= 0x2U;
__edis();
}
//*****************************************************************************
//
//! \brief Disables the ping watchdog counter logic
//!
//! \param[in] base is the FSI Rx module base address
//!
//! \return None.
//
//*****************************************************************************
static inline void
FSI_disableRxPingWatchdog(uint32_t base)
{
//
// Check the arguments.
//
;
__eallow();
(*((volatile uint16_t *)(base + 0x16U))) &= ~0x2U;
__edis();
}
//*****************************************************************************
//
//! \brief Returns current value of ping watchdog counter
//!
//! \param[in] base is the FSI Rx module base address
//!
//! \return current value(32 bit) of ping watchdog counter
//
//*****************************************************************************
static inline uint32_t
FSI_getRxPingWatchdogCounter(uint32_t base)
{
//
// Check the arguments.
//
;
return((*((volatile uint32_t *)(base + 0x1AU))));
}
//*****************************************************************************
//
//! \brief Returns the value of tag received for last ping frame
//!
//! \param[in] base is the FSI Rx module base address
//!
//! \return the tagValue received for last ping frame
//
//*****************************************************************************
static inline uint16_t
FSI_getRxPingTag(uint32_t base)
{
//
// Check the arguments.
//
;
return(((*((volatile uint16_t *)(base + 0x17U))) & 0x1EU) >>
1U);
}
//*****************************************************************************
//
//! \brief Locks the control of all receive control registers,
//! once locked further writes will not take effect until system
//! reset occurs
//!
//! \param[in] base is the FSI Rx module base address
//!
//! \return None.
//
//*****************************************************************************
static inline void
FSI_lockRxCtrl(uint32_t base)
{
//
// Check the arguments.
//
;
__eallow();
(*((volatile uint16_t *)(base + 0x1EU))) = ((uint16_t)0x1U |
((0x00A5U) <<
8U));
__edis();
}
//*****************************************************************************
//
//! \brief Sets Rx ECC data on which ECC (SEC-DED) computaion logic runs
//!
//! \param[in] base is the FSI Rx module base address
//! \param[in] rxECCdata Data for ECC logic
//!
//! \return None.
//
//*****************************************************************************
static inline void
FSI_setRxECCData(uint32_t base, uint32_t rxECCdata)
{
//
// Check the arguments.
//
;
(*((volatile uint32_t *)(base + 0x20U))) = rxECCdata;
}
//*****************************************************************************
//
//! \brief Sets received ECC value on which ECC (SEC-DED) computaion logic runs
//!
//! \param[in] base is the FSI Rx module base address
//! \param[in] rxECCvalue Received ECC value in a data frame
//!
//! \return None.
//
//*****************************************************************************
static inline void
FSI_setRxReceivedECCValue(uint32_t base, uint16_t rxECCvalue)
{
//
// Check the arguments.
//
;
//
// ECC value can be passed as 8 bit value in USERDATA field in a frame
//
;
(*((volatile uint16_t *)(base + 0x22U))) = rxECCvalue;
}
//*****************************************************************************
//
//! \brief Returns ECC Corrected data
//!
//! \param[in] base is the FSI Rx module base address
//!
//! \return 32 bit ECC corrected data
//
//*****************************************************************************
static inline uint32_t
FSI_getRxECCCorrectedData(uint32_t base)
{
//
// Check the arguments.
//
;
return((*((volatile uint32_t *)(base + 0x24U))));
}
//*****************************************************************************
//
//! \brief Returns ECC Log details
//!
//! \param[in] base is the FSI Rx module base address
//!
//! \return ECC Log value(8 bit)
//
//*****************************************************************************
static inline uint16_t
FSI_getRxECCLog(uint32_t base)
{
//
// Check the arguments.
//
;
return((*((volatile uint16_t *)(base + 0x26U))) &
(0x1U | 0x2U));
}
//*****************************************************************************
//
//! \brief Let user generate interrupt on occurrence of Rx events
//!
//! \param[in] base is the FSI Rx module base address
//! \param[in] intNum the type of interrupt to be generated interrupt1
//! or interrupt2
//! \param[in] intFlags contains list of events on which interrupt
//! should be generated. Each bit will represent one event,bits for
//! the events on which user want to generate interrupt will be set
//! others remain clear
//!
//! \return None.
//!
//! Example Usage
//! evtFlags = FSI_RX_EVT_PING_WD_TIMEOUT & FSI_RX_INT_TYPE_ERR
//! FSI_enableRxInterrupt(FSI_base,FSI_INT1,evtFlags)
//! Above call will generate interrupt1 on events
//! FSI_RX_INT_PING_WD_TIMEOUT and FSI_RX_INT_TYPE_ERR
//
//*****************************************************************************
static inline void
FSI_enableRxInterrupt(uint32_t base, FSI_InterruptNum intNum,
uint16_t intFlags)
{
//
// Check the arguments.
//
;
__eallow();
if(intNum == FSI_INT1)
{
(*((volatile uint16_t *)(base + 0x1CU))) |= (intFlags &
(0x7FFFU));
}
else
{
(*((volatile uint16_t *)(base + 0x1DU))) |= (intFlags &
(0x7FFFU));
}
__edis();
}
//*****************************************************************************
//
//! \brief Let user disable interrupt generation on Rx events
//!
//! \param[in] base is the FSI Rx module base address
//! \param[in] intNum the type of interrupt to be generated interrupt1
//! or interrupt2
//! \param[in] intFlags contains list of events on which interrupt
//! generation has to be disabled.
//!
//! \return None.
//
//*****************************************************************************
static inline void
FSI_disableRxInterrupt(uint32_t base, FSI_InterruptNum intNum,
uint16_t intFlags)
{
//
// Check the arguments.
//
;
__eallow();
if(intNum == FSI_INT1)
{
(*((volatile uint16_t *)(base + 0x1CU))) &= ~(intFlags &
(0x7FFFU));
}
else
{
(*((volatile uint16_t *)(base + 0x1DU))) &= ~(intFlags &
(0x7FFFU));
}
__edis();
}
//*****************************************************************************
//
//! \brief Returns address of Rx data buffer
//!
//! \details Data buffer is consisting of 16 words from offset- 0x40 to 0x4e
//!
//! \param[in] base is the FSI Rx module base address
//!
//! \return Rx data buffer address
//
//*****************************************************************************
static inline uint32_t
FSI_getRxBufferAddress(uint32_t base)
{
//
// Check the arguments.
//
;
return(base + (0x40U + (0U)));
}
//*****************************************************************************
//
//! \brief Sets the Rx Frame Reference Tag Value
//!
//! \details The reference tag is used to check against when comparing the
//! TAG_MASK and the incoming frame tag.
//!
//! \param[in] base is the FSI Rx module base address
//! \param[in] refVal is the Rx frame reference tag value to be set
//!
//! \return Rx data buffer address
//
//*****************************************************************************
static inline void
FSI_setRxFrameTagRef(uint32_t base, uint16_t refVal)
{
//
// Check the arguments.
//
;
__eallow();
//
// Sets the Rx frame tag reference.
//
(*((volatile uint16_t *)(base + 0x28U))) =
(((*((volatile uint16_t *)(base + 0x28U))) &
~((uint16_t)0xFU)) |
(refVal << 0U));
__edis();
}
//*****************************************************************************
//
//! \brief Returns the Rx Frame Reference Tag Value
//!
//! \details The reference tag is used to check against when comparing the
//! TAG_MASK and the incoming frame tag.
//!
//! \param[in] base is the FSI Rx module base address
//!
//! \return Rx frame reference tag
//
//*****************************************************************************
static inline uint16_t
FSI_getRxFrameTagRef(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Returns the Rx frame tag reference.
//
return(((*((volatile uint16_t *)(base + 0x28U))) &
0xFU) >> 0U);
}
//*****************************************************************************
//
//! \brief Sets the Rx Frame Tag Mask Value
//!
//! \details Any bit position set to 0 will be used in the comparison of
//! incoming tag & the reference tag. A bit position set to 1 will be ignored
//! in the tag comparison.
//!
//! \param[in] base is the FSI Rx module base address
//! \param[in] maskVal is the Rx frame tag mask value to be set
//!
//! \return Rx frame tag mask
//
//*****************************************************************************
static inline void
FSI_setRxFrameTagMask(uint32_t base, uint16_t maskVal)
{
//
// Check the arguments.
//
;
__eallow();
//
// Sets the Rx frame tag mask.
//
(*((volatile uint16_t *)(base + 0x28U))) =
(((*((volatile uint16_t *)(base + 0x28U))) &
~((uint16_t)0xF0U)) |
(maskVal << 4U));
__edis();
}
//*****************************************************************************
//
//! \brief Returns the Rx Frame Tag Mask Value
//!
//! \details Any bit position set to 0 will be used in the comparison of
//! incoming tag & the reference tag. A bit position set to 1 will be ignored
//! in the tag comparison.
//!
//! \param[in] base is the FSI Rx module base address
//!
//! \return Rx frame reference tag
//
//*****************************************************************************
static inline uint16_t
FSI_getRxFrameTagMask(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Returns the frame tag mask.
//
return(((*((volatile uint16_t *)(base + 0x28U))) &
0xF0U) >> 4U);
}
//*****************************************************************************
//
//! \brief Enables the Rx Frame Compare Mode
//!
//! \param[in] base is the FSI Rx module base address
//!
//! \return None.
//
//*****************************************************************************
static inline void
FSI_enableRxFrameTagCompare(uint32_t base)
{
//
// Check the arguments.
//
;
__eallow();
//
// Enables the frame tag compare mode.
//
(*((volatile uint16_t *)(base + 0x28U))) |= 0x100U;
__edis();
}
//*****************************************************************************
//
//! \brief Disables the Rx Frame Compare Mode
//!
//! \param[in] base is the FSI Rx module base address
//!
//! \return None.
//
//*****************************************************************************
static inline void
FSI_disableRxFrameTagCompare(uint32_t base)
{
//
// Check the arguments.
//
;
__eallow();
//
// Disables the Rx frame tag compare mode.
//
(*((volatile uint16_t *)(base + 0x28U))) &=
~(uint16_t)0x100U;
__edis();
}
//*****************************************************************************
//
//! \brief Enables the Rx Frame Broadcast Mode
//!
//! \param[in] base is the FSI Rx module base address
//!
//! \return None.
//
//*****************************************************************************
static inline void
FSI_enableRxFrameBroadcast(uint32_t base)
{
//
// Check the arguments.
//
;
__eallow();
//
// Enables Rx frame broadcast mode.
//
(*((volatile uint16_t *)(base + 0x28U))) |= 0x200U;
__edis();
}
//*****************************************************************************
//
//! \brief Disables the Rx Frame Broadcast Mode
//!
//! \param[in] base is the FSI Rx module base address
//!
//! \return None.
//
//*****************************************************************************
static inline void
FSI_disableRxFrameBroadcast(uint32_t base)
{
//
// Check the arguments.
//
;
__eallow();
//
// Disables Rx frame broadcast mode.
//
(*((volatile uint16_t *)(base + 0x28U))) &=
~(uint16_t)0x200U;
__edis();
}
//
// ping frame related APIs
//
//*****************************************************************************
//
//! \brief Sets the Rx Ping Tag Reference Value
//!
//! \details The reference tag is used to check against when comparing the
//! TAG_MASK and the incoming ping tag.
//!
//! \param[in] base is the FSI Rx module base address
//! \param[in] refVal is the Rx frame reference tag value to be set
//!
//! \return Rx data buffer address
//
//*****************************************************************************
static inline void
FSI_setRxPingTagRef(uint32_t base, uint16_t refVal)
{
//
// Check the arguments.
//
;
__eallow();
//
// Set Rx ping tag reference value.
//
(*((volatile uint16_t *)(base + 0x29U))) =
(((*((volatile uint16_t *)(base + 0x29U))) &
~((uint16_t)0xFU)) |
(refVal << 0U));
__edis();
}
//*****************************************************************************
//
//! \brief Returns the Rx Ping Reference Tag Value
//!
//! \details The reference tag is used to check against when comparing the
//! TAG_MASK and the incoming ping tag.
//!
//! \param[in] base is the FSI Rx module base address
//!
//! \return Rx frame reference tag
//
//*****************************************************************************
static inline uint16_t
FSI_getRxPingTagRef(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Returns Rx ping tag reference.
//
return(((*((volatile uint16_t *)(base + 0x29U))) &
0xFU) >> 0U);
}
//*****************************************************************************
//
//! \brief Sets the Rx Ping Tag Mask Value
//!
//! \details Any bit position set to 0 will be used in the comparison of
//! incoming tag & the reference tag. A bit position set to 1 will be ignored
//! in the tag comparison.
//!
//! \param[in] base is the FSI Rx module base address
//! \param[in] maskVal is the Rx frame tag mask value to be set
//!
//! \return Rx ping tag mask
//
//*****************************************************************************
static inline void
FSI_setRxPingTagMask(uint32_t base, uint16_t maskVal)
{
//
// Check the arguments.
//
;
__eallow();
//
// Set Rx ping tag mask.
//
(*((volatile uint16_t *)(base + 0x29U))) =
(((*((volatile uint16_t *)(base + 0x29U))) &
~((uint16_t)0xF0U)) |
(maskVal << 4U));
__edis();
}
//*****************************************************************************
//
//! \brief Returns the Rx Ping Tag Mask Value
//!
//! \details Any bit position set to 0 will be used in the comparison of
//! incoming tag & the reference tag. A bit position set to 1 will be ignored
//! in the tag comparison.
//!
//! \param[in] base is the FSI Rx module base address
//!
//! \return Rx ping reference tag
//
//*****************************************************************************
static inline uint16_t
FSI_getRxPingTagMask(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Returns ping tag mask.
//
return(((*((volatile uint16_t *)(base + 0x29U))) &
0xF0U) >> 4U);
}
//*****************************************************************************
//
//! \brief Enables the Rx Ping Compare Mode
//!
//! \param[in] base is the FSI Rx module base address
//!
//! \return None.
//
//*****************************************************************************
static inline void
FSI_enableRxPingTagCompare(uint32_t base)
{
//
// Check the arguments.
//
;
__eallow();
//
// Enables the Rx ping tag compare mode.
//
(*((volatile uint16_t *)(base + 0x29U))) |= 0x100U;
__edis();
}
//*****************************************************************************
//
//! \brief Disables the Rx Ping Compare Mode
//!
//! \param[in] base is the FSI Rx module base address
//!
//! \return None.
//
//*****************************************************************************
static inline void
FSI_disableRxPingTagCompare(uint32_t base)
{
//
// Check the arguments.
//
;
__eallow();
//
// Disables Rx ping tag compare mode.
//
(*((volatile uint16_t *)(base + 0x29U))) &=
~(uint16_t)0x100U;
__edis();
}
//*****************************************************************************
//
//! \brief Enables the Rx Ping Broadcast Mode
//!
//! \param[in] base is the FSI Rx module base address
//!
//! \return None.
//
//*****************************************************************************
static inline void
FSI_enableRxPingBroadcast(uint32_t base)
{
//
// Check the arguments.
//
;
__eallow();
//
// Enables the Rx ping broadcast mode.
//
(*((volatile uint16_t *)(base + 0x29U))) |= 0x200U;
__edis();
}
//*****************************************************************************
//
//! \brief Disables the Rx Ping Broadcast Mode
//!
//! \param[in] base is the FSI Rx module base address
//!
//! \return None.
//
//*****************************************************************************
static inline void
FSI_disableRxPingBroadcast(uint32_t base)
{
//
// Check the arguments.
//
;
__eallow();
//
// Disables the Rx ping broadcast.
//
(*((volatile uint16_t *)(base + 0x29U))) &=
~(uint16_t)0x200U;
__edis();
}
//*****************************************************************************
//
//! \brief Resets frame watchdog,ping watchdog or entire RX module
//!
//! \param[in] base is the FSI Rx module base address
//! \param[in] submodule the name of module which is supposed to be reset
//!
//! \return None.
//
//*****************************************************************************
extern void
FSI_resetRxModule(uint32_t base, FSI_RxSubmoduleInReset submodule);
//*****************************************************************************
//
//! \brief Clears resets on frame watchdog,ping watchdog or entire RX module
//!
//! \param[in] base is the FSI Rx module base address
//! \param[in] submodule module which is to be brought out of reset
//!
//! \return None.
//
//*****************************************************************************
extern void
FSI_clearRxModuleReset(uint32_t base, FSI_RxSubmoduleInReset submodule);
//*****************************************************************************
//
//! \brief Reads data from FSI Rx buffer
//!
//! \param[in] base is the FSI Rx module base address
//! \param[out] array is the address of the array of words to receive the data
//! \param[in] length is the number of words in the array to be received
//! \param[in] bufOffset is the offset in Rx buffer from where data will
//! be read
//!
//! \note This function ensures that not more than 16 words are read and
//! wrap around case is also taken care when more words need to be read
//! wherein last read happens at maximum offset in Rx buffer
//!
//! \return None.
//
//*****************************************************************************
extern void
FSI_readRxBuffer(uint32_t base, uint16_t array[], uint16_t length,
uint16_t bufOffset);
//*****************************************************************************
//
//! \brief Adds delay for selected tap line
//!
//! \param[in] base is the FSI Rx module base address
//! \param[in] delayTapType the line for which delay needs to be added
//! it can be either RXCLK,RXD0 or RXD1
//! \param[in] tapValue 5 bit value of the amount of delay to be added
//!
//! \return None.
//
//*****************************************************************************
extern void
FSI_configRxDelayLine(uint32_t base, FSI_RxDelayTapType delayTapType,
uint16_t tapValue);
//*****************************************************************************
//
//! \brief Initializes FSI Tx module
//!
//! \details Software based initialization of the FSI transmitter IP. This is
//! typically needed only once during initialization or if the module
//! needs to be reset due to an underrun condition that occurred during
//! operation.
//!
//! \param[in] base is the FSI Tx module base address
//! \param[in] prescalar is the user configurable clock divider for PLL input
//! clock
//!
//! \return None.
//
//*****************************************************************************
extern void
FSI_performTxInitialization(uint32_t base, uint16_t prescalar);
//*****************************************************************************
//
//! \brief Initializes FSI Rx module
//!
//! \details Software based initialization of the FSI receiver module.This is
//! typically needed only once during initialization. However, if there
//! are framing errors in the received frames, then the receive module
//! needs to be reset so that subsequent frames/packets can be handled
//! fresh.
//!
//! \param[in] base is the FSI Rx module base address
//!
//! \return None.
//
//*****************************************************************************
extern void
FSI_performRxInitialization(uint32_t base);
//*****************************************************************************
//
//! \brief Sends Flush pattern sequence
//!
//! \details Flush pattern sequence sent by a FSI transmit module will bring the
//! FSI receive module out of reset so that it will then be ready to
//! receive subsequent frames.
//!
//! \param[in] base is the FSI Tx module base address
//! \param[in] prescalar is the user configurable clock divider for PLL input
//! clock
//!
//! \return None.
//
//*****************************************************************************
extern void
FSI_executeTxFlushSequence(uint32_t base, uint16_t prescalar);
//*****************************************************************************
//
// Close the Doxygen group.
//! @}
//
//*****************************************************************************
//*****************************************************************************
//
// Mark the end of the C bindings section for C++ compilers.
//
//*****************************************************************************
//###########################################################################
//
// FILE: gpio.h
//
// TITLE: C28x GPIO driver.
//
//###########################################################################
// $Copyright:
// Copyright (C) 2023 Texas Instruments Incorporated - http://www.ti.com/
//
// 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 Texas Instruments Incorporated 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
// OWNER 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.
// $
//###########################################################################
//*****************************************************************************
//
// If building with a C++ compiler, make all of the definitions in this header
// have a C binding.
//
//*****************************************************************************
//*****************************************************************************
//
//! \addtogroup gpio_api GPIO
//! @{
//
//*****************************************************************************
//###########################################################################
//
// FILE: hw_gpio.h
//
// TITLE: Definitions for the GPIO registers.
//
//###########################################################################
// $Copyright:
// Copyright (C) 2023 Texas Instruments Incorporated - http://www.ti.com/
//
// 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 Texas Instruments Incorporated 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
// OWNER 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.
// $
//###########################################################################
//*************************************************************************************************
//
// The following are defines for the GPIO register offsets
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the GPACTRL register
//
//*************************************************************************************************
// GPIO15
// GPIO23
// GPIO31
//*************************************************************************************************
//
// The following are defines for the bit fields in the GPAQSEL1 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the GPAQSEL2 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the GPAMUX1 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the GPAMUX2 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the GPADIR register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the GPAPUD register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the GPAINV register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the GPAODR register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the GPAAMSEL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the GPAGMUX1 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the GPAGMUX2 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the GPACSEL1 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the GPACSEL2 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the GPACSEL3 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the GPACSEL4 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the GPALOCK register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the GPACR register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the GPBCTRL register
//
//*************************************************************************************************
// GPIO39
// GPIO47
// GPIO55
// GPIO63
//*************************************************************************************************
//
// The following are defines for the bit fields in the GPBQSEL1 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the GPBQSEL2 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the GPBMUX1 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the GPBMUX2 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the GPBDIR register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the GPBPUD register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the GPBINV register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the GPBODR register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the GPBGMUX1 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the GPBGMUX2 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the GPBCSEL1 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the GPBCSEL2 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the GPBCSEL3 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the GPBCSEL4 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the GPBLOCK register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the GPBCR register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the GPHCTRL register
//
//*************************************************************************************************
// GPIO231
// GPIO239
// GPIO247
// GPIO255
//*************************************************************************************************
//
// The following are defines for the bit fields in the GPHQSEL1 register
//
//*************************************************************************************************
// Pin
// Pin
// Pin
// Pin
// Pin
// Pin
// Pin
// Pin
// Pin
// Pin
// Pin
// Pin
// Pin
// Pin
//*************************************************************************************************
//
// The following are defines for the bit fields in the GPHQSEL2 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the GPHMUX1 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the GPHMUX2 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the GPHINV register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the GPHAMSEL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the GPHGMUX1 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the GPHGMUX2 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the GPHCSEL1 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the GPHCSEL2 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the GPHCSEL3 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the GPHCSEL4 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the GPHLOCK register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the GPHCR register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the GPADAT register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the GPASET register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the GPACLEAR register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the GPATOGGLE register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the GPBDAT register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the GPBSET register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the GPBCLEAR register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the GPBTOGGLE register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the GPHDAT register
//
//*************************************************************************************************
//###########################################################################
//
// FILE: hw_xint.h
//
// TITLE: Definitions for the XINT registers.
//
//###########################################################################
// $Copyright:
// Copyright (C) 2023 Texas Instruments Incorporated - http://www.ti.com/
//
// 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 Texas Instruments Incorporated 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
// OWNER 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.
// $
//###########################################################################
//*************************************************************************************************
//
// The following are defines for the XINT register offsets
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the XINT1CR register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the XINT2CR register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the XINT3CR register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the XINT4CR register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the XINT5CR register
//
//*************************************************************************************************
//###########################################################################
//
// FILE: xbar.h
//
// TITLE: C28x X-BAR driver.
//
//###########################################################################
// $Copyright:
// Copyright (C) 2023 Texas Instruments Incorporated - http://www.ti.com/
//
// 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 Texas Instruments Incorporated 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
// OWNER 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.
// $
//###########################################################################
//*****************************************************************************
//
// If building with a C++ compiler, make all of the definitions in this header
// have a C binding.
//
//*****************************************************************************
//*****************************************************************************
//
//! \addtogroup xbar_api XBAR
//! @{
//
//*****************************************************************************
//###########################################################################
//
// FILE: hw_clbxbar.h
//
// TITLE: Definitions for the XBAR registers.
//
//###########################################################################
// $Copyright:
// Copyright (C) 2023 Texas Instruments Incorporated - http://www.ti.com/
//
// 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 Texas Instruments Incorporated 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
// OWNER 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.
// $
//###########################################################################
//*************************************************************************************************
//
// The following are defines for the XBAR register offsets
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the AUXSIG0MUX0TO15CFG register
//
//*************************************************************************************************
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
//*************************************************************************************************
//
// The following are defines for the bit fields in the AUXSIG0MUX16TO31CFG register
//
//*************************************************************************************************
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
//*************************************************************************************************
//
// The following are defines for the bit fields in the AUXSIG1MUX0TO15CFG register
//
//*************************************************************************************************
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
//*************************************************************************************************
//
// The following are defines for the bit fields in the AUXSIG1MUX16TO31CFG register
//
//*************************************************************************************************
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
//*************************************************************************************************
//
// The following are defines for the bit fields in the AUXSIG2MUX0TO15CFG register
//
//*************************************************************************************************
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
//*************************************************************************************************
//
// The following are defines for the bit fields in the AUXSIG2MUX16TO31CFG register
//
//*************************************************************************************************
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
//*************************************************************************************************
//
// The following are defines for the bit fields in the AUXSIG3MUX0TO15CFG register
//
//*************************************************************************************************
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
//*************************************************************************************************
//
// The following are defines for the bit fields in the AUXSIG3MUX16TO31CFG register
//
//*************************************************************************************************
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
//*************************************************************************************************
//
// The following are defines for the bit fields in the AUXSIG4MUX0TO15CFG register
//
//*************************************************************************************************
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
//*************************************************************************************************
//
// The following are defines for the bit fields in the AUXSIG4MUX16TO31CFG register
//
//*************************************************************************************************
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
//*************************************************************************************************
//
// The following are defines for the bit fields in the AUXSIG5MUX0TO15CFG register
//
//*************************************************************************************************
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
//*************************************************************************************************
//
// The following are defines for the bit fields in the AUXSIG5MUX16TO31CFG register
//
//*************************************************************************************************
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
//*************************************************************************************************
//
// The following are defines for the bit fields in the AUXSIG6MUX0TO15CFG register
//
//*************************************************************************************************
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
//*************************************************************************************************
//
// The following are defines for the bit fields in the AUXSIG6MUX16TO31CFG register
//
//*************************************************************************************************
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
//*************************************************************************************************
//
// The following are defines for the bit fields in the AUXSIG7MUX0TO15CFG register
//
//*************************************************************************************************
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
//*************************************************************************************************
//
// The following are defines for the bit fields in the AUXSIG7MUX16TO31CFG register
//
//*************************************************************************************************
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
// CLB-XBAR
//*************************************************************************************************
//
// The following are defines for the bit fields in the AUXSIG0MUXENABLE register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the AUXSIG1MUXENABLE register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the AUXSIG2MUXENABLE register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the AUXSIG3MUXENABLE register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the AUXSIG4MUXENABLE register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the AUXSIG5MUXENABLE register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the AUXSIG6MUXENABLE register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the AUXSIG7MUXENABLE register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the AUXSIGOUTINV register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the AUXSIGLOCK register
//
//*************************************************************************************************
//###########################################################################
//
// FILE: hw_epwmxbar.h
//
// TITLE: Definitions for the XBAR registers.
//
//###########################################################################
// $Copyright:
// Copyright (C) 2023 Texas Instruments Incorporated - http://www.ti.com/
//
// 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 Texas Instruments Incorporated 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
// OWNER 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.
// $
//###########################################################################
//*************************************************************************************************
//
// The following are defines for the XBAR register offsets
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the TRIP4MUX0TO15CFG register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the TRIP4MUX16TO31CFG register
//
//*************************************************************************************************
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
//*************************************************************************************************
//
// The following are defines for the bit fields in the TRIP5MUX0TO15CFG register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the TRIP5MUX16TO31CFG register
//
//*************************************************************************************************
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
//*************************************************************************************************
//
// The following are defines for the bit fields in the TRIP7MUX0TO15CFG register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the TRIP7MUX16TO31CFG register
//
//*************************************************************************************************
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
//*************************************************************************************************
//
// The following are defines for the bit fields in the TRIP8MUX0TO15CFG register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the TRIP8MUX16TO31CFG register
//
//*************************************************************************************************
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
//*************************************************************************************************
//
// The following are defines for the bit fields in the TRIP9MUX0TO15CFG register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the TRIP9MUX16TO31CFG register
//
//*************************************************************************************************
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
//*************************************************************************************************
//
// The following are defines for the bit fields in the TRIP10MUX0TO15CFG register
//
//*************************************************************************************************
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
//*************************************************************************************************
//
// The following are defines for the bit fields in the TRIP10MUX16TO31CFG register
//
//*************************************************************************************************
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
//*************************************************************************************************
//
// The following are defines for the bit fields in the TRIP11MUX0TO15CFG register
//
//*************************************************************************************************
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
//*************************************************************************************************
//
// The following are defines for the bit fields in the TRIP11MUX16TO31CFG register
//
//*************************************************************************************************
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
//*************************************************************************************************
//
// The following are defines for the bit fields in the TRIP12MUX0TO15CFG register
//
//*************************************************************************************************
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
//*************************************************************************************************
//
// The following are defines for the bit fields in the TRIP12MUX16TO31CFG register
//
//*************************************************************************************************
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
// EPWM-XBAR
//*************************************************************************************************
//
// The following are defines for the bit fields in the TRIP4MUXENABLE register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the TRIP5MUXENABLE register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the TRIP7MUXENABLE register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the TRIP8MUXENABLE register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the TRIP9MUXENABLE register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the TRIP10MUXENABLE register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the TRIP11MUXENABLE register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the TRIP12MUXENABLE register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the TRIPOUTINV register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the TRIPLOCK register
//
//*************************************************************************************************
//###########################################################################
//
// FILE: hw_inputxbar.h
//
// TITLE: Definitions for the XBAR registers.
//
//###########################################################################
// $Copyright:
// Copyright (C) 2023 Texas Instruments Incorporated - http://www.ti.com/
//
// 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 Texas Instruments Incorporated 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
// OWNER 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.
// $
//###########################################################################
//*************************************************************************************************
//
// The following are defines for the XBAR register offsets
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the INPUTSELECTLOCK register
//
//*************************************************************************************************
//###########################################################################
//
// FILE: hw_outputxbar.h
//
// TITLE: Definitions for the XBAR registers.
//
//###########################################################################
// $Copyright:
// Copyright (C) 2023 Texas Instruments Incorporated - http://www.ti.com/
//
// 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 Texas Instruments Incorporated 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
// OWNER 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.
// $
//###########################################################################
//*************************************************************************************************
//
// The following are defines for the XBAR register offsets
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the OUTPUT1MUX0TO15CFG register
//
//*************************************************************************************************
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
//*************************************************************************************************
//
// The following are defines for the bit fields in the OUTPUT1MUX16TO31CFG register
//
//*************************************************************************************************
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
//*************************************************************************************************
//
// The following are defines for the bit fields in the OUTPUT2MUX0TO15CFG register
//
//*************************************************************************************************
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
//*************************************************************************************************
//
// The following are defines for the bit fields in the OUTPUT2MUX16TO31CFG register
//
//*************************************************************************************************
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
//*************************************************************************************************
//
// The following are defines for the bit fields in the OUTPUT3MUX0TO15CFG register
//
//*************************************************************************************************
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
//*************************************************************************************************
//
// The following are defines for the bit fields in the OUTPUT3MUX16TO31CFG register
//
//*************************************************************************************************
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
//*************************************************************************************************
//
// The following are defines for the bit fields in the OUTPUT4MUX0TO15CFG register
//
//*************************************************************************************************
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
//*************************************************************************************************
//
// The following are defines for the bit fields in the OUTPUT4MUX16TO31CFG register
//
//*************************************************************************************************
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
//*************************************************************************************************
//
// The following are defines for the bit fields in the OUTPUT5MUX0TO15CFG register
//
//*************************************************************************************************
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
//*************************************************************************************************
//
// The following are defines for the bit fields in the OUTPUT5MUX16TO31CFG register
//
//*************************************************************************************************
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
//*************************************************************************************************
//
// The following are defines for the bit fields in the OUTPUT6MUX0TO15CFG register
//
//*************************************************************************************************
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
//*************************************************************************************************
//
// The following are defines for the bit fields in the OUTPUT6MUX16TO31CFG register
//
//*************************************************************************************************
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
//*************************************************************************************************
//
// The following are defines for the bit fields in the OUTPUT7MUX0TO15CFG register
//
//*************************************************************************************************
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
//*************************************************************************************************
//
// The following are defines for the bit fields in the OUTPUT7MUX16TO31CFG register
//
//*************************************************************************************************
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
//*************************************************************************************************
//
// The following are defines for the bit fields in the OUTPUT8MUX0TO15CFG register
//
//*************************************************************************************************
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
//*************************************************************************************************
//
// The following are defines for the bit fields in the OUTPUT8MUX16TO31CFG register
//
//*************************************************************************************************
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
//*************************************************************************************************
//
// The following are defines for the bit fields in the OUTPUT1MUXENABLE register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the OUTPUT2MUXENABLE register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the OUTPUT3MUXENABLE register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the OUTPUT4MUXENABLE register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the OUTPUT5MUXENABLE register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the OUTPUT6MUXENABLE register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the OUTPUT7MUXENABLE register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the OUTPUT8MUXENABLE register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the OUTPUTLATCH register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the OUTPUTLATCHCLR register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the OUTPUTLATCHFRC register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the OUTPUTLATCHENABLE register
//
//*************************************************************************************************
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
// OUTPUT-XBAR
//*************************************************************************************************
//
// The following are defines for the bit fields in the OUTPUTINV register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the OUTPUTLOCK register
//
//*************************************************************************************************
//###########################################################################
//
// FILE: hw_xbar.h
//
// TITLE: Definitions for the XBAR registers.
//
//###########################################################################
// $Copyright:
// Copyright (C) 2023 Texas Instruments Incorporated - http://www.ti.com/
//
// 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 Texas Instruments Incorporated 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
// OWNER 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.
// $
//###########################################################################
//*************************************************************************************************
//
// The following are defines for the XBAR register offsets
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the XBARFLG1 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the XBARFLG2 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the XBARFLG3 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the XBARFLG4 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the XBARCLR1 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the XBARCLR2 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the XBARCLR3 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the XBARCLR4 register
//
//*************************************************************************************************
//*****************************************************************************
//
// Useful defines used within the driver functions.
// Not intended for use by application code.
//
//*****************************************************************************
//
// To acheive backward compatibilty for previously defined macros naming
// in XBAR
//
//
//OUTPUTXBAR
//
//
//EPWMXBAR
//
//*****************************************************************************
//
// The following values define the muxes parameter for XBAR_enableEPWMMux(),
// XBAR_enableOutputMux(), XBAR_disableEPWMMux(), and
// XBAR_disableOutputMux().
//
//*****************************************************************************
//*****************************************************************************
//
//! The following values define the \e output parameter for
//! XBAR_setOutputMuxConfig(), XBAR_enableOutputMux(), and
//! XBAR_disableOutputMux().
//
//*****************************************************************************
typedef enum
{
XBAR_OUTPUT1 = 0, //!< OUTPUT1 of the Output X-BAR
XBAR_OUTPUT2 = 2, //!< OUTPUT2 of the Output X-BAR
XBAR_OUTPUT3 = 4, //!< OUTPUT3 of the Output X-BAR
XBAR_OUTPUT4 = 6, //!< OUTPUT4 of the Output X-BAR
XBAR_OUTPUT5 = 8, //!< OUTPUT5 of the Output X-BAR
XBAR_OUTPUT6 = 10, //!< OUTPUT6 of the Output X-BAR
XBAR_OUTPUT7 = 12, //!< OUTPUT7 of the Output X-BAR
XBAR_OUTPUT8 = 14, //!< OUTPUT8 of the Output X-BAR
} XBAR_OutputNum;
//*****************************************************************************
//
//! The following values define the \e trip parameter for
//! XBAR_setEPWMMuxConfig(), XBAR_invertEPWMSignal(), XBAR_enableEPWMMux(),
//! and XBAR_disableEPWMMux().
//
//*****************************************************************************
typedef enum
{
XBAR_TRIP4 = 0, //!< TRIP4 of the ePWM X-BAR
XBAR_TRIP5 = 2, //!< TRIP5 of the ePWM X-BAR
XBAR_TRIP7 = 4, //!< TRIP7 of the ePWM X-BAR
XBAR_TRIP8 = 6, //!< TRIP8 of the ePWM X-BAR
XBAR_TRIP9 = 8, //!< TRIP9 of the ePWM X-BAR
XBAR_TRIP10 = 10, //!< TRIP10 of the ePWM X-BAR
XBAR_TRIP11 = 12, //!< TRIP11 of the ePWM X-BAR
XBAR_TRIP12 = 14 //!< TRIP12 of the ePWM X-BAR
} XBAR_TripNum;
//*****************************************************************************
//
// The following values define the trip parameter for XBAR_setCLBMuxConfig(),
// XBAR_enableCLBMux(), and XBAR_disableCLBMux().
//
//*****************************************************************************
typedef enum
{
XBAR_AUXSIG0 = 0,
XBAR_AUXSIG1 = 2,
XBAR_AUXSIG2 = 4,
XBAR_AUXSIG3 = 6,
XBAR_AUXSIG4 = 8,
XBAR_AUXSIG5 = 10,
XBAR_AUXSIG6 = 12,
XBAR_AUXSIG7 = 14
} XBAR_AuxSigNum;
//*****************************************************************************
//
//! The following values define the \e input parameter for XBAR_setInputPin().
//
//*****************************************************************************
typedef enum
{
XBAR_INPUT1, //!< ePWM[TZ1], ePWM[TRIP1], X-BARs, eCAPs
XBAR_INPUT2, //!< ePWM[TZ2], ePWM[TRIP2], X-BARs, eCAPs
XBAR_INPUT3, //!< ePWM[TZ3], ePWM[TRIP3], X-BARs, eCAPs
XBAR_INPUT4, //!< ADC wrappers, X-BARs, XINT1, eCAPs
XBAR_INPUT5, //!< EXTSYNCIN1, X-BARs, XINT2, eCAPs
XBAR_INPUT6, //!< EXTSYNCIN2, ePWM[TRIP6], X-BARs, XINT3, eCAPs
XBAR_INPUT7, //!< X-BARs, eCAPs
XBAR_INPUT8, //!< X-BARs, eCAPs
XBAR_INPUT9, //!< X-BARs, eCAPs
XBAR_INPUT10, //!< X-BARs, eCAPs
XBAR_INPUT11, //!< X-BARs, eCAPs
XBAR_INPUT12, //!< X-BARs, eCAPs
XBAR_INPUT13, //!< XINT4, X-BARs, eCAPs
XBAR_INPUT14, //!< XINT5, X-BARs, eCAPs
XBAR_INPUT15, //!< eCAPs
XBAR_INPUT16 //!< eCAPs
} XBAR_InputNum;
//*****************************************************************************
//
//! The following values define the \e muxConfig parameter for
//! XBAR_setOutputMuxConfig().
//
//*****************************************************************************
typedef enum
{
//
//OUTPUTXBAR
//
XBAR_OUT_MUX00_CMPSS1_CTRIPOUTH = 0x0000,
XBAR_OUT_MUX00_CMPSS1_CTRIPOUTH_OR_L = 0x0001,
XBAR_OUT_MUX00_ADCAEVT1 = 0x0002,
XBAR_OUT_MUX00_ECAP1_OUT = 0x0003,
XBAR_OUT_MUX01_CMPSS1_CTRIPOUTL = 0x0200,
XBAR_OUT_MUX01_INPUTXBAR1 = 0x0201,
XBAR_OUT_MUX01_CLB1_OUT4 = 0x0202,
XBAR_OUT_MUX01_ADCCEVT1 = 0x0203,
XBAR_OUT_MUX02_CMPSS2_CTRIPOUTH = 0x0400,
XBAR_OUT_MUX02_CMPSS2_CTRIPOUTH_OR_L = 0x0401,
XBAR_OUT_MUX02_ADCAEVT2 = 0x0402,
XBAR_OUT_MUX02_ECAP2_OUT = 0x0403,
XBAR_OUT_MUX03_CMPSS2_CTRIPOUTL = 0x0600,
XBAR_OUT_MUX03_INPUTXBAR2 = 0x0601,
XBAR_OUT_MUX03_CLB1_OUT5 = 0x0602,
XBAR_OUT_MUX03_ADCCEVT2 = 0x0603,
XBAR_OUT_MUX04_CMPSS3_CTRIPOUTH = 0x0800,
XBAR_OUT_MUX04_CMPSS3_CTRIPOUTH_OR_L = 0x0801,
XBAR_OUT_MUX04_ADCAEVT3 = 0x0802,
XBAR_OUT_MUX04_ECAP3_OUT = 0x0803,
XBAR_OUT_MUX05_CMPSS3_CTRIPOUTL = 0x0A00,
XBAR_OUT_MUX05_INPUTXBAR3 = 0x0A01,
XBAR_OUT_MUX05_CLB2_OUT4 = 0x0A02,
XBAR_OUT_MUX05_ADCCEVT3 = 0x0A03,
XBAR_OUT_MUX06_CMPSS4_CTRIPOUTH = 0x0C00,
XBAR_OUT_MUX06_CMPSS4_CTRIPOUTH_OR_L = 0x0C01,
XBAR_OUT_MUX06_ADCAEVT4 = 0x0C02,
XBAR_OUT_MUX07_CMPSS4_CTRIPOUTL = 0x0E00,
XBAR_OUT_MUX07_INPUTXBAR4 = 0x0E01,
XBAR_OUT_MUX07_CLB2_OUT5 = 0x0E02,
XBAR_OUT_MUX07_ADCCEVT4 = 0x0E03,
XBAR_OUT_MUX08_ADCBEVT1 = 0x1002,
XBAR_OUT_MUX09_INPUTXBAR5 = 0x1201,
XBAR_OUT_MUX09_CLB3_OUT4 = 0x1202,
XBAR_OUT_MUX10_ADCBEVT2 = 0x1402,
XBAR_OUT_MUX11_INPUTXBAR6 = 0x1601,
XBAR_OUT_MUX11_CLB3_OUT5 = 0x1602,
XBAR_OUT_MUX12_ADCBEVT3 = 0x1802,
XBAR_OUT_MUX14_EXTSYNCOUT = 0x1C03,
XBAR_OUT_MUX14_ADCBEVT4 = 0x1C02,
XBAR_OUT_MUX13_ADCSOCA = 0x1A01,
XBAR_OUT_MUX13_CLB4_OUT4 = 0x1A02,
XBAR_OUT_MUX15_ADCSOCB = 0x1E01,
XBAR_OUT_MUX15_CLB4_OUT5 = 0x1E02,
XBAR_OUT_MUX16_SD1FLT1_CEVT1 = 0x2000,
XBAR_OUT_MUX16_SD1FLT1_CEVT1_OR_CEVT2 = 0x2001,
XBAR_OUT_MUX17_SD1FLT1_CEVT2 = 0x2200,
XBAR_OUT_MUX17_CLAHALT = 0x2203,
XBAR_OUT_MUX18_SD1FLT2_CEVT1 = 0x2400,
XBAR_OUT_MUX18_SD1FLT2_CEVT1_OR_CEVT2 = 0x2401,
XBAR_OUT_MUX19_SD1FLT2_CEVT2 = 0x2600,
XBAR_OUT_MUX20_SD1FLT3_CEVT1 = 0x2800,
XBAR_OUT_MUX20_SD1FLT3_CEVT1_OR_CEVT2 = 0x2801,
XBAR_OUT_MUX21_SD1FLT3_CEVT2 = 0x2A00,
XBAR_OUT_MUX21_FSIA_RX_TRIG2 = 0x2A03,
XBAR_OUT_MUX22_SD1FLT4_CEVT1 = 0x2C00,
XBAR_OUT_MUX22_SD1FLT4_CEVT1_OR_CEVT2 = 0x2C01,
XBAR_OUT_MUX23_SD1FLT4_CEVT2 = 0x2E00,
XBAR_OUT_MUX24_SD2FLT1_CEVT1 = 0x3000,
XBAR_OUT_MUX24_SD2FLT1_CEVT1_OR_CEVT2 = 0x3001,
XBAR_OUT_MUX25_SD2FLT1_CEVT2 = 0x3200,
XBAR_OUT_MUX26_SD2FLT2_CEVT1 = 0x3400,
XBAR_OUT_MUX26_SD2FLT2_CEVT1_OR_CEVT2 = 0x3401,
XBAR_OUT_MUX27_SD2FLT2_CEVT2 = 0x3600,
XBAR_OUT_MUX28_SD2FLT3_CEVT1 = 0x3800,
XBAR_OUT_MUX28_SD2FLT3_CEVT1_OR_CEVT2 = 0x3801,
XBAR_OUT_MUX29_SD2FLT3_CEVT2 = 0x3A00,
XBAR_OUT_MUX30_SD2FLT4_CEVT1 = 0x3C00,
XBAR_OUT_MUX30_SD2FLT4_CEVT1_OR_CEVT2 = 0x3C01,
XBAR_OUT_MUX31_SD2FLT4_CEVT2 = 0x3E00,
XBAR_OUT_MUX19_ERRSTS = 0x2603,
XBAR_OUT_MUX30_EPG1_OUT0 = 0x3C03,
XBAR_OUT_MUX31_ERRSTS = 0x3E02,
XBAR_OUT_MUX31_EPG1_OUT1 = 0x3E03,
//
//CLBOUTPUTXBAR
//
XBAR_OUT_MUX00_CLB1_OUT0 = 0x0000,
XBAR_OUT_MUX00_XTRIP_OUT1 = 0x0003,
XBAR_OUT_MUX01_CLB1_OUT1 = 0x0200,
XBAR_OUT_MUX01_XTRIP_OUT2 = 0x0203,
XBAR_OUT_MUX02_CLB1_OUT2 = 0x0400,
XBAR_OUT_MUX03_CLB1_OUT3 = 0x0600,
XBAR_OUT_MUX04_CLB1_OUT4 = 0x0800,
XBAR_OUT_MUX05_CLB1_OUT5 = 0x0A00,
XBAR_OUT_MUX06_CLB1_OUT6 = 0x0C00,
XBAR_OUT_MUX07_CLB1_OUT7 = 0x0E00,
XBAR_OUT_MUX08_CLB2_OUT0 = 0x1000,
XBAR_OUT_MUX08_XTRIP_OUT3 = 0x1003,
XBAR_OUT_MUX09_CLB2_OUT1 = 0x1200,
XBAR_OUT_MUX09_XTRIP_OUT4 = 0x1203,
XBAR_OUT_MUX10_CLB2_OUT2 = 0x1400,
XBAR_OUT_MUX11_CLB2_OUT3 = 0x1600,
XBAR_OUT_MUX12_CLB2_OUT4 = 0x1800,
XBAR_OUT_MUX13_CLB2_OUT5 = 0x1A00,
XBAR_OUT_MUX14_CLB2_OUT6 = 0x1C00,
XBAR_OUT_MUX15_CLB2_OUT7 = 0x1E00,
XBAR_OUT_MUX16_CLB3_OUT0 = 0x2000,
XBAR_OUT_MUX16_XTRIP_OUT5 = 0x2003,
XBAR_OUT_MUX17_CLB3_OUT1 = 0x2200,
XBAR_OUT_MUX17_XTRIP_OUT6 = 0x2203,
XBAR_OUT_MUX18_CLB3_OUT2 = 0x2400,
XBAR_OUT_MUX19_CLB3_OUT3 = 0x2600,
XBAR_OUT_MUX20_CLB3_OUT4 = 0x2800,
XBAR_OUT_MUX21_CLB3_OUT5 = 0x2A00,
XBAR_OUT_MUX22_CLB3_OUT6 = 0x2C00,
XBAR_OUT_MUX23_CLB3_OUT7 = 0x2E00,
XBAR_OUT_MUX24_CLB4_OUT0 = 0x3000,
XBAR_OUT_MUX24_XTRIP_OUT7 = 0x3003,
XBAR_OUT_MUX25_CLB4_OUT1 = 0x3200,
XBAR_OUT_MUX25_XTRIP_OUT8 = 0x3203,
XBAR_OUT_MUX26_CLB4_OUT2 = 0x3400,
XBAR_OUT_MUX27_CLB4_OUT3 = 0x3600,
XBAR_OUT_MUX28_CLB4_OUT4 = 0x3800,
XBAR_OUT_MUX29_CLB4_OUT5 = 0x3A00,
XBAR_OUT_MUX30_CLB4_OUT6 = 0x3C00,
XBAR_OUT_MUX30_EPG1_OUT2 = 0x3C03,
XBAR_OUT_MUX31_CLB4_OUT7 = 0x3E00,
XBAR_OUT_MUX31_EPG1_OUT3 = 0x3E03,
} XBAR_OutputMuxConfig;
//*****************************************************************************
//
//! The following values define the \e muxConfig parameter for
//! XBAR_setEPWMMuxConfig().
//
//*****************************************************************************
typedef enum
{
XBAR_EPWM_MUX00_CMPSS1_CTRIPH = 0x0000,
XBAR_EPWM_MUX00_CMPSS1_CTRIPH_OR_L = 0x0001,
XBAR_EPWM_MUX00_ADCAEVT1 = 0x0002,
XBAR_EPWM_MUX00_ECAP1_OUT = 0x0003,
XBAR_EPWM_MUX01_CMPSS1_CTRIPL = 0x0200,
XBAR_EPWM_MUX01_INPUTXBAR1 = 0x0201,
XBAR_EPWM_MUX01_CLB1_OUT4 = 0x0202,
XBAR_EPWM_MUX01_ADCCEVT1 = 0x0203,
XBAR_EPWM_MUX02_CMPSS2_CTRIPH = 0x0400,
XBAR_EPWM_MUX02_CMPSS2_CTRIPH_OR_L = 0x0401,
XBAR_EPWM_MUX02_ADCAEVT2 = 0x0402,
XBAR_EPWM_MUX02_ECAP2_OUT = 0x0403,
XBAR_EPWM_MUX03_CMPSS2_CTRIPL = 0x0600,
XBAR_EPWM_MUX03_INPUTXBAR2 = 0x0601,
XBAR_EPWM_MUX03_CLB1_OUT5 = 0x0602,
XBAR_EPWM_MUX03_ADCCEVT2 = 0x0603,
XBAR_EPWM_MUX04_CMPSS3_CTRIPH = 0x0800,
XBAR_EPWM_MUX04_CMPSS3_CTRIPH_OR_L = 0x0801,
XBAR_EPWM_MUX04_ADCAEVT3 = 0x0802,
XBAR_EPWM_MUX04_ECAP3_OUT = 0x0803,
XBAR_EPWM_MUX05_CMPSS3_CTRIPL = 0x0A00,
XBAR_EPWM_MUX05_INPUTXBAR3 = 0x0A01,
XBAR_EPWM_MUX05_CLB2_OUT4 = 0x0A02,
XBAR_EPWM_MUX05_ADCCEVT3 = 0x0A03,
XBAR_EPWM_MUX06_CMPSS4_CTRIPH = 0x0C00,
XBAR_EPWM_MUX06_CMPSS4_CTRIPH_OR_L = 0x0C01,
XBAR_EPWM_MUX06_ADCAEVT4 = 0x0C02,
XBAR_EPWM_MUX07_CMPSS4_CTRIPL = 0x0E00,
XBAR_EPWM_MUX07_INPUTXBAR4 = 0x0E01,
XBAR_EPWM_MUX07_CLB2_OUT5 = 0x0E02,
XBAR_EPWM_MUX07_ADCCEVT4 = 0x0E03,
XBAR_EPWM_MUX08_ADCBEVT1 = 0x1002,
XBAR_EPWM_MUX09_INPUTXBAR5 = 0x1201,
XBAR_EPWM_MUX09_CLB3_OUT4 = 0x1202,
XBAR_EPWM_MUX10_ADCBEVT2 = 0x1402,
XBAR_EPWM_MUX11_INPUTXBAR6 = 0x1601,
XBAR_EPWM_MUX11_CLB3_OUT5 = 0x1602,
XBAR_EPWM_MUX12_ADCBEVT3 = 0x1802,
XBAR_EPWM_MUX13_ADCSOCA = 0x1A01,
XBAR_EPWM_MUX13_CLB4_OUT4 = 0x1A02,
XBAR_EPWM_MUX14_ADCBEVT4 = 0x1C02,
XBAR_EPWM_MUX14_EXTSYNCOUT = 0x1C03,
XBAR_EPWM_MUX15_ADCSOCB = 0x1E01,
XBAR_EPWM_MUX15_CLB4_OUT5 = 0x1E02,
XBAR_EPWM_MUX16_SD1FLT1_CEVT1 = 0x2000,
XBAR_EPWM_MUX16_SD1FLT1_CEVT1_OR_CEVT2 = 0x2001,
XBAR_EPWM_MUX16_SD1FLT1_COMPZ = 0x2002,
XBAR_EPWM_MUX16_SD1FLT1_DRINT = 0x2003,
XBAR_EPWM_MUX17_SD1FLT1_CEVT2 = 0x2200,
XBAR_EPWM_MUX17_INPUTXBAR7 = 0x2201,
XBAR_EPWM_MUX17_CLAHALT = 0x2203,
XBAR_EPWM_MUX18_SD1FLT2_CEVT1 = 0x2400,
XBAR_EPWM_MUX18_SD1FLT2_CEVT1_OR_CEVT2 = 0x2401,
XBAR_EPWM_MUX18_SD1FLT2_COMPZ = 0x2402,
XBAR_EPWM_MUX18_SD1FLT2_DRINT = 0x2403,
XBAR_EPWM_MUX19_SD1FLT2_CEVT2 = 0x2600,
XBAR_EPWM_MUX19_INPUTXBAR8 = 0x2601,
XBAR_EPWM_MUX19_ERRORSTS = 0x2603,
XBAR_EPWM_MUX20_SD1FLT3_CEVT1 = 0x2800,
XBAR_EPWM_MUX20_SD1FLT3_CEVT1_OR_CEVT2 = 0x2801,
XBAR_EPWM_MUX20_SD1FLT3_COMPZ = 0x2802,
XBAR_EPWM_MUX20_SD1FLT3_DRINT = 0x2803,
XBAR_EPWM_MUX21_SD1FLT3_CEVT2 = 0x2A00,
XBAR_EPWM_MUX21_INPUTXBAR9 = 0x2A01,
XBAR_EPWM_MUX22_SD1FLT4_CEVT1 = 0x2C00,
XBAR_EPWM_MUX22_SD1FLT4_CEVT1_OR_CEVT2 = 0x2C01,
XBAR_EPWM_MUX22_SD1FLT4_COMPZ = 0x2C02,
XBAR_EPWM_MUX22_SD1FLT4_DRINT = 0x2C03,
XBAR_EPWM_MUX23_SD1FLT4_CEVT2 = 0x2E00,
XBAR_EPWM_MUX23_INPUTXBAR10 = 0x2E01,
XBAR_EPWM_MUX24_SD2FLT1_CEVT1 = 0x3000,
XBAR_EPWM_MUX24_SD2FLT1_CEVT1_OR_CEVT2 = 0x3001,
XBAR_EPWM_MUX24_SD2FLT1_COMPZ = 0x3002,
XBAR_EPWM_MUX24_SD2FLT1_DRINT = 0x3003,
XBAR_EPWM_MUX25_SD2FLT1_CEVT2 = 0x3200,
XBAR_EPWM_MUX25_INPUTXBAR11 = 0x3201,
XBAR_EPWM_MUX25_MCAN_FEVT0 = 0x3202,
XBAR_EPWM_MUX26_SD2FLT2_CEVT1 = 0x3400,
XBAR_EPWM_MUX26_SD2FLT2_CEVT1_OR_CEVT2 = 0x3401,
XBAR_EPWM_MUX26_SD2FLT2_COMPZ = 0x3402,
XBAR_EPWM_MUX26_SD2FLT2_DRINT = 0x3403,
XBAR_EPWM_MUX27_SD2FLT2_CEVT2 = 0x3600,
XBAR_EPWM_MUX27_INPUTXBAR12 = 0x3601,
XBAR_EPWM_MUX27_MCAN_FEVT1 = 0x3602,
XBAR_EPWM_MUX28_SD2FLT3_CEVT1 = 0x3800,
XBAR_EPWM_MUX28_SD2FLT3_CEVT1_OR_CEVT2 = 0x3801,
XBAR_EPWM_MUX28_SD2FLT3_COMPZ = 0x3802,
XBAR_EPWM_MUX28_SD2FLT3_DRINT = 0x3803,
XBAR_EPWM_MUX29_SD2FLT3_CEVT2 = 0x3A00,
XBAR_EPWM_MUX29_INPUTXBAR13 = 0x3A01,
XBAR_EPWM_MUX29_MCAN_FEVT2 = 0x3A02,
XBAR_EPWM_MUX30_SD2FLT4_CEVT1 = 0x3C00,
XBAR_EPWM_MUX30_SD2FLT4_CEVT1_OR_CEVT2 = 0x3C01,
XBAR_EPWM_MUX30_SD2FLT4_COMPZ = 0x3C02,
XBAR_EPWM_MUX30_SD2FLT4_DRINT = 0x3C03,
XBAR_EPWM_MUX31_SD2FLT4_CEVT2 = 0x3E00,
XBAR_EPWM_MUX31_ERRORSTS = 0x3E02,
XBAR_EPWM_MUX31_INPUTXBAR14 = 0x3E01
} XBAR_EPWMMuxConfig;
//*****************************************************************************
//
// The following values define the muxConfig parameter for
// XBAR_setCLBMuxConfig().
//
//*****************************************************************************
typedef enum
{
XBAR_CLB_MUX00_CMPSS1_CTRIPH = 0x0000,
XBAR_CLB_MUX00_CMPSS1_CTRIPH_OR_L = 0x0001,
XBAR_CLB_MUX00_ADCAEVT1 = 0x0002,
XBAR_CLB_MUX00_ECAP1_OUT = 0x0003,
XBAR_CLB_MUX01_CMPSS1_CTRIPL = 0x0200,
XBAR_CLB_MUX01_INPUTXBAR1 = 0x0201,
XBAR_CLB_MUX01_CLB1_OUT4 = 0x0202,
XBAR_CLB_MUX01_ADCCEVT1 = 0x0203,
XBAR_CLB_MUX02_CMPSS2_CTRIPH = 0x0400,
XBAR_CLB_MUX02_CMPSS2_CTRIPH_OR_L = 0x0401,
XBAR_CLB_MUX02_ADCAEVT2 = 0x0402,
XBAR_CLB_MUX02_ECAP2_OUT = 0x0403,
XBAR_CLB_MUX03_CMPSS2_CTRIPL = 0x0600,
XBAR_CLB_MUX03_INPUTXBAR2 = 0x0601,
XBAR_CLB_MUX03_CLB1_OUT5 = 0x0602,
XBAR_CLB_MUX03_ADCCEVT2 = 0x0603,
XBAR_CLB_MUX04_CMPSS3_CTRIPH = 0x0800,
XBAR_CLB_MUX04_CMPSS3_CTRIPH_OR_L = 0x0801,
XBAR_CLB_MUX04_ADCAEVT3 = 0x0802,
XBAR_CLB_MUX04_ECAP3_OUT = 0x0803,
XBAR_CLB_MUX05_CMPSS3_CTRIPL = 0x0A00,
XBAR_CLB_MUX05_INPUTXBAR3 = 0x0A01,
XBAR_CLB_MUX05_CLB2_OUT4 = 0x0A02,
XBAR_CLB_MUX05_ADCCEVT3 = 0x0A03,
XBAR_CLB_MUX06_CMPSS4_CTRIPH = 0x0C00,
XBAR_CLB_MUX06_CMPSS4_CTRIPH_OR_L = 0x0C01,
XBAR_CLB_MUX06_ADCAEVT4 = 0x0C02,
XBAR_CLB_MUX07_CMPSS4_CTRIPL = 0x0E00,
XBAR_CLB_MUX07_INPUTXBAR4 = 0x0E01,
XBAR_CLB_MUX07_CLB2_OUT5 = 0x0E02,
XBAR_CLB_MUX07_ADCCEVT4 = 0x0E03,
XBAR_CLB_MUX08_ADCBEVT1 = 0x1002,
XBAR_CLB_MUX09_INPUTXBAR5 = 0x1201,
XBAR_CLB_MUX09_CLB3_OUT4 = 0x1202,
XBAR_CLB_MUX10_ADCBEVT2 = 0x1402,
XBAR_CLB_MUX11_INPUTXBAR6 = 0x1601,
XBAR_CLB_MUX11_CLB3_OUT5 = 0x1602,
XBAR_CLB_MUX12_ADCBEVT3 = 0x1802,
XBAR_CLB_MUX13_ADCSOCA = 0x1A01,
XBAR_CLB_MUX13_CLB4_OUT4 = 0x1A02,
XBAR_CLB_MUX14_ADCBEVT4 = 0x1C02,
XBAR_CLB_MUX14_EXTSYNCOUT = 0x1C03,
XBAR_CLB_MUX15_ADCSOCB = 0x1E01,
XBAR_CLB_MUX15_CLB4_OUT5 = 0x1E02,
XBAR_CLB_MUX16_SD1FLT1_COMPH = 0x2000,
XBAR_CLB_MUX16_SD1FLT1_COMPH_OR_COMPL = 0x2001,
XBAR_CLB_MUX16_SD1FLT1_COMPZ = 0x2002,
XBAR_CLB_MUX16_SD1FLT1_DRINT = 0x2003,
XBAR_CLB_MUX17_SD1FLT1_COMPL = 0x2200,
XBAR_CLB_MUX17_INPUTXBAR7 = 0x2201,
XBAR_CLB_MUX17_CLAHALT = 0x2203,
XBAR_CLB_MUX18_SD1FLT2_COMPH = 0x2400,
XBAR_CLB_MUX18_SD1FLT2_COMPH_OR_COMPL = 0x2401,
XBAR_CLB_MUX18_SD1FLT2_COMPZ = 0x2402,
XBAR_CLB_MUX18_SD1FLT2_DRINT = 0x2403,
XBAR_CLB_MUX19_SD1FLT2_COMPL = 0x2600,
XBAR_CLB_MUX19_INPUTXBAR8 = 0x2601,
XBAR_CLB_MUX19_ERRORSTS = 0x2603,
XBAR_CLB_MUX20_SD1FLT3_COMPH = 0x2800,
XBAR_CLB_MUX20_SD1FLT3_COMPH_OR_COMPL = 0x2801,
XBAR_CLB_MUX20_SD1FLT3_COMPZ = 0x2802,
XBAR_CLB_MUX20_SD1FLT3_DRINT = 0x2803,
XBAR_CLB_MUX21_SD1FLT3_COMPL = 0x2A00,
XBAR_CLB_MUX21_INPUTXBAR9 = 0x2A01,
XBAR_CLB_MUX22_SD1FLT4_COMPH = 0x2C00,
XBAR_CLB_MUX22_SD1FLT4_COMPH_OR_COMPL = 0x2C01,
XBAR_CLB_MUX22_SD1FLT4_COMPZ = 0x2C02,
XBAR_CLB_MUX22_SD1FLT4_DRINT = 0x2C03,
XBAR_CLB_MUX23_SD1FLT4_COMPL = 0x2E00,
XBAR_CLB_MUX23_INPUTXBAR10 = 0x2E01,
XBAR_CLB_MUX24_SD2FLT1_COMPH = 0x3000,
XBAR_CLB_MUX24_SD2FLT1_COMPH_OR_COMPL = 0x3001,
XBAR_CLB_MUX24_SD2FLT1_COMPZ = 0x3002,
XBAR_CLB_MUX24_SD2FLT1_DRINT = 0x3003,
XBAR_CLB_MUX25_SD2FLT1_COMPL = 0x3200,
XBAR_CLB_MUX25_INPUTXBAR11 = 0x3201,
XBAR_CLB_MUX25_MCAN_FEVT0 = 0x3202,
XBAR_CLB_MUX26_SD2FLT2_COMPH = 0x3400,
XBAR_CLB_MUX26_SD2FLT2_COMPH_OR_COMPL = 0x3401,
XBAR_CLB_MUX26_SD2FLT2_COMPZ = 0x3402,
XBAR_CLB_MUX26_SD2FLT2_DRINT = 0x3403,
XBAR_CLB_MUX27_SD2FLT2_COMPL = 0x3600,
XBAR_CLB_MUX27_INPUTXBAR12 = 0x3601,
XBAR_CLB_MUX27_MCAN_FEVT1 = 0x3602,
XBAR_CLB_MUX28_SD2FLT3_COMPH = 0x3800,
XBAR_CLB_MUX28_SD2FLT3_COMPH_OR_COMPL = 0x3801,
XBAR_CLB_MUX28_SD2FLT3_COMPZ = 0x3802,
XBAR_CLB_MUX28_SD2FLT3_DRINT = 0x3803,
XBAR_CLB_MUX29_SD2FLT3_COMPL = 0x3A00,
XBAR_CLB_MUX29_INPUTXBAR13 = 0x3A01,
XBAR_CLB_MUX29_MCAN_FEVT2 = 0x3A02,
XBAR_CLB_MUX30_SD2FLT4_COMPH = 0x3C00,
XBAR_CLB_MUX30_SD2FLT4_COMPH_OR_COMPL = 0x3C01,
XBAR_CLB_MUX30_SD2FLT4_COMPZ = 0x3C02,
XBAR_CLB_MUX30_SD2FLT4_DRINT = 0x3C03,
XBAR_CLB_MUX31_SD2FLT4_COMPL = 0x3E00,
XBAR_CLB_MUX31_ERRORSTS = 0x3E02,
XBAR_CLB_MUX31_INPUTXBAR14 = 0x3E01
} XBAR_CLBMuxConfig;
//*****************************************************************************
//
//! The following values define the \e inputFlag parameter for
//! XBAR_getInputFlagStatus() and XBAR_clearInputFlag().
//
//*****************************************************************************
typedef enum
{
//
// XBARFLG1
//
XBAR_INPUT_FLG_CMPSS1_CTRIPL = 0x0000,
XBAR_INPUT_FLG_CMPSS1_CTRIPH = 0x0001,
XBAR_INPUT_FLG_CMPSS2_CTRIPL = 0x0002,
XBAR_INPUT_FLG_CMPSS2_CTRIPH = 0x0003,
XBAR_INPUT_FLG_CMPSS3_CTRIPL = 0x0004,
XBAR_INPUT_FLG_CMPSS3_CTRIPH = 0x0005,
XBAR_INPUT_FLG_CMPSS4_CTRIPL = 0x0006,
XBAR_INPUT_FLG_CMPSS4_CTRIPH = 0x0007,
XBAR_INPUT_FLG_CMPSS1_CTRIPOUTL = 0x0010,
XBAR_INPUT_FLG_CMPSS1_CTRIPOUTH = 0x0011,
XBAR_INPUT_FLG_CMPSS2_CTRIPOUTL = 0x0012,
XBAR_INPUT_FLG_CMPSS2_CTRIPOUTH = 0x0013,
XBAR_INPUT_FLG_CMPSS3_CTRIPOUTL = 0x0014,
XBAR_INPUT_FLG_CMPSS3_CTRIPOUTH = 0x0015,
XBAR_INPUT_FLG_CMPSS4_CTRIPOUTL = 0x0016,
XBAR_INPUT_FLG_CMPSS4_CTRIPOUTH = 0x0017,
//
// XBARFLG2
//
XBAR_INPUT_FLG_INPUT1 = 0x0100,
XBAR_INPUT_FLG_INPUT2 = 0x0101,
XBAR_INPUT_FLG_INPUT3 = 0x0102,
XBAR_INPUT_FLG_INPUT4 = 0x0103,
XBAR_INPUT_FLG_INPUT5 = 0x0104,
XBAR_INPUT_FLG_INPUT6 = 0x0105,
XBAR_INPUT_FLG_ADCSOCA = 0x0106,
XBAR_INPUT_FLG_ADCSOCB = 0x0107,
XBAR_INPUT_FLG_INPUT7 = 0x0108,
XBAR_INPUT_FLG_INPUT8 = 0x0109,
XBAR_INPUT_FLG_INPUT9 = 0x010A,
XBAR_INPUT_FLG_INPUT10 = 0x010B,
XBAR_INPUT_FLG_INPUT11 = 0x010C,
XBAR_INPUT_FLG_INPUT12 = 0x010D,
XBAR_INPUT_FLG_INPUT13 = 0x010E,
XBAR_INPUT_FLG_INPUT14 = 0x010F,
XBAR_INPUT_FLG_ECAP1_OUT = 0x0110,
XBAR_INPUT_FLG_ECAP2_OUT = 0x0111,
XBAR_INPUT_FLG_ECAP3_OUT = 0x0112,
XBAR_INPUT_FLG_EXTSYNCOUT = 0x0116,
XBAR_INPUT_FLG_ADCAEVT1 = 0x0117,
XBAR_INPUT_FLG_ADCAEVT2 = 0x0118,
XBAR_INPUT_FLG_ADCAEVT3 = 0x0119,
XBAR_INPUT_FLG_ADCAEVT4 = 0x011A,
XBAR_INPUT_FLG_ADCCEVT1 = 0x011F,
//
// XBARFLG3
//
XBAR_INPUT_FLG_ADCCEVT2 = 0x0200,
XBAR_INPUT_FLG_ADCCEVT3 = 0x0201,
XBAR_INPUT_FLG_ADCCEVT4 = 0x0202,
XBAR_INPUT_FLG_SD1FLT1_COMPL = 0x0207,
XBAR_INPUT_FLG_SD1FLT1_COMPH = 0x0208,
XBAR_INPUT_FLG_SD1FLT2_COMPL = 0x0209,
XBAR_INPUT_FLG_SD1FLT2_COMPH = 0x020A,
XBAR_INPUT_FLG_SD1FLT3_COMPL = 0x020B,
XBAR_INPUT_FLG_SD1FLT3_COMPH = 0x020C,
XBAR_INPUT_FLG_SD1FLT4_COMPL = 0x020D,
XBAR_INPUT_FLG_SD1FLT4_COMPH = 0x020E,
XBAR_INPUT_FLG_SD2FLT1_COMPL = 0x020F,
XBAR_INPUT_FLG_SD2FLT1_COMPH = 0x0210,
XBAR_INPUT_FLG_SD2FLT2_COMPL = 0x0211,
XBAR_INPUT_FLG_SD2FLT2_COMPH = 0x0212,
XBAR_INPUT_FLG_SD2FLT3_COMPL = 0x0213,
XBAR_INPUT_FLG_SD2FLT3_COMPH = 0x0214,
XBAR_INPUT_FLG_SD2FLT4_COMPL = 0x0215,
XBAR_INPUT_FLG_SD2FLT4_COMPH = 0x0216,
XBAR_INPUT_FLG_SD1FLT1_COMPZ = 0x0218,
XBAR_INPUT_FLG_SD1FLT1_DRINT = 0x0219,
XBAR_INPUT_FLG_SD1FLT2_COMPZ = 0x021A,
XBAR_INPUT_FLG_SD1FLT2_DRINT = 0x021B,
XBAR_INPUT_FLG_SD1FLT3_COMPZ = 0x021C,
XBAR_INPUT_FLG_SD1FLT3_DRINT = 0x021D,
XBAR_INPUT_FLG_SD1FLT4_COMPZ = 0x021E,
XBAR_INPUT_FLG_SD1FLT4_DRINT = 0x021F,
//
// XBARFLG4
//
XBAR_INPUT_FLG_SD2FLT1_COMPZ = 0x0300,
XBAR_INPUT_FLG_SD2FLT1_DRINT = 0x0301,
XBAR_INPUT_FLG_SD2FLT2_COMPZ = 0x0302,
XBAR_INPUT_FLG_SD2FLT2_DRINT = 0x0303,
XBAR_INPUT_FLG_SD2FLT3_COMPZ = 0x0304,
XBAR_INPUT_FLG_SD2FLT3_DRINT = 0x0305,
XBAR_INPUT_FLG_SD2FLT4_COMPZ = 0x0306,
XBAR_INPUT_FLG_SD2FLT4_DRINT = 0x0307,
XBAR_INPUT_FLG_EMAC_PPS0 = 0x0308,
XBAR_INPUT_FLG_MCANA_FEVT0 = 0x0309,
XBAR_INPUT_FLG_MCANA_FEVT1 = 0x030A,
XBAR_INPUT_FLG_MCANA_FEVT2 = 0x030B,
XBAR_INPUT_FLG_CLB1_OUT4 = 0x0310,
XBAR_INPUT_FLG_CLB1_OUT5 = 0x0311,
XBAR_INPUT_FLG_CLB2_OUT4 = 0x0312,
XBAR_INPUT_FLG_CLB2_OUT5 = 0x0313,
XBAR_INPUT_FLG_CLB3_OUT4 = 0x0314,
XBAR_INPUT_FLG_CLB3_OUT5 = 0x0315,
XBAR_INPUT_FLG_CLB4_OUT4 = 0x0316,
XBAR_INPUT_FLG_CLB4_OUT5 = 0x0317,
XBAR_INPUT_FLG_ERRORSTS_ERROR = 0x031C,
XBAR_INPUT_FLG_CLAHALT = 0x031F,
} XBAR_InputFlag;
//*****************************************************************************
//
// Prototypes for the APIs.
//
//*****************************************************************************
//*****************************************************************************
//
//! \internal
//! Checks a X-BAR base address.
//!
//! \param base is the base address of the X-BAR.
//!
//! This function determines if a X-BAR base address is valid.
//!
//! \return Returns \b true if the base address is valid and \b false
//! otherwise.
//
//*****************************************************************************
//*****************************************************************************
//
//! Enables the Output X-BAR mux values to be passed to the output signal.
//!
//! \param base specifies the X-BAR Enable register base address.
//! \param output is the X-BAR output being configured.
//! \param muxes is a bit field of the muxes to be enabled.
//!
//! This function enables the mux values to be passed to the X-BAR output
//! signal. The \e output parameter is a value \b XBAR_OUTPUTy where y is
//! the output number between 1 and 8 inclusive.
//!
//! The \e base parameter can take base addresses
//! OUTPUTXBAR_BASE
//! or CLBOUTPUTXBAR_BASE.
//!
//! The \e muxes parameter is a bit field of the muxes being enabled where bit
//! 0 represents mux 0, bit 1 represents mux 1 and so on. Defines are provided
//! in the form of \b XBAR_MUXnn that can be OR'd together to enable several
//! muxes on an output at the same time. For example, passing this function
//! ( \b XBAR_MUX04 | \b XBAR_MUX10 ) would enable muxes 4 and 10.
//!
//! \return None.
//
//*****************************************************************************
static inline void
XBAR_enableOutputMux(uint32_t base, XBAR_OutputNum output, uint32_t muxes)
{
uint16_t outputNum = (uint16_t)output;
//
// Check the arguments.
//
;
//
// Set the enable bit.
//
__eallow();
(*((volatile uint32_t *)(base + 0x20U + outputNum))) |= muxes;
__edis();
}
//*****************************************************************************
//
//! Disables the Output X-BAR mux values from being passed to the output.
//!
//! \param base specifies the X-BAR Enable Register base address.
//! \param output is the X-BAR output being configured.
//! \param muxes is a bit field of the muxes to be disabled.
//!
//! This function disables the mux values from being passed to the X-BAR output
//! signal. The \e output parameter is a value \b XBAR_OUTPUTy where y is
//! the output number between 1 and 8 inclusive.
//!
//! The \e base parameter can take base addresses
//! OUTPUTXBAR_BASE
//! or CLBOUTPUTXBAR_BASE.
//!
//! The \e muxes parameter is a bit field of the muxes being disabled where bit
//! 0 represents mux 0, bit 1 represents mux 1 and so on. Defines are provided
//! in the form of \b XBAR_MUXnn that can be OR'd together to disable several
//! muxes on an output at the same time. For example, passing this function
//! ( \b XBAR_MUX04 | \b XBAR_MUX10 ) would disable muxes 4 and 10.
//!
//! \return None.
//
//*****************************************************************************
static inline void
XBAR_disableOutputMux(uint32_t base, XBAR_OutputNum output, uint32_t muxes)
{
uint16_t outputNum = (uint16_t)output;
//
// Check the arguments.
//
;
//
// Clear the enable bit.
//
__eallow();
(*((volatile uint32_t *)(base + 0x20U + outputNum))) &= ~(muxes);
__edis();
}
//*****************************************************************************
//
//! Enables or disables the output latch to drive the selected output.
//!
//! \param base specifies the X-BAR base address.
//! \param output is the X-BAR output being configured.
//! The valid inputs are XBAR_OUTPUTy where y is from 1 to 8.
//! \param enable is a flag that determines whether or not the latch is
//! selected to drive the X-BAR output.
//!
//! The \e base parameter can take base addresses
//! OUTPUTXBAR_BASE
//! or CLBOUTPUTXBAR_BASE.
//!
//! This function sets the Output X-BAR output signal latch mode. If the
//! \e enable parameter is \b true, the output specified by \e output will be
//! driven by the output latch.
//!
//! \return None.
//
//*****************************************************************************
static inline void
XBAR_setOutputLatchMode(uint32_t base, XBAR_OutputNum output, _Bool enable)
{
//
// Check the arguments.
//
;
__eallow();
//
// Set or clear the latch setting bit based on the enable parameter.
//
if(enable)
{
(*((volatile uint16_t *)(base + 0x36U))) |=
0x1U << ((uint16_t)output / 2U);
}
else
{
(*((volatile uint16_t *)(base + 0x36U))) &=
~(0x1U << ((uint16_t)output / 2U));
}
__edis();
}
//*****************************************************************************
//
//! Returns the status of the output latch
//!
//! \param base specifies the X-BAR base address.
//! \param output is the X-BAR output being checked.
//! The valid inputs are XBAR_OUTPUTy where y is from 1 to 8.
//!
//! The \e base parameter can take base addresses
//! OUTPUTXBAR_BASE
//! or CLBOUTPUTXBAR_BASE.
//!
//! \return Returns \b true if the output corresponding to \e output was
//! triggered. If not, it will return \b false.
//
//*****************************************************************************
static inline _Bool
XBAR_getOutputLatchStatus(uint32_t base, XBAR_OutputNum output)
{
//
// Check the arguments.
//
;
//
// Get the status of the Output X-BAR output latch.
//
return(((*((volatile uint16_t *)(base + 0x30U))) &
(0x1U << ((uint16_t)output / 2U))) != 0U);
}
//*****************************************************************************
//
//! Clears the output latch for the specified output.
//!
//! \param base specifies the X-BAR base address.
//! \param output is the X-BAR output being configured.
//! The valid inputs are XBAR_OUTPUTy where y is from 1 to 8.
//!
//! The \e base parameter can take base addresses
//! OUTPUTXBAR_BASE
//! or CLBOUTPUTXBAR_BASE.
//!
//! This function clears the Output X-BAR output latch. The output to be
//! configured is specified by the \e output parameter.
//!
//! \return None.
//
//*****************************************************************************
static inline void
XBAR_clearOutputLatch(uint32_t base, XBAR_OutputNum output)
{
//
// Check the arguments.
//
;
//
// Set the bit that clears the corresponding OUTPUTLATCH bit.
//
(*((volatile uint16_t *)(base + 0x32U))) |=
0x1U << ((uint16_t)output / 2U);
}
//*****************************************************************************
//
//! Forces the output latch for the specified output.
//!
//! \param base specifies the X-BAR base address.
//! \param output is the X-BAR output being configured.
//! The valid inputs are XBAR_OUTPUTy where y is from 1 to 8.
//!
//! The \e base parameter can take base addresses
//! OUTPUTXBAR_BASE
//! or CLBOUTPUTXBAR_BASE.
//!
//! This function forces the Output X-BAR output latch. The output to be
//! configured is specified by the \e output parameter.
//!
//! \return None.
//
//*****************************************************************************
static inline void
XBAR_forceOutputLatch(uint32_t base, XBAR_OutputNum output)
{
//
// Check the arguments.
//
;
//
// Set the bit that forces the corresponding OUTPUTLATCH bit.
//
(*((volatile uint16_t *)(base + 0x34U))) =
(uint16_t)0x1U << ((uint16_t)output / 2U);
}
//*****************************************************************************
//
//! Configures the polarity of an Output X-BAR output.
//!
//! \param base specifies the X-BAR base address.
//! \param output is the X-BAR output being configured.
//! The valid inputs are XBAR_OUTPUTy where y is from 1 to 8.
//! \param invert is a flag that determines whether the output is active-high
//! or active-low.
//!
//! The \e base parameter can take base addresses
//! OUTPUTXBAR_BASE
//! or CLBOUTPUTXBAR_BASE.
//!
//! This function inverts the Output X-BAR signal if the \e invert parameter is
//! \b true. If \e invert is \b false, the signal will be passed as is. The
//! \e output parameter is a value \b XBAR_OUTPUTy where y is the output
//! number between 1 and 8 inclusive.
//!
//! \return None.
//
//*****************************************************************************
static inline void
XBAR_invertOutputSignal(uint32_t base, XBAR_OutputNum output, _Bool invert)
{
//
// Check the arguments.
//
;
//
// Set or clear the polarity setting bit based on the invert parameter.
//
__eallow();
if(invert)
{
(*((volatile uint16_t *)(base + 0x38U))) |=
0x1U << ((uint16_t)output / 2U);
}
else
{
(*((volatile uint16_t *)(base + 0x38U))) &=
~(0x1U << ((uint16_t)output / 2U));
}
__edis();
}
//*****************************************************************************
//
//! Enables the ePWM X-BAR mux values to be passed to an ePWM module.
//!
//! \param trip is the X-BAR output being configured.
//! \param muxes is a bit field of the muxes to be enabled.
//!
//! This function enables the mux values to be passed to the X-BAR trip
//! signal. The \e trip parameter is a value \b XBAR_TRIPy where y is
//! the number of the trip signal on the ePWM.
//!
//! The \e muxes parameter is a bit field of the muxes being enabled where bit
//! 0 represents mux 0, bit 1 represents mux 1 and so on. Defines are provided
//! in the form of \b XBAR_MUXnn that can be logically OR'd together to
//! enable several muxes on an output at the same time.
//!
//! \return None.
//
//*****************************************************************************
static inline void
XBAR_enableEPWMMux(XBAR_TripNum trip, uint32_t muxes)
{
//
// Set the enable bit.
//
__eallow();
(*((volatile uint32_t *)((0x00007A00U + 0x20U) + (uint32_t)trip))) |= muxes;
__edis();
}
//*****************************************************************************
//
//! Disables the ePWM X-BAR mux values to be passed to an ePWM module.
//!
//! \param trip is the X-BAR output being configured.
//! \param muxes is a bit field of the muxes to be disabled.
//!
//! This function disables the mux values to be passed to the X-BAR trip
//! signal. The \e trip parameter is a value \b XBAR_TRIPy where y is
//! the number of the trip signal on the ePWM.
//!
//! The \e muxes parameter is a bit field of the muxes being disabled where bit
//! 0 represents mux 0, bit 1 represents mux 1 and so on. Defines are provided
//! in the form of \b XBAR_MUXnn that can be logically OR'd together to
//! disable several muxes on an output at the same time.
//!
//! \return None.
//
//*****************************************************************************
static inline void
XBAR_disableEPWMMux(XBAR_TripNum trip, uint32_t muxes)
{
//
// Clear the enable bit.
//
__eallow();
(*((volatile uint32_t *)((0x00007A00U + 0x20U) + (uint32_t)trip))) &= ~(muxes);
__edis();
}
//*****************************************************************************
//
//! Configures the polarity of an ePWM X-BAR output.
//!
//! \param trip is the X-BAR output being configured.
//! \param invert is a flag that determines whether the output is active-high
//! or active-low.
//!
//! This function inverts the ePWM X-BAR trip signal if the \e invert
//! parameter is \b true. If \e invert is \b false, the signal will be passed
//! as is. The \e trip parameter is a value \b XBAR_TRIPy where y is
//! the number of the trip signal on the ePWM X-BAR that is being configured.
//!
//! \return None.
//
//*****************************************************************************
static inline void
XBAR_invertEPWMSignal(XBAR_TripNum trip, _Bool invert)
{
//
// Set or clear the polarity setting bit based on the invert parameter.
//
__eallow();
if(invert)
{
(*((volatile uint16_t *)(0x00007A00U + 0x38U))) |=
0x1U << ((uint16_t)trip / 2U);
}
else
{
(*((volatile uint16_t *)(0x00007A00U + 0x38U))) &=
~(0x1U << ((uint16_t)trip / 2U));
}
__edis();
}
//*****************************************************************************
//
//! Sets the GPIO / non-GPIO pin for an Input X-BAR input.
//!
//! \param base specifies the X-BAR base address.
//! \param input is the X-BAR input being configured.
//! \param pin is the identifying number of the pin.
//!
//! The \e base parameter can take base addresses
//! INPUTXBAR_BASE
//! or CLBINPUTXBAR_BASE.
//!
//! This function configures which GPIO is assigned to an Input X-BAR input.
//! The \e input parameter is a value in the form of a define \b XBAR_INPUTy
//! where y is a the input number for the Input X-BAR.
//!
//! The pin is specified by its numerical value. For example, GPIO34 is
//! specified by passing 34 as \e pin.
//!
//! For the other non - GPIO values:
//! 0xFFFD: '1' will be driven to the destination
//! 0xFFFE: '1' will be driven to the destination
//! 0xFFFF: '0' will be driven to the destination
//! NOTE: Pin value greater than the available number of GPIO pins on a
//! device (except 0xFFFF) will cause the destination to be driven '1'.
//!
//! \return None.
//
//*****************************************************************************
static inline void
XBAR_setInputPin(uint32_t base, XBAR_InputNum input, uint16_t pin)
{
//
// Check the argument.
//
;
;
//
// Write the requested pin to the appropriate input select register.
//
__eallow();
(*((volatile uint16_t *)(base + 0x0U + (uint16_t)input))) = pin;
__edis();
}
//*****************************************************************************
//
//! Locks an input to the Input X-BAR.
//!
//! \param base specifies the X-BAR base address.
//! \param input is an input to the Input X-BAR.
//!
//! This function locks the specific input on the Input X-BAR.
//!
//! The \e base parameter can take base addresses
//! INPUTXBAR_BASE
//! or CLBINPUTXBAR_BASE .
//!
//! \return None.
//
//*****************************************************************************
static inline void
XBAR_lockInput(uint32_t base, XBAR_InputNum input)
{
//
// Check the arguments.
//
;
//
// lock the input in the INPUTSELECTLOCK register.
//
__eallow();
(*((volatile uint32_t *)(base + 0x1EU))) =
1UL << (uint16_t)input;
__edis();
}
//*****************************************************************************
//
//! Locks the Output X-BAR.
//!
//! \param base specifies the X-BAR base address.
//! This function locks the Output X-BAR.
//!
//! The \e base parameter can take base addresses
//! OUTPUTXBAR_BASE
//! or CLBOUTPUTXBAR_BASE.
//!
//! \return None.
//
//*****************************************************************************
static inline void
XBAR_lockOutput(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Lock the Output X-BAR with the OUTPUTLOCK register.
// Write key 0x5A5A to the KEY bits and 1 to LOCK bit.
//
__eallow();
(*((volatile uint32_t *)(base + 0x3EU))) =
((uint32_t)0x5A5A << 16U) |
(uint32_t)0x1U;
__edis();
}
//*****************************************************************************
//
//! Locks the ePWM X-BAR.
//!
//! This function locks the ePWM X-BAR.
//!
//! \return None.
//
//*****************************************************************************
static inline void
XBAR_lockEPWM(void)
{
//
// Lock the ePWM X-BAR with the TRIPLOCK register.
// Write key 0x5A5A to the KEY bits and 1 to LOCK bit.
//
__eallow();
(*((volatile uint32_t *)(0x00007A00U + 0x3EU))) =
((uint32_t)0x5A5A << 16U) |
(uint32_t)0x1U;
__edis();
}
//*****************************************************************************
//
//! Enables the CLB X-BAR mux values to be passed to an CLB module.
//!
//! \param auxSignal is the X-BAR output being configured.
//! \param muxes is a bit field of the muxes to be enabled.
//!
//! This function enables the mux values to be passed to the X-BAR auxSignal
//! signal. The \e auxSignal parameter is a value \b XBAR_AUXSIGy where y is
//! the number of the signal on the CLB.
//!
//! The \e muxes parameter is a bit field of the muxes being enabled where bit
//! 0 represents mux 0, bit 1 represents mux 1 and so on. Defines are provided
//! in the form of \b XBAR_MUXnn that can be logically OR'd together to
//! enable several muxes on an output at the same time.
//!
//! \return None.
//
//*****************************************************************************
static inline void
XBAR_enableCLBMux(XBAR_AuxSigNum auxSignal, uint32_t muxes)
{
//
// Set the enable bit.
//
__eallow();
(*((volatile uint32_t *)((0x00007A40U + 0x20U) + (uint32_t)auxSignal))) |= muxes;
__edis();
}
//*****************************************************************************
//
//! Disables the CLB X-BAR mux values to be passed to an CLB module.
//!
//! \param auxSignal is the X-BAR output being configured.
//! \param muxes is a bit field of the muxes to be disabled.
//!
//! This function disables the mux values to be passed to the X-BAR auxSignal
//! signal. The \e auxSignal parameter is a value \b XBAR_AUXSIGy where y is
//! the number of the signal on the CLB.
//!
//! The \e muxes parameter is a bit field of the muxes being disabled where bit
//! 0 represents mux 0, bit 1 represents mux 1 and so on. Defines are provided
//! in the form of \b XBAR_MUXnn that can be logically OR'd together to
//! disable several muxes on an output at the same time.
//!
//! \return None.
//
//*****************************************************************************
static inline void
XBAR_disableCLBMux(XBAR_AuxSigNum auxSignal, uint32_t muxes)
{
//
// Clear the enable bit.
//
__eallow();
(*((volatile uint32_t *)((0x00007A40U + 0x20U) + (uint32_t)auxSignal))) &= ~(muxes);
__edis();
}
//*****************************************************************************
//
//! Configures the polarity of an CLB X-BAR output.
//!
//! \param auxSignal is the X-BAR output being configured.
//! \param invert is a flag that determines whether the output is active-high
//! or active-low.
//!
//! This function inverts the CLB X-BAR auxSignal signal if the \e invert
//! parameter is \b true. If \e invert is \b false, the signal will be passed
//! as is. The \e auxSignal parameter is a value \b XBAR_AUXSIGy where y is
//! the number of the signal on the CLB X-BAR that is being configured.
//!
//! \return None.
//
//*****************************************************************************
static inline void
XBAR_invertCLBSignal(XBAR_AuxSigNum auxSignal, _Bool invert)
{
//
// Set or clear the polarity setting bit based on the invert parameter.
//
__eallow();
if(invert)
{
(*((volatile uint16_t *)(0x00007A40U + 0x38U))) |=
0x1U << ((uint16_t)auxSignal / 2U);
}
else
{
(*((volatile uint16_t *)(0x00007A40U + 0x38U))) &=
~(0x1U << ((uint16_t)auxSignal / 2U));
}
__edis();
}
//*****************************************************************************
//
//! Configures the Output X-BAR mux that determines the signals passed to an
//! output.
//!
//! \param base specifies the X-BAR Config Register base address.
//! \param output is the X-BAR output being configured.
//! \param muxConfig is mux configuration that specifies the signal.
//!
//! This function configures an Output X-BAR mux. This determines which
//! signal(s) should be passed through the X-BAR to a GPIO. The \e output
//! parameter is a value \b XBAR_OUTPUTy where y is a the output number
//! between 1 and 8 inclusive.
//!
//! The \e base parameter can take base addresses
//! OUTPUTXBAR_BASE
//! or CLBOUTPUTXBAR_BASE.
//!
//! The \e muxConfig parameter for OUTPUT XBAR is the mux configuration
//! value that specifies which signal will be passed from the mux. The
//! values have the format of \b XBAR_OUT_MUXnn_xx where the 'xx' is
//! the signal and nn is the mux number.
//!
//! The \e muxConfig parameter for the CLB OUTPUT XBAR have the similar
//! format as \b XBAR_OUT_MUXnn_xx where the 'xx' is the signal and nn is
//! the mux number.
//!
//! This function may be called for each mux of an output and their values will
//! be logically OR'd before being passed to the output signal. This means that
//! this function may be called, for example, with the argument
//! \b XBAR_OUT_MUX00_ECAP1_OUT and then with the argument
//! \b XBAR_OUT_MUX01_INPUTXBAR1, resulting in the values of MUX00 and MUX01
//! being logically OR'd if both are enabled. Calling the function twice for
//! the same mux on the output will result in the configuration in the second
//! call overwriting the first.
//!
//! \return None.
//
//*****************************************************************************
extern void
XBAR_setOutputMuxConfig(uint32_t base, XBAR_OutputNum output,
XBAR_OutputMuxConfig muxConfig);
//*****************************************************************************
//
//! Configures the ePWM X-BAR mux that determines the signals passed to an
//! ePWM module.
//!
//! \param trip is the X-BAR output being configured.
//! \param muxConfig is mux configuration that specifies the signal.
//!
//! This function configures an ePWM X-BAR mux. This determines which signal(s)
//! should be passed through the X-BAR to an ePWM module. The \e trip
//! parameter is a value \b XBAR_TRIPy where y is a the number of the trip
//! signal on the ePWM.
//!
//! The \e muxConfig parameter is the mux configuration value that specifies
//! which signal will be passed from the mux. The values have the format of
//! \b XBAR_EPWM_MUXnn_xx where the 'xx' is the signal and nn is the mux
//! number (0 through 31). The possible values are found in xbar.h
//!
//! This function may be called for each mux of an output and their values will
//! be logically OR'd before being passed to the trip signal. This means that
//! this function may be called, for example, with the argument
//! \b XBAR_EPWM_MUX00_ECAP1_OUT and then with the argument
//! \b XBAR_EPWM_MUX01_INPUTXBAR1, resulting in the values of MUX00 and MUX01
//! being logically OR'd if both are enabled. Calling the function twice for
//! the same mux on the output will result in the configuration in the second
//! call overwriting the first.
//!
//! \return None.
//
//*****************************************************************************
extern void
XBAR_setEPWMMuxConfig(XBAR_TripNum trip, XBAR_EPWMMuxConfig muxConfig);
//*****************************************************************************
//
//! Returns the status of the input latch.
//!
//! \param inputFlag is the X-BAR input latch being checked. Values are in the
//! format of /b XBAR_INPUT_FLG_XXXX where "XXXX" is name of the signal.
//!
//! \return Returns \b true if the X-BAR input corresponding to the
//! \e inputFlag has been triggered. If not, it will return \b false.
//
//*****************************************************************************
extern _Bool
XBAR_getInputFlagStatus(XBAR_InputFlag inputFlag);
//*****************************************************************************
//
//! Clears the input latch for the specified input latch.
//!
//! \param inputFlag is the X-BAR input latch being cleared.
//!
//! This function clears the Input X-BAR input latch. The input latch to be
//! cleared is specified by the \e inputFlag parameter.
//!
//! \return None.
//
//*****************************************************************************
extern void
XBAR_clearInputFlag(XBAR_InputFlag inputFlag);
//*****************************************************************************
//
//! Configures the CLB X-BAR mux that determines the signals passed to a
//! CLB module.
//!
//! \param auxSignal is the X-BAR output being configured.
//! \param muxConfig is mux configuration that specifies the signal.
//!
//! This function configures an CLB X-BAR mux. This determines which signal(s)
//! should be passed through the X-BAR to an CLB module. The \e auxSignal
//! parameter is a value \b XBAR_AUXSIGy where y is a the number of the
//! signal on the CLB.
//!
//! The \e muxConfig parameter is the mux configuration value that specifies
//! which signal will be passed from the mux. The values have the format of
//! \b XBAR_CLB_MUXnn_xx where the 'xx' is the signal and nn is the mux
//! number (0 through 31). The possible values are found in xbar.h
//!
//! This function may be called for each mux of an output and their values will
//! be logically OR'd before being passed to the signal. This means that
//! this function may be called, for example, with the argument
//! \b XBAR_CLB_MUX00_ECAP1_OUT and then with the argument
//! \b XBAR_CLB_MUX03_INPUTXBAR2, resulting in the values of MUX00 and MUX03
//! being logically OR'd if both are enabled. Calling the function twice for
//! the same mux on the output will result in the configuration in the second
//! call overwriting the first.
//!
//! \return None.
//
//*****************************************************************************
extern void XBAR_setCLBMuxConfig(XBAR_AuxSigNum auxSignal,
XBAR_CLBMuxConfig muxConfig);
//*****************************************************************************
//
// Close the Doxygen group.
//! @}
//
//*****************************************************************************
//*****************************************************************************
//
// Mark the end of the C bindings section for C++ compilers.
//
//*****************************************************************************
//*****************************************************************************
//
// Useful defines used within the driver functions to access gpio registers.
// Not intended for use by application code.
//
// Divide by 2 is for C28x which has word access
//
//*****************************************************************************
//*****************************************************************************
//
// Values that can be passed to GPIO_setPadConfig() as the pinType parameter
// and returned by GPIO_getPadConfig().
//
//*****************************************************************************
//*****************************************************************************
//
//! Values that can be passed to GPIO_setDirectionMode() as the \e pinIO
//! parameter and returned from GPIO_getDirectionMode().
//
//*****************************************************************************
typedef enum
{
GPIO_DIR_MODE_IN, //!< Pin is a GPIO input
GPIO_DIR_MODE_OUT //!< Pin is a GPIO output
} GPIO_Direction;
//*****************************************************************************
//
//! Values that can be passed to GPIO_setInterruptType() as the \e intType
//! parameter and returned from GPIO_getInterruptType().
//
//*****************************************************************************
typedef enum
{
GPIO_INT_TYPE_FALLING_EDGE = 0x00, //!< Interrupt on falling edge
GPIO_INT_TYPE_RISING_EDGE = 0x04, //!< Interrupt on rising edge
GPIO_INT_TYPE_BOTH_EDGES = 0x0C //!< Interrupt on both edges
} GPIO_IntType;
//*****************************************************************************
//
//! Values that can be passed to GPIO_setQualificationMode() as the
//! \e qualification parameter and returned by GPIO_getQualificationMode().
//
//*****************************************************************************
typedef enum
{
GPIO_QUAL_SYNC, //!< Synchronization to SYSCLK
GPIO_QUAL_3SAMPLE, //!< Qualified with 3 samples
GPIO_QUAL_6SAMPLE, //!< Qualified with 6 samples
GPIO_QUAL_ASYNC //!< No synchronization
} GPIO_QualificationMode;
//*****************************************************************************
//
//! Values that can be passed to GPIO_setAnalogMode() as the \e mode parameter.
//
//*****************************************************************************
typedef enum
{
GPIO_ANALOG_DISABLED, //!< Pin is in digital mode
GPIO_ANALOG_ENABLED //!< Pin is in analog mode
} GPIO_AnalogMode;
//*****************************************************************************
//
//! Values that can be passed to GPIO_setControllerCore() as the \e core
//! parameter.
//
//*****************************************************************************
typedef enum
{
GPIO_CORE_CPU1, //!< CPU1 selected as controller core
GPIO_CORE_CPU1_CLA1 //!< CPU1's CLA1 selected as controller core
} GPIO_CoreSelect;
//*****************************************************************************
//
//! Values that can be passed to GPIO_readPortData(), GPIO_setPortPins(),
//! GPIO_clearPortPins(), and GPIO_togglePortPins() as the \e port parameter.
//
//*****************************************************************************
typedef enum
{
GPIO_PORT_A = 0, //!< GPIO port A
GPIO_PORT_B = 1, //!< GPIO port B
GPIO_PORT_H = 7 //!< GPIO port H
} GPIO_Port;
//*****************************************************************************
//
//! Values that can be passed to GPIO_setInterruptPin(),
//! GPIO_setInterruptType(), GPIO_getInterruptType(), GPIO_enableInterrupt(),
//! GPIO_disableInterrupt(), as the \e extIntNum parameter.
//
//*****************************************************************************
typedef enum
{
GPIO_INT_XINT1, //!< External Interrupt 1
GPIO_INT_XINT2, //!< External Interrupt 2
GPIO_INT_XINT3, //!< External Interrupt 3
GPIO_INT_XINT4, //!< External Interrupt 4
GPIO_INT_XINT5 //!< External Interrupt 5
} GPIO_ExternalIntNum;
//*****************************************************************************
//
// Prototypes for the APIs.
//
//*****************************************************************************
//*****************************************************************************
//
//! \internal
//! Checks that a pin number is valid for a device.
//!
//! Note that this function reflects the highest possible GPIO number of a
//! device on its biggest package. Check the datasheet to see what the actual
//! range of valid pin numbers is for a specific package.
//!
//! \return None.
//
//*****************************************************************************
//*****************************************************************************
//
//! Sets the interrupt type for the specified pin.
//!
//! \param extIntNum specifies the external interrupt.
//! \param intType specifies the type of interrupt trigger mechanism.
//!
//! This function sets up the various interrupt trigger mechanisms for the
//! specified pin on the selected GPIO port.
//!
//! The following defines can be used to specify the external interrupt for the
//! \e extIntNum parameter:
//!
//! - \b GPIO_INT_XINT1
//! - \b GPIO_INT_XINT2
//! - \b GPIO_INT_XINT3
//! - \b GPIO_INT_XINT4
//! - \b GPIO_INT_XINT5
//!
//! One of the following flags can be used to define the \e intType
//! parameter:
//!
//! - \b GPIO_INT_TYPE_FALLING_EDGE sets detection to edge and trigger to
//! falling
//! - \b GPIO_INT_TYPE_RISING_EDGE sets detection to edge and trigger to rising
//! - \b GPIO_INT_TYPE_BOTH_EDGES sets detection to both edges
//!
//! \return None.
//
//*****************************************************************************
static inline void
GPIO_setInterruptType(GPIO_ExternalIntNum extIntNum, GPIO_IntType intType)
{
//
// Write the selected polarity to the appropriate register.
//
(*((volatile uint16_t *)(0x00007070U + (uint16_t)extIntNum))) =
((*((volatile uint16_t *)(0x00007070U + (uint16_t)extIntNum))) & ~0xCU) |
(uint16_t)intType;
}
//*****************************************************************************
//
//! Gets the interrupt type for a pin.
//!
//! \param extIntNum specifies the external interrupt.
//!
//! This function gets the interrupt type for a interrupt. The interrupt can be
//! configured as a falling-edge, rising-edge, or both-edges detected
//! interrupt.
//!
//! The following defines can be used to specify the external interrupt for the
//! \e extIntNum parameter:
//!
//! - \b GPIO_INT_XINT1
//! - \b GPIO_INT_XINT2
//! - \b GPIO_INT_XINT3
//! - \b GPIO_INT_XINT4
//! - \b GPIO_INT_XINT5
//!
//! \return Returns one of the flags described for GPIO_setInterruptType().
//
//*****************************************************************************
static inline GPIO_IntType
GPIO_getInterruptType(GPIO_ExternalIntNum extIntNum)
{
//
// Read the selected polarity from the appropriate register.
//
return((GPIO_IntType)((uint16_t)((*((volatile uint16_t *)(0x00007070U + (uint16_t)extIntNum))) &
0xCU)));
}
//*****************************************************************************
//
//! Enables the specified external interrupt.
//!
//! \param extIntNum specifies the external interrupt.
//!
//! This function enables the indicated external interrupt sources. Only the
//! sources that are enabled can be reflected to the processor interrupt.
//! Disabled sources have no effect on the processor.
//!
//! The following defines can be used to specify the external interrupt for the
//! \e extIntNum parameter:
//!
//! - \b GPIO_INT_XINT1
//! - \b GPIO_INT_XINT2
//! - \b GPIO_INT_XINT3
//! - \b GPIO_INT_XINT4
//! - \b GPIO_INT_XINT5
//!
//! \return None.
//
//*****************************************************************************
static inline void
GPIO_enableInterrupt(GPIO_ExternalIntNum extIntNum)
{
//
// Set the enable bit for the specified interrupt.
//
(*((volatile uint16_t *)(0x00007070U + (uint16_t)extIntNum))) |= 0x1U;
}
//*****************************************************************************
//
//! Disables the specified external interrupt.
//!
//! \param extIntNum specifies the external interrupt.
//!
//! This function disables the indicated external interrupt sources. Only the
//! sources that are enabled can be reflected to the processor interrupt.
//! Disabled sources have no effect on the processor.
//!
//! The following defines can be used to specify the external interrupt for the
//! \e extIntNum parameter:
//!
//! - \b GPIO_INT_XINT1
//! - \b GPIO_INT_XINT2
//! - \b GPIO_INT_XINT3
//! - \b GPIO_INT_XINT4
//! - \b GPIO_INT_XINT5
//!
//! \return None.
//
//*****************************************************************************
static inline void
GPIO_disableInterrupt(GPIO_ExternalIntNum extIntNum)
{
//
// Clear the enable bit for the specified interrupt
//
(*((volatile uint16_t *)(0x00007070U + (uint16_t)extIntNum))) &= ~0x1U;
}
//*****************************************************************************
//
//! Gets the value of the external interrupt counter.
//!
//! \param extIntNum specifies the external interrupt.
//!
//! The following defines can be used to specify the external interrupt for the
//! \e extIntNum parameter:
//!
//! - \b GPIO_INT_XINT1
//! - \b GPIO_INT_XINT2
//! - \b GPIO_INT_XINT3
//!
//! \b Note: The counter is clocked at the SYSCLKOUT rate.
//!
//! \return Returns external interrupt counter value.
//
//*****************************************************************************
static inline uint16_t
GPIO_getInterruptCounter(GPIO_ExternalIntNum extIntNum)
{
;
//
// Read the counter value from the appropriate register.
//
return(((*((volatile uint16_t *)(0x00007070U + 0x8U + (uint16_t)extIntNum)))));
}
//*****************************************************************************
//
//! Reads the value present on the specified pin.
//!
//! \param pin is the identifying GPIO number of the pin.
//!
//! The value at the specified pin are read, as specified by \e pin. The value
//! is returned for both input and output pins.
//!
//! The pin is specified by its numerical value. For example, GPIO34 is
//! specified by passing 34 as \e pin.
//!
//! \return Returns the value in the data register for the specified pin.
//
//*****************************************************************************
static inline uint32_t
GPIO_readPin(uint32_t pin)
{
volatile uint32_t *gpioDataReg;
//
// Check the arguments.
//
;
gpioDataReg = (uint32_t *)((uintptr_t)0x00007F00U) +
((pin / 32U) * ((0x8U - 0x0U) / 2U));
return((gpioDataReg[(0x0U / 2U)] >> (pin % 32U)) & (uint32_t)0x1U);
}
//*****************************************************************************
//
//! Reads the data register value for specified pin.
//!
//! \param pin is the identifying GPIO number of the pin.
//!
//! The value available at the data register for the specified pin is read, as
//! specified by \e pin. The value is returned for both input and output pins.
//!
//! The pin is specified by its numerical value. For example, GPIO34 is
//! specified by passing 34 as \e pin.
//!
//! \sa GPIO_readPin()
//!
//! \return Returns the value in the data register for the specified pin.
//
//*****************************************************************************
static inline uint32_t
GPIO_readPinDataRegister(uint32_t pin)
{
volatile uint32_t *gpioDataReg;
//
// Check the arguments.
//
;
gpioDataReg = (uint32_t *)((uintptr_t)0x00007F80U) +
((pin / 32U) * ((0x2U - 0x0U) / 2U));
return((gpioDataReg[(0x0U / 2U)] >> (pin % 32U)) & (uint32_t)0x1U);
}
//*****************************************************************************
//
//! Writes a value to the specified pin.
//!
//! \param pin is the identifying GPIO number of the pin.
//! \param outVal is the value to write to the pin.
//!
//! Writes the corresponding bit values to the output pin specified by
//! \e pin. Writing to a pin configured as an input pin has no effect.
//!
//! The pin is specified by its numerical value. For example, GPIO34 is
//! specified by passing 34 as \e pin.
//!
//! \return None.
//
//*****************************************************************************
static inline void
GPIO_writePin(uint32_t pin, uint32_t outVal)
{
volatile uint32_t *gpioDataReg;
uint32_t pinMask;
//
// Check the arguments.
//
;
gpioDataReg = (uint32_t *)((uintptr_t)0x00007F00U) +
((pin / 32U) * ((0x8U - 0x0U) / 2U));
pinMask = (uint32_t)1U << (pin % 32U);
if(outVal == 0U)
{
gpioDataReg[(0x4U / 2U)] = pinMask;
}
else
{
gpioDataReg[(0x2U / 2U)] = pinMask;
}
}
//*****************************************************************************
//
//! Toggles the specified pin.
//!
//! \param pin is the identifying GPIO number of the pin.
//!
//! Writes the corresponding bit values to the output pin specified by
//! \e pin. Writing to a pin configured as an input pin has no effect.
//!
//! The pin is specified by its numerical value. For example, GPIO34 is
//! specified by passing 34 as \e pin.
//!
//! \return None.
//
//*****************************************************************************
static inline void
GPIO_togglePin(uint32_t pin)
{
volatile uint32_t *gpioDataReg;
//
// Check the arguments.
//
;
gpioDataReg = (uint32_t *)((uintptr_t)0x00007F00U) +
((pin / 32U) * ((0x8U - 0x0U) / 2U));
gpioDataReg[(0x6U / 2U)] = (uint32_t)1U << (pin % 32U);
}
//*****************************************************************************
//
//! Reads the data on the specified port.
//!
//! \param port is the GPIO port being accessed in the form of \b GPIO_PORT_X
//! where X is the port letter.
//!
//! \return Returns the value available on pin for the specified port. Each
//! bit of the the return value represents a pin on the port, where bit 0
//! represents GPIO port pin 0, bit 1 represents GPIO port pin 1, and so on.
//
//*****************************************************************************
static inline uint32_t
GPIO_readPortData(GPIO_Port port)
{
volatile uint32_t *gpioDataReg;
//
// Get the starting address of the port's registers and return DATA.
//
gpioDataReg = (uint32_t *)((uintptr_t)0x00007F00U) +
((uint32_t)port * ((0x8U - 0x0U) / 2U));
return(gpioDataReg[(0x0U / 2U)]);
}
//*****************************************************************************
//
//! Reads the data written in GPIO Data Register.
//!
//! \param port is the GPIO port being accessed in the form of \b GPIO_PORT_X
//! where X is the port letter.
//!
//! Reads the data written in GPIO Data Register for the specified port. In
//! previous devices, read of GPIO data registers resulted in read of
//! corespoinding pins. The function \b GPIO_readPortData() returns the value
//! on pin.
//!
//! \sa GPIO_readPortData()
//!
//! \return Returns the value in the data register for the specified port. Each
//! bit of the the return value represents a pin on the port, where bit 0
//! represents GPIO port pin 0, bit 1 represents GPIO port pin 1, and so on.
//
//*****************************************************************************
static inline uint32_t
GPIO_readPortDataRegister(GPIO_Port port)
{
volatile uint32_t *gpioDataReg;
//
// Get the starting address of the port's registers and return DATA.
//
gpioDataReg = (uint32_t *)((uintptr_t)0x00007F80U) +
((uint32_t)port * ((0x2U - 0x0U) / 2U));
return(gpioDataReg[(0x0U / 2U)]);
}
//*****************************************************************************
//
//! Writes a value to the specified port.
//!
//! \param port is the GPIO port being accessed.
//! \param outVal is the value to write to the port.
//!
//! This function writes the value \e outVal to the port specified by the
//! \e port parameter which takes a value in the form of \b GPIO_PORT_X where X
//! is the port letter. For example, use \b GPIO_PORT_A to affect port A
//! (GPIOs 0-31).
//!
//! The \e outVal is a bit-packed value, where each bit represents a bit on a
//! GPIO port. Bit 0 represents GPIO port pin 0, bit 1 represents GPIO port
//! pin 1, and so on.
//!
//! \return None.
//
//*****************************************************************************
static inline void
GPIO_writePortData(GPIO_Port port, uint32_t outVal)
{
volatile uint32_t *gpioDataReg;
//
// Get the starting address of the port's registers and write to DATA.
//
gpioDataReg = (uint32_t *)((uintptr_t)0x00007F00U) +
((uint32_t)port * ((0x8U - 0x0U) / 2U));
gpioDataReg[(0x0U / 2U)] = outVal;
}
//*****************************************************************************
//
//! Sets all of the specified pins on the specified port.
//!
//! \param port is the GPIO port being accessed.
//! \param pinMask is a mask of which of the 32 pins on the port are affected.
//!
//! This function sets all of the pins specified by the \e pinMask parameter on
//! the port specified by the \e port parameter which takes a value in the
//! form of \b GPIO_PORT_X where X is the port letter. For example, use
//! \b GPIO_PORT_A to affect port A (GPIOs 0-31).
//!
//! The \e pinMask is a bit-packed value, where each bit that is set identifies
//! the pin to be set. Bit 0 represents GPIO port pin 0, bit 1 represents GPIO
//! port pin 1, and so on.
//!
//! \return None.
//
//*****************************************************************************
static inline void
GPIO_setPortPins(GPIO_Port port, uint32_t pinMask)
{
volatile uint32_t *gpioDataReg;
//
// Get the starting address of the port's registers and write to SET.
//
gpioDataReg = (uint32_t *)((uintptr_t)0x00007F00U) +
((uint32_t)port * ((0x8U - 0x0U) / 2U));
gpioDataReg[(0x2U / 2U)] = pinMask;
}
//*****************************************************************************
//
//! Clears all of the specified pins on the specified port.
//!
//! \param port is the GPIO port being accessed.
//! \param pinMask is a mask of which of the 32 pins on the port are affected.
//!
//! This function clears all of the pins specified by the \e pinMask parameter
//! on the port specified by the \e port parameter which takes a value in the
//! form of \b GPIO_PORT_X where X is the port letter. For example, use
//! \b GPIO_PORT_A to affect port A (GPIOs 0-31).
//!
//! The \e pinMask is a bit-packed value, where each bit that is \b set
//! identifies the pin to be cleared. Bit 0 represents GPIO port pin 0, bit 1
//! represents GPIO port pin 1, and so on.
//!
//! \return None.
//
//*****************************************************************************
static inline void
GPIO_clearPortPins(GPIO_Port port, uint32_t pinMask)
{
volatile uint32_t *gpioDataReg;
//
// Get the starting address of the port's registers and write to CLEAR.
//
gpioDataReg = (uint32_t *)((uintptr_t)0x00007F00U) +
((uint32_t)port * ((0x8U - 0x0U) / 2U));
gpioDataReg[(0x4U / 2U)] = pinMask;
}
//*****************************************************************************
//
//! Toggles all of the specified pins on the specified port.
//!
//! \param port is the GPIO port being accessed.
//! \param pinMask is a mask of which of the 32 pins on the port are affected.
//!
//! This function toggles all of the pins specified by the \e pinMask parameter
//! on the port specified by the \e port parameter which takes a value in the
//! form of \b GPIO_PORT_X where X is the port letter. For example, use
//! \b GPIO_PORT_A to affect port A (GPIOs 0-31).
//!
//! The \e pinMask is a bit-packed value, where each bit that is set identifies
//! the pin to be toggled. Bit 0 represents GPIO port pin 0, bit 1 represents
//! GPIO port pin 1, and so on.
//!
//! \return None.
//
//*****************************************************************************
static inline void
GPIO_togglePortPins(GPIO_Port port, uint32_t pinMask)
{
volatile uint32_t *gpioDataReg;
//
// Get the starting address of the port's registers and write to TOGGLE.
//
gpioDataReg = (uint32_t *)((uintptr_t)0x00007F00U) +
((uint32_t)port * ((0x8U - 0x0U) / 2U));
gpioDataReg[(0x6U / 2U)] = pinMask;
}
//*****************************************************************************
//
//! Locks the configuration of the specified pins on the specified port.
//!
//! \param port is the GPIO port being accessed.
//! \param pinMask is a mask of which of the 32 pins on the port are affected.
//!
//! This function locks the configuration registers of the pins specified by
//! the \e pinMask parameter on the port specified by the \e port parameter
//! which takes a value in the form of \b GPIO_PORT_X where X is the port
//! letter. For example, use \b GPIO_PORT_A to affect port A (GPIOs 0-31).
//!
//! The \e pinMask is a bit-packed value, where each bit that is set identifies
//! the pin to be locked. Bit 0 represents GPIO port pin 0, bit 1 represents
//! GPIO port pin 1, 0xFFFFFFFF represents all pins on that port, and so on.
//!
//! Note that this function is for locking the configuration of a pin such as
//! the pin muxing, direction, open drain mode, and other settings. It does not
//! affect the ability to change the value of the pin.
//!
//! \return None.
//
//*****************************************************************************
static inline void
GPIO_lockPortConfig(GPIO_Port port, uint32_t pinMask)
{
volatile uint32_t *gpioDataReg;
//
// Get the starting address of the port's registers and write to the lock.
//
gpioDataReg = (uint32_t *)((uintptr_t)0x00007C00U) +
((uint32_t)port * ((0x40U - 0x0U) / 2U));
__eallow();
gpioDataReg[(0x3CU / 2U)] |= pinMask;
__edis();
}
//*****************************************************************************
//
//! Unlocks the configuration of the specified pins on the specified port.
//!
//! \param port is the GPIO port being accessed.
//! \param pinMask is a mask of which of the 32 pins on the port are affected.
//!
//! This function unlocks the configuration registers of the pins specified by
//! the \e pinMask parameter on the port specified by the \e port parameter
//! which takes a value in the form of \b GPIO_PORT_X where X is the port
//! letter. For example, use \b GPIO_PORT_A to affect port A (GPIOs 0-31).
//!
//! The \e pinMask is a bit-packed value, where each bit that is set identifies
//! the pin to be unlocked. Bit 0 represents GPIO port pin 0, bit 1 represents
//! GPIO port pin 1, 0xFFFFFFFF represents all pins on that port, and so on.
//!
//! \return None.
//
//*****************************************************************************
static inline void
GPIO_unlockPortConfig(GPIO_Port port, uint32_t pinMask)
{
volatile uint32_t *gpioDataReg;
//
// Get the starting address of the port's registers and write to the lock.
//
gpioDataReg = (uint32_t *)((uintptr_t)0x00007C00U) +
((uint32_t)port * ((0x40U - 0x0U) / 2U));
__eallow();
gpioDataReg[(0x3CU / 2U)] &= ~pinMask;
__edis();
}
//*****************************************************************************
//
//! Commits the lock configuration of the specified pins on the specified port.
//!
//! \param port is the GPIO port being accessed.
//! \param pinMask is a mask of which of the 32 pins on the port are affected.
//!
//! This function commits the lock configuration registers of the pins
//! specified by the \e pinMask parameter on the port specified by the \e port
//! parameter which takes a value in the form of \b GPIO_PORT_X where X is the
//! port letter. For example, use \b GPIO_PORT_A to affect port A (GPIOs 0-31).
//!
//! The \e pinMask is a bit-packed value, where each bit that is set identifies
//! the pin to be locked. Bit 0 represents GPIO port pin 0, bit 1 represents
//! GPIO port pin 1, 0xFFFFFFFF represents all pins on that port, and so on.
//!
//! Note that once this function is called, GPIO_lockPortConfig() and
//! GPIO_unlockPortConfig() will no longer have any effect on the specified
//! pins.
//!
//! \return None.
//
//*****************************************************************************
static inline void
GPIO_commitPortConfig(GPIO_Port port, uint32_t pinMask)
{
volatile uint32_t *gpioDataReg;
//
// Get the starting address of the port's registers and write to the lock.
//
gpioDataReg = (uint32_t *)((uintptr_t)0x00007C00U) +
((uint32_t)port * ((0x40U - 0x0U) / 2U));
__eallow();
gpioDataReg[(0x3EU / 2U)] |= pinMask;
__edis();
}
//*****************************************************************************
//
//! Sets the direction and mode of the specified pin.
//!
//! \param pin is the identifying GPIO number of the pin.
//! \param pinIO is the pin direction mode.
//!
//! This function configures the specified pin on the selected GPIO port as
//! either input or output.
//!
//! The parameter \e pinIO is an enumerated data type that can be one of the
//! following values:
//!
//! - \b GPIO_DIR_MODE_IN
//! - \b GPIO_DIR_MODE_OUT
//!
//! where \b GPIO_DIR_MODE_IN specifies that the pin is programmed as an input
//! and \b GPIO_DIR_MODE_OUT specifies that the pin is programmed as an output.
//!
//! The pin is specified by its numerical value. For example, GPIO34 is
//! specified by passing 34 as \e pin.
//!
//! \return None.
//
//*****************************************************************************
extern void
GPIO_setDirectionMode(uint32_t pin, GPIO_Direction pinIO);
//*****************************************************************************
//
//! Gets the direction mode of a pin.
//!
//! \param pin is the identifying GPIO number of the pin.
//!
//! This function gets the direction mode for a specified pin. The pin can be
//! configured as either an input or output The type of direction is returned
//! as an enumerated data type.
//!
//! \return Returns one of the enumerated data types described for
//! GPIO_setDirectionMode().
//
//*****************************************************************************
extern GPIO_Direction
GPIO_getDirectionMode(uint32_t pin);
//*****************************************************************************
//
//! Sets the pin for the specified external interrupt.
//!
//! \param pin is the identifying GPIO number of the pin.
//! \param extIntNum specifies the external interrupt.
//!
//! This function sets which pin triggers the selected external interrupt.
//!
//! The following defines can be used to specify the external interrupt for the
//! \e extIntNum parameter:
//!
//! - \b GPIO_INT_XINT1
//! - \b GPIO_INT_XINT2
//! - \b GPIO_INT_XINT3
//! - \b GPIO_INT_XINT4
//! - \b GPIO_INT_XINT5
//!
//! The pin is specified by its numerical value. For example, GPIO34 is
//! specified by passing 34 as \e pin.
//!
//! \sa XBAR_setInputPin()
//!
//! \return None.
//
//*****************************************************************************
extern void
GPIO_setInterruptPin(uint32_t pin, GPIO_ExternalIntNum extIntNum);
//*****************************************************************************
//
//! Sets the pad configuration for the specified pin.
//!
//! \param pin is the identifying GPIO number of the pin.
//! \param pinType specifies the pin type.
//!
//! This function sets the pin type for the specified pin. The parameter
//! \e pinType can be the following values:
//!
//! - \b GPIO_PIN_TYPE_STD specifies a push-pull output or a floating input
//! - \b GPIO_PIN_TYPE_PULLUP specifies the pull-up is enabled for an input
//! - \b GPIO_PIN_TYPE_OD specifies an open-drain output pin
//! - \b GPIO_PIN_TYPE_INVERT specifies inverted polarity on an input
//!
//! \b GPIO_PIN_TYPE_INVERT may be OR-ed with \b GPIO_PIN_TYPE_STD or
//! \b GPIO_PIN_TYPE_PULLUP.
//!
//! The pin is specified by its numerical value. For example, GPIO34 is
//! specified by passing 34 as \e pin.
//!
//! \return None.
//
//*****************************************************************************
extern void
GPIO_setPadConfig(uint32_t pin, uint32_t pinType);
//*****************************************************************************
//
//! Gets the pad configuration for a pin.
//!
//! \param pin is the identifying GPIO number of the pin.
//!
//! This function returns the pin type for the specified pin. The value
//! returned corresponds to the values used in GPIO_setPadConfig().
//!
//! \return Returns a bit field of the values \b GPIO_PIN_TYPE_STD,
//! \b GPIO_PIN_TYPE_PULLUP, \b GPIO_PIN_TYPE_OD, and \b GPIO_PIN_TYPE_INVERT.
//
//*****************************************************************************
extern uint32_t
GPIO_getPadConfig(uint32_t pin);
//*****************************************************************************
//
//! Sets the qualification mode for the specified pin.
//!
//! \param pin is the identifying GPIO number of the pin.
//! \param qualification specifies the qualification mode of the pin.
//!
//! This function sets the qualification mode for the specified pin. The
//! parameter \e qualification can be one of the following values:
//! - \b GPIO_QUAL_SYNC
//! - \b GPIO_QUAL_3SAMPLE
//! - \b GPIO_QUAL_6SAMPLE
//! - \b GPIO_QUAL_ASYNC
//!
//! To set the qualification sampling period, use
//! GPIO_setQualificationPeriod().
//!
//! \return None.
//
//*****************************************************************************
extern void
GPIO_setQualificationMode(uint32_t pin, GPIO_QualificationMode qualification);
//*****************************************************************************
//
//! Gets the qualification type for the specified pin.
//!
//! \param pin is the identifying GPIO number of the pin.
//!
//! \return Returns the qualification mode in the form of one of the values
//! \b GPIO_QUAL_SYNC, \b GPIO_QUAL_3SAMPLE, \b GPIO_QUAL_6SAMPLE, or
//! \b GPIO_QUAL_ASYNC.
//
//*****************************************************************************
extern GPIO_QualificationMode
GPIO_getQualificationMode(uint32_t pin);
//*****************************************************************************
//
//! Sets the qualification period for a set of pins
//!
//! \param pin is the identifying GPIO number of the pin.
//! \param divider specifies the output drive strength.
//!
//! This function sets the qualification period for a set of \b 8 \b pins,
//! specified by the \e pin parameter. For instance, passing in 3 as the value
//! of \e pin will set the qualification period for GPIO0 through GPIO7, and a
//! value of 98 will set the qualification period for GPIO96 through GPIO103.
//! This is because the register field that configures the divider is shared.
//!
//! To think of this in terms of an equation, configuring \e pin as \b n will
//! configure GPIO (n & ~(7)) through GPIO ((n & ~(7)) + 7).
//!
//! \e divider is the value by which the frequency of SYSCLKOUT is divided. It
//! can be 1 or an even value between 2 and 510 inclusive.
//!
//! \return None.
//
//*****************************************************************************
extern void
GPIO_setQualificationPeriod(uint32_t pin, uint32_t divider);
//*****************************************************************************
//
//! Selects the controller core of a specified pin.
//!
//! \param pin is the identifying GPIO number of the pin.
//! \param core is the core that is controller of the specified pin.
//!
//! This function configures which core owns the specified pin's data registers
//! (DATA, SET, CLEAR, and TOGGLE). The \e core parameter is an enumerated data
//! type that specifies the core, such as \b GPIO_CORE_CPU1_CLA1 to make CPU1's
//! CLA1 controller of the pin.
//!
//! The pin is specified by its numerical value. For example, GPIO34 is
//! specified by passing 34 as \e pin.
//!
//! \return None.
//
//*****************************************************************************
extern void
GPIO_setControllerCore(uint32_t pin, GPIO_CoreSelect core);
//*****************************************************************************
//
//! Sets the analog mode of the specified pin.
//!
//! \param pin is the identifying GPIO number of the pin.
//! \param mode is the selected analog mode.
//!
//! This function configures the specified pin for either analog or digital
//! mode. Not all GPIO pins have the ability to be switched to analog mode,
//! so refer to the technical reference manual for details. This setting should
//! be thought of as another level of muxing.
//!
//! The parameter \e mode is an enumerated data type that can be one of the
//! following values:
//!
//! - \b GPIO_ANALOG_DISABLED - Pin is in digital mode
//! - \b GPIO_ANALOG_ENABLED - Pin is in analog mode
//!
//! The pin is specified by its numerical value. For example, GPIO34 is
//! specified by passing 34 as \e pin.
//!
//! \b Note: The pin parameter is applicable for both AIO and GPIO because
//! the GPAxMSEL.GPIOy register configures for both
//!
//! \return None.
//
//*****************************************************************************
extern void
GPIO_setAnalogMode(uint32_t pin, GPIO_AnalogMode mode);
//*****************************************************************************
//
//! Configures the alternate function of a GPIO pin.
//!
//! \param pinConfig is the pin configuration value, specified as only one
//! of the \b GPIO_#_???? values.
//!
//! This function configures the pin mux that selects the peripheral function
//! associated with a particular GPIO pin. Only one peripheral function at a
//! time can be associated with a GPIO pin, and each peripheral function should
//! only be associated with a single GPIO pin at a time (despite the fact that
//! many of them can be associated with more than one GPIO pin).
//!
//! The available mappings are supplied in pin_map.h.
//!
//! \return None.
//
//*****************************************************************************
extern void
GPIO_setPinConfig(uint32_t pinConfig);
//*****************************************************************************
//
// Close the Doxygen group.
//! @}
//
//*****************************************************************************
//*****************************************************************************
//
// Mark the end of the C bindings section for C++ compilers.
//
//*****************************************************************************
//###########################################################################
//
// FILE: hic.h
//
// TITLE: C28x Host Interface Controller (HIC) driver.
//
//###########################################################################
// $Copyright:
// Copyright (C) 2023 Texas Instruments Incorporated - http://www.ti.com/
//
// 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 Texas Instruments Incorporated 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
// OWNER 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.
// $
//###########################################################################
//*****************************************************************************
//
// If building with a C++ compiler, make all of the definitions in this header
// have a C binding.
//
//*****************************************************************************
//*****************************************************************************
//
//! \addtogroup hic_api HIC
//! \brief This module is used for Host Interface Controller(HIC) configuration
//! @{
//
//*****************************************************************************
//###########################################################################
//
// FILE: hw_hic.h
//
// TITLE: Definitions for the HIC registers.
//
//###########################################################################
// $Copyright:
// Copyright (C) 2023 Texas Instruments Incorporated - http://www.ti.com/
//
// 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 Texas Instruments Incorporated 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
// OWNER 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.
// $
//###########################################################################
//*************************************************************************************************
//
// The following are defines for the HIC register offsets
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the HICREV register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the HICGCR register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the HICLOCK register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the HICMODECR register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the HICPINPOLCR register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the HICBASESEL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the HICHOSTCR register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the HICERRADDR register
//
//*************************************************************************************************
// error for Device
// error for Host
//*************************************************************************************************
//
// The following are defines for the bit fields in the HICDBADDR0 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the HICDBADDR1 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the HICDBADDR2 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the HICDBADDR3 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the HICDBADDR4 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the HICDBADDR5 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the HICDBADDR6 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the HICDBADDR7 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the HICH2DINTEN register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the HICH2DINTFLG register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the HICH2DINTCLR register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the HICH2DINTFRC register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the HICD2HINTEN register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the HICD2HINTFLG register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the HICD2HINTCLR register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the HICD2HINTFRC register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the HICCOMMIT register
//
//*************************************************************************************************
//
//Generic defines
//
//
//Number of Regions of Base addresses supported in HIC module
//
//
//Number of Device to Host and Host to Device Buffer Registers of the module
//
//
//Used in HIC_enableHostInterface() API
//
//
//Used in HIC_enableLock() and HIC_disableLock() APIs
//
//
//Flag for Unlocking in LOCK register
//
//*****************************************************************************
//
//! Values that can be passed to HIC_setConfig() as \e flags or
//! used with HIC_getConfig() API return value parsing
//
//*****************************************************************************
//
//Enumerations for HICMODECR Register
//
//
//For Read/Write Pin
//
//
//For Byte Enable BEn Pins
//
//
//For Ready nRDY Pin
//
//
//For Host to Device Buffer Device Write Enable
//
//
//For Device to Host Buffer Host Write Enable
//
//
//For Enabling Host Access to Device Region
//
//
//For Enabling Host Write to EALLOWCTL Register
//
//*****************************************************************************
//
//! Values that can be passed to HIC_setPinPolarity() API as \e flags or
//! used with HIC_getPinPolarity() API return value parsing
//
//*****************************************************************************
//
//For Pin Polarity Configuration
//Chip Select Pin (CS)
//
//
// Byte Enable Pin
//
//
// Output Enable OE Pin
//
//
// Write Enable (WE) Pin Polarity
//
//
// Ready Pin( RDY) Polarity
//
//*****************************************************************************
//
//! Values that can be passed to HIC_configureHostAccessMode() API as \e config
//! or used with HIC_getHostAccessMode() API return value parsing
//
//*****************************************************************************
//
//Host Control Register
//
//
//Access size of MMR registers
//
//
//Page selection via Pin/BASESEL Register
//
//*****************************************************************************
//
//! Values that can be passed to HIC_enableD2HInterrupt() API or
//! or used with HIC_disableD2HInterrupt() API to enable/disable interrupt
//! or with HIC_clearD2HInterrupt() API to clear interrupt
//
//*****************************************************************************
//
//SOC Internal Event Trigger (EVTTRIG)
//Refer Device TRM for details of the event(s)
//
//*****************************************************************************
//
// Prototypes for the APIs.
//
//*****************************************************************************
//*****************************************************************************
//
//! Returns the Revision of HIC Controller interface.
//!
//! This function returns the hardware revision of the Host Interface
//! controller module
//!
//! \return The Hardware Version number
//! returns the content of HICREV register. Please refer to device TRM
//! for field wise details.
//
//*****************************************************************************
static inline uint32_t
HIC_getRevision(void)
{
return((*((volatile uint32_t *)(0x00006500U + 0x0U))));
}
//*****************************************************************************
//
//! Enables the Host Access to the Device region and to the Mailbox
//!
//! \return none
//!
//! \n The Host interface Controller module provides two mechanisms of access
//! 1. Using Device Memory access, the host can access the memory directly
//! read/write/poll for registers
//! 2. Using the Mailbox mechanism which can be used when the Host can write
//! the parameters to the mailbox Host-to-Device buffer region and then
//! trigger an interrupt to the Device. The HIC module with the
//! other application running on device side can then be used
//! to signal to the host, using the Device-to-Host buffer region
//! in response.
//! This API enables the access to the Device region and Mailbox.
//! This should be used as the first API in sequence of configuring
//! the HIC module.
//
//*****************************************************************************
static inline void
HIC_enableHostInterface(void)
{
__eallow();
(*((volatile uint32_t *)(0x00006500U + 0x2U))) = 0x0AU;
__edis();
}
//*****************************************************************************
//
//! Enables the Lock for the HIC module registers protected by Writes
//!
//! \n This API enables the lock, which protects the writes to registers
//! protected by Lock. Calling this API prevents writes to the write protected
//! registers.
//!
//! \return none
//
//*****************************************************************************
static inline void
HIC_enableLock(void)
{
__eallow();
(*((volatile uint32_t *)(0x00006500U + 0x4U))) = (0x1U |
((uint32_t)0x5A5AU <<
16U));
__edis();
}
//*****************************************************************************
//
//! Disables the Lock for the HIC module registers protected by Writes
//!
//! \n This API disables the lock(unlocks), which enables the writes
//! to registers protected by Lock.
//! Calling this API enables writes to the write protected
//! registers.
//! This API must be called one time before calling any of these APIs
//! - HIC_setConfig()
//! - HIC_setPinPolarity()
//! - HIC_selectBaseAddress()
//!
//! \return None
//
//*****************************************************************************
static inline void
HIC_disableLock(void)
{
__eallow();
(*((volatile uint32_t *)(0x00006500U + 0x4U))) = (0x0U |
((uint32_t)0x5A5AU <<
16U));
__edis();
}
//*****************************************************************************
//
//! Sets the Host Interface Controller Configurations
//! \n This API configures the HICMODECR register for the selected configuration
//! HIC_disableLock() API should have been called prior to this API.
//!
//! \param flags specifies the ORed values of any of following flags.
//!
//! Any one of following values for Data Width
//! - \b HIC_MODE_DW_8BIT -for 8bit Data
//! - \b HIC_MODE_DW_16BIT -for 16bit Data
//! - \b HIC_MODE_DW_32BIT -for 32bit Data
//!
//! Any one of following values for Read Write Pin
//! - \b HIC_MODE_RW_PIN_SEPARATE - for Separate Read and Write Pin
//! - \b HIC_MODE_RW_PIN_SINGLE - for Same Read and Write Pin
//!
//! Any one of following values for Byte Enable Pin configuration
//! - \b HIC_MODE_BEN_PRESENT - for using Byte Enable Pin
//! - \b HIC_MODE_BEN_ABSENT - for not using Byte Enable Pin
//!
//! Any one of following values for Ready Pin
//! - \b HIC_MODE_RDY_PRESENT - for using Ready Pin for extended wait
//! - \b HIC_MODE_RDY_ABSENT - for not using Extended Wait pin
//!
//! Other configurations:
//! - \b HIC_MODE_H2DBUF_DEVWREN - for enabling Device access to
//! host to Device Buffers. If this is not enabled the device cannot write to
//! Host to Device buffers
//! - \b HIC_MODE_D2HBUF_HOST_WR_ENABLE - for enabling host access to
//! device to host buffers. If this is not enabled the host cannot write to
//! device to host buffers.
//! - \b HIC_MODE_DEVICE_HOST_ACCESS_ENABLE - for enabling access to the device
//! region. Only if this is enabled the regions selected by
//! Base select registers using the HIC_selectBaseAddress() API
//! shall be accessible.
//! Without this only the HIC registers and Mailbox registers will be
//! accessible for the host.
//! - \b HIC_MODE_HOST_WREALLOW_ENABLE - for enabling host access to write to
//! EALLOW bitfield using HIC_configureHostAccessMode() API. Without enabling
//! this HIC_configureHostAccessMode(HIC_HOSTCR_EALLOW_EN)
//! will not work.
//
//! \return None
//
//*****************************************************************************
static inline void
HIC_setConfig(uint32_t flags)
{
__eallow();
(*((volatile uint32_t *)(0x00006500U + 0x6U))) = flags;
__edis();
}
//*****************************************************************************
//
//! Returns the Host Interface Controller Configurations
//!
//! \return
//! 32-bit integer specifies the ORed values of following flags
//! Any one of following values for Data Width
//! - \b HIC_MODE_DW_8BIT -for 8bit Data
//! - \b HIC_MODE_DW_16BIT -for 16bit Data
//! - \b HIC_MODE_DW_32BIT -for 32bit Data
//!
//! Following values for Other Configurations
//! - \b HIC_MODE_RW_PIN_SEPARATE/ HIC_MODE_RW_PIN_SINGLE - for Read/Write Pin
//! - \b HIC_MODE_BEN_PRESENT/HIC_MODE_BEN_ABSENT - for Byte Enable Pin Usage
//! - \b HIC_MODE_RDY_PRESENT/HIC_MODE_RDY_ABSENT - for using Ready Pin for
//! extended wait
//! - \b HIC_MODE_H2DBUF_DEVWREN- Device access to Host to Device Buffer Enabled
//! - \b HIC_MODE_D2HBUF_HOST_WR_ENABLE - Host access to Device to Host Buffer
//! enabled
//! - \b HIC_MODE_DEVICE_HOST_ACCESS_ENABLE - for enabling access to the device
//! - \b HIC_MODE_HOST_WREALLOW_ENABLE - for host access to write to EALLOW
//!
//! This API returns the current configuration of HIC module.
//! It can be used along with macros defined in hw_hic.h as below.
//! For querying the Data width use like in below examples
//! \n HIC_getConfig() & HIC_MODECR_DW_MODE_M == HIC_MODE_DW_8BIT for Data width
//! \n HIC_getConfig() & HIC_MODECR_RW_MODE == HIC_MODE_RW_PIN_SINGLE for RW Pin
//! \n HIC_getConfig() & HIC_MODECR_BEN_PRESENT == HIC_MODE_BEN_PRESENT
//! for BE Pin
//
//*****************************************************************************
static inline uint32_t
HIC_getConfig(void)
{
return((*((volatile uint32_t *)(0x00006500U + 0x6U))));
}
//*****************************************************************************
//
//! Sets the Host Interface Controller Pin Polarity.
//! This API configures the HICPINPOLCR register for the selected configuration.
//! HIC_disableLock() API should have been called prior to this API.
//!
//! \param flags specifies the ORed values of any of following flags
//!
//! Any one of following values for Chip Select Pin
//! - \b HIC_PIN_POLARITY_CS_HIGH - for Active High Chip Select Pin
//! - \b HIC_PIN_POLARITY_CS_LOW - for Active Low Chip Select Pin
//!
//! Any one of following values for Byte Enable Pin configuration
//! - \b HIC_PIN_POLARITY_BEN_HIGH - for Active High Byte Enable
//! - \b HIC_PIN_POLARITY_BEN_LOW - for Active Low Byte Enable
//!
//! Any one of following values for Output Enable Pin
//! - \b HIC_PIN_POLARITY_OE_HIGH - for Active High Output Enable
//! - \b HIC_PIN_POLARITY_OE_LOW - for Active Low Output Enable
//!
//! Any one of following values for Write Enable Pin
//! - \b HIC_PIN_POLARITY_WE_HIGH - for Active High Write Enable
//! - \b HIC_PIN_POLARITY_WE_LOW - for Active Low Write Enable
//!
//! Any one of following values for Ready Pin
//! - \b HIC_PIN_POLARITY_RDY_HIGH - for Active High Write Enable
//! - \b HIC_PIN_POLARITY_RDY_LOW - for Active Low Write Enable
//!
//! \return None
//
//*****************************************************************************
static inline void
HIC_setPinPolarity(uint16_t flags)
{
__eallow();
(*((volatile uint32_t *)(0x00006500U + 0x8U))) = flags;
__edis();
}
//*****************************************************************************
//
//! Returns the Host Interface Controller Pin Polarity Configurations
//!
//! This API returns the HICPINPOLCR register for the selected configuration
//!
//! \return
//! 32-bit integer specifies the ORed values of any of following flags
//! Following values for corresponding Pin Configuration
//! - \b HIC_PIN_POLARITY_CS_HIGH/ HIC_PIN_POLARITY_CS_HIGH - for CS Pin
//! - \b HIC_PIN_POLARITY_BEN_HIGH/HIC_PIN_POLARITY_BEN_HIGH- for
//! Byte Enable pin
//! - \b HIC_PIN_POLARITY_OE_HIGH/HIC_PIN_POLARITY_OE_LOW - for OE Pin
//! - \b HIC_PIN_POLARITY_WE_HIGH/HIC_PIN_POLARITY_WE_LOW- for WE Pin
//! - \b HIC_PIN_POLARITY_RDY_HIGH/HIC_PIN_POLARITY_RDY_LOW - for RDY Pin
//!
//! This API returns the Pin Polarity.This can be used with the macros defined
//! in hw_hic.h as shown below
//! HIC_getPinPolarity & HIC_PINPOLCR_BEN_POL == HIC_PIN_POLARITY_BEN_HIGH for
//! checking the status of Byte Enable Pin Polarity
//
//*****************************************************************************
static inline uint32_t
HIC_getPinPolarity(void)
{
return((*((volatile uint32_t *)(0x00006500U + 0x8U))));
}
//*****************************************************************************
//
//! Selects the Base Address for the device memory access
//!
//! \param selectIndex specifies the index of Base address in the Base Address
//! regions can vary from 0 to HIC_NUM_BASE_ADDRESS-1
//!
//! The Device memory region will be accessible by the region selected in this
//! API. Also look at HIC_configureHostAccessMode(HIC_HOSTCR_PAGESEL)
//!
//! \return None
//
//*****************************************************************************
static inline void
HIC_selectBaseAddress(uint16_t selectIndex)
{
//
//Check the arguments.
//
;
(*((volatile uint32_t *)(0x00006500U + 0xAU))) = selectIndex;
}
//*****************************************************************************
//
//! Returns the Selected Base address index for the device memory access
//!
//! The Device memory region will be accessible by the region selected in this
//! API. Also look at HIC_configureHostAccessMode(HIC_HOSTCR_PAGESEL)
//!
//! \return selected index of Base address in the Base Address
//! regions. can vary from 0 to HIC_NUM_BASE_ADDRESS-1
//
//*****************************************************************************
static inline uint16_t
HIC_getSelectedBaseAddressIndex(void)
{
return((*((volatile uint16_t *)(0x00006500U + 0xAU))));
}
//*****************************************************************************
//
//! Configures the Host Access modes to the device region
//!
//! \param config logical OR of the following values
//! - \b HIC_HOSTCR_EALLOW_EN for enabling module writes to EALLOW Protected
//! registers
//! - either of
//! HIC_HOST_CONTROL_ACCSIZE_16BIT/HIC_HOST_CONTROL_ACCSIZE_32BIT
//! to select 16 bit or 32 bit device side master port accesses
//! - either of
//! HIC_HOST_CONTROL_PAGESEL_REG/HIC_HOST_CONTROL_PAGESEL_PIN
//! to select Page/Region selection based on PAGESEL register
//! programmed using HIC_selectBaseAddress()API or the PAGESEL Pin
//!
//! \return None
//
//*****************************************************************************
static inline void
HIC_configureHostAccessMode(uint16_t config)
{
//
//Needs a key to be written for the write to go through
//
(*((volatile uint32_t *)(0x00006500U + 0xCU))) = (config |
0xA5U <<
8U);
}
//*****************************************************************************
//
//! Provides the Host Access modes configured currently
//!
//! \return Host Access mode value as configured
//! HIC_configureHostAccessMode()
//! API which is a logical OR of
//! - \b HIC_HOSTCR_EALLOW_EN for enabling module writes to EALLOW Protected
//! registers
//! - either of
//! HIC_HOST_CONTROL_ACCSIZE_16BIT/HIC_HOST_CONTROL_ACCSIZE_32BIT
//! for selected 16 bit or 32 bit device side master port accesses
//! - either of
//! HIC_HOST_CONTROL_PAGESEL_REG/HIC_HOST_CONTROL_PAGESEL_PIN
//! for selected Page/Region selection based on PAGESEL register
//! programmed using HIC_selectBaseAddress()API or the PAGESEL Pin
//!
//! This API can be used with few Macros defined in hw_hic.h as below
//! (HIC_getAccessMode() & HIC_HOSTCR_ACCSIZE) == HIC_HOST_CONTROL_ACCSIZE_32BIT
//! for Access size checking. Similarly it can be used for other bit fields.
//
//*****************************************************************************
static inline uint32_t
HIC_getHostAccessMode(void)
{
//
//Returns the lower 16 bits that contains the configuration
//
return((*((volatile uint16_t *)(0x00006500U + 0xCU))));
}
//*****************************************************************************
//
//! Returns the Host and Device side Status when an Error happened on interface
//!
//! \return returns the logical OR of the following
//! - 8 bit Host to Device Error Address when Host to Device Error happens
//! - 3 bit Base select value when Host to Device Error happens
//! - 8 bit Device to Host Error Address when Device to Host Error happens
//! - 3 bit Base select value when Device to Host Error Happens.
//! \n Please refer to TRM HICERRADDR register for more details on this.
//
//*****************************************************************************
static inline uint32_t
HIC_getErrorAddress(void)
{
return((*((volatile uint32_t *)(0x00006500U + 0xEU))));
}
//*****************************************************************************
//
//! Returns the token written by the token written onto the Host to Device Token
//!
//! \return the 32 bit Token value written into the register
//!
//! This API can be used while using the Mailbox mechanism.
//
//*****************************************************************************
static inline uint32_t
HIC_getH2DToken(void)
{
return((*((volatile uint32_t *)(0x00006500U + 0x10U))));
}
//*****************************************************************************
//
//! Writes the Token to the Host from Device
//!
//! \param token is the 32 bit token value to be written. It could be used
//! to denote the number of bytes written on to the Device-to-Host buffer
//!
//! \return None
//!
//! This API can be used while using the Mailbox mechanism.
//! Writing to this register could be used to trigger an interrupt
//! to the Host using the Device to Host
//! interrupt line(D2HINT) of the module.
//! It can be used to interrupt the external host.
//
//*****************************************************************************
static inline void
HIC_setD2HToken(uint32_t token)
{
(*((volatile uint32_t *)(0x00006500U + 0x12U))) = token;
}
//*****************************************************************************
//
//! Returns the token written by the token written onto the Device to Host Token
//!
//! \return the 32 bit Token value written into the register
//!
//! This API can be used while using the Mailbox mechanism.
//
//*****************************************************************************
static inline uint32_t
HIC_getD2HToken(void)
{
return((*((volatile uint32_t *)(0x00006500U + 0x12U))));
}
//*****************************************************************************
//
//! Configures the Base Address of the region
//!
//! \param index specifies the index of the Device Region to be configured
//! can be from 0 to HIC_NUM_BASE_ADDRESS-1
//!
//! \param baseAddress the 32 bit base address of the device region
//! being configured
//!
//! The device memory which HIC module can access can be divided into multiple
//! 256 byte regions.
//! For Example: GSRAM in Region 0,
//! ADC registers in Region 1
//! FSI registers in Region 2,etc
//! This API helps to configure the base address for each region
//! The HIC address Pin can then be used to offset into the specific region
//! by the host
//!
//! \return None
//
//*****************************************************************************
static inline void
HIC_setBaseAddress(uint16_t index,
uint32_t baseAddress)
{
//
//Check the arguments.
//
;
__eallow();
(*((volatile uint32_t *)(0x00006500U + 0x14U + (index * 2)))) = baseAddress;
__edis();
}
//*****************************************************************************
//
//! Returns the Base Address configured for the region
//!
//! \param index specifies the index of the Device Region to be configured
//! can be from 0 to HIC_NUM_BASE_ADDRESS-1
//!
//! Returns the configured base address for the Region index provided
//!
//! \return 32 bit base address configured for the region
//
//*****************************************************************************
static inline uint32_t
HIC_getBaseAddress(uint16_t index)
{
//
//Check the arguments.
//
;
return(0x00006500U + 0x14U + (index * 2));
}
//*****************************************************************************
//
//! Enables the Interrupts from Host to Device
//!
//! \param flags specifies the logical ORed values below
//! - \b HIC_H2DINTEN_H2D_INTEN - Data Ready interrupt Enable
//! - \b HIC_H2DINTEN_BUSERR_INTEN - Bus error Interrupt Enable
//! - \b HIC_H2DINTEN_ILLWR_INTEN - Illegal Write Interrupt Enable
//! - \b HIC_H2DINTEN_ILLRD_INTEN - Illegal Read Interrupt Enable
//!
//! Enables the specified interrupts. This will result in a HIC interrupt
//! generated to the C28x core.
//!
//! \return None
//
//*****************************************************************************
static inline void
HIC_enableH2DInterrupt(uint32_t flags)
{
(*((volatile uint32_t *)(0x00006500U + 0x28U))) |= flags;
}
//*****************************************************************************
//
//! Disables the Interrupts from Host to Device
//!
//! \param flags specifies the logical ORed values below
//! - \b HIC_H2DINTEN_H2D_INTEN - Data Ready interrupt Enable
//! - \b HIC_H2DINTEN_BUSERR_INTEN - Bus error Interrupt Enable
//! - \b HIC_H2DINTEN_ILLWR_INTEN - Illegal Write Interrupt Enable
//! - \b HIC_H2DINTEN_ILLRD_INTEN - Illegal Read Interrupt Enable
//!
//! Disables the interrupt flags specified
//!
//! \return None
//
//*****************************************************************************
static inline void
HIC_disableH2DInterrupt(uint32_t flags)
{
(*((volatile uint32_t *)(0x00006500U + 0x28U))) &= ~flags;
}
//*****************************************************************************
//
//! Gives the status of Host to Device interrupts
//!
//! \return 32bit flag with the logical ORed values below
//! - \b HIC_H2DINTFLG_H2D_FLG - Data Ready interrupt Status
//! - \b HIC_H2DINTFLG_BUSERR_FLG - Bus error Interrupt Status
//! - \b HIC_H2DINTFLG_ILLWR_FLG - Illegal Write Interrupt Status
//! - \b HIC_H2DINTFLG_ILLRD_FLG - Illegal Read Interrupt Status.
//!
//! \n The Flag if Set indicates that the corresponding Interrupt is active
//! (has occured)
//
//*****************************************************************************
static inline uint32_t
HIC_getH2DInterruptStatus(void)
{
return((*((volatile uint32_t *)(0x00006500U + 0x2AU))));
}
//*****************************************************************************
//
//! Clears the Interrupts from Host to Device
//!
//! \param flags specifies the logical ORed values below to be cleared
//! - \b HIC_H2DINTCLR_H2D_CLR - Data Ready interrupt Clear
//! - \b HIC_H2DINTCLR_BUSERR_CLR - Bus error Interrupt Clear
//! - \b HIC_H2DINTCLR_ILLWR_CLR - Illegal Write Interrupt Clear
//! - \b HIC_H2DINTCLR_ILLRD_CLR - Illegal Read Interrupt Clear
//!
//! Clears the interrupt flags specified
//!
//! \return None
//
//*****************************************************************************
static inline void
HIC_clearH2DInterrupt(uint32_t flags)
{
(*((volatile uint32_t *)(0x00006500U + 0x2CU))) = flags;
}
//*****************************************************************************
//
//! Forces the Interrupts from Host to Device
//!
//! \param flags specifies the logical ORed values below to be Forced
//! - \b HIC_H2DINTFRC_H2D_INTFRC - Data Ready interrupt Force
//! - \b HIC_H2DINTFRC_BUSERR_INTFRC - Bus error Interrupt Force
//! - \b HIC_H2DINTFRC_ILLWR_INTFRC - Illegal Write Interrupt Force
//! - \b HIC_H2DINTFRC_ILLRD_INTFRC - Illegal Read Interrupt Force
//!
//! Forces the interrupt flags specified. Can be used for Debug purpose.
//!
//! \return None
//
//*****************************************************************************
static inline void
HIC_forceH2DInterrupt(uint32_t flags)
{
(*((volatile uint32_t *)(0x00006500U + 0x2EU))) = flags;
}
//*****************************************************************************
//
//! Enables the Interrupts from Device to Host
//!
//! \param flags specifies the logical ORed values below
//! - \b HIC_D2HINTEN_D2H_INTEN - Data Ready interrupt Enable
//! - \b HIC_D2HINTEN_BUSERR_INTEN - Bus error Interrupt Enable
//! - \b HIC_D2HINTEN_ILLWR_INTEN - Illegal Write Interrupt Enable
//! - \b HIC_D2HINTEN_ILLRD_INTEN - Illegal Read Interrupt Enable
//! - \b HIC_D2HINTEN_ACCVIO_INTEN - Access Violation Interrupt Enable
//! - \b Event Trigger interrupt flags - The higher 16 bits when Set will enable
//! corresponding D2H interrupts. Refer TRM for details.
//!
//! Enables the specified interrupts. This will result in a HIC interrupt
//! generated to the Host(D2HINT).
//!
//! \return None
//
//*****************************************************************************
static inline void
HIC_enableD2HInterrupt(uint32_t flags)
{
(*((volatile uint32_t *)(0x00006500U + 0x30U))) |= flags;
}
//*****************************************************************************
//
//! Disables the Interrupts from Device to Host
//!
//! \param flags specifies the logical ORed values below
//! - \b HIC_D2HINTEN_D2H_INTEN - Data Ready interrupt Enable
//! - \b HIC_D2HINTEN_BUSERR_INTEN - Bus error Interrupt Enable
//! - \b HIC_D2HINTEN_ILLWR_INTEN - Illegal Write Interrupt Enable
//! - \b HIC_D2HINTEN_ILLRD_INTEN - Illegal Read Interrupt Enable
//! - \b HIC_D2HINTEN_ACCVIO_INTEN - Access Violation Interrupt Enable
//! - Event Trigger interrupt flags - The higher 16 bits when set will
//! disable corresponding D2H interrupts. Refer TRM for details.
//!
//! Disables the interrupt flags specified
//!
//! \return None
//
//*****************************************************************************
static inline void
HIC_disableD2HInterrupt(uint32_t flags)
{
(*((volatile uint32_t *)(0x00006500U + 0x30U))) &= ~flags;
}
//*****************************************************************************
//
//! Gives the status of Device to Host interrupts
//!
//! \return 32bit flag with the logical ORed values below
//! - \b HIC_D2HINTFLG_D2H_FLG - Data Ready interrupt Status
//! - \b HIC_D2HINTFLG_BUSERR_FLG - Bus error Interrupt Status
//! - \b HIC_D2HINTFLG_ILLWR_FLG - Illegal Write Interrupt Status
//! - \b HIC_D2HINTFLG_ILLRD_FLG - Illegal Read Interrupt Status
//! - \b HIC_D2HINTFLG_ACCVIO_FLG - Access Violation Interrupt Status
//! - Event Trigger Interrupt Flags - The higher 16 bits give
//! the status of event Trigger Interrupt flags.
//! Refer TRM for the sources of these interrupts.
//!
//! The Flag if Set indicates that the corresponding Interrupt is active
//! (has occurred)
//
//*****************************************************************************
static inline uint32_t
HIC_getD2HInterruptStatus(void)
{
return((*((volatile uint32_t *)(0x00006500U + 0x32U))));
}
//*****************************************************************************
//
//! Clears the Interrupts from Host to Device
//!
//! \param flags specifies the logical ORed values below to be cleared
//! - \b HIC_D2HINTCLR_D2H_CLR - Data Ready interrupt Clear
//! - \b HIC_D2HINTCLR_BUSERR_CLR - Bus error Interrupt Clear
//! - \b HIC_D2HINTCLR_ILLWR_CLR - Illegal Write Interrupt Clear
//! - \b HIC_D2HINTCLR_ILLRD_CLR - Illegal Read Interrupt Clear
//! - \b HIC_D2HINTCLR_ACCVIO_CLR - Access Violation Interrupt Clear
//! - Event Trigger Interrupt Clear Flags - The higher 16 bits
//! indicates event trigger flags to be cleared.
//! Refer TRM for the sources of these interrupts.
//!
//! Clears the interrupt flags specified
//!
//! \return None
//
//*****************************************************************************
static inline void
HIC_clearD2HInterrupt(uint32_t flags)
{
(*((volatile uint32_t *)(0x00006500U + 0x34U))) = flags;
}
//*****************************************************************************
//
//! Forces the Interrupts from Host to Device
//!
//! \param flags specifies the logical ORed values below to be Forced
//! - \b HIC_D2HINTFRC_D2H_INTFRC - Data Ready interrupt Force
//! - \b HIC_D2HINTFRC_BUSERR_INTFRC - Bus error Interrupt Force
//! - \b HIC_D2HINTFRC_ILLWR_INTFRC - Illegal Write Interrupt Force
//! - \b HIC_D2HINTFRC_ILLRD_INTFRC - Illegal Read Interrupt Force
//! - \b HIC_D2HINTFRC_ACCVIO_INTFRC - Access violation Interrupt Force
//! - Event Trigger Interrupt Force Flags - The higher 16 bits
//! indicates event trigger flags to be cleared.
//! Refer TRM for the sources of these interrupts.
//!
//! Forces the interrupt flags specified. Can be used for Debug purposes.
//!
//! \return None
//
//*****************************************************************************
static inline void
HIC_forceD2HInterrupt(uint32_t flags)
{
(*((volatile uint32_t *)(0x00006500U + 0x36U))) = flags;
}
//*****************************************************************************
//
//! Returns the Address when Access violation happened
//!
//! \return returns the 32 bit address when the Access violation happened
//!
//! While the HIC module internal access port accesses a memory, if there is
//! an access violation, the module updates the address in this register.
//
//*****************************************************************************
static inline uint32_t
HIC_getAccessViolationAddress(void)
{
return((*((volatile uint32_t *)(0x00006500U + 0x38U))));
}
//*****************************************************************************
//
//! Returns the Host to Device Buffer for the offset specified
//!
//! \param offset specifies the offset of the H2D buffer
//! can vary from 0 to HIC_NUM_BUFFER_REGS-1
//!
//! \return returns the 32 bit content of the Host to Device buffer.
//!
//! The Host to Device buffer can be used to implement a communication
//! scheme on which the Host writes the data to sent to the Control peripherals.
//! The MCU can pick it up and stream it over control peripherals.
//! The Device to Host Buffer can be used to write the response back.
//! The External host need not continuously wait for the data/response.
//
//*****************************************************************************
static inline uint32_t
HIC_readH2DBuffer(uint16_t offset)
{
//
//Check the arguments.
//
;
return((*((volatile uint32_t *)(0x00006500U + 0x40U + (offset * 2)))));
}
//*****************************************************************************
//
//! Writes to the Host to Device buffer
//!
//! \param offset specifies the offset of the H2D buffer
//! can vary from 0 to HIC_NUM_BUFFER_REGS-1
//! \param data the 32bit data to be written onto the buffer
//!
//! \return none
//!
//! This API should be used only when the Device write to Host buffer
//! is enabled, using HIC_setConfig(HIC_MODECR_H2DBUF_DEVWREN) API.
//
//*****************************************************************************
static inline void
HIC_writeH2DBuffer(uint16_t offset, uint32_t data)
{
//
//Check the arguments.
//
;
(*((volatile uint32_t *)(0x00006500U + 0x40U + (offset * 2)))) = data;
}
//*****************************************************************************
//
//! Clears the Host to Device buffer (by making it Zero)
//!
//! \param offset specifies the offset of the H2D buffer
//! can vary from 0 to HIC_NUM_BUFFER_REGS-1
//!
//! \return none
//!
//! This API should be used only when the Device write to Host buffer
//! is enabled, using HIC_setConfig(HIC_MODECR_H2DBUF_DEVWREN) API.
//! This API can be used to clear the content of H2D Buffer
//
//*****************************************************************************
static inline void
HIC_clearH2DBuffer(uint16_t offset)
{
//
//Check the arguments.
//
;
(*((volatile uint32_t *)(0x00006500U + 0x40U + (offset * 2)))) = 0;
}
//*****************************************************************************
//
//! Returns the Device to Host Buffer for the offset specified
//!
//! \param offset specifies the offset of the D2H buffer
//! can vary from 0 to HIC_NUM_BUFFER_REGS-1
//!
//! \return returns the 32 bit content of the Device to Host buffer
//!
//! The Device to Host Buffer can be used to write the response back to host
//! The External host need not continuously wait for the data/response.
//
//*****************************************************************************
static inline uint32_t
HIC_readD2HBuffer(uint16_t offset)
{
//
//Check the arguments.
//
;
return((*((volatile uint32_t *)(0x00006500U + 0x60U + (offset * 2)))));
}
//*****************************************************************************
//
//! Writes to the Device to Host buffer
//!
//! \param offset specifies the offset of the D2H buffer
//! can vary from 0 to HIC_NUM_BUFFER_REGS-1
//! \param data the 32bit data to be written onto the buffer
//!
//! \return none
//
//*****************************************************************************
static inline void
HIC_writeD2HBuffer(uint16_t offset, uint32_t data)
{
//
//Check the arguments.
//
;
(*((volatile uint32_t *)(0x00006500U + 0x60U + (offset * 2)))) = data;
}
//*****************************************************************************
//
//! Clears the Device to Host buffer (by making it Zero)
//!
//! \param offset specifies the offset of the D2H buffer
//! can vary from 0 to HIC_NUM_BUFFER_REGS-1
//!
//! \return none
//!
//! This API can be used to clear the content of D2H Buffer
//
//*****************************************************************************
static inline void
HIC_clearD2HBuffer(uint16_t offset)
{
//
//Check the arguments.
//
;
(*((volatile uint32_t *)(0x00006500U + 0x60U + (offset * 2)))) = 0U;
}
//*****************************************************************************
//
// Close the Doxygen group.
//! @}
//
//*****************************************************************************
//*****************************************************************************
//
// Mark the end of the C bindings section for C++ compilers.
//
//*****************************************************************************
//###########################################################################
//
// FILE: hrcap.h
//
// TITLE: C28x HRCAP Driver.
//
//#############################################################################
// $Copyright:
// Copyright (C) 2023 Texas Instruments Incorporated - http://www.ti.com/
//
// 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 Texas Instruments Incorporated 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
// OWNER 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.
// $
//#############################################################################
//*****************************************************************************
//
// If building with a C++ compiler, make all of the definitions in this header
// have a C binding.
//
//*****************************************************************************
//*****************************************************************************
//
//! \addtogroup hrcap_api HRCAP
//! @{
//
//*****************************************************************************
//###########################################################################
//
// FILE: hw_hrcap.h
//
// TITLE: Definitions for the HRCAP registers.
//
//###########################################################################
// $Copyright:
// Copyright (C) 2023 Texas Instruments Incorporated - http://www.ti.com/
//
// 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 Texas Instruments Incorporated 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
// OWNER 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.
// $
//###########################################################################
//*************************************************************************************************
//
// The following are defines for the HRCAP register offsets
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the ECCTL0 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the ECCTL1 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the ECCTL2 register
//
//*************************************************************************************************
// flags.
//*************************************************************************************************
//
// The following are defines for the bit fields in the ECEINT register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the ECFLG register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the ECCLR register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the ECFRC register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the ECAPSYNCINSEL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the HRCTL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the HRINTEN register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the HRFLG register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the HRCLR register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the HRFRC register
//
//*************************************************************************************************
//*****************************************************************************
//
// Values that can be passed to HRCAP_enableCalibrationInterrupt(),
// HRCAP_disableCalibrationInterrupt() as the intFlags parameter and
// HRCAP_clearCalibrationFlags() and HRCAP_forceCalibrationFlags() as the flags
// parameter and returned by HRCAP_getCalibrationFlags().
//
//*****************************************************************************
//! Global calibration interrupt flag
//!
//! Calibration done flag
//!
//! Calibration period overflow flag
//!
//*****************************************************************************
//
//! Values that can be passed to HRCAP_getCalibrationClockPeriod() as the
//! \e clockSource parameter.
//
//*****************************************************************************
typedef enum
{
HRCAP_CALIBRATION_CLOCK_SYSCLK = 0x0, //!< Use SYSCLK for period match.
HRCAP_CALIBRATION_CLOCK_HRCLK = 0x4 //!< Use HRCLK for period match.
}HRCAP_CalibrationClockSource;
//*****************************************************************************
//
//! Values that can be passed to HRCAP_setCalibrationMode(),
//! as the \e continuousMode parameter.
//
//*****************************************************************************
typedef enum
{
//! Continuous calibration disabled.
HRCAP_CONTINUOUS_CALIBRATION_DISABLED = 0x00,
//! Continuous calibration enabled.
HRCAP_CONTINUOUS_CALIBRATION_ENABLED = 0x20
}HRCAP_ContinuousCalibrationMode;
//*****************************************************************************
//
//! \internal
//! Checks HRCAP base address.
//!
//! \param base specifies the HRCAP module base address.
//!
//! This function determines if an HRCAP module base address is valid.
//!
//! \return Returns \b true if the base address is valid and \b false
//! otherwise.
//
//*****************************************************************************
//*****************************************************************************
//
//! enables HRCAP.
//!
//! \param base is the base address of the HRCAP instance used.
//!
//! This function enables High Resolution Capture module.
//!
//! \note High resolution clock must be enabled before High Resolution Module
//! is enabled.
//!
//! \return None.
//
//*****************************************************************************
static inline void
HRCAP_enableHighResolution(uint32_t base)
{
;
__eallow();
//
// Set HRE bit.
//
(*((volatile uint16_t *)(base + 0x0U))) |= 0x1U;
__edis();
}
//*****************************************************************************
//
//! Disables HRCAP.
//!
//! \param base is the base address of the HRCAP instance used.
//!
//! This function disable High Resolution Capture module.
//!
//!
//! \return None.
//
//*****************************************************************************
static inline void
HRCAP_disableHighResolution(uint32_t base)
{
;
__eallow();
//
// Set HRE bit.
//
(*((volatile uint16_t *)(base + 0x0U))) &= ~0x1U;
__edis();
}
//*****************************************************************************
//
//! Enables high resolution clock.
//!
//! \param base is the base address of the HRCAP instance used.
//!
//! This function enables High Resolution clock.
//!
//! \return None.
//
//*****************************************************************************
static inline void
HRCAP_enableHighResolutionClock(uint32_t base)
{
;
__eallow();
//
// Set HRCLKE bit.
//
(*((volatile uint16_t *)(base + 0x0U))) |= 0x2U;
__edis();
}
//*****************************************************************************
//
//! Disables High resolution clock.
//!
//! \param base is the base address of the HRCAP instance used.
//!
//! This function disables High Resolution clock.
//!
//! \return None.
//
//*****************************************************************************
static inline void
HRCAP_disbleHighResolutionClock(uint32_t base)
{
;
__eallow();
//
// Clear HRCLKE bit.
//
(*((volatile uint16_t *)(base + 0x0U))) &= ~0x2U;
__edis();
}
//*****************************************************************************
//
//! Starts calibration.
//!
//! \param base is the base address of the HRCAP instance used.
//!
//! This function starts calibration.
//!
//! \return None.
//
//*****************************************************************************
static inline void
HRCAP_startCalibration(uint32_t base)
{
;
__eallow();
//
// Set CALIBSTART bit.
//
(*((volatile uint16_t *)(base + 0x0U))) |= 0x8U;
__edis();
}
//*****************************************************************************
//
//! Sets the calibration mode.
//!
//! \param base is the base address of the HRCAP instance used.
//!
//! This function sets the the calibration mode by turning on continuous
//! calibration.
//!
//! \return None.
//
//*****************************************************************************
static inline void
HRCAP_setCalibrationMode(uint32_t base)
{
;
__eallow();
//
// Write to CALIBSTS and CALIBCONT bits.
//
(*((volatile uint16_t *)(base + 0x0U))) |= 0x20U;
__edis();
}
//*****************************************************************************
//
//! Enables calibration interrupt.
//!
//! \param base is the base address of the HRCAP module.
//! \param intFlags is the calibration interrupt flags to be enabled.
//!
//! This function enables HRCAP calibration interrupt flags.
//! Valid values for intFlags are:
//! - HRCAP_CALIBRATION_DONE - Calibration done interrupt.
//! - HRCAP_CALIBRATION_PERIOD_OVERFLOW - Calibration period overflow
//! check interrupt.
//! \return None.
//
//*****************************************************************************
static inline void
HRCAP_enableCalibrationInterrupt(uint32_t base, uint16_t intFlags)
{
;
;
__eallow();
//
// Set CALIBDONE or CALPRDCHKSTS.
//
(*((volatile uint16_t *)(base + 0x4U))) |= intFlags;
__edis();
}
//*****************************************************************************
//
//! Disables calibration interrupt source.
//!
//! \param base is the base address of the HRCAP module.
//! \param intFlags is the calibration interrupt flags to be disabled.
//!
//! This function disables HRCAP calibration interrupt flags.
//! Valid values for intFlags are:
//! - HRCAP_CALIBRATION_DONE - Calibration done interrupt.
//! - HRCAP_CALIBRATION_PERIOD_OVERFLOW - Calibration period check
//! interrupt.
//! \return None.
//
//*****************************************************************************
static inline void
HRCAP_disableCalibrationInterrupt(uint32_t base, uint16_t intFlags)
{
;
;
__eallow();
//
// Clear CALIBDONE or CALPRDCHKSTS.
//
(*((volatile uint16_t *)(base + 0x4U))) &= ~intFlags;
__edis();
}
//*****************************************************************************
//
//! Returns the calibration interrupt source.
//!
//! \param base is the base address of the HRCAP module.
//!
//! This function returns the HRCAP calibration interrupt source.
//!
//! \return Returns the HRCAP interrupt that has occurred. The following are
//! valid return values.
//! - HRCAP_GLOBAL_CALIBRATION_INTERRUPT - Global calibration
//! interrupt.
//! - HRCAP_CALIBRATION_DONE - Calibration done interrupt.
//! - HRCAP_CALIBRATION_PERIOD_OVERFLOW - Calibration period overflow
//! interrupt.
//!
//! \note - User can check if a combination of the interrupts have occurred
//! by ORing the above return values.
//
//*****************************************************************************
static inline uint16_t
HRCAP_getCalibrationFlags(uint32_t base)
{
;
//
// Return contents of HRFLG register.
//
return((uint16_t)((*((volatile uint16_t *)(base + 0x6U))) & 0x7U));
}
//*****************************************************************************
//
//! Clears calibration flags.
//!
//! \param base is the base address of the HRCAP module.
//! \param flags is the calibration flags to be cleared.
//!
//! This function clears HRCAP calibration flags.
//! The following are valid values for flags.
//! - HRCAP_GLOBAL_CALIBRATION_INTERRUPT - Global calibration interrupt.
//! - HRCAP_CALIBRATION_DONE - Calibration done flag.
//! - HRCAP_CALIBRATION_PERIOD_OVERFLOW - Calibration period overflow flag.
//!
//! \return None.
//
//*****************************************************************************
static inline void
HRCAP_clearCalibrationFlags(uint32_t base, uint16_t flags)
{
;
;
//
// Write to HRCLR register.
//
(*((volatile uint16_t *)(base + 0x8U))) |= flags;
}
//*****************************************************************************
//
//! Return the Calibration status
//!
//! \param base is the base address of the HRCAP instance used.
//!
//! This function returns the calibration status.
//!
//! \return This functions returns true if the calibration is in process,false
//! if there is no active calibration.
//
//*****************************************************************************
static inline _Bool
HRCAP_isCalibrationBusy(uint32_t base)
{
;
//
// Read CALIBSTS bit.
//
return(((*((volatile uint16_t *)(base + 0x0U))) & 0x10U) ==
0x10U);
}
//*****************************************************************************
//
//! Force a software based calibration
//!
//! \param base is the base address of the HRCAP instance used.
//! \param flag is the calibration flag source.
//!
//! This function forces a software based calibration done flag.
//! The following are valid values for flag.
//! - HRCAP_CALIBRATION_DONE - Calibration done flag.
//! - HRCAP_CALIBRATION_PERIOD_OVERFLOW - Calibration period overflow flag.
//!
//! \return None.
//
//*****************************************************************************
static inline void
HRCAP_forceCalibrationFlags(uint32_t base, uint16_t flag)
{
;
;
__eallow();
//
// Write to CALIBDONE or CALPRDCHKSTS bit.
//
(*((volatile uint16_t *)(base + 0xAU))) |= flag;
__edis();
}
//*****************************************************************************
//
//! Sets the calibration period count
//!
//! \param base is the base address of the HRCAP instance used.
//! \param sysclkHz is the rate of the SYSCLK in Hz.
//!
//! This function sets the calibration period count value to achieve a period
//! of 1.6 milliseconds given the SYSCLK frequency in Hz (the \e sysclkHz
//! parameter).
//!
//! \return None.
//
//*****************************************************************************
static inline void
HRCAP_setCalibrationPeriod(uint32_t base, uint32_t sysclkHz)
{
;
__eallow();
(*((volatile uint32_t *)(base + 0xCU))) = (sysclkHz * 16U) / 10000U;
__edis();
}
//*****************************************************************************
//
//! Sets the calibration period count at a user configurable value.
//!
//! \param base is the base address of the HRCAP instance used.
//! \param sysclkHz is the rate of the SYSCLK in Hz.
//! \param periodInMs is the calibration period to be configured.
//!
//! This function sets the calibration period count value to the provided
//! period in milliseconds given the SYSCLK frequency in Hz (the \e sysclkHz
//! parameter).
//!
//! \return None.
//
//*****************************************************************************
static inline void
HRCAP_configCalibrationPeriod(uint32_t base, uint32_t sysclkHz,
float periodInMs)
{
;
__eallow();
(*((volatile uint32_t *)(base + 0xCU))) =
(uint32_t)((float32_t)sysclkHz * periodInMs / 1000.0F);
__edis();
}
//*****************************************************************************
//
//! Returns the calibration clock period
//!
//! \param base is the base address of the HRCAP instance used.
//! \param clockSource is the calibration clock source
//! (\b HRCAP_CALIBRATION_CLOCK_SYSCLK or \b HRCAP_CALIBRATION_CLOCK_HRCLK).
//!
//! This function returns the period match value of the calibration clock. The
//! return value has a valid count when a period match occurs.
//!
//! \return This function returns the captured value of the clock counter
//! specified by clockSource.
//
//*****************************************************************************
static inline uint32_t
HRCAP_getCalibrationClockPeriod(uint32_t base,
HRCAP_CalibrationClockSource clockSource)
{
;
//
// Return HRCAP_O_HRSYSCLKCAP or HRCAP_O_HRCLKCAP.
//
return((*((volatile uint32_t *)(base + 0x10U + (uint32_t)clockSource))));
}
//*****************************************************************************
//
//! Calculates the scale factor
//!
//! \param base is the base address of the HRCAP instance used.
//!
//! This function reads the SYSCLK and HRCLK calibration periods and then
//! uses them to calculate the scale factor.
//!
//! \return This function returns the calculated scale factor.
//
//*****************************************************************************
static inline float32_t
HRCAP_getScaleFactor(uint32_t base)
{
;
//
// Calculate and return the scale factor.
//
return((float32_t)HRCAP_getCalibrationClockPeriod(base,
HRCAP_CALIBRATION_CLOCK_SYSCLK) /
(float32_t)HRCAP_getCalibrationClockPeriod(base,
HRCAP_CALIBRATION_CLOCK_HRCLK));
}
//*****************************************************************************
//
//! Returns event time stamp in nanoseconds
//!
//! \param timeStamp is a raw time stamp count returned by
//! ECAP_getEventTimeStamp().
//! \param scaleFactor is the calculated scale factor returned by
//! HRCAP_getScaleFactor().
//!
//! This function converts a raw CAP time stamp (the \e timeStamp parameter) to
//! nanoseconds using the provided scale factor (the \e scaleFactor parameter).
//!
//! \return Returns the converted time stamp in nanoseconds.
//
//*****************************************************************************
static inline float32_t
HRCAP_convertEventTimeStampNanoseconds(uint32_t timeStamp,
float32_t scaleFactor)
{
//
// Convert the raw count value to nanoseconds using the given scale factor.
//
return((float32_t)timeStamp * scaleFactor * ((float32_t)25.0 /
(float32_t)384.0));
}
//*****************************************************************************
//
// Close the Doxygen group.
//! @}
//
// Mark the end of the C bindings section for C++ compilers.
//
//*****************************************************************************
//#############################################################################
//
// FILE: hrpwm.h
//
// TITLE: C28x HRPWM Driver
//
//#############################################################################
// $Copyright:
// Copyright (C) 2023 Texas Instruments Incorporated - http://www.ti.com/
//
// 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 Texas Instruments Incorporated 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
// OWNER 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.
// $
//#############################################################################
//*****************************************************************************
//
// If building with a C++ compiler, make all of the definitions in this header
// have a C binding.
//
//*****************************************************************************
//*****************************************************************************
//
//! \addtogroup hrpwm_api HRPWM
//! @{
//
//*****************************************************************************
//###########################################################################
//
// FILE: hw_hrpwm.h
//
// TITLE: Definitions for the HRPWM registers.
//
//###########################################################################
// $Copyright:
// Copyright (C) 2023 Texas Instruments Incorporated - http://www.ti.com/
//
// 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 Texas Instruments Incorporated 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
// OWNER 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.
// $
//###########################################################################
//*************************************************************************************************
//
// The following are defines for the HRPWM register offsets
//
//*************************************************************************************************
// Output A
// Output B
// Mirror Register
// Mirror Register
// Resolution Register
//*************************************************************************************************
//
// The following are defines for the bit fields in the TBCTL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the TBCTL2 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the EPWMSYNCINSEL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the TBSTS register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the EPWMSYNCOUTEN register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the TBCTL3 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the CMPCTL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the CMPCTL2 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the DBCTL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the DBCTL2 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the AQCTL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the AQTSRCSEL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the PCCTL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the VCAPCTL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the VCNTCFG register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the HRCNFG register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the HRPWR register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the HRMSTEP register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the HRCNFG2 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the HRPCTL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the TRREM register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the GLDCTL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the GLDCFG register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the EPWMXLINK register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the AQCTLA register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the AQCTLA2 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the AQCTLB register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the AQCTLB2 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the AQSFRC register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the AQCSFRC register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the DBREDHR register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the DBRED register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the DBFEDHR register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the DBFED register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the TBPHS register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the CMPA register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the CMPB register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the GLDCTL2 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the TZSEL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the TZDCSEL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the TZCTL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the TZCTL2 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the TZCTLDCA register
//
//*************************************************************************************************
// UP
// DOWN
// UP
// DOWN
//*************************************************************************************************
//
// The following are defines for the bit fields in the TZCTLDCB register
//
//*************************************************************************************************
// UP
// DOWN
// UP
// DOWN
//*************************************************************************************************
//
// The following are defines for the bit fields in the TZEINT register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the TZFLG register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the TZCBCFLG register
//
//*************************************************************************************************
// 2
// 2
//*************************************************************************************************
//
// The following are defines for the bit fields in the TZOSTFLG register
//
//*************************************************************************************************
// 1
// 1
//*************************************************************************************************
//
// The following are defines for the bit fields in the TZCLR register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the TZCBCCLR register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the TZOSTCLR register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the TZFRC register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the ETSEL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the ETPS register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the ETFLG register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the ETCLR register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the ETFRC register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the ETINTPS register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the ETSOCPS register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the ETCNTINITCTL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the ETCNTINIT register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the DCTRIPSEL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the DCACTL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the DCBCTL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the DCFCTL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the DCCAPCTL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the BLANKPULSEMIXSEL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the DCAHTRIPSEL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the DCALTRIPSEL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the DCBHTRIPSEL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the DCBLTRIPSEL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the EPWMLOCK register
//
//*************************************************************************************************
//#############################################################################
//
// FILE: hrpwm.h
//
// TITLE: C28x HRPWM Driver
//
//#############################################################################
// $Copyright:
// Copyright (C) 2023 Texas Instruments Incorporated - http://www.ti.com/
//
// 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 Texas Instruments Incorporated 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
// OWNER 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.
// $
//#############################################################################
//*****************************************************************************
//
//! Values that can be passed to HRPWM_setMEPEdgeSelect(),
//! HRPWM_setMEPControlMode(), HRPWM_setCounterCompareShadowLoadEvent()
//! as the \e channel parameter.
//
//*****************************************************************************
typedef enum
{
HRPWM_CHANNEL_A = 0, //!< HRPWM A
HRPWM_CHANNEL_B = 8 //!< HRPWM B
} HRPWM_Channel;
//*****************************************************************************
//
//! Values that can be passed to HRPWM_setMEPEdgeSelect() as the \e mepEdgeMode
//! parameter.
//
//*****************************************************************************
typedef enum
{
//! HRPWM is disabled
HRPWM_MEP_CTRL_DISABLE = 0,
//! MEP controls rising edge
HRPWM_MEP_CTRL_RISING_EDGE = 1,
//! MEP controls falling edge
HRPWM_MEP_CTRL_FALLING_EDGE = 2,
//! MEP controls both rising and falling edge
HRPWM_MEP_CTRL_RISING_AND_FALLING_EDGE = 3
} HRPWM_MEPEdgeMode;
//*****************************************************************************
//
//! Values that can be passed to HRPWM_setHRMEPCtrlMode() as the \e
//! parameter.
//
//*****************************************************************************
typedef enum
{
//! CMPAHR/CMPBHR or TBPRDHR controls MEP edge
HRPWM_MEP_DUTY_PERIOD_CTRL = 0,
//! TBPHSHR controls MEP edge
HRPWM_MEP_PHASE_CTRL = 1
} HRPWM_MEPCtrlMode;
//*****************************************************************************
//
//! Values that can be passed to HRPWM_setCounterCompareShadowLoadEvent(),
//! HRPWM_setRisingEdgeDelayLoadMode() and HRPWM_setFallingEdgeDelayLoadMode
//! as the \e loadEvent parameter.
//
//*****************************************************************************
typedef enum
{
//! load when counter equals zero
HRPWM_LOAD_ON_CNTR_ZERO = 0,
//! load when counter equals period
HRPWM_LOAD_ON_CNTR_PERIOD = 1,
//! load when counter equals zero or period
HRPWM_LOAD_ON_CNTR_ZERO_PERIOD = 2,
} HRPWM_LoadMode;
//*****************************************************************************
//
//! Values that can be passed to HRPWM_setChannelBOutputPath() as the \e
//! outputOnB parameter.
//
//*****************************************************************************
typedef enum
{
HRPWM_OUTPUT_ON_B_NORMAL = 0, //!< ePWMxB output is normal.
HRPWM_OUTPUT_ON_B_INV_A = 1 //!< ePWMxB output is inverted
//!< version of ePWMxA signal
} HRPWM_ChannelBOutput;
//*****************************************************************************
//
//! Values that can be passed to HRPWM_setSyncPulseSource() as the \e
//! syncPulseSource parameter.
//
//*****************************************************************************
typedef enum
{
//! Counter equals Period
HRPWM_PWMSYNC_SOURCE_PERIOD = 0,
//! Counter equals zero
HRPWM_PWMSYNC_SOURCE_ZERO = 1,
//! Counter equals COMPC when counting up
HRPWM_PWMSYNC_SOURCE_COMPC_UP = 4,
//! Counter equals COMPC when counting down
HRPWM_PWMSYNC_SOURCE_COMPC_DOWN = 5,
//! Counter equals COMPD when counting up
HRPWM_PWMSYNC_SOURCE_COMPD_UP = 6,
//! Counter equals COMPD when counting down
HRPWM_PWMSYNC_SOURCE_COMPD_DOWN = 7
} HRPWM_SyncPulseSource;
//*****************************************************************************
//
//! Values that can be passed to HRPWM_setCounterCompareValue() as the \e
//! compModule parameter.
//
//*****************************************************************************
typedef enum
{
HRPWM_COUNTER_COMPARE_A = 0, //!< counter compare A
HRPWM_COUNTER_COMPARE_B = 4 //!< counter compare B
} HRPWM_CounterCompareModule;
//*****************************************************************************
//
//! Values that can be passed to HRPWM_setDeadbandMEPEdgeSelect() as the \e
//! mepDBEdge.
//
//*****************************************************************************
typedef enum
{
//! HRPWM is disabled
HRPWM_DB_MEP_CTRL_DISABLE = 0,
//! MEP controls Rising Edge Delay
HRPWM_DB_MEP_CTRL_RED = 1,
//! MEP controls Falling Edge Delay
HRPWM_DB_MEP_CTRL_FED = 2,
//! MEP controls both Falling and Rising edge delay
HRPWM_DB_MEP_CTRL_RED_FED = 3
} HRPWM_MEPDeadBandEdgeMode;
//*****************************************************************************
//
//! Values that can be passed to HRPWM_lockRegisters() as the \e registerGroup
//! parameter.
//
//*****************************************************************************
typedef enum
{
HRPWM_REGISTER_GROUP_HRPWM = 0x1, //!< HRPWM register group
HRPWM_REGISTER_GROUP_GLOBAL_LOAD = 0x2, //!< Global load register group
HRPWM_REGISTER_GROUP_TRIP_ZONE = 0x4, //!< Trip zone register group
HRPWM_REGISTER_GROUP_TRIP_ZONE_CLEAR = 0x8, //!< Trip zone clear group
HRPWM_REGISTER_GROUP_DIGITAL_COMPARE = 0x10 //!< Digital compare group
} HRPWM_LockRegisterGroup;
//*****************************************************************************
//
// Functions APIs shared with ePWM module
//
//*****************************************************************************
//
// Time Base Sub Module related APIs
//
//
// Action Qualifier module related APIs
//
/* HRPWM_setActionQualifierSwAction is kept for compatibility,
use HRPWM_setActionQualifierSWAction*/
/* HRPWM_forceActionQualifierSwAction is kept for compatibility,
use HRPWM_forceActionQualifierSWAction*/
//
// Dead Band Module related APIs
//
//
// Chopper module related APIs
//
//
// Trip Zone module related APIs
//
//
// HRPWM_getTripZoneInterruptStatus API define is obsolete please use
// HRPWM_getTripZoneFlagStatus going forward.
//
//
// HRPWM_getCycleByCycleTripZoneInterruptStatus API define is obsolete
// please use HRPWM_getCycleByCycleTripZoneFlagStatus going forward.
//
//
// HRPWM_getOneShotTripZoneInterruptStatus is obsolete please use
// HRPWM_getOneShotTripZoneFlagStatus going forward.
//
//
// HRPWM_clearTripZoneInterruptFlag is obsolete please use
// HRPWM_clearTripZoneFlag going forward.
//
//
// HRPWM_clearCycleByCycleTripZoneInterruptFlag is obsolete please use
// HRPWM_clearCycleByCycleTripZoneFlag going forward.
//
//
// HRPWM_clearOneShotTripZoneInterruptFlag is obsolete please use
// HRPWM_clearOneShotTripZoneFlag going forward.
//
//
// Event Trigger related APIs
//
//
// ADC SOC configuration related APIs
//
//
// Digital Compare Module related APIs
//
//
// Valley switching related APIs
//
//
// Global Load feature related APIs
//
//*****************************************************************************
//
// Prototypes for the API.
//
//*****************************************************************************
//*****************************************************************************
//
//! \internal
//! Checks HRPWM base address.
//!
//! \param base specifies the HRPWM module base address.
//!
//! This function determines if an HRPWM module base address is valid.
//!
//! \return Returns \b true if the base address is valid and \b false
//! otherwise.
//
//*****************************************************************************
//*****************************************************************************
//
//! Sets the consolidated phase shift value in high resolution mode.
//!
//! \param base is the base address of the EPWM module.
//! \param phaseCount is the consolidated phase shift count value.
//!
//! This function sets the consolidated phase shift value, that is, both TBPHS
//! and TBPHSHR values are configured together.
//!
//! Call EPWM_enablePhaseShiftLoad & HRPWM_enableHRPhaseShiftLoad() functions
//! to enable loading of the phaseCount in high resolution mode.
//!
//! \b Note: phaseCount is a 24-bit value.
//! \b Note: For configuring TBPHS = 0x3C, TBPHSHR = 0x2;
//! phaseCount = 0x3C02
//!
//! \return None.
//
//*****************************************************************************
static inline void
HRPWM_setPhaseShift(uint32_t base, uint32_t phaseCount)
{
//
// Check the arguments
//
;
;
//
// Write to TBPHS:TBPHSHR bits
//
(*((volatile uint32_t *)(base + 0x60U))) = phaseCount << 8U;
}
//*****************************************************************************
//
//! Sets only the high resolution phase shift value.
//!
//! \param base is the base address of the EPWM module.
//! \param hrPhaseCount is the high resolution phase shift count value.
//!
//! This function sets only the high resolution phase shift(TBPHSHR) value.
//! Call the HRPWM_enableHRPhaseShiftLoad() function to enable loading of
//! the hrPhaseCount.
//!
//! \b Note: hrPhaseCount is an 8-bit value.
//!
//! \return None.
//
//*****************************************************************************
static inline void
HRPWM_setHiResPhaseShiftOnly(uint32_t base, uint16_t hrPhaseCount)
{
//
// Check the arguments
//
;
;
//
// Write to TBPHSHR bits
//
(*((volatile uint16_t *)(base + 0x60U))) = hrPhaseCount << 8U;
}
//*****************************************************************************
//
//! Sets the consolidated period of time base counter used in HR mode.
//!
//! \param base is the base address of the EPWM module.
//! \param periodCount is the consolidated period count value.
//!
//! This function sets the consolidated period of time base counter value
//! (TBPRD:TBPRDHR) required in high resolution mode.
//!
//! User should map the desired period or frequency of the waveform into
//! the correct periodCount.
//!
//! \b Note: periodCount is a 24 bit value.
//! \b Note: For configuring TBPRD = 0x3C, TBPRDHR = 0xA;
//! periodCount = 0x3C0A
//!
//! \return None.
//
//*****************************************************************************
static inline void
HRPWM_setTimeBasePeriod(uint32_t base, uint32_t periodCount)
{
//
// Check the arguments
//
;
;
//
// Write to TBPRD:TBPRDHR bits
//
(*((volatile uint32_t *)(base + 0x62U))) = periodCount << 8U;
}
//*****************************************************************************
//
//! Sets only the high resolution time base counter.
//!
//! \param base is the base address of the EPWM module.
//! \param hrPeriodCount is the high resolution period count value.
//!
//! This function sets only the high resolution time base counter(TBPRDHR)
//! value.
//!
//! User should map the desired period or frequency of the waveform into
//! the correct hrPeriodCount.
//!
//! \b Note: hrPeriodCount is an 8-bit value.
//!
//! \return None.
//
//*****************************************************************************
static inline void
HRPWM_setHiResTimeBasePeriodOnly(uint32_t base, uint16_t hrPeriodCount)
{
//
// Check the arguments
//
;
;
//
// Write to TBPRDHR bits
//
(*((volatile uint16_t *)(base + 0x62U))) = hrPeriodCount << 8U;
}
//*****************************************************************************
//
//! Gets the consolidated time base period count used in HR mode
//!
//! \param base is the base address of the EPWM module.
//!
//! This function gets the consolidated time base period(TBPRD:TBPRDHR) value
//! used in high resolution mode.
//!
//! \return The consolidated time base period count value.
//
//*****************************************************************************
static inline uint32_t
HRPWM_getTimeBasePeriod(uint32_t base)
{
//
// Check the arguments
//
;
//
// Read from TBPRD:TBPRDHR bit
//
return((*((volatile uint32_t *)(base + 0x62U))) >> 8U);
}
//*****************************************************************************
//
//! Gets the only the high resolution time base period count.
//!
//! \param base is the base address of the EPWM module.
//!
//! This function gets only the high resolution time base period(TBPRDHR) value.
//!
//! \return The high resolution time base period count value.
//
//*****************************************************************************
static inline uint16_t
HRPWM_getHiResTimeBasePeriodOnly(uint32_t base)
{
//
// Check the arguments
//
;
//
// Read from TBPRDHR bit
//
return((*((volatile uint16_t *)(base + 0x62U))) >> 8U);
}
//*****************************************************************************
//
//! Sets the high resolution edge controlled by MEP (Micro Edge Positioner).
//!
//! \param base is the base address of the EPWM module.
//! \param channel is high resolution period module.
//! \param mepEdgeMode edge of the PWM that is controlled by MEP (Micro Edge
//! Positioner).
//!
//! This function sets the edge of the PWM that is controlled by MEP (Micro
//! Edge Positioner). Valid values for the parameters are:
//! - channel
//! - HRPWM_CHANNEL_A - HRPWM A
//! - HRPWM_CHANNEL_B - HRPWM B
//! - mepEdgeMode
//! - HRPWM_MEP_CTRL_DISABLE - HRPWM is disabled
//! - HRPWM_MEP_CTRL_RISING_EDGE - MEP (Micro Edge Positioner)
//! controls rising edge.
//! - HRPWM_MEP_CTRL_FALLING_EDGE - MEP (Micro Edge Positioner)
//! controls falling edge.
//! - HRPWM_MEP_CTRL_RISING_AND_FALLING_EDGE - MEP (Micro Edge Positioner)
//! controls both edges.
//!
//! \return None.
//
//*****************************************************************************
static inline void
HRPWM_setMEPEdgeSelect(uint32_t base, HRPWM_Channel channel,
HRPWM_MEPEdgeMode mepEdgeMode)
{
//
// Check the arguments
//
;
//
// Set the edge mode
//
__eallow();
(*((volatile uint16_t *)(base + 0x20U))) =
(((*((volatile uint16_t *)(base + 0x20U))) & ~(0x3U << (uint16_t)channel )) |
((uint16_t)mepEdgeMode << (uint16_t)channel));
__edis();
}
//*****************************************************************************
//
//! Sets the MEP (Micro Edge Positioner) control mode.
//!
//! \param base is the base address of the EPWM module.
//! \param channel is high resolution period module.
//! \param mepCtrlMode is the MEP (Micro Edge Positioner) control mode.
//!
//! This function sets the mode (register type) the MEP (Micro Edge Positioner)
//! will control. Valid values for the parameters are:
//! - channel
//! - HRPWM_CHANNEL_A - HRPWM A
//! - HRPWM_CHANNEL_B - HRPWM B
//! - mepCtrlMode
//! - HRPWM_MEP_DUTY_PERIOD_CTRL - MEP (Micro Edge Positioner) is
//! controlled by value of CMPAHR/
//! CMPBHR(depending on the value of
//! channel) or TBPRDHR.
//! - HRPWM_MEP_PHASE_CTRL - MEP (Micro Edge Positioner) is
//! controlled by TBPHSHR.
//!
//! \return None.
//
//*****************************************************************************
static inline void
HRPWM_setMEPControlMode(uint32_t base, HRPWM_Channel channel,
HRPWM_MEPCtrlMode mepCtrlMode)
{
//
// Check the arguments
//
;
//
// Set the MEP control
//
__eallow();
(*((volatile uint16_t *)(base + 0x20U))) =
(((*((volatile uint16_t *)(base + 0x20U))) & ~(0x1U << ((uint16_t)channel + 2U))) |
((uint16_t)mepCtrlMode << ((uint16_t)channel + 2U)));
__edis();
}
//*****************************************************************************
//
//! Sets the high resolution comparator load mode.
//!
//! \param base is the base address of the EPWM module.
//! \param channel is high resolution period module.
//! \param loadEvent is the MEP (Micro Edge Positioner) control mode.
//!
//! This function sets the shadow load mode of the high resolution comparator.
//! The function sets the COMPA or COMPB register depending on the channel
//! variable.
//! Valid values for the parameters are:
//! - channel
//! - HRPWM_CHANNEL_A - HRPWM A
//! - HRPWM_CHANNEL_B - HRPWM B
//! - loadEvent
//! - HRPWM_LOAD_ON_CNTR_ZERO - load when counter equals zero
//! - HRPWM_LOAD_ON_CNTR_PERIOD - load when counter equals period
//! - HRPWM_LOAD_ON_CNTR_ZERO_PERIOD - load when counter equals zero or
//! period
//!
//! \return None.
//
//*****************************************************************************
static inline void
HRPWM_setCounterCompareShadowLoadEvent(uint32_t base, HRPWM_Channel channel,
HRPWM_LoadMode loadEvent)
{
//
// Check the arguments
//
;
//
// Set the CMPAHR or CMPBHR load mode
//
__eallow();
(*((volatile uint16_t *)(base + 0x20U))) =
(((*((volatile uint16_t *)(base + 0x20U))) & ~(0x3U << ((uint16_t)channel + 3U))) |
((uint16_t)loadEvent << ((uint16_t)channel + 3U)));
__edis();
}
//*****************************************************************************
//
//! Sets the high resolution output swap mode.
//!
//! \param base is the base address of the EPWM module.
//! \param enableOutputSwap is the output swap flag.
//!
//! This function sets the HRPWM output swap mode. If enableOutputSwap is true,
//! ePWMxA signal appears on ePWMxB output and ePWMxB signal appears on ePWMxA
//! output. If it is false ePWMxA and ePWMxB outputs are unchanged.
//!
//! \return None.
//
//*****************************************************************************
static inline void
HRPWM_setOutputSwapMode(uint32_t base, _Bool enableOutputSwap)
{
//
// Check the arguments
//
;
//
// Set output swap mode
//
__eallow();
if(enableOutputSwap)
{
(*((volatile uint16_t *)(base + 0x20U))) |= 0x80U;
}
else
{
(*((volatile uint16_t *)(base + 0x20U))) &= ~0x80U;
}
__edis();
}
//*****************************************************************************
//
//! Sets the high resolution output on ePWMxB
//!
//! \param base is the base address of the EPWM module.
//! \param outputOnB is the output signal on ePWMxB.
//!
//! This function sets the HRPWM output signal on ePWMxB. If outputOnB is
//! HRPWM_OUTPUT_ON_B_INV_A, ePWMxB output is an inverted version of
//! ePWMxA. If outputOnB is HRPWM_OUTPUT_ON_B_NORMAL, ePWMxB output is
//! ePWMxB.
//!
//! \return None.
//
//*****************************************************************************
static inline void
HRPWM_setChannelBOutputPath(uint32_t base, HRPWM_ChannelBOutput outputOnB)
{
//
// Check the arguments
//
;
//
// Set the output on ePWM B
//
__eallow();
(*((volatile uint16_t *)(base + 0x20U))) =
(((*((volatile uint16_t *)(base + 0x20U))) & ~(0x20U)) |
((uint16_t)outputOnB << 5U));
__edis();
}
//*****************************************************************************
//
//! Enables MEP (Micro Edge Positioner) automatic scale mode.
//!
//! \param base is the base address of the EPWM module.
//!
//! This function enables the MEP (Micro Edge Positioner) to automatically
//! scale HRMSTEP.
//!
//! The SFO library will calculate required MEP steps per coarse steps and
//! feed it to HRMSTEP register. The MEP calibration module will use the value
//! in HRMSTEP to determine appropriate number of MEP steps represented by
//! fractional duty cycle.
//!
//! \return None.
//
//*****************************************************************************
static inline void
HRPWM_enableAutoConversion(uint32_t base)
{
//
// Check the arguments
//
;
//
// Enable MEP automatic scale
//
__eallow();
(*((volatile uint16_t *)(base + 0x20U))) |= 0x40U;
__edis();
}
//*****************************************************************************
//
//! Disables MEP automatic scale mode.
//!
//! \param base is the base address of the EPWM module.
//!
//! This function disables the MEP (Micro Edge Positioner) from automatically
//! scaling HRMSTEP.
//!
//! \return None.
//
//*****************************************************************************
static inline void
HRPWM_disableAutoConversion(uint32_t base)
{
//
// Check the arguments
//
;
//
// Disable MEP automatic scale
//
__eallow();
(*((volatile uint16_t *)(base + 0x20U))) &= ~0x40U;
__edis();
}
//*****************************************************************************
//
//! Enable high resolution period feature.
//!
//! \param base is the base address of the EPWM module.
//!
//! This function enables the high resolution period feature.
//!
//! \return None.
//
//*****************************************************************************
static inline void
HRPWM_enablePeriodControl(uint32_t base)
{
//
// Check the arguments
//
;
//
// Set HRPE bit
//
__eallow();
(*((volatile uint16_t *)(base + 0x2DU))) |= 0x1U;
__edis();
}
//*****************************************************************************
//
//! Disable high resolution period feature.
//!
//! \param base is the base address of the EPWM module.
//!
//! This function disables the high resolution period feature.
//!
//! \return None.
//
//*****************************************************************************
static inline void
HRPWM_disablePeriodControl(uint32_t base)
{
//
// Check the arguments
//
;
//
// Clear HRPE bit
//
__eallow();
(*((volatile uint16_t *)(base + 0x2DU))) &= ~0x1U;
__edis();
}
//*****************************************************************************
//
//! Enable high resolution phase load
//!
//! \param base is the base address of the EPWM module.
//!
//! This function enables loading of high resolution phase shift value which is
//! set by the function HRPWM_setPhaseShift().
//!
//! \return None.
//
//*****************************************************************************
static inline void
HRPWM_enablePhaseShiftLoad(uint32_t base)
{
//
// Check the arguments
//
;
//
// Set TBPHSHRLOADE bit
//
__eallow();
(*((volatile uint16_t *)(base + 0x2DU))) |= 0x4U;
__edis();
}
//*****************************************************************************
//
//! Disable high resolution phase load
//!
//! \param base is the base address of the EPWM module.
//!
//! This function disables loading of high resolution phase shift value.
//!
//! \return
//
//*****************************************************************************
static inline void
HRPWM_disablePhaseShiftLoad(uint32_t base)
{
//
// Check the arguments
//
;
//
// Clear TBPHSHRLOADE bit
//
__eallow();
(*((volatile uint16_t *)(base + 0x2DU))) &= ~0x4U;
__edis();
}
//*****************************************************************************
//
//! Set high resolution PWMSYNC source.
//!
//! \param base is the base address of the EPWM module.
//! \param syncPulseSource is the PWMSYNC source.
//!
//! This function sets the high resolution PWMSYNC pulse source.
//! Valid values for syncPulseSource are:
//! - HRPWM_PWMSYNC_SOURCE_PERIOD - Counter equals Period.
//! - HRPWM_PWMSYNC_SOURCE_ZERO - Counter equals zero.
//! - HRPWM_PWMSYNC_SOURCE_COMPC_UP - Counter equals COMPC when
//! counting up.
//! - HRPWM_PWMSYNC_SOURCE_COMPC_DOWN - Counter equals COMPC when
//! counting down.
//! - HRPWM_PWMSYNC_SOURCE_COMPD_UP - Counter equals COMPD when
//! counting up.
//! - HRPWM_PWMSYNC_SOURCE_COMPD_DOWN - Counter equals COMPD when
//! counting down.
//!
//! \return None.
//
//*****************************************************************************
static inline void
HRPWM_setSyncPulseSource(uint32_t base, HRPWM_SyncPulseSource syncPulseSource)
{
//
// Set the PWMSYNC source
//
__eallow();
//
// Configuration for sync pulse source equal to HRPWM_PWMSYNC_SOURCE_PERIOD
// or HRPWM_PWMSYNC_SOURCE_ZERO
//
if(syncPulseSource < HRPWM_PWMSYNC_SOURCE_COMPC_UP)
{
(*((volatile uint16_t *)(base + 0x2DU))) =
(((*((volatile uint16_t *)(base + 0x2DU))) &
~(0x70U | 0x2U)) |
((uint16_t)syncPulseSource << 1U));
}
else
{
(*((volatile uint16_t *)(base + 0x2DU))) =
(((*((volatile uint16_t *)(base + 0x2DU))) & ~0x70U) |
((uint16_t)syncPulseSource << 4U));
}
__edis();
}
//*****************************************************************************
//
//! Sets the Translator Remainder value.
//!
//! \param base is the base address of the EPWM module.
//! \param trremVal is the translator remainder value.
//!
//! This function sets the Translator Remainder value.
//!
//! \return None.
//
//*****************************************************************************
static inline void
HRPWM_setTranslatorRemainder(uint32_t base, uint16_t trremVal)
{
//
// Check the arguments
//
;
;
//
// Set Translator Remainder value
//
__eallow();
(*((volatile uint16_t *)(base + 0x2EU))) = (trremVal & 0x7FFU);
__edis();
}
//*****************************************************************************
//
//! Sets the consolidated counter compare values in HR mode.
//!
//! \param base is the base address of the EPWM module.
//! \param compModule is the Counter Compare module.
//! \param compCount is the consolidated counter compare count value.
//!
//! This function sets the consolidated counter compare(CMPx:CMPxHR) value
//! required in high resolution mode for counter compare registers.
//! Valid values for compModule are:
//! - HRPWM_COUNTER_COMPARE_A - counter compare A.
//! - HRPWM_COUNTER_COMPARE_B - counter compare B.
//!
//! \b Note: compCount is a 24 bit value.
//! \b Note: For configuring CMPA = 0xB4, CMPAHR = 0x64; value of
//! compCount = 0xB464
//!
//! \return None.
//
//*****************************************************************************
static inline void
HRPWM_setCounterCompareValue(uint32_t base,
HRPWM_CounterCompareModule compModule,
uint32_t compCount)
{
//
// Check the arguments
//
;
;
//
// Write to counter compare registers
//
if(compModule == HRPWM_COUNTER_COMPARE_A)
{
//
// Write to CMPA:CMPAHR
//
(*((volatile uint32_t *)(base + 0x6AU))) = compCount << 8U;
}
else
{
//
// Write to CMPB:CMPBHR
//
(*((volatile uint32_t *)(base + 0x6CU))) = compCount << 8U;
}
}
//*****************************************************************************
//
//! Sets only the high resolution counter compare value.
//!
//! \param base is the base address of the EPWM module.
//! \param compModule is the Counter Compare module.
//! \param hrCompCount is the high resolution counter compare count value.
//!
//! This function sets the high resolution counter compare value(CMPxHR) for
//! counter compare registers.
//! Valid values for compModule are:
//! - HRPWM_COUNTER_COMPARE_A - counter compare A.
//! - HRPWM_COUNTER_COMPARE_B - counter compare B.
//!
//! \b Note: hrCompCount is an 8-bit value.
//!
//! \return None.
//
//*****************************************************************************
static inline void
HRPWM_setHiResCounterCompareValueOnly(uint32_t base,
HRPWM_CounterCompareModule compModule,
uint16_t hrCompCount)
{
//
// Check the arguments
//
;
;
//
// Write to the high resolution counter compare registers
//
if(compModule == HRPWM_COUNTER_COMPARE_A)
{
//
// Write to CMPAHR
//
(*((volatile uint16_t *)(base + 0x6AU))) = hrCompCount << 8U;
}
else
{
//
// Write to CMPBHR
//
(*((volatile uint16_t *)(base + 0x6CU))) = hrCompCount << 8U;
}
}
//*****************************************************************************
//
//! Gets the consolidated counter compare values.
//!
//! \param base is the base address of the EPWM module.
//! \param compModule is the Counter Compare module value.
//!
//! This function gets the consolidated counter compare(CMPx:CMPxHR) value
//! used in high resolution for the counter compare module specified.
//! Valid values for compModule are:
//! - HRPWM_COUNTER_COMPARE_A - counter compare A.
//! - HRPWM_COUNTER_COMPARE_B - counter compare B.
//!
//!
//! \return None.
//
//*****************************************************************************
static inline uint32_t
HRPWM_getCounterCompareValue(uint32_t base,
HRPWM_CounterCompareModule compModule)
{
uint32_t compCount;
//
// Check the arguments
//
;
//
// Get counter compare value for selected module
//
if(compModule == HRPWM_COUNTER_COMPARE_A)
{
//
// Read from CMPAHR
//
compCount = (*((volatile uint32_t *)(base + 0x6AU))) >> 8U;
}
else
{
//
// Read from CMPBHR
//
compCount = (*((volatile uint32_t *)(base + 0x6CU))) >> 8U;
}
return(compCount);
}
//*****************************************************************************
//
//! Gets only the high resolution counter compare values.
//!
//! \param base is the base address of the EPWM module.
//! \param compModule is the Counter Compare module value.
//!
//! This function gets only the high resolution counter compare(CMPxHR) value
//! for the counter compare module specified.
//! Valid values for compModule are:
//! - HRPWM_COUNTER_COMPARE_A - counter compare A.
//! - HRPWM_COUNTER_COMPARE_B - counter compare B.
//!
//! \return None.
//
//*****************************************************************************
static inline uint16_t
HRPWM_getHiResCounterCompareValueOnly(uint32_t base,
HRPWM_CounterCompareModule compModule)
{
uint16_t hrCompCount;
//
// Check the arguments
//
;
//
// Get counter compare value for selected module
//
if(compModule == HRPWM_COUNTER_COMPARE_A)
{
//
// Read from CMPAHR
//
hrCompCount = (*((volatile uint16_t *)(base + 0x6AU))) >> 8U;
}
else
{
//
// Read from CMPBHR
//
hrCompCount = (*((volatile uint16_t *)(base + 0x6CU))) >> 8U;
}
return(hrCompCount);
}
//*****************************************************************************
//
//! Sets the consolidated RED count in high resolution mode.
//!
//! \param base is the base address of the EPWM module.
//! \param redCount is the high resolution RED count.
//!
//! This function sets the consolidated RED (Rising Edge Delay) count
//! (DBRED:DBREDHR) value used in high resolution mode. The value of
//! redCount should be less than 0x200000.
//!
//! \b Note: redCount is a 21 bit value.
//! \b Note: For configuring DBRED = 0x4, DBREDHR = 0x1; value of
//! redCount = ((0x4 << 7) | 0x1) = 0x201
//!
//! \return None.
//
//*****************************************************************************
static inline void
HRPWM_setRisingEdgeDelay(uint32_t base, uint32_t redCount)
{
//
// Check the arguments
//
;
;
//
// Set the consolidated RED (Rising Edge Delay) count
//
(*((volatile uint32_t *)(base + 0x50U))) = redCount << 9U;
}
//*****************************************************************************
//
//! Sets the high resolution RED count only.
//!
//! \param base is the base address of the EPWM module.
//! \param hrRedCount is the high resolution RED count.
//!
//! This function sets only the high resolution RED (Rising Edge Delay)
//! count(DBREDHR) value.
//! The value of hrRedCount should be less than 128.
//!
//! \b Note: hrRedCount is a 7-bit value.
//!
//! \return None.
//
//*****************************************************************************
static inline void
HRPWM_setHiResRisingEdgeDelayOnly(uint32_t base, uint16_t hrRedCount)
{
//
// Check the arguments
//
;
;
//
// Set the High Resolution RED (Rising Edge Delay) count only
//
(*((volatile uint16_t *)(base + 0x50U))) = hrRedCount << 9U;
}
//*****************************************************************************
//
//! Sets the consolidated FED value in high resolution mode.
//!
//! \param base is the base address of the EPWM module.
//! \param fedCount is the high resolution FED count.
//!
//! This function sets the consolidated FED (Falling Edge Delay) count
//! (DBFED: DBFEDHR) value used in high resolution mode. The value of fedCount
//! should be less than 0x200000.
//!
//! \b Note: fedCount is a 21 bit value.
//! \b Note: For configuring DBFED = 0x4, DBFEDHR = 0x1; value of
//! fedCount = ((0x4 << 7) | 0x1) = 0x201
//!
//! \return None.
//
//*****************************************************************************
static inline void
HRPWM_setFallingEdgeDelay(uint32_t base, uint32_t fedCount)
{
//
// Check the arguments
//
;
;
//
// Set the High Resolution FED (Falling Edge Delay) count
//
(*((volatile uint32_t *)(base + 0x52U))) = fedCount << 9U;
}
//*****************************************************************************
//
//! Sets high resolution FED count only.
//!
//! \param base is the base address of the EPWM module.
//! \param hrFedCount is the high resolution FED count.
//!
//! This function sets only the high resolution FED (Falling Edge Delay) count
//! (DBFEDHR)value. The value of hrFedCount should be less than 128.
//!
//! \b Note: hrFedCount is a 7-bit value.
//!
//! \return None.
//
//*****************************************************************************
static inline void
HRPWM_setHiResFallingEdgeDelayOnly(uint32_t base, uint16_t hrFedCount)
{
//
// Check the arguments
//
;
;
//
// Set the high resolution FED (Falling Edge Delay) count
//
(*((volatile uint16_t *)(base + 0x52U))) = hrFedCount << 9U;
}
//*****************************************************************************
//
//! Set high resolution MEP (Micro Edge Positioner) step.
//!
//! \param base is the base address of the EPWM module.
//! \param mepCount is the high resolution MEP (Micro Edge Positioner) step
//! count.
//!
//! This function sets the high resolution MEP (Micro Edge Positioner) step
//! count. The maximum value for the MEP count step is 255.
//!
//! \return None.
//
//*****************************************************************************
static inline void
HRPWM_setMEPStep(uint32_t base, uint16_t mepCount)
{
//
// Check the arguments
//
;
;
//
// Set HRPWM MEP count
//
__eallow();
(*((volatile uint16_t *)(base + 0x26U))) =
(((*((volatile uint16_t *)(base + 0x26U))) & ~0xFFU) |
mepCount);
__edis();
}
//*****************************************************************************
//
//! Set high resolution Dead Band MEP (Micro Edge Positioner) control.
//!
//! \param base is the base address of the EPWM module.
//! \param mepDBEdge is the high resolution MEP (Micro Edge Positioner) control
//! edge.
//!
//! This function sets the high resolution Dead Band edge that the MEP (Micro
//! Edge Positioner) controls Valid values for mepDBEdge are:
//! - HRPWM_DB_MEP_CTRL_DISABLE - HRPWM is disabled
//! - HRPWM_DB_MEP_CTRL_RED - MEP (Micro Edge Positioner) controls
//! Rising Edge Delay
//! - HRPWM_DB_MEP_CTRL_FED - MEP (Micro Edge Positioner) controls
//! Falling Edge Delay
//! - HRPWM_DB_MEP_CTRL_RED_FED - MEP (Micro Edge Positioner) controls both
//! Falling and Rising edge delays
//!
//! \return None.
//
//*****************************************************************************
static inline void
HRPWM_setDeadbandMEPEdgeSelect(uint32_t base,
HRPWM_MEPDeadBandEdgeMode mepDBEdge)
{
//
// Check the arguments
//
;
//
// Set the HRPWM DB edge mode
//
__eallow();
(*((volatile uint16_t *)(base + 0x27U))) =
(((*((volatile uint16_t *)(base + 0x27U))) & ~0x3U) |
((uint16_t)mepDBEdge));
__edis();
}
//*****************************************************************************
//
//! Set the high resolution Dead Band RED load mode.
//!
//! \param base is the base address of the EPWM module.
//! \param loadEvent is the shadow to active load event.
//!
//! This function sets the high resolution Rising Edge Delay(RED)Dead Band
//! count load mode.
//! Valid values for loadEvent are:
//! - HRPWM_LOAD_ON_CNTR_ZERO - load when counter equals zero.
//! - HRPWM_LOAD_ON_CNTR_PERIOD - load when counter equals period
//! - HRPWM_LOAD_ON_CNTR_ZERO_PERIOD - load when counter equals zero
//! or period.
//!
//! \return None.
//
//*****************************************************************************
static inline void
HRPWM_setRisingEdgeDelayLoadMode(uint32_t base,
HRPWM_LoadMode loadEvent)
{
//
// Check the arguments
//
;
//
// Set the HRPWM RED load mode
//
__eallow();
(*((volatile uint16_t *)(base + 0x27U))) =
(((*((volatile uint16_t *)(base + 0x27U))) & ~0xCU) |
((uint16_t)loadEvent << 2U));
__edis();
}
//*****************************************************************************
//
//! Set the high resolution Dead Band FED load mode.
//!
//! \param base is the base address of the EPWM module.
//! \param loadEvent is the shadow to active load event.
//!
//! This function sets the high resolution Falling Edge Delay(FED) Dead Band
//! count load mode.
//! Valid values for loadEvent are:
//! - HRPWM_LOAD_ON_CNTR_ZERO - load when counter equals zero.
//! - HRPWM_LOAD_ON_CNTR_PERIOD - load when counter equals period
//! - HRPWM_LOAD_ON_CNTR_ZERO_PERIOD - load when counter equals zero
//! or period.
//!
//! \return None.
//
//*****************************************************************************
static inline void
HRPWM_setFallingEdgeDelayLoadMode(uint32_t base, HRPWM_LoadMode loadEvent)
{
//
// Check the arguments
//
;
//
// Set the HRPWM FED load mode
//
__eallow();
(*((volatile uint16_t *)(base + 0x27U))) =
(((*((volatile uint16_t *)(base + 0x27U))) & ~0x30U) |
((uint16_t)loadEvent << 4U));
__edis();
}
//*****************************************************************************
//
//! Lock EALLOW protected register groups
//!
//! \param base is the base address of the EPWM module.
//! \param registerGroup is the EALLOW register groups.
//!
//! This functions locks the EALLOW protected register groups specified by
//! the registerGroup variable.
//!
//! \return None.
//
//*****************************************************************************
static inline void
HRPWM_lockRegisters(uint32_t base, HRPWM_LockRegisterGroup registerGroup)
{
//
// Check the arguments
//
;
//
// Write the Key to EPWMLOCK register
//
(*((volatile uint32_t *)(base + 0xFAU))) =
(0xA5A50000UL | ((uint32_t)registerGroup));
}
//*****************************************************************************
//
// Close the Doxygen group.
//! @}
//
//*****************************************************************************
//*****************************************************************************
//
// Mark the end of the C bindings section for C++ compilers.
//
//*****************************************************************************
//###########################################################################
//
// FILE: i2c.h
//
// TITLE: C28x I2C driver.
//
//###########################################################################
// $Copyright:
// Copyright (C) 2023 Texas Instruments Incorporated - http://www.ti.com/
//
// 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 Texas Instruments Incorporated 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
// OWNER 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.
// $
//###########################################################################
//*****************************************************************************
//
// If building with a C++ compiler, make all of the definitions in this header
// have a C binding.
//
//*****************************************************************************
//*****************************************************************************
//
//! \addtogroup i2c_api I2C
//! @{
//
//*****************************************************************************
//###########################################################################
//
// FILE: hw_i2c.h
//
// TITLE: Definitions for the I2C registers.
//
//###########################################################################
// $Copyright:
// Copyright (C) 2023 Texas Instruments Incorporated - http://www.ti.com/
//
// 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 Texas Instruments Incorporated 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
// OWNER 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.
// $
//###########################################################################
//*************************************************************************************************
//
// The following are defines for the I2C register offsets
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the I2COAR register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the I2CIER register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the I2CSTR register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the I2CDRR register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the I2CSAR register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the I2CDXR register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the I2CMDR register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the I2CISRC register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the I2CEMDR register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the I2CPSC register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the I2CFFTX register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the I2CFFRX register
//
//*************************************************************************************************
//*****************************************************************************
//
// Defines for the API.
//
//*****************************************************************************
//*****************************************************************************
//
// I2C Controller commands.
//
//*****************************************************************************
//*****************************************************************************
//
// I2C interrupts for use with the intFlags parameter of I2C_enableInterrupt(),
// I2C_disableInterrupt(), and I2C_clearInterruptStatus() and to be returned by
// I2C_getInterruptStatus().
//
//*****************************************************************************
//
// Helpful define to mask out the bits in the I2CSTR register that aren't
// associated with interrupts.
//
//*****************************************************************************
//
// Flags for use as the stsFlags parameter of I2C_clearStatus() and to be
// returned by I2C_getStatus().
//
//*****************************************************************************
//*****************************************************************************
//
//! I2C interrupts to be returned by I2C_getInterruptSource().
//
//*****************************************************************************
typedef enum
{
I2C_INTSRC_NONE, //!< No interrupt pending
I2C_INTSRC_ARB_LOST, //!< Arbitration-lost interrupt
I2C_INTSRC_NO_ACK, //!< NACK interrupt
I2C_INTSRC_REG_ACCESS_RDY, //!< Register-access-ready interrupt
I2C_INTSRC_RX_DATA_RDY, //!< Receive-data-ready interrupt
I2C_INTSRC_TX_DATA_RDY, //!< Transmit-data-ready interrupt
I2C_INTSRC_STOP_CONDITION, //!< Stop condition detected
I2C_INTSRC_ADDR_TARGET //!< Addressed as target interrupt
} I2C_InterruptSource;
//*****************************************************************************
//
//! Values that can be passed to I2C_setFIFOInterruptLevel() as the \e txLevel
//! parameter, returned by I2C_getFIFOInterruptLevel() in the \e txLevel
//! parameter, and returned by I2C_getTxFIFOStatus().
//
//*****************************************************************************
typedef enum
{
I2C_FIFO_TXEMPTY = 0x0000U, //!< Transmit FIFO empty
I2C_FIFO_TX0 = 0x0000U, //!< Transmit FIFO empty
I2C_FIFO_TX1 = 0x0001U, //!< Transmit FIFO 1/16 full
I2C_FIFO_TX2 = 0x0002U, //!< Transmit FIFO 2/16 full
I2C_FIFO_TX3 = 0x0003U, //!< Transmit FIFO 3/16 full
I2C_FIFO_TX4 = 0x0004U, //!< Transmit FIFO 4/16 full
I2C_FIFO_TX5 = 0x0005U, //!< Transmit FIFO 5/16 full
I2C_FIFO_TX6 = 0x0006U, //!< Transmit FIFO 6/16 full
I2C_FIFO_TX7 = 0x0007U, //!< Transmit FIFO 7/16 full
I2C_FIFO_TX8 = 0x0008U, //!< Transmit FIFO 8/16 full
I2C_FIFO_TX9 = 0x0009U, //!< Transmit FIFO 9/16 full
I2C_FIFO_TX10 = 0x000AU, //!< Transmit FIFO 10/16 full
I2C_FIFO_TX11 = 0x000BU, //!< Transmit FIFO 11/16 full
I2C_FIFO_TX12 = 0x000CU, //!< Transmit FIFO 12/16 full
I2C_FIFO_TX13 = 0x000DU, //!< Transmit FIFO 13/16 full
I2C_FIFO_TX14 = 0x000EU, //!< Transmit FIFO 14/16 full
I2C_FIFO_TX15 = 0x000FU, //!< Transmit FIFO 15/16 full
I2C_FIFO_TX16 = 0x0010U, //!< Transmit FIFO full
I2C_FIFO_TXFULL = 0x0010U //!< Transmit FIFO full
} I2C_TxFIFOLevel;
//*****************************************************************************
//
//! Values that can be passed to I2C_setFIFOInterruptLevel() as the \e rxLevel
//! parameter, returned by I2C_getFIFOInterruptLevel() in the \e rxLevel
//! parameter, and returned by I2C_getRxFIFOStatus().
//
//*****************************************************************************
typedef enum
{
I2C_FIFO_RXEMPTY = 0x0000U, //!< Receive FIFO empty
I2C_FIFO_RX0 = 0x0000U, //!< Receive FIFO empty
I2C_FIFO_RX1 = 0x0001U, //!< Receive FIFO 1/16 full
I2C_FIFO_RX2 = 0x0002U, //!< Receive FIFO 2/16 full
I2C_FIFO_RX3 = 0x0003U, //!< Receive FIFO 3/16 full
I2C_FIFO_RX4 = 0x0004U, //!< Receive FIFO 4/16 full
I2C_FIFO_RX5 = 0x0005U, //!< Receive FIFO 5/16 full
I2C_FIFO_RX6 = 0x0006U, //!< Receive FIFO 6/16 full
I2C_FIFO_RX7 = 0x0007U, //!< Receive FIFO 7/16 full
I2C_FIFO_RX8 = 0x0008U, //!< Receive FIFO 8/16 full
I2C_FIFO_RX9 = 0x0009U, //!< Receive FIFO 9/16 full
I2C_FIFO_RX10 = 0x000AU, //!< Receive FIFO 10/16 full
I2C_FIFO_RX11 = 0x000BU, //!< Receive FIFO 11/16 full
I2C_FIFO_RX12 = 0x000CU, //!< Receive FIFO 12/16 full
I2C_FIFO_RX13 = 0x000DU, //!< Receive FIFO 13/16 full
I2C_FIFO_RX14 = 0x000EU, //!< Receive FIFO 14/16 full
I2C_FIFO_RX15 = 0x000FU, //!< Receive FIFO 15/16 full
I2C_FIFO_RX16 = 0x0010U, //!< Receive FIFO full
I2C_FIFO_RXFULL = 0x0010U //!< Receive FIFO full
} I2C_RxFIFOLevel;
//*****************************************************************************
//
//! Values that can be passed to I2C_setBitCount() as the \e size parameter.
//
//*****************************************************************************
typedef enum
{
I2C_BITCOUNT_1 = 1U, //!< 1 bit per data byte
I2C_BITCOUNT_2 = 2U, //!< 2 bits per data byte
I2C_BITCOUNT_3 = 3U, //!< 3 bits per data byte
I2C_BITCOUNT_4 = 4U, //!< 4 bits per data byte
I2C_BITCOUNT_5 = 5U, //!< 5 bits per data byte
I2C_BITCOUNT_6 = 6U, //!< 6 bits per data byte
I2C_BITCOUNT_7 = 7U, //!< 7 bits per data byte
I2C_BITCOUNT_8 = 0U //!< 8 bits per data byte
} I2C_BitCount;
//*****************************************************************************
//
//! Values that can be passed to I2C_setAddressMode() as the \e mode parameter.
//
//*****************************************************************************
typedef enum
{
I2C_ADDR_MODE_7BITS = 0x0000U, //!< 7-bit address
I2C_ADDR_MODE_10BITS = 0x0100U //!< 10-bit address
} I2C_AddressMode;
//*****************************************************************************
//
//! Values that can be passed to I2C_setExtendedMode() as the \e mode parameter.
//
//*****************************************************************************
typedef enum
{
I2C_EADDR_MODE_BC = 1U, //!< Backward compatibility
I2C_EADDR_MODE_FWD = 2U //!< Forward compatibility
} I2C_ExtendedMode;
//*****************************************************************************
//
//! Values that can be passed to I2C_setEmulationMode() as the \e mode
//! parameter.
//
//*****************************************************************************
typedef enum
{
//! If SCL is low, keep it low. If high, stop when it goes low again.
I2C_EMULATION_STOP_SCL_LOW = 0x0000U,
//! Continue I2C operation regardless
I2C_EMULATION_FREE_RUN = 0x4000U
} I2C_EmulationMode;
//*****************************************************************************
//
//! Values that can be passed to I2C_initController() as the \e dutyCycle
//! parameter.
//
//*****************************************************************************
typedef enum
{
I2C_DUTYCYCLE_33, //!< Clock duty cycle is 33%
I2C_DUTYCYCLE_50 //!< Clock duty cycle is 55%
} I2C_DutyCycle;
//*****************************************************************************
//
// Prototypes for the APIs.
//
//*****************************************************************************
//*****************************************************************************
//
//! \internal
//! Checks an I2C base address.
//!
//! \param base is the base address of the I2C instance used.
//!
//! This function determines if a I2C module base address is valid.
//!
//! \return Returns \b true if the base address is valid and \b false
//! otherwise.
//
//*****************************************************************************
//*****************************************************************************
//
//! Enables the I2C module.
//!
//! \param base is the base address of the I2C instance used.
//!
//! This function enables operation of the I2C module.
//!
//! \return None.
//
//*****************************************************************************
static inline void
I2C_enableModule(uint32_t base)
{
//
// Check the arguments.
//
;
(*((volatile uint16_t *)(base + 0x9U))) |= 0x20U;
}
//*****************************************************************************
//
//! Disables the I2C module.
//!
//! \param base is the base address of the I2C instance used.
//!
//! This function disables operation of the I2C module.
//!
//! \return None.
//
//*****************************************************************************
static inline void
I2C_disableModule(uint32_t base)
{
//
// Check the arguments.
//
;
(*((volatile uint16_t *)(base + 0x9U))) &= ~(0x20U);
}
//*****************************************************************************
//
//! Enables the transmit and receive FIFOs.
//!
//! \param base is the base address of the I2C instance used.
//!
//! This functions enables the transmit and receive FIFOs in the I2C.
//!
//! \return None.
//
//*****************************************************************************
static inline void
I2C_enableFIFO(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Enable the FIFO.
//
(*((volatile uint16_t *)(base + 0x20U))) |= 0x4000U | 0x2000U;
(*((volatile uint16_t *)(base + 0x21U))) |= 0x2000U;
}
//*****************************************************************************
//
//! Disables the transmit and receive FIFOs.
//!
//! \param base is the base address of the I2C instance used.
//!
//! This functions disables the transmit and receive FIFOs in the I2C.
//!
//! \return None.
//
//*****************************************************************************
static inline void
I2C_disableFIFO(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Disable the FIFO.
//
(*((volatile uint16_t *)(base + 0x20U))) &= ~(0x4000U | 0x2000U);
(*((volatile uint16_t *)(base + 0x21U))) &= ~0x2000U;
}
//*****************************************************************************
//
//! Sets the FIFO level at which interrupts are generated.
//!
//! \param base is the base address of the I2C instance used.
//! \param txLevel is the transmit FIFO interrupt level, specified as
//! \b I2C_FIFO_TX0, \b I2C_FIFO_TX1, \b I2C_FIFO_TX2, . . . or
//! \b I2C_FIFO_TX16.
//! \param rxLevel is the receive FIFO interrupt level, specified as
//! \b I2C_FIFO_RX0, \b I2C_FIFO_RX1, \b I2C_FIFO_RX2, . . . or
//! \b I2C_FIFO_RX16.
//!
//! This function sets the FIFO level at which transmit and receive interrupts
//! are generated. The transmit FIFO interrupt flag will be set when the FIFO
//! reaches a value less than or equal to \e txLevel. The receive FIFO
//! flag will be set when the FIFO reaches a value greater than or equal to
//! \e rxLevel.
//!
//! \return None.
//
//*****************************************************************************
static inline void
I2C_setFIFOInterruptLevel(uint32_t base, I2C_TxFIFOLevel txLevel,
I2C_RxFIFOLevel rxLevel)
{
//
// Check the arguments.
//
;
//
// Set the FIFO interrupt levels.
//
(*((volatile uint16_t *)(base + 0x20U))) = ((*((volatile uint16_t *)(base + 0x20U))) &
(~0x1FU)) | (uint16_t)txLevel;
(*((volatile uint16_t *)(base + 0x21U))) = ((*((volatile uint16_t *)(base + 0x21U))) &
(~0x1FU)) | (uint16_t)rxLevel;
}
//*****************************************************************************
//
//! Gets the FIFO level at which interrupts are generated.
//!
//! \param base is the base address of the I2C instance used.
//! \param txLevel is a pointer to storage for the transmit FIFO level,
//! returned as one of \b I2C_FIFO_TX0, \b I2C_FIFO_TX1,
//! \b I2C_FIFO_TX2, . . . or \b I2C_FIFO_TX16.
//! \param rxLevel is a pointer to storage for the receive FIFO level,
//! returned as one of \b I2C_FIFO_RX0, \b I2C_FIFO_RX1,
//! \b I2C_FIFO_RX2, . . . or \b I2C_FIFO_RX16.
//!
//! This function gets the FIFO level at which transmit and receive interrupts
//! are generated. The transmit FIFO interrupt flag will be set when the FIFO
//! reaches a value less than or equal to \e txLevel. The receive FIFO
//! flag will be set when the FIFO reaches a value greater than or equal to
//! \e rxLevel.
//!
//! \return None.
//
//*****************************************************************************
static inline void
I2C_getFIFOInterruptLevel(uint32_t base, I2C_TxFIFOLevel *txLevel,
I2C_RxFIFOLevel *rxLevel)
{
//
// Check the arguments.
//
;
//
// Extract the transmit and receive FIFO levels.
//
*txLevel = (I2C_TxFIFOLevel)((*((volatile uint16_t *)(base + 0x20U))) &
0x1FU);
*rxLevel = (I2C_RxFIFOLevel)((*((volatile uint16_t *)(base + 0x21U))) &
0x1FU);
}
//*****************************************************************************
//
//! Get the transmit FIFO status
//!
//! \param base is the base address of the I2C instance used.
//!
//! This function gets the current number of words in the transmit FIFO.
//!
//! \return Returns the current number of words in the transmit FIFO specified
//! as one of the following:
//! \b I2C_FIFO_TX0, \b I2C_FIFO_TX1, \b I2C_FIFO_TX2, \b I2C_FIFO_TX3,
//! ..., or \b I2C_FIFO_TX16
//
//*****************************************************************************
static inline I2C_TxFIFOLevel
I2C_getTxFIFOStatus(uint32_t base)
{
uint16_t level;
//
// Check the arguments.
//
;
//
// Get the current FIFO status
//
level = (((*((volatile uint16_t *)(base + 0x20U))) & 0x1F00U) >>
8U);
return((I2C_TxFIFOLevel)level);
}
//*****************************************************************************
//
//! Get the receive FIFO status
//!
//! \param base is the base address of the I2C instance used.
//!
//! This function gets the current number of words in the receive FIFO.
//!
//! \return Returns the current number of words in the receive FIFO specified
//! as one of the following:
//! \b I2C_FIFO_RX0, \b I2C_FIFO_RX1, \b I2C_FIFO_RX2, \b I2C_FIFO_RX3,
//! ..., or \b I2C_FIFO_RX16
//
//*****************************************************************************
static inline I2C_RxFIFOLevel
I2C_getRxFIFOStatus(uint32_t base)
{
uint16_t level;
//
// Check the arguments.
//
;
//
// Get the current FIFO status
//
level = (((*((volatile uint16_t *)(base + 0x21U))) & 0x1F00U) >>
8U);
return((I2C_RxFIFOLevel)level);
}
//*****************************************************************************
//
//! Reads I2C Module clock prescaler value.
//!
//! \param base is the base address of the I2C instance used.
//!
//! This function reads the I2C prescaler value which configures the I2C module
//! clock by dividing down the SYSCLK. I2C_MODULE_CLK = SYSCLK / (I2CPSC + )
//!
//! \return Returns the I2C prescaler(I2CPSC) cast as an uint16_t.
//
//*****************************************************************************
static inline uint16_t
I2C_getPreScaler(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Return the contents of the Prescaler register.
//
return((*((volatile uint16_t *)(base + 0xCU))));
}
//*****************************************************************************
//
//! Sets the address that the I2C Controller places on the bus.
//!
//! \param base is the base address of the I2C instance used.
//! \param targetAddr 7-bit or 10-bit target address
//!
//! This function configures the address that the I2C Controller places on the bus
//! when initiating a transaction.
//!
//! \return None.
//
//*****************************************************************************
static inline void
I2C_setTargetAddress(uint32_t base, uint16_t targetAddr)
{
//
// Check the arguments.
//
;
;
(*((volatile uint16_t *)(base + 0x7U))) = targetAddr;
}
//*****************************************************************************
//
//! Sets the own address for this I2C module.
//!
//! \param base is the base address of the I2C Target module.
//! \param Addr is the 7-bit or 10-bit address
//!
//! This function writes the specified address.
//!
//! The parameter \e Addr is the value that is compared against the
//! target address sent by an I2C controller.
//!
//! \return None.
//
//*****************************************************************************
static inline void
I2C_setOwnAddress(uint32_t base, uint16_t Addr)
{
//
// Check the arguments.
//
;
;
(*((volatile uint16_t *)(base + 0x0U))) = Addr;
}
//*****************************************************************************
//
//! Indicates whether or not the I2C bus is busy.
//!
//! \param base is the base address of the I2C instance used.
//!
//! This function returns an indication of whether or not the I2C bus is busy.
//! This function can be used in a multi-controller environment to determine if the
//! bus is free for another data transfer.
//!
//! \return Returns \b true if the I2C bus is busy; otherwise, returns
//! \b false.
//
//*****************************************************************************
static inline _Bool
I2C_isBusBusy(uint32_t base)
{
//
// Check the arguments.
//
;
return(((*((volatile uint16_t *)(base + 0x2U))) & 0x1000U) == 0x1000U);
}
//*****************************************************************************
//
//! Gets the current I2C module status.
//!
//! \param base is the base address of the I2C instance used.
//!
//! This function returns the status for the I2C module.
//!
//! \return The current module status, enumerated as a bit field of
//! - \b I2C_STS_ARB_LOST - Arbitration-lost
//! - \b I2C_STS_NO_ACK - No-acknowledgment (NACK)
//! - \b I2C_STS_REG_ACCESS_RDY - Register-access-ready (ARDY)
//! - \b I2C_STS_RX_DATA_RDY - Receive-data-ready
//! - \b I2C_STS_TX_DATA_RDY - Transmit-data-ready
//! - \b I2C_STS_STOP_CONDITION - Stop condition detected
//! - \b I2C_STS_BYTE_SENT - Byte transmit complete
//! - \b I2C_STS_ADDR_ZERO - Address of all zeros detected
//! - \b I2C_STS_ADDR_TARGET - Addressed as Target
//! - \b I2C_STS_TX_EMPTY - Transmit shift register empty
//! - \b I2C_STS_RX_FULL - Receive shift register full
//! - \b I2C_STS_BUS_BUSY - Bus busy, wait for STOP or reset
//! - \b I2C_STS_NACK_SENT - NACK was sent
//! - \b I2C_STS_TARGET_DIR- Addressed as Target transmitter
//
//*****************************************************************************
static inline uint16_t
I2C_getStatus(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Return contents of the status register
//
return((*((volatile uint16_t *)(base + 0x2U))));
}
//*****************************************************************************
//
//! Clears I2C status flags.
//!
//! \param base is the base address of the I2C instance used.
//! \param stsFlags is a bit mask of the status flags to be cleared.
//!
//! This function clears the specified I2C status flags. The \e stsFlags
//! parameter is the logical OR of the following values:
//! - \b I2C_STS_ARB_LOST
//! - \b I2C_STS_NO_ACK,
//! - \b I2C_STS_REG_ACCESS_RDY
//! - \b I2C_STS_RX_DATA_RDY
//! - \b I2C_STS_STOP_CONDITION
//! - \b I2C_STS_BYTE_SENT
//! - \b I2C_STS_NACK_SENT
//! - \b I2C_STS_TARGET_DIR
//!
//! \note Note that some of the status flags returned by I2C_getStatus() cannot
//! be cleared by this function. Some may only be cleared by hardware or a
//! reset of the I2C module.
//!
//! \return None.
//
//*****************************************************************************
static inline void
I2C_clearStatus(uint32_t base, uint16_t stsFlags)
{
//
// Check the arguments.
//
;
//
// Write to the status registers to clear them.
//
(*((volatile uint16_t *)(base + 0x2U))) = stsFlags;
}
//*****************************************************************************
//
//! Controls the state of the I2C module.
//!
//! \param base is the base address of the I2C instance used.
//! \param config is the command to be issued to the I2C module.
//!
//! This function is used to control the state of the controller and target send and
//! receive operations. The \e config is a logical OR of the following options.
//!
//! One of the following four options:
//! - \b I2C_CONTROLLER_SEND_MODE - Controller-transmitter mode
//! - \b I2C_CONTROLLER_RECEIVE_MODE - Controller-receiver mode
//! - \b I2C_TARGET_SEND_MODE - Target-transmitter mode
//! - \b I2C_TARGET_RECEIVE_MODE - Target-receiver mode
//!
//! Any of the following:
//! - \b I2C_REPEAT_MODE - Sends data until stop bit is set, ignores data count
//! - \b I2C_START_BYTE_MODE - Use start byte mode
//! - \b I2C_FREE_DATA_FORMAT - Use free data format, transfers have no address
//!
//! \return None.
//
//*****************************************************************************
static inline void
I2C_setConfig(uint32_t base, uint16_t config)
{
//
// Check the arguments.
//
;
//
// Write the selected options to the mode register.
//
(*((volatile uint16_t *)(base + 0x9U))) = ((*((volatile uint16_t *)(base + 0x9U))) &
~(0x400U | 0x200U | 0x80U |
0x10U | 0x8U)) | config;
}
//*****************************************************************************
//
//! Sets the data byte bit count the I2C module.
//!
//! \param base is the base address of the I2C instance used.
//! \param size is the number of bits per data byte.
//!
//! The \e size parameter is a value I2C_BITCOUNT_x where x is the number of
//! bits per data byte. The default and maximum size is 8 bits.
//!
//! \return None.
//
//*****************************************************************************
static inline void
I2C_setBitCount(uint32_t base, I2C_BitCount size)
{
//
// Check the arguments.
//
;
//
// Write the selected options to the mode register.
//
(*((volatile uint16_t *)(base + 0x9U))) = ((*((volatile uint16_t *)(base + 0x9U))) & ~0x7U) |
(uint16_t)size;
}
//*****************************************************************************
//
//! Issues an I2C START condition.
//!
//! \param base is the base address of the I2C instance used.
//!
//! This function causes the I2C module to generate a start condition. This
//! function is only valid when the I2C module specified by the \b base
//! parameter is a controller.
//!
//! \return None.
//
//*****************************************************************************
static inline void
I2C_sendStartCondition(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Set the START condition bit.
//
(*((volatile uint16_t *)(base + 0x9U))) |= 0x2000U;
}
//*****************************************************************************
//
//! Issues an I2C STOP condition.
//!
//! \param base is the base address of the I2C instance used.
//!
//! This function causes the I2C module to generate a stop condition. This
//! function is only valid when the I2C module specified by the \b base
//! parameter is a controller.
//!
//! To check on the status of the STOP condition, I2C_getStopConditionStatus()
//! can be used.
//!
//! \return None.
//
//*****************************************************************************
static inline void
I2C_sendStopCondition(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Set the STOP condition bit.
//
(*((volatile uint16_t *)(base + 0x9U))) |= 0x800U;
}
//*****************************************************************************
//
//! Issues a no-acknowledge (NACK) bit.
//!
//! \param base is the base address of the I2C instance used.
//!
//! This function causes the I2C module to generate a NACK bit. This is only
//! applicable when the I2C module is acting as a receiver.
//!
//! \return None.
//
//*****************************************************************************
static inline void
I2C_sendNACK(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Set the NACK mode bit.
//
(*((volatile uint16_t *)(base + 0x9U))) |= 0x8000U;
}
//*****************************************************************************
//
//! Receives a byte that has been sent to the I2C.
//!
//! \param base is the base address of the I2C instance used.
//!
//! This function reads a byte of data from the I2C Data Receive Register.
//!
//! \return Returns the byte received from by the I2C cast as an uint16_t.
//
//*****************************************************************************
static inline uint16_t
I2C_getData(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Return the contents of the receive register.
//
return((*((volatile uint16_t *)(base + 0x6U))));
}
//*****************************************************************************
//
//! Transmits a byte from the I2C.
//!
//! \param base is the base address of the I2C instance used.
//! \param data is the data to be transmitted from the I2C Controller.
//!
//! This function places the supplied data into I2C Data Transmit Register.
//!
//! \return None.
//
//*****************************************************************************
static inline void
I2C_putData(uint32_t base, uint16_t data)
{
//
// Check the arguments.
//
;
//
// Place the data into the transmit register.
//
(*((volatile uint16_t *)(base + 0x8U))) = data;
}
//*****************************************************************************
//
//! Get stop condition status.
//!
//! \param base is the base address of the I2C instance used.
//!
//! This function reads and returns the stop condition bit status.
//!
//! \return Returns \b true if the STP bit has been set by the device to
//! generate a stop condition when the internal data counter of the I2C module
//! has reached 0. Returns \b false when the STP bit is zero. This bit is
//! automatically cleared after the stop condition has been generated.
//
//*****************************************************************************
static inline _Bool
I2C_getStopConditionStatus(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Check the stop condition bit and return appropriately.
//
return(((*((volatile uint16_t *)(base + 0x9U))) & 0x800U) != 0U);
}
//*****************************************************************************
//
//! Set number of bytes to be to transfer or receive when repeat mode is off.
//!
//! \param base is the base address of the I2C instance used.
//! \param count is the value to be put in the I2C data count register.
//!
//! This function sets the number of bytes to transfer or receive when repeat
//! mode is off.
//!
//! \return None.
//
//*****************************************************************************
static inline void
I2C_setDataCount(uint32_t base, uint16_t count)
{
//
// Check the arguments.
//
;
//
// Write the count value to the appropriate register.
//
(*((volatile uint16_t *)(base + 0x5U))) = count;
}
//*****************************************************************************
//
//! Sets the addressing mode to either 7-bit or 10-bit.
//!
//! \param base is the base address of the I2C instance used.
//! \param mode is the address mode, 7-bit or 10-bit.
//!
//! This function configures the I2C module for either a 7-bit address
//! (default) or a 10-bit address. The \e mode parameter configures the address
//! length to 10 bits when its value is \b I2C_ADDR_MODE_10BITS and 7 bits when
//! \b I2C_ADDR_MODE_7BITS.
//!
//! \return None.
//
//*****************************************************************************
static inline void
I2C_setAddressMode(uint32_t base, I2C_AddressMode mode)
{
//
// Check the arguments.
//
;
//
// Write the appropriate value to the address expansion bit.
//
(*((volatile uint16_t *)(base + 0x9U))) = ((*((volatile uint16_t *)(base + 0x9U))) & ~0x100U) |
(uint16_t)mode;
}
//*****************************************************************************
//
//! Sets I2C emulation mode.
//!
//! \param base is the base address of the I2C instance used.
//! \param mode is the emulation mode.
//!
//! This function sets the behavior of the I2C operation when an emulation
//! suspend occurs. The \e mode parameter can be one of the following:
//!
//! - \b I2C_EMULATION_STOP_SCL_LOW - If SCL is low when the breakpoint occurs,
//! the I2C module stops immediately. If SCL is high, the I2C module waits
//! until SCL becomes low and then stops.
//! - \b I2C_EMULATION_FREE_RUN - I2C operation continues regardless of a
//! the suspend.
//!
//! \return None.
//
//*****************************************************************************
static inline void
I2C_setEmulationMode(uint32_t base, I2C_EmulationMode mode)
{
//
// Check the arguments.
//
;
//
// Write the desired emulation mode to the register.
//
(*((volatile uint16_t *)(base + 0x9U))) = ((*((volatile uint16_t *)(base + 0x9U))) & ~0x4000U) |
(uint16_t)mode;
}
//*****************************************************************************
//
//! Enables I2C loopback mode.
//!
//! \param base is the base address of the I2C instance used.
//!
//! This function enables loopback mode. This mode is only valid during controller
//! mode and is helpful during device testing as it causes data transmitted out
//! of the data transmit register to be received in data receive register.
//!
//! \return None.
//
//*****************************************************************************
static inline void
I2C_enableLoopback(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Set the bit that enables loopback mode.
//
(*((volatile uint16_t *)(base + 0x9U))) |= 0x40U;
}
//*****************************************************************************
//
//! Disables I2C loopback mode.
//!
//! \param base is the base address of the I2C instance used.
//!
//! This function disables loopback mode. Loopback mode is disabled by default
//! after reset.
//!
//! \return None.
//
//*****************************************************************************
static inline void
I2C_disableLoopback(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Clear the bit that enables loopback mode.
//
(*((volatile uint16_t *)(base + 0x9U))) &= ~0x40U;
}
//*****************************************************************************
//
//! Returns the current I2C interrupt source.
//!
//! \param base is the base address of the I2C instance used.
//!
//! This function returns the event that generated an I2C basic (non-FIFO)
//! interrupt. The possible sources are the following:
//! - \b I2C_INTSRC_NONE
//! - \b I2C_INTSRC_ARB_LOST
//! - \b I2C_INTSRC_NO_ACK
//! - \b I2C_INTSRC_REG_ACCESS_RDY
//! - \b I2C_INTSRC_RX_DATA_RDY
//! - \b I2C_INTSRC_TX_DATA_RDY
//! - \b I2C_INTSRC_STOP_CONDITION
//! - \b I2C_INTSRC_ADDR_TARGET
//!
//! Calling this function will result in hardware automatically clearing the
//! current interrupt code and if ready, loading the next pending enabled
//! interrupt. It will also clear the corresponding interrupt flag if the
//! source is \b I2C_INTSRC_ARB_LOST, \b I2C_INTSRC_NO_ACK, or
//! \b I2C_INTSRC_STOP_CONDITION.
//!
//! \note Note that this function differs from I2C_getInterruptStatus() in that
//! it returns a single interrupt source. I2C_getInterruptSource() will return
//! the status of all interrupt flags possible, including the flags that aren't
//! necessarily enabled to generate interrupts.
//!
//! \return None.
//
//*****************************************************************************
static inline I2C_InterruptSource
I2C_getInterruptSource(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Return the interrupt source value
//
return((I2C_InterruptSource)((*((volatile uint16_t *)(base + 0xAU))) &
0x7U));
}
//*****************************************************************************
//
//! Sets the compatibility mode to support I2C Extended Mode.
//!
//! \param base is the base address of the I2C instance used.
//! \param mode is the compatibility modes.
//!
//! This function configures the I2C module for either a Forward or Backward
//! compatibilty. The \e mode parameter configures the compatibility
//! to Forward when its value is \b I2C_EADDR_MODE_FWD and Backward when
//! \b I2C_EADDR_MODE_BC.
//!
//! \return None.
//
//*****************************************************************************
static inline void
I2C_setExtendedMode(uint32_t base, I2C_ExtendedMode mode)
{
//
// Check the arguments.
//
;
//
// Write the appropriate value to the compatibility mode register.
//
(*((volatile uint16_t *)(base + 0xBU))) =
((*((volatile uint16_t *)(base + 0xBU))) & ~(0x1U | 0x2U)) |
(uint16_t)mode;
}
//*****************************************************************************
//
//! Initializes the I2C Controller.
//!
//! \param base is the base address of the I2C instance used.
//! \param sysclkHz is the rate of the clock supplied to the I2C module
//! (SYSCLK) in Hz.
//! \param bitRate is the rate of the controller clock signal, SCL.
//! \param dutyCycle is duty cycle of the SCL signal.
//!
//! This function initializes operation of the I2C Controller by configuring the
//! bus speed for the controller. Note that the I2C module \b must be put into
//! reset before calling this function. You can do this with the function
//! I2C_disableModule().
//!
//! A programmable prescaler in the I2C module divides down the input clock
//! (rate specified by \e sysclkHz) to produce the module clock (calculated to
//! be around 10 MHz in this function). That clock is then divided down further
//! to configure the SCL signal to run at the rate specified by \e bitRate. The
//! \e dutyCycle parameter determines the percentage of time high and time low
//! on the clock signal. The valid values are \b I2C_DUTYCYCLE_33 for 33% and
//! \b I2C_DUTYCYCLE_50 for 50%.
//!
//! The peripheral clock is the system clock. This value is returned by
//! SysCtl_getClock(), or it can be explicitly hard coded if it is
//! constant and known (to save the code/execution overhead of a call to
//! SysCtl_getClock()).
//!
//! \return None.
//
//*****************************************************************************
extern void
I2C_initController(uint32_t base, uint32_t sysclkHz, uint32_t bitRate,
I2C_DutyCycle dutyCycle);
//*****************************************************************************
//
//! Enables I2C interrupt sources.
//!
//! \param base is the base address of the I2C instance used.
//! \param intFlags is the bit mask of the interrupt sources to be enabled.
//!
//! This function enables the indicated I2C Controller interrupt sources. Only the
//! sources that are enabled can be reflected to the processor interrupt.
//! Disabled sources have no effect on the processor.
//!
//! The \e intFlags parameter is the logical OR of any of the following:
//!
//! - \b I2C_INT_ARB_LOST - Arbitration-lost interrupt
//! - \b I2C_INT_NO_ACK - No-acknowledgment (NACK) interrupt
//! - \b I2C_INT_REG_ACCESS_RDY - Register-access-ready interrupt
//! - \b I2C_INT_RX_DATA_RDY - Receive-data-ready interrupt
//! - \b I2C_INT_TX_DATA_RDY - Transmit-data-ready interrupt
//! - \b I2C_INT_STOP_CONDITION - Stop condition detected
//! - \b I2C_INT_ADDR_TARGET - Addressed as target interrupt
//! - \b I2C_INT_RXFF - RX FIFO level interrupt
//! - \b I2C_INT_TXFF - TX FIFO level interrupt
//!
//! \note \b I2C_INT_RXFF and \b I2C_INT_TXFF are associated with the I2C FIFO
//! interrupt vector. All others are associated with the I2C basic interrupt.
//!
//! \return None.
//
//*****************************************************************************
extern void
I2C_enableInterrupt(uint32_t base, uint32_t intFlags);
//*****************************************************************************
//
//! Disables I2C interrupt sources.
//!
//! \param base is the base address of the I2C instance used.
//! \param intFlags is the bit mask of the interrupt sources to be disabled.
//!
//! This function disables the indicated I2C Target interrupt sources. Only
//! the sources that are enabled can be reflected to the processor interrupt.
//! Disabled sources have no effect on the processor.
//!
//! The \e intFlags parameter has the same definition as the \e intFlags
//! parameter to I2C_enableInterrupt().
//!
//! \return None.
//
//*****************************************************************************
extern void
I2C_disableInterrupt(uint32_t base, uint32_t intFlags);
//*****************************************************************************
//
//! Gets the current I2C interrupt status.
//!
//! \param base is the base address of the I2C instance used.
//!
//! This function returns the interrupt status for the I2C module.
//!
//! \return The current interrupt status, enumerated as a bit field of
//! - \b I2C_INT_ARB_LOST
//! - \b I2C_INT_NO_ACK
//! - \b I2C_INT_REG_ACCESS_RDY
//! - \b I2C_INT_RX_DATA_RDY
//! - \b I2C_INT_TX_DATA_RDY
//! - \b I2C_INT_STOP_CONDITION
//! - \b I2C_INT_ADDR_TARGET
//! - \b I2C_INT_RXFF
//! - \b I2C_INT_TXFF
//!
//! \note This function will only return the status flags associated with
//! interrupts. However, a flag may be set even if its corresponding interrupt
//! is disabled.
//
//*****************************************************************************
extern uint32_t
I2C_getInterruptStatus(uint32_t base);
//*****************************************************************************
//
//! Clears I2C interrupt sources.
//!
//! \param base is the base address of the I2C instance used.
//! \param intFlags is a bit mask of the interrupt sources to be cleared.
//!
//! The specified I2C interrupt sources are cleared, so that they no longer
//! assert. This function must be called in the interrupt handler to keep the
//! interrupt from being triggered again immediately upon exit.
//!
//! The \e intFlags parameter has the same definition as the \e intFlags
//! parameter to I2C_enableInterrupt().
//!
//! \note \b I2C_INT_RXFF and \b I2C_INT_TXFF are associated with the I2C FIFO
//! interrupt vector. All others are associated with the I2C basic interrupt.
//!
//! \note Also note that some of the status flags returned by
//! I2C_getInterruptStatus() cannot be cleared by this function. Some may only
//! be cleared by hardware or a reset of the I2C module.
//!
//! \return None.
//
//*****************************************************************************
extern void
I2C_clearInterruptStatus(uint32_t base, uint32_t intFlags);
//*****************************************************************************
//
//! Configures I2C Module Clock Frequency
//!
//! \param base is the base address of the I2C instance used.
//! \param sysclkHz is the rate of the clock supplied to the I2C module
//! (SYSCLK) in Hz.
//!
//! This function configures I2C module clock frequency by initializing
//! prescale register based on SYSCLK frequency.
//! Note that the I2C module \b must be put into
//! reset before calling this function. You can do this with the function
//! I2C_disableModule().
//!
//! \return None.
//
//*****************************************************************************
extern void
I2C_configureModuleFrequency(uint32_t base, uint32_t sysclkHz);
//*****************************************************************************
//
// Close the Doxygen group.
//! @}
//
//*****************************************************************************
//*****************************************************************************
//
// Mark the end of the C bindings section for C++ compilers.
//
//*****************************************************************************
//###########################################################################
//
// FILE: lin.h
//
// TITLE: C28x LIN driver.
//
//###########################################################################
// $Copyright:
// Copyright (C) 2023 Texas Instruments Incorporated - http://www.ti.com/
//
// 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 Texas Instruments Incorporated 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
// OWNER 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.
// $
//###########################################################################
//*****************************************************************************
//
// If building with a C++ compiler, make all of the definitions in this header
// have a C binding.
//
//*****************************************************************************
//*****************************************************************************
//
//! \addtogroup lin_api LIN
//! @{
//
//*****************************************************************************
//###########################################################################
//
// FILE: hw_lin.h
//
// TITLE: Definitions for the LIN registers.
//
//###########################################################################
// $Copyright:
// Copyright (C) 2023 Texas Instruments Incorporated - http://www.ti.com/
//
// 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 Texas Instruments Incorporated 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
// OWNER 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.
// $
//###########################################################################
//*************************************************************************************************
//
// The following are defines for the LIN register offsets
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the SCIGCR0 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the SCIGCR1 register
//
//*************************************************************************************************
// mode.
//*************************************************************************************************
//
// The following are defines for the bit fields in the SCIGCR2 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the SCISETINT register
//
//*************************************************************************************************
// mode)
// (LIN only)
// Interrupt (LIN only)
// (LIN only)
//*************************************************************************************************
//
// The following are defines for the bit fields in the SCICLEARINT register
//
//*************************************************************************************************
// compatible mode
// Interrupt (LIN only)
// Interrupt (LIN only)
// only)
// Interrupt (LIN only)
// only)
//*************************************************************************************************
//
// The following are defines for the bit fields in the SCISETINTLVL register
//
//*************************************************************************************************
// compatible mode)
// Interrupt Level (LIN only)
// Interrupt Level
// only)
// (LIN only)
// Interrupt Level
// (LIN only)
// (LIN only)
// only)
//*************************************************************************************************
//
// The following are defines for the bit fields in the SCICLEARINTLVL register
//
//*************************************************************************************************
// (SCI compatible mode)
// only)
// Interrupt Level (LIN only)
// (LIN only)
// Level (LIN only)
// (LIN only)
// Level (LIN only)
// only)
//*************************************************************************************************
//
// The following are defines for the bit fields in the SCIFLR register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the SCIINTVECT0 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the SCIINTVECT1 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the SCIFORMAT register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the BRSR register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the SCIED register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the SCIRD register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the SCITD register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the SCIPIO0 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the SCIPIO2 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the LINCOMP register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the LINRD0 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the LINRD1 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the LINMASK register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the LINID register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the LINTD0 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the LINTD1 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the MBRSR register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the IODFTCTRL register
//
//*************************************************************************************************
// compatibility mode)
// mode)
// mode)
// mode)
//*************************************************************************************************
//
// The following are defines for the bit fields in the LIN_GLB_INT_EN register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the LIN_GLB_INT_FLG register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the LIN_GLB_INT_CLR register
//
//*************************************************************************************************
//*****************************************************************************
//
// Useful defines used within the driver functions. Not intended for use by
// application code.
//
//*****************************************************************************
//
// The IO DFT Enable Key
//
//
// LIN Wakeup Signal Key
//
//
// LIN Parity ID Masks
//
//*****************************************************************************
//
// Definitions for the intFlags parameter of LIN_enableInterrupt(),
// LIN_disableInterrupt(), LIN_clearInterruptStatus(),
// LIN_setInterruptLevel0() and LIN_setInterruptLevel1().
//
//*****************************************************************************
//*****************************************************************************
//
// Definitions for the return value of LIN_getInterruptStatus().
//
//*****************************************************************************
//!< signal
//!< signals
//!< Method Select
//!< Error
//*****************************************************************************
//
// Definitions for the return value of LIN_getInterruptLine0Offset() and
// LIN_getInterruptLine1Offset().
//
//*****************************************************************************
//*****************************************************************************
//
// Definitions for the LIN errors parameter of LIN_enableModuleErrors() and
// LIN_disableModuleErrors().
//
//*****************************************************************************
//*****************************************************************************
//
// Definitions for the SCI errors parameter of LIN_enableSCIModuleErrors() and
// LIN_disableSCIModuleErrors().
//
//*****************************************************************************
//*****************************************************************************
//
// Definitions for the intFlags parameter of LIN_enableSCIInterrupt(),
// LIN_disableSCIInterrupt(), LIN_clearSCIInterruptStatus(),
// LIN_setSCIInterruptLevel0() and LIN_setSCIInterruptLevel1().
//
//*****************************************************************************
//*****************************************************************************
//
//! The following are defines for the \e type parameter of the
//! LIN_enableExtLoopback() function.
//
//*****************************************************************************
typedef enum
{
LIN_LOOPBACK_DIGITAL = 0U, //!< Digital Loopback Mode
LIN_LOOPBACK_ANALOG = 2U //!< Analog Loopback Mode
} LIN_LoopbackType;
//*****************************************************************************
//
//! The following are defines for the \e path parameter of the
//! LIN_enableExtLoopback() function.
//
//*****************************************************************************
typedef enum
{
LIN_ANALOG_LOOP_NONE = 0U, //!< Default path for digital loopback mode
LIN_ANALOG_LOOP_TX = 0U, //!< Analog loopback through transmit pin
LIN_ANALOG_LOOP_RX = 1U //!< Analog loopback through receive pin
} LIN_AnalogLoopback;
//*****************************************************************************
//
//! The following are defines for the \e mode parameter of the
//! LIN_setCommMode() function.
//
//*****************************************************************************
typedef enum
{
//! Use the length indicated in the LENGTH field of the SCIFORMAT register
LIN_COMM_LIN_USELENGTHVAL = 0x0000U,
//! Use ID4 and ID5 to convey the length
LIN_COMM_LIN_ID4ID5LENCTL = 0x0001U
} LIN_CommMode;
//*****************************************************************************
//
//! The following are defines for the \e mode parameter of the
//! LIN_setSCICommMode() function.
//
//*****************************************************************************
typedef enum
{
//! Idle-line mode is used
LIN_COMM_SCI_IDLELINE = 0x0000U,
//! Address bit mode is used
LIN_COMM_SCI_ADDRBIT = 0x0001U
} LIN_SCICommMode;
//*****************************************************************************
//
//! The following are defines for the \e mode parameter of the LIN_setLINMode()
//! function.
//
//*****************************************************************************
typedef enum
{
LIN_MODE_LIN_RESPONDER = 0x0000U, //!< The node is in responder mode
LIN_MODE_LIN_COMMANDER = 0x0020U //!< The node is in commander mode
} LIN_LINMode;
//*****************************************************************************
//
//! The following are defines for the \e line parameter of the
//! LIN_enableGlobalInterrupt(), LIN_disableGlobalInterrupt(),
//! LIN_clearGlobalInterruptStatus(), and LIN_getGlobalInterruptStatus()
//! functions.
//
//*****************************************************************************
typedef enum
{
LIN_INTERRUPT_LINE0 = 0x0U, //!< Interrupt line 0
LIN_INTERRUPT_LINE1 = 0x1U //!< Interrupt line 1
} LIN_InterruptLine;
//*****************************************************************************
//
//! The following are defines for the \e type parameter of the
//! LIN_setMessageFiltering() function.
//
//*****************************************************************************
typedef enum
{
LIN_MSG_FILTER_IDBYTE = 0x0U, //!< LIN Message ID Byte Filtering
LIN_MSG_FILTER_IDRESPONDER = 0x1U //!< Responder Task ID Byte Filtering
} LIN_MessageFilter;
//*****************************************************************************
//
//! The following are defines for the \e type parameter of the
//! LIN_setChecksumType() function.
//
//*****************************************************************************
typedef enum
{
LIN_CHECKSUM_CLASSIC = 0x0U, //!< Checksum Classic
LIN_CHECKSUM_ENHANCED = 0x1U //!< Checksum Enhanced
} LIN_ChecksumType;
//*****************************************************************************
//
//! The following are defines for the \e mode parameter of the
//! LIN_setDebugSuspendMode() function.
//
//*****************************************************************************
typedef enum
{
LIN_DEBUG_FROZEN = 0x0U, //!< Freeze module during debug
LIN_DEBUG_COMPLETE = 0x1U //!< Complete Tx/Rx before Freezing
} LIN_DebugMode;
//*****************************************************************************
//
//! The following are defines for the \e mask parameter of the
//! LIN_setPinSampleMask() function.
//
//*****************************************************************************
typedef enum
{
//! No Pin Mask
LIN_PINMASK_NONE = 0x0U,
//! Invert Tx Pin value at T-bit center
LIN_PINMASK_CENTER = 0x1U,
//! Invert Tx Pin value at T-bit center + SCLK
LIN_PINMASK_CENTER_SCLK = 0x2U,
//! Invert Tx Pin value at T-bit center + 2 SCLK
LIN_PINMASK_CENTER_2SCLK = 0x3U
} LIN_PinSampleMask;
//*****************************************************************************
//
//! The following are defines for the \e parity parameter of the
//! LIN_enableSCIParity() function.
//
//*****************************************************************************
typedef enum
{
LIN_SCI_PAR_ODD = 0x0U, //!< Odd parity
LIN_SCI_PAR_EVEN = 0x1U //!< Even parity
} LIN_SCIParityType;
//*****************************************************************************
//
//! The following are defines for the \e number parameter of the
//! LIN_setSCIStopBits() function.
//
//*****************************************************************************
typedef enum
{
LIN_SCI_STOP_ONE = 0x0U, //!< Use One Stop bit
LIN_SCI_STOP_TWO = 0x1U //!< Use Two Stop bits
} LIN_SCIStopBits;
//*****************************************************************************
//
//! The following are defines for the \e pin parameter of the
//! LIN_getPinStatus() function.
//
//*****************************************************************************
typedef enum
{
LIN_PINTYPE_TX = 0x4U, //!< Transmit Pin
LIN_PINTYPE_RX = 0x2U //!< Receive Pin
} LIN_PinType;
//*****************************************************************************
//
// Prototypes for the LIN mode APIs.
//
//*****************************************************************************
//*****************************************************************************
//
//! \internal
//!
//! Checks a LIN base address.
//!
//! \param base is the base address of the LIN controller.
//!
//! This function determines if a LIN controller base address is valid.
//!
//! \return Returns \b true if the base address is valid and \b false
//! otherwise.
//
//*****************************************************************************
//*****************************************************************************
//
//! Sets the LIN mode
//!
//! \param base is the LIN module base address
//! \param mode is the desired mode (responder or commander)
//!
//! In LIN mode only, this function sets the mode of the LIN mode to either
//! responder or commander. The \e mode parameter should be passed a value of
//! \b LIN_MODE_LIN_RESPONDER or \b LIN_MODE_LIN_COMMANDER to configure the mode of
//! the LIN module specified by \e base.
//!
//! \return None.
//
//*****************************************************************************
static inline void
LIN_setLINMode(uint32_t base, LIN_LINMode mode)
{
//
// Check the arguments.
//
;
//
// Write the LIN mode to the appropriate register.
//
__eallow();
(*((volatile uint16_t *)(base + 0x4U))) = ((*((volatile uint16_t *)(base + 0x4U))) &
~0x20U) | (uint16_t)mode;
__edis();
}
//*****************************************************************************
//
//! Set Maximum Baud Rate Prescaler
//!
//! \param base is the LIN module base address
//! \param clock is the device system clock (Hz)
//!
//! In LIN mode only, this function is used to set the maximum baud rate
//! prescaler used during synchronization phase of a responder module if the
//! ADAPT bit is set. The maximum baud rate prescaler is used by the wakeup
//! and idle timer counters for a constant 4 second expiration time relative
//! to a 20kHz rate.
//!
//! \note Use LIN_enableAutomaticBaudrate() to set the ADAPT bit and enable
//! automatic bit rate mod detection.
//!
//! \return None.
//
//*****************************************************************************
static inline void
LIN_setMaximumBaudRate(uint32_t base, uint32_t systemClock)
{
//
// Check the arguments.
//
;
//
// Calculate maximum baud rate prescaler
//
(*((volatile uint16_t *)(base + 0x7CU))) = (uint16_t)(systemClock / 20000U);
}
//*****************************************************************************
//
//! Set Message filtering Type
//!
//! \param base is the LIN module base address
//! \param type is the mask filtering comparison type
//!
//! In LIN mode only, this function sets the message filtering type. The \e
//! type parameter can be one of the following values:
//! - \b LIN_MSG_FILTER_IDBYTE - Filtering uses LIN message ID Byte
//! - \b LIN_MSG_FILTER_IDRESPONDER - Filtering uses the responder Task ID Byte
//!
//! \return None.
//
//*****************************************************************************
static inline void
LIN_setMessageFiltering(uint32_t base, LIN_MessageFilter type)
{
//
// Check the arguments.
//
;
//
// Sets the message filtering type
//
if(type == LIN_MSG_FILTER_IDBYTE)
{
(*((volatile uint16_t *)(base + 0x4U))) &= ~0x1000U;
}
else
{
(*((volatile uint16_t *)(base + 0x4U))) |= 0x1000U;
}
}
//*****************************************************************************
//
//! Enable Parity mode.
//!
//! \param base is the LIN module base address
//!
//! In LIN mode only, this function enables the parity check.
//!
//! \return None.
//
//*****************************************************************************
static inline void
LIN_enableParity(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Enable the parity mode
//
(*((volatile uint16_t *)(base + 0x4U))) |= 0x4U;
}
//*****************************************************************************
//
//! Disable Parity mode.
//!
//! \param base is the LIN module base address
//!
//! In LIN mode only, this function disables the parity check.
//!
//! \return None.
//
//*****************************************************************************
static inline void
LIN_disableParity(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Disable the parity mode
//
(*((volatile uint16_t *)(base + 0x4U))) &= ~(0x4U);
}
//*****************************************************************************
//
//! Generate Parity Identifier
//! \param identifier is the LIN header ID byte
//!
//! In LIN mode only, this function generates the identifier parity bits and
//! appends them to the identifier.
//!
//! \note An ID must be generated with parity before header generation in
//! LIN commander mode when parity is enabled using the function
//! LIN_enableParity().
//!
//! \return Returns the identifier appended with parity bits.
//
//*****************************************************************************
static inline uint16_t
LIN_generateParityID(uint16_t identifier)
{
uint16_t p0, p1, parityIdentifier;
//
// Calculate parity bits and generate updated identifier
//
p0 = ((identifier & (0x1U)) ^ ((identifier & (0x2U)) >> 1U) ^
((identifier & (0x4U)) >> 2U) ^ ((identifier & (0x10U)) >> 4U));
p1 = !(((identifier & (0x2U)) >> 1U) ^ ((identifier & (0x8U)) >> 3U) ^
((identifier & (0x10U)) >> 4U) ^ ((identifier & (0x20U)) >> 5U));
parityIdentifier = identifier | ((p0 << 6U) | (p1 << 7U));
return(parityIdentifier);
}
//*****************************************************************************
//
//! Set ID Byte
//!
//! \param base is the LIN module base address
//! \param identifier is the LIN header ID byte
//!
//! In LIN mode only, this function sets the message ID byte. In commander mode,
//! writing to this ID initiates a header transmission. In responder task, this
//! ID is used for message filtering when HGENCTRL is 0.
//!
//! \return None.
//
//*****************************************************************************
static inline void
LIN_setIDByte(uint32_t base, uint16_t identifier)
{
//
// Check the arguments.
//
;
(*((volatile uint16_t *)(base + 0x70U))) = ((*((volatile uint16_t *)(base + 0x70U))) & ~(0xFFU)) |
(identifier & 0xFFU);
}
//*****************************************************************************
//
//! Set ID-ResponderTask
//!
//! \param base is the LIN module base address
//! \param identifier is the Received ID comparison ID
//!
//! In LIN mode only, this function sets the identifier to which the received
//! ID of an incoming Header will be compared in order to decide whether a RX
//! response, a TX response, or no action is required.
//!
//! \return None.
//
//*****************************************************************************
static inline void
LIN_setIDResponderTask(uint32_t base, uint16_t identifier)
{
//
// Check the arguments.
//
;
(*((volatile uint16_t *)(base + 0x70U))) = (((*((volatile uint16_t *)(base + 0x70U))) &
~(0xFF00U)) |
((identifier & 0xFFU) <<
8U));
}
//*****************************************************************************
//
//! Send LIN wakeup signal
//!
//! \param base is the LIN module base address
//!
//! In LIN mode only, this function sends the LIN wakeup signal to terminate
//! the sleep mode of any LIN node connected to the bus.
//!
//! \return None.
//
//*****************************************************************************
static inline void
LIN_sendWakeupSignal(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Set key in Byte 0 (MSB) of transmit buffer 0 register
//
__byte((int16_t *)(base + 0x74U + 0x3U),0) = (uint16_t)(0xF0U);
//
// Transmit TDO for wakeup
//
(*((volatile uint16_t *)(base + 0x8U))) |= 0x100U;
}
//*****************************************************************************
//
//! Enter LIN Sleep Mode.
//!
//! \param base is the LIN module base address
//!
//! In LIN mode only, this function puts the LIN module into a low-power, sleep
//! mode. This can also be called to forcefully enter sleep when there is no
//! activity on the bus.
//!
//! \note If this function is called while the receiver is actively receiving
//! data and the wakeup interrupt is disabled, then the module will delay
//! sleep mode from being entered until completion of reception.
//!
//! \return None.
//
//*****************************************************************************
static inline void
LIN_enterSleep(uint32_t base)
{
//
// Check the arguments.
//
;
(*((volatile uint16_t *)(base + 0x8U))) |= 0x1U;
}
//*****************************************************************************
//
//! Send Checksum Byte
//!
//! \param base is the LIN module base address
//!
//! In LIN mode only, this function enables the transmitter with extended
//! frames to send a checkbyte.
//!
//! \return None.
//
//*****************************************************************************
static inline void
LIN_sendChecksum(uint32_t base)
{
__byte_peripheral_32((uint32_t *)(base + 0x8U)) |= 0x10000U;
}
//*****************************************************************************
//
//! Trigger Checksum Compare
//!
//! \param base is the LIN module base address
//!
//! In LIN mode only, this function enables the receiver for extended frames
//! to trigger a checksum compare.
//!
//! \return None.
//
//*****************************************************************************
static inline void
LIN_triggerChecksumCompare(uint32_t base)
{
//
// Check the arguments.
//
;
__byte_peripheral_32((uint32_t *)(base + 0x8U)) |= 0x20000U;
}
//*****************************************************************************
//
//! Check Tx buffer ready flag
//!
//! \param base is the LIN module base address
//!
//! In LIN mode only, this function checks to see if the Tx ready flag is set
//! indicating that the Tx buffer(s) is/are ready to get another character.
//!
//! \return Returns \b true if the TX ready flag is set, else returns \b false
//
//*****************************************************************************
static inline _Bool
LIN_isTxReady(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Read Tx Buffer flag and return status
//
return(((*((volatile uint16_t *)(base + 0x1CU))) & 0x100U) ==
0x100U);
}
//*****************************************************************************
//
//! Set LIN Frame Length
//!
//! \param base is the LIN module base address
//! \param length is the number of bytes.
//!
//! In LIN mode only, this function sets the number of bytes in the response
//! field.
//!
//! The \e length parameter must be in a range between 1 and 8.
//!
//! \return None.
//
//*****************************************************************************
static inline void
LIN_setFrameLength(uint32_t base, uint16_t length)
{
//
// Check the arguments.
//
;
;
//
// Clear and set frame length value
//
__byte_peripheral_32((uint32_t *)(base + 0x28U)) &= ~(0x70000U);
__byte_peripheral_32((uint32_t *)(base + 0x28U)) |= ((((uint32_t)length - (uint32_t)1U) <<
16U));
}
//*****************************************************************************
//
//! Set LIN communication mode
//!
//! \param base is the LIN module base address
//! \param mode is the selected communication mode
//!
//! In LIN mode only, this function is used to choose how the length of data is
//! conveyed. This choice relates to the version of LIN being used. The \e mode
//! parameter can have one of two values:
//! - \b LIN_COMM_LIN_USELENGTHVAL will use the length set with the
//! LIN_setFrameLength() function.
//! - \b LIN_COMM_LIN_ID4ID5LENCTL will use ID4 and ID5 for length control.
//!
//! \return None.
//
//*****************************************************************************
static inline void
LIN_setCommMode(uint32_t base, LIN_CommMode mode)
{
//
// Check the arguments.
//
;
//
// Write communication mode selection to the appropriate bit.
//
(*((volatile uint16_t *)(base + 0x4U))) = ((*((volatile uint16_t *)(base + 0x4U))) &
~0x1U) | (uint16_t)mode;
}
//*****************************************************************************
//
//! Sets the transmit ID mask
//!
//! \param base is the LIN module base address
//! \param mask is the mask value to be set
//!
//! In LIN mode only, this function sets the mask used for filtering an
//! incoming ID message to determine if the TX ID flag should be set.
//!
//! \return None.
//
//*****************************************************************************
static inline void
LIN_setTxMask(uint32_t base, uint16_t mask)
{
//
// Check the arguments.
//
;
//
// Clear previous mask value and set new mask
//
(*((volatile uint16_t *)(base + 0x6CU))) &= ~(0xFFU);
(*((volatile uint16_t *)(base + 0x6CU))) |= (mask & 0xFFU);
}
//*****************************************************************************
//
//! Sets the receive ID mask
//!
//! \param base is the LIN module base address
//! \param mask is the mask value to be set
//!
//! In LIN mode only, this function sets the mask used for filtering an
//! incoming ID message to determine if the ID RX flag should be set.
//!
//! \return None.
//
//*****************************************************************************
static inline void
LIN_setRxMask(uint32_t base, uint16_t mask)
{
//
// Check the arguments.
//
;
//
// Clear previous mask value and set new mask
//
__byte_peripheral_32((uint32_t *)(base + 0x6CU)) &= ~(0xFF0000U);
__byte_peripheral_32((uint32_t *)(base + 0x6CU)) |= ((uint32_t)mask << 16U) &
0xFF0000U;
}
//*****************************************************************************
//
//! Gets the transmit ID mask
//!
//! \param base is the LIN module base address
//!
//! In LIN mode only, this function gets the mask used for filtering an
//! incoming ID message to determine if the TX ID flag should be set.
//!
//! \return Returns the Transmit ID Mask.
//
//*****************************************************************************
static inline uint16_t
LIN_getTxMask(uint32_t base)
{
//
// Check the arguments.
//
;
return((*((volatile uint16_t *)(base + 0x6CU))) & 0xFFU);
}
//*****************************************************************************
//
//! Gets the receive ID mask
//!
//! \param base is the LIN module base address
//!
//! In LIN mode only, this function gets the mask used for filtering an
//! incoming ID message to determine if the ID RX flag should be set.
//!
//! \return Returns the Receive ID Mask.
//
//*****************************************************************************
static inline uint16_t
LIN_getRxMask(uint32_t base)
{
//
// Check the arguments.
//
;
return((uint16_t)((__byte_peripheral_32((uint32_t *)(base + 0x6CU)) & 0xFF0000U) >>
16U));
}
//*****************************************************************************
//
//! Check if Rx data is ready
//!
//! \param base is the LIN module base address
//!
//! In LIN mode only, checks to see if the Rx ready bit is set indicating that
//! a valid message frame has been received.
//!
//! \return Returns \b true if the Rx ready flag is set, else returns \b false.
//
//*****************************************************************************
static inline _Bool
LIN_isRxReady(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Ready Rx ready flag and return status
//
return(((*((volatile uint16_t *)(base + 0x1CU))) & 0x200U) ==
0x200U);
}
//*****************************************************************************
//
//! Get last received identifier
//!
//! \param base is the LIN module base address
//!
//! In LIN mode only, this function gets the last received identifier.
//!
//! \return Returns the Received Identifier.
//
//*****************************************************************************
static inline uint16_t
LIN_getRxIdentifier(uint32_t base)
{
//
// Check the arguments.
//
;
return((uint16_t)((__byte_peripheral_32((uint32_t *)(base + 0x70U)) & 0xFF0000U) >>
16U));
}
//*****************************************************************************
//
//! Checks for Tx ID Match Received
//!
//! \param base is the LIN module base address
//!
//! In LIN mode only, this function checks if an ID is received with a TX match
//! and no ID-parity error.
//!
//! \return Returns \b true if a valid ID is matched, else returns \b false.
//
//*****************************************************************************
static inline _Bool
LIN_isTxMatch(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Read Tx ID flag and return status
//
return(((*((volatile uint16_t *)(base + 0x1CU))) & 0x2000U) ==
0x2000U);
}
//*****************************************************************************
//
//! Checks for Rx ID Match Received
//!
//! \param base is the LIN module base address
//!
//! In LIN mode only, this function checks if an ID is received with a RX match
//! and no ID-parity error.
//!
//! \return Returns \b true if a valid ID is matched, else returns \b false.
//
//*****************************************************************************
static inline _Bool
LIN_isRxMatch(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Read Rx ID flag and return status
//
return(((*((volatile uint16_t *)(base + 0x1CU))) & 0x4000U) ==
0x4000U);
}
//*****************************************************************************
//
//! Enable interrupts
//!
//! \param base is the LIN module base address
//! \param intFlags is the bit mask of the interrupt sources to be enabled.
//!
//! In LIN mode only, this function enables the interrupts for the specified
//! interrupt sources.
//!
//! The \e intFlags parameter can be set to the following value to set
//! all the flag bits:
//! - \b LIN_INT_ALL - All Interrupts
//!
//! To set individual flags, the \e intFlags parameter can be the logical
//! OR of any of the following:
//! - \b LIN_INT_WAKEUP - Wakeup
//! - \b LIN_INT_TO - Time out
//! - \b LIN_INT_TOAWUS - Time out after wakeup signal
//! - \b LIN_INT_TOA3WUS - Time out after 3 wakeup signals
//! - \b LIN_INT_TX - Transmit buffer ready
//! - \b LIN_INT_RX - Receive buffer ready
//! - \b LIN_INT_ID - Received matching identifier
//! - \b LIN_INT_PE - Parity error
//! - \b LIN_INT_OE - Overrun error
//! - \b LIN_INT_FE - Framing error
//! - \b LIN_INT_NRE - No response error
//! - \b LIN_INT_ISFE - Inconsistent sync field error
//! - \b LIN_INT_CE - Checksum error
//! - \b LIN_INT_PBE - Physical bus error
//! - \b LIN_INT_BE - Bit error
//!
//! \return None.
//
//*****************************************************************************
static inline void
LIN_enableInterrupt(uint32_t base, uint32_t intFlags)
{
//
// Check the arguments.
//
;
__byte_peripheral_32((uint32_t *)(base + 0xCU)) |= intFlags;
}
//*****************************************************************************
//
//! Disable interrupts
//!
//! \param base is the LIN module base address
//! \param intFlags is the bit mask of the interrupt sources to be disabled.
//!
//! In LIN mode only, this function disables the interrupts for the specified
//! interrupt sources.
//!
//! The \e intFlags parameter can be set to the following value to disable
//! all the flag bits:
//! - \b LIN_INT_ALL - All Interrupts
//!
//! To disable individual flags, the \e intFlags parameter can be the logical
//! OR of any of the following:
//! - \b LIN_INT_WAKEUP - Wakeup
//! - \b LIN_INT_TO - Time out
//! - \b LIN_INT_TOAWUS - Time out after wakeup signal
//! - \b LIN_INT_TOA3WUS - Time out after 3 wakeup signals
//! - \b LIN_INT_TX - Transmit buffer ready
//! - \b LIN_INT_RX - Receive buffer ready
//! - \b LIN_INT_ID - Received matching identifier
//! - \b LIN_INT_PE - Parity error
//! - \b LIN_INT_OE - Overrun error
//! - \b LIN_INT_FE - Framing error
//! - \b LIN_INT_NRE - No response error
//! - \b LIN_INT_ISFE - Inconsistent sync field error
//! - \b LIN_INT_CE - Checksum error
//! - \b LIN_INT_PBE - Physical bus error
//! - \b LIN_INT_BE - Bit error
//!
//! \return None.
//
//*****************************************************************************
static inline void
LIN_disableInterrupt(uint32_t base, uint32_t intFlags)
{
//
// Check the arguments.
//
;
__byte_peripheral_32((uint32_t *)(base + 0x10U)) = intFlags;
}
//*****************************************************************************
//
//! Clear interrupt status
//!
//! \param base is the LIN module base address
//! \param intFlags is the bit mask of the interrupt sources to be cleared.
//!
//! In LIN mode only, this function clears the specified status flags.
//!
//! The \e intFlags parameter can be set to the following value to clear
//! all the flag bits:
//! - \b LIN_INT_ALL - All Interrupts
//!
//! To clear individual flags, the \e intFlags parameter can be the logical
//! OR of any of the following:
//! - \b LIN_INT_WAKEUP - Wakeup
//! - \b LIN_INT_TO - Time out
//! - \b LIN_INT_TOAWUS - Time out after wakeup signal
//! - \b LIN_INT_TOA3WUS - Time out after 3 wakeup signals
//! - \b LIN_INT_TX - Transmit buffer ready
//! - \b LIN_INT_RX - Receive buffer ready
//! - \b LIN_INT_ID - Received matching identifier
//! - \b LIN_INT_PE - Parity error
//! - \b LIN_INT_OE - Overrun error
//! - \b LIN_INT_FE - Framing error
//! - \b LIN_INT_NRE - No response error
//! - \b LIN_INT_ISFE - Inconsistent sync field error
//! - \b LIN_INT_CE - Checksum error
//! - \b LIN_INT_PBE - Physical bus error
//! - \b LIN_INT_BE - Bit error
//!
//! \return None.
//
//*****************************************************************************
static inline void
LIN_clearInterruptStatus(uint32_t base, uint32_t intFlags)
{
//
// Check the arguments.
//
;
//
// Clear the status flags
//
__byte_peripheral_32((uint32_t *)(base + 0x1CU)) = intFlags;
}
//*****************************************************************************
//
//! Set interrupt level to 0
//!
//! \param base is the LIN module base address
//! \param intFlags is the bit mask of interrupt sources to be configured
//!
//! In LIN mode only, this function sets the specified interrupt sources to
//! level 0.
//!
//! The \e intFlags parameter can be set to the following value to set
//! all the flag bits:
//! - \b LIN_INT_ALL - All Interrupts
//!
//! To set individual flags, the \e intFlags parameter can be the logical
//! OR of any of the following:
//! - \b LIN_INT_WAKEUP - Wakeup
//! - \b LIN_INT_TO - Time out
//! - \b LIN_INT_TOAWUS - Time out after wakeup signal
//! - \b LIN_INT_TOA3WUS - Time out after 3 wakeup signals
//! - \b LIN_INT_TX - Transmit buffer ready
//! - \b LIN_INT_RX - Receive buffer ready
//! - \b LIN_INT_ID - Received matching identifier
//! - \b LIN_INT_PE - Parity error
//! - \b LIN_INT_OE - Overrun error
//! - \b LIN_INT_FE - Framing error
//! - \b LIN_INT_NRE - No response error
//! - \b LIN_INT_ISFE - Inconsistent sync field error
//! - \b LIN_INT_CE - Checksum error
//! - \b LIN_INT_PBE - Physical bus error
//! - \b LIN_INT_BE - Bit error
//!
//! \return None.
//
//*****************************************************************************
static inline void
LIN_setInterruptLevel0(uint32_t base, uint32_t intFlags)
{
//
// Check the arguments.
//
;
//
// Clear interrupt levels to 0
//
__byte_peripheral_32((uint32_t *)(base + 0x18U)) = intFlags;
}
//*****************************************************************************
//
//! Set interrupt level to 1
//!
//! \param base is the LIN module base address
//! \param intFlags is the bit mask of interrupt sources to be configured
//!
//! In LIN mode only, this function sets the specified interrupt sources to
//! level 1.
//!
//! The \e intFlags parameter can be set to the following value to set
//! all the flag bits:
//! - \b LIN_INT_ALL - All Interrupts
//!
//! To set individual flags, the \e intFlags parameter can be the logical
//! OR of any of the following:
//! - \b LIN_INT_WAKEUP - Wakeup
//! - \b LIN_INT_TO - Time out
//! - \b LIN_INT_TOAWUS - Time out after wakeup signal
//! - \b LIN_INT_TOA3WUS - Time out after 3 wakeup signals
//! - \b LIN_INT_TX - Transmit buffer ready
//! - \b LIN_INT_RX - Receive buffer ready
//! - \b LIN_INT_ID - Received matching identifier
//! - \b LIN_INT_PE - Parity error
//! - \b LIN_INT_OE - Overrun error
//! - \b LIN_INT_FE - Framing error
//! - \b LIN_INT_NRE - No response error
//! - \b LIN_INT_ISFE - Inconsistent sync field error
//! - \b LIN_INT_CE - Checksum error
//! - \b LIN_INT_PBE - Physical bus error
//! - \b LIN_INT_BE - Bit error
//!
//! \return None.
//
//*****************************************************************************
static inline void
LIN_setInterruptLevel1(uint32_t base, uint32_t intFlags)
{
//
// Check the arguments.
//
;
//
// Set interrupt levels to 1
//
__byte_peripheral_32((uint32_t *)(base + 0x14U)) |= intFlags;
}
//*****************************************************************************
//
//! Enable Module Errors for Testing
//!
//! \param base is the LIN module base address
//! \param errors is the specified errors to be enabled
//!
//! In LIN mode only, this function enables the specified errors in the module
//! for testing. The \e errors parameter can be a logical OR-ed result of the
//! following values or \b LIN_ALL_ERRORS can be used to enable all of them:
//! - \b LIN_BIT_ERROR - Simulates a bit error
//! - \b LIN_BUS_ERROR - Simulates a physical bus error
//! - \b LIN_CHECKSUM_ERROR - Simulates a checksum error
//! - \b LIN_ISF_ERROR - Simulates an inconsistent synch field error
//!
//! \note To disable these errors, use the LIN_disableModuleErrors() function.
//!
//! \return None.
//
//*****************************************************************************
static inline void
LIN_enableModuleErrors(uint32_t base, uint32_t errors)
{
//
// Check the arguments.
//
;
__eallow();
//
// Clear the IO DFT Enable Key
//
(*((volatile uint16_t *)(base + 0x90U))) &= ~(0xF00U);
//
// Enable write access
//
(*((volatile uint16_t *)(base + 0x90U))) |= ((0xAU) <<
8U);
//
// Enable specified error bits
//
__byte_peripheral_32((uint32_t *)(base + 0x90U)) |= errors;
//
// Clear the IO DFT Enable Key
//
(*((volatile uint16_t *)(base + 0x90U))) &= ~((0xAU) <<
8U);
__edis();
}
//*****************************************************************************
//
//! Disable Module Errors for Testing
//!
//! \param base is the LIN module base address
//! \param errors is the specified errors to be disabled
//!
//! In LIN mode only, this function disables the specified errors in the module
//! for testing. The \e errors parameter can be a logical OR-ed result of the
//! following values or \b LIN_ALL_ERRORS can be used to disable all of them:
//! - \b LIN_BIT_ERROR - Simulates a bit error
//! - \b LIN_BUS_ERROR - Simulates a physical bus error
//! - \b LIN_CHECKSUM_ERROR - Simulates a checksum error
//! - \b LIN_ISF_ERROR - Simulates an inconsistent synch field error
//!
//! \return None.
//
//*****************************************************************************
static inline void
LIN_disableModuleErrors(uint32_t base, uint32_t errors)
{
//
// Check the arguments.
//
;
__eallow();
//
// Clear the IO DFT Enable Key
//
(*((volatile uint16_t *)(base + 0x90U))) &= ~(0xF00U);
//
// Enable write access
//
(*((volatile uint16_t *)(base + 0x90U))) |= ((0xAU) <<
8U);
//
// Disable specified error bits
//
__byte_peripheral_32((uint32_t *)(base + 0x90U)) &= ~(errors);
//
// Clear the IO DFT Enable Key
//
(*((volatile uint16_t *)(base + 0x90U))) &= ~((0xAU) <<
8U);
__edis();
}
//*****************************************************************************
//
//! Enable Automatic Baudrate Adjustment
//!
//! \param base is the LIN module base address
//!
//! In LIN mode only, this function enables the automatic baudrate adjustment
//! mode during the detection of the Synch Field.
//!
//! \note The baudrate selection register will be updated automatically by a
//! responder node if this mode is enabled.
//!
//! \return None.
//
//*****************************************************************************
static inline void
LIN_enableAutomaticBaudrate(uint32_t base)
{
//
// Check the arguments.
//
;
__eallow();
(*((volatile uint16_t *)(base + 0x4U))) |= 0x200U;
__edis();
}
//*****************************************************************************
//
//! Disable Automatic Baudrate Adjustment
//!
//! \param base is the LIN module base address
//!
//! In LIN mode only, this function disables the automatic baudrate adjustment
//! mode during the detection of the Synch Field. This results in a fixed
//! baud rate.
//!
//! \return None.
//
//*****************************************************************************
static inline void
LIN_disableAutomaticBaudrate(uint32_t base)
{
//
// Check the arguments.
//
;
__eallow();
(*((volatile uint16_t *)(base + 0x4U))) &= ~0x200U;
__edis();
}
//*****************************************************************************
//
//! Stops LIN Extended Frame Communication
//!
//! \param base is the LIN module base address
//!
//! In LIN mode only, this function stops the extended frame communication.
//! Once stopped, the bit is automatically cleared.
//!
//! \note This function can only be called during extended frame communication.
//!
//! \return None.
//
//*****************************************************************************
static inline void
LIN_stopExtendedFrame(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Set stop bit
//
(*((volatile uint16_t *)(base + 0x4U))) |= 0x2000U;
}
//*****************************************************************************
//
//! Set Checksum Type
//!
//! \param base is the LIN module base address
//! \param type is the checksum type
//!
//! In LIN mode only, this function sets the checksum type. The \e type
//! parameter can be one of the following two values:
//! - \b LIN_CHECKSUM_CLASSIC - Checksum Classic
//! - \b LIN_CHECKSUM_ENHANCED - Checksum Enhanced
//!
//! \return None.
//
//*****************************************************************************
static inline void
LIN_setChecksumType(uint32_t base, LIN_ChecksumType type)
{
//
// Check the arguments.
//
;
if(type == LIN_CHECKSUM_ENHANCED)
{
(*((volatile uint16_t *)(base + 0x4U))) |= 0x800U;
}
else
{
(*((volatile uint16_t *)(base + 0x4U))) &= ~(0x800U);
}
}
//*****************************************************************************
//
//! Set Sync Break Extend and Delimiter
//!
//! \param base is the LIN module base address
//! \param syncBreak is the sync break extend value
//! \param delimiter is the sync delimiter value
//!
//! In LIN mode only, this function sets the 3-bit sync break extend value
//! and the 2-bit sync delimiter compare value.
//!
//! The \e break parameter can be a value between 0 to 7. Details:
//! - \b 0 - Sync Break has no additional T-bit
//! - \b 1 - Sync Break has 1 additional T-bit
//! - \b ...
//! - \b 7 - Sync Break has 7 additional T-bits
//!
//! The \e delimiter parameter can be a value between 1 to 4. Details:
//! - \b 1 - Delimiter has 1 T-bit
//! - \b 2 - Delimiter has 2 T-bits
//! - \b 3 - Delimiter has 3 T-bits
//! - \b 4 - Delimiter has 4 T-bits
//!
//! \return None.
//
//*****************************************************************************
static inline void
LIN_setSyncFields(uint32_t base, uint16_t syncBreak, uint16_t delimiter)
{
//
// Check the arguments.
//
;
;
;
//
// Clear sync values and set new values
//
(*((volatile uint16_t *)(base + 0x60U))) &= ~((uint16_t)0x7U |
(uint16_t)0x300U);
(*((volatile uint16_t *)(base + 0x60U))) |= (syncBreak | ((delimiter - 1U) <<
8U));
}
//*****************************************************************************
//
// Prototypes for the SCI mode APIs.
//
//*****************************************************************************
//*****************************************************************************
//
//! Enable SCI Mode
//!
//! \param base is the LIN module base address
//!
//! This function enables the LIN peripheral to function as a SCI.
//!
//! \return None.
//
//*****************************************************************************
static inline void
LIN_enableSCIMode(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Enable SCI communications mode
//
__eallow();
(*((volatile uint16_t *)(base + 0x4U))) &= ~0x40U;
(*((volatile uint16_t *)(base + 0x4U))) |= 0x20U |
0x2U;
__edis();
}
//*****************************************************************************
//
//! Disable SCI Mode
//!
//! \param base is the LIN module base address
//!
//! This function disables the SCI mode of the LIN peripheral.
//!
//! \return None.
//
//*****************************************************************************
static inline void
LIN_disableSCIMode(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Disable SCI communications mode
//
__eallow();
(*((volatile uint16_t *)(base + 0x4U))) &= ~(0x20U |
0x2U);
(*((volatile uint16_t *)(base + 0x4U))) |= 0x40U;
__edis();
}
//*****************************************************************************
//
//! Set SCI communication mode
//!
//! \param base is the LIN module base address
//! \param mode is the selected communication mode
//!
//! In SCI mode only, this function is used to select between idle-line mode
//! and address-bit mode. The \e mode parameter can have one of the following
//! values:
//! - \b LIN_COMM_SCI_IDLELINE - Idle-line mode.
//! - \b LIN_COMM_SCI_ADDRBIT - Address-bit mode.
//!
//! \return None.
//
//*****************************************************************************
static inline void
LIN_setSCICommMode(uint32_t base, LIN_SCICommMode mode)
{
//
// Check the arguments.
//
;
;
//
// Write communication mode selection to the appropriate bit.
//
(*((volatile uint16_t *)(base + 0x4U))) = ((*((volatile uint16_t *)(base + 0x4U))) &
~0x1U) | (uint16_t)mode;
}
//*****************************************************************************
//
//! Enable SCI Parity mode.
//!
//! \param base is the LIN module base address
//! \param parity is the SCI parity type
//!
//! In SCI mode only, this function enables the parity check and sets the
//! parity type. The \e parity parameter can one of the following values:
//! - \b LIN_SCI_PAR_ODD - Sets Odd parity
//! - \b LIN_SCI_PAR_EVEN - Sets Even parity
//!
//! \return None.
//
//*****************************************************************************
static inline void
LIN_enableSCIParity(uint32_t base, LIN_SCIParityType parity)
{
//
// Check the arguments.
//
;
;
//
// Enable the parity mode
//
(*((volatile uint16_t *)(base + 0x4U))) |= 0x4U;
//
// Set the parity type
//
if(parity == LIN_SCI_PAR_ODD)
{
(*((volatile uint16_t *)(base + 0x4U))) &= ~(0x8U);
}
else
{
(*((volatile uint16_t *)(base + 0x4U))) |= 0x8U;
}
}
//*****************************************************************************
//
//! Disable SCI Parity mode.
//!
//! \param base is the LIN module base address
//!
//! In SCI mode only, this function disables the parity check.
//!
//! \return None.
//
//*****************************************************************************
static inline void
LIN_disableSCIParity(uint32_t base)
{
//
// Check the arguments.
//
;
;
//
// Disable the parity mode
//
(*((volatile uint16_t *)(base + 0x4U))) &= ~(0x4U);
}
//*****************************************************************************
//
//! Set the number of stop bits for SCI
//!
//! \param base is the LIN module base address
//! \param number is the number of stop bits
//!
//! In SCI mode only, this function sets the number of stop bits transmitted.
//! The \e number parameter can be one of the following values:
//! - \b LIN_SCI_STOP_ONE - Set one stop bit
//! - \b LIN_SCI_STOP_TWO - Set two stop bits
//!
//! \return None.
//
//*****************************************************************************
static inline void
LIN_setSCIStopBits(uint32_t base, LIN_SCIStopBits number)
{
//
// Check the arguments.
//
;
;
//
// Set the number of stop bits
//
if(number == LIN_SCI_STOP_ONE)
{
(*((volatile uint16_t *)(base + 0x4U))) &= ~(0x10U);
}
else
{
(*((volatile uint16_t *)(base + 0x4U))) |= 0x10U;
}
}
//*****************************************************************************
//
//! Enable SCI Sleep mode.
//!
//! \param base is the LIN module base address
//!
//! In SCI mode only, this function enables the receive sleep mode
//! functionality.
//!
//! \note The receiver still operates when the sleep mode is enabled, however,
//! RXRDY is updated and SCIRD is loaded with new data only when an address
//! frame is detected.
//!
//! \return None.
//
//*****************************************************************************
static inline void
LIN_enableSCISleepMode(uint32_t base)
{
//
// Check the arguments.
//
;
;
//
// Set sleep mode bit
//
(*((volatile uint16_t *)(base + 0x4U))) |= 0x100U;
}
//*****************************************************************************
//
//! Disable SCI Sleep mode.
//!
//! \param base is the LIN module base address
//!
//! In SCI mode only, this function disables the receive sleep mode
//! functionality.
//!
//! \return None.
//
//*****************************************************************************
static inline void
LIN_disableSCISleepMode(uint32_t base)
{
//
// Check the arguments.
//
;
;
//
// Clear sleep mode bit
//
(*((volatile uint16_t *)(base + 0x4U))) &= ~(0x100U);
}
//*****************************************************************************
//
//! Enter SCI Local Low-Power Mode
//!
//! \param base is the LIN module base address
//!
//! In SCI mode only, this function enters the SCI local low-power mode.
//!
//! \note If this function is called while the receiver is actively receiving
//! data and the wakeup interrupt is disabled, then the module will delay
//! sleep mode from being entered until completion of reception.
//!
//! \return None.
//
//*****************************************************************************
static inline void
LIN_enterSCILowPower(uint32_t base)
{
//
// Check the arguments.
//
;
;
//
// Set low power bit
//
(*((volatile uint16_t *)(base + 0x8U))) |= 0x1U;
}
//*****************************************************************************
//
//! Exit SCI Local Low-Power Mode
//!
//! \param base is the LIN module base address
//!
//! In SCI mode only, this function exits the SCI local low-power mode.
//!
//! \return None.
//
//*****************************************************************************
static inline void
LIN_exitSCILowPower(uint32_t base)
{
//
// Check the arguments.
//
;
;
//
// Clear low power bit
//
(*((volatile uint16_t *)(base + 0x8U))) &= ~0x1U;
}
//*****************************************************************************
//
//! Set SCI character length
//!
//! \param base is the LIN module base address
//! \param numBits is the number of bits per character.
//!
//! In SCI mode only, this function sets the number of bits per character.
//!
//! The \e numBits parameter must be in a range between 1 and 8.
//!
//! \return None.
//
//*****************************************************************************
static inline void
LIN_setSCICharLength(uint32_t base, uint16_t numBits)
{
//
// Check the arguments.
//
;
;
;
//
// Set the number of bits per character
//
(*((volatile uint16_t *)(base + 0x28U))) = ((*((volatile uint16_t *)(base + 0x28U))) &
~0x7U) |
(uint16_t)(numBits - 1U);
}
//*****************************************************************************
//
//! Set SCI Frame Length
//!
//! \param base is the LIN module base address
//! \param length is the number of characters
//!
//! In SCI mode only, this function sets the number of characters in the
//! response field.
//!
//! The \e length parameter must be in a range between 1 and 8.
//!
//! \return None.
//
//*****************************************************************************
static inline void
LIN_setSCIFrameLength(uint32_t base, uint16_t length)
{
//
// Check the arguments.
//
;
;
;
//
// Set number of characters
//
__byte_peripheral_32((uint32_t *)(base + 0x28U)) = (__byte_peripheral_32((uint32_t *)(base + 0x28U)) &
~(0x70000U)) |
(((uint32_t)length - (uint32_t)1U) <<
16U);
}
//*****************************************************************************
//
//! Check if new SCI data is ready to be read
//!
//! \param base is the LIN module base address
//!
//! In SCI mode only, this function checks to see if the Rx ready bit is set
//! indicating that a new data has been received.
//!
//! \return Returns \b true if the Rx ready flag is set, else returns \b false.
//
//*****************************************************************************
static inline _Bool
LIN_isSCIDataAvailable(uint32_t base)
{
//
// Check the arguments.
//
;
;
//
// Read Rx Ready flag and return status
//
return(((*((volatile uint16_t *)(base + 0x1CU))) & 0x200U) ==
0x200U);
}
//*****************************************************************************
//
//! Check if Space is available in SCI Transmit Buffer
//!
//! \param base is the LIN module base address
//!
//! In SCI mode only, this function checks to see if the Tx ready flag is set
//! indicating that the Tx buffer(s) is/are ready to get another character.
//!
//! \return Returns \b true if the TX ready flag is set, else returns \b false
//
//*****************************************************************************
static inline _Bool
LIN_isSCISpaceAvailable(uint32_t base)
{
//
// Check the arguments.
//
;
;
//
// Read Tx buffer flag and return status
//
return(((*((volatile uint16_t *)(base + 0x1CU))) & 0x100U) ==
0x100U);
}
//*****************************************************************************
//
//! Reads a SCI character without Blocking
//!
//! \param base is the LIN module base address
//! \param emulation sets whether the data is being read by an emulator or not
//!
//! In SCI mode only, this function gets the byte of data received. The
//! \e emulation parameter can have one of the following values:
//! - \b true - Emulator is being used, the RXRDY flag won't be cleared
//! - \b false - Emulator isn't being used, the RXRDY flag will be cleared
//! automatically on read
//!
//! \note
//! -# If the SCI receives data that is fewer than 8 bits in length, the
//! data is left-justified and padded with trailing zeros.
//! -# To determine if new data is available to read, use the function
//! LIN_isSCIDataAvailable().
//!
//! \return Returns the received data.
//
//*****************************************************************************
static inline uint16_t
LIN_readSCICharNonBlocking(uint32_t base, _Bool emulation)
{
//
// Check the arguments.
//
;
;
//
// Read specific data register
//
return(emulation ? ((*((volatile uint16_t *)(base + 0x30U))) & 0xFFU) :
((*((volatile uint16_t *)(base + 0x34U))) & 0xFFU));
}
//*****************************************************************************
//
//! Reads a SCI character with Blocking
//!
//! \param base is the LIN module base address
//! \param emulation sets whether the data is being read by an emulator or not
//!
//! In SCI mode only, this function gets the byte of data received. If new data
//! isn't available, this function will wait until new data arrives. The
//! \e emulation parameter can have one of the following values:
//! - \b true - Emulator is being used, the RXRDY flag won't be cleared
//! - \b false - Emulator isn't being used, the RXRDY flag will be cleared
//! automatically on read
//!
//! \note If the SCI receives data that is fewer than 8 bits in length, the
//! data is left-justified and padded with trailing zeros.
//!
//! \return Returns the received data.
//
//*****************************************************************************
static inline uint16_t
LIN_readSCICharBlocking(uint32_t base, _Bool emulation)
{
//
// Check the arguments.
//
;
;
//
// Wait until a character is available in buffer.
//
while(!LIN_isSCIDataAvailable(base))
{
}
//
// Read specific data register
//
return(emulation ? ((*((volatile uint16_t *)(base + 0x30U))) & 0xFFU) :
((*((volatile uint16_t *)(base + 0x34U))) & 0xFFU));
}
//*****************************************************************************
//
//! Sends a SCI character without blocking
//!
//! \param base is the LIN module base address
//! \param data is the byte of data to be transmitted
//!
//! In SCI mode only, this function sets the byte of data to be transmitted
//! without blocking.
//!
//! \note The transmit ready flag gets set when this buffer is ready to be
//! loaded with another byte of data. Use LIN_isSCISpaceAvailable() to
//! determine if space is available to write another character.
//!
//! \return None.
//
//*****************************************************************************
static inline void
LIN_writeSCICharNonBlocking(uint32_t base, uint16_t data)
{
//
// Check the arguments.
//
;
;
;
//
// Set the Tx Data
//
(*((volatile uint16_t *)(base + 0x38U))) = (data & 0xFFU);
}
//*****************************************************************************
//
//! Sends a SCI character with blocking
//!
//! \param base is the LIN module base address
//! \param data is the byte of data to be transmitted
//!
//! In SCI mode only, this function sets the byte of data to be transmitted
//! with blocking functionality. If the buffer isn't ready to get new data
//! written to, this function will wait until space is available.
//!
//! \return None.
//
//*****************************************************************************
static inline void
LIN_writeSCICharBlocking(uint32_t base, uint16_t data)
{
//
// Check the arguments.
//
;
;
;
//
// Wait until space is available in the transmit buffer.
//
while(!LIN_isSCISpaceAvailable(base))
{
}
//
// Set the Tx Data
//
(*((volatile uint16_t *)(base + 0x38U))) = (data & 0xFFU);
}
//*****************************************************************************
//
//! Enable SCI Module Errors for Testing
//!
//! \param base is the LIN module base address
//! \param errors is the specified errors to be enabled
//!
//! In SCI mode only, this function enables the specified errors in the module
//! for testing. The \e errors parameter can be a logical OR-ed result of the
//! following values or \b LIN_SCI_ALL_ERRORS can be used to enable all of
//! them:
//! - \b LIN_SCI_FRAME_ERROR - Simulates a frame error
//! - \b LIN_SCI_PARITY_ERROR - Simulates a parity error
//! - \b LIN_SCI_BREAK_ERROR - Simulates a break detect error
//!
//! \note To disable these errors, use the LIN_disableSCIModuleErrors()
//! function.
//!
//! \return None.
//
//*****************************************************************************
static inline void
LIN_enableSCIModuleErrors(uint32_t base, uint32_t errors)
{
//
// Check the arguments.
//
;
;
__eallow();
//
// Clear the IO DFT Enable Key
//
(*((volatile uint16_t *)(base + 0x90U))) &= ~(0xF00U);
//
// Enable write access
//
(*((volatile uint16_t *)(base + 0x90U))) |= ((0xAU) <<
8U);
//
// Enable specified error bits
//
__byte_peripheral_32((uint32_t *)(base + 0x90U)) |= errors;
//
// Clear the IO DFT Enable Key
//
(*((volatile uint16_t *)(base + 0x90U))) &= ~((0xAU) <<
8U);
__edis();
}
//*****************************************************************************
//
//! Disable SCI Module Errors for Testing
//!
//! \param base is the LIN module base address
//! \param errors is the specified errors to be disabled
//!
//! In SCI mode only, this function disables the specified errors in the module
//! for testing. The \e errors parameter can be a logical OR-ed result of the
//! following values or \b LIN_SCI_ALL_ERRORS can be used to enable all of
//! them:
//! - \b LIN_SCI_FRAME_ERROR - Simulates a frame error
//! - \b LIN_SCI_PARITY_ERROR - Simulates a parity error
//! - \b LIN_SCI_BREAK_ERROR - Simulates a break detect error
//!
//! \return None.
//
//*****************************************************************************
static inline void
LIN_disableSCIModuleErrors(uint32_t base, uint32_t errors)
{
//
// Check the arguments.
//
;
;
__eallow();
//
// Clear the IO DFT Enable Key
//
(*((volatile uint16_t *)(base + 0x90U))) &= ~(0xF00U);
//
// Enable write access
//
(*((volatile uint16_t *)(base + 0x90U))) |= ((0xAU) <<
8U);
//
// Disable specified error bits
//
__byte_peripheral_32((uint32_t *)(base + 0x90U)) &= ~(errors);
//
// Clear the IO DFT Enable Key
//
(*((volatile uint16_t *)(base + 0x90U))) &= ~((0xAU) <<
8U);
__edis();
}
//*****************************************************************************
//
//! Enable SCI interrupts
//!
//! \param base is the LIN module base address
//! \param intFlags is the bit mask of the interrupt sources to be enabled.
//!
//! In SCI mode only, this function enables the interrupts for the specified
//! interrupt sources.
//!
//! The \e intFlags parameter can be set to the following value to set
//! all the flag bits:
//! - \b LIN_SCI_INT_ALL - All Interrupts
//!
//! To set individual flags, the \e intFlags parameter can be the logical
//! OR of any of the following:
//! - \b LIN_SCI_INT_BREAK - Break Detect
//! - \b LIN_SCI_INT_WAKEUP - Wakeup
//! - \b LIN_SCI_INT_TX - Transmit Buffer
//! - \b LIN_SCI_INT_RX - Receive Buffer
//! - \b LIN_SCI_INT_TX_DMA - DMA Transmit
//! - \b LIN_SCI_INT_RX_DMA - DMA Receive
//! - \b LIN_SCI_INT_RX_DMA_ALL - DMA Receive All
//! - \b LIN_SCI_INT_PARITY - Parity Error
//! - \b LIN_SCI_INT_OVERRUN - Overrun Error
//! - \b LIN_SCI_INT_FRAME - Framing Error
//!
//! \return None.
//
//*****************************************************************************
static inline void
LIN_enableSCIInterrupt(uint32_t base, uint32_t intFlags)
{
//
// Check the arguments.
//
;
;
//
// Set specified interrupts
//
__byte_peripheral_32((uint32_t *)(base + 0xCU)) |= intFlags;
}
//*****************************************************************************
//
//! Disable SCI interrupts
//!
//! \param base is the LIN module base address
//! \param intFlags is the bit mask of the interrupt sources to be disabled.
//!
//! In SCI mode only, this function disables the interrupts for the specified
//! interrupt sources.
//!
//! The \e intFlags parameter can be set to the following value to disable
//! all the flag bits:
//! - \b LIN_SCI_INT_ALL - All Interrupts
//!
//! To disable individual flags, the \e intFlags parameter can be the logical
//! OR of any of the following:
//! - \b LIN_SCI_INT_BREAK - Break Detect
//! - \b LIN_SCI_INT_WAKEUP - Wakeup
//! - \b LIN_SCI_INT_TX - Transmit Buffer
//! - \b LIN_SCI_INT_RX - Receive Buffer
//! - \b LIN_SCI_INT_TX_DMA - DMA Transmit
//! - \b LIN_SCI_INT_RX_DMA - DMA Receive
//! - \b LIN_SCI_INT_RX_DMA_ALL - DMA Receive All
//! - \b LIN_SCI_INT_PARITY - Parity Error
//! - \b LIN_SCI_INT_OVERRUN - Overrun Error
//! - \b LIN_SCI_INT_FRAME - Framing Error
//!
//! \return None.
//
//*****************************************************************************
static inline void
LIN_disableSCIInterrupt(uint32_t base, uint32_t intFlags)
{
//
// Check the arguments.
//
;
;
//
// Set specified interrupts to be cleared
//
__byte_peripheral_32((uint32_t *)(base + 0x10U)) |= intFlags;
}
//*****************************************************************************
//
//! Clear SCI interrupt status
//!
//! \param base is the LIN module base address
//! \param intFlags is the bit mask of the interrupt sources to be cleared.
//!
//! In SCI mode only, this function clears the specified status flags.
//!
//! The \e intFlags parameter can be set to the following value to clear
//! all the flag bits:
//! - \b LIN_SCI_INT_ALL - All Interrupts
//!
//! To clear individual flags, the \e intFlags parameter can be the logical
//! OR of any of the following:
//! - \b LIN_SCI_INT_BREAK - Break Detect
//! - \b LIN_SCI_INT_WAKEUP - Wakeup
//! - \b LIN_SCI_INT_TX - Transmit Buffer
//! - \b LIN_SCI_INT_RX - Receive Buffer
//! - \b LIN_SCI_INT_TX_DMA - DMA Transmit
//! - \b LIN_SCI_INT_RX_DMA - DMA Receive
//! - \b LIN_SCI_INT_RX_DMA_ALL - DMA Receive All
//! - \b LIN_SCI_INT_PARITY - Parity Error
//! - \b LIN_SCI_INT_OVERRUN - Overrun Error
//! - \b LIN_SCI_INT_FRAME - Framing Error
//!
//! \return None.
//
//*****************************************************************************
static inline void
LIN_clearSCIInterruptStatus(uint32_t base, uint32_t intFlags)
{
//
// Check the arguments.
//
;
;
//
// Clear the status flags
//
__byte_peripheral_32((uint32_t *)(base + 0x1CU)) |= intFlags;
}
//*****************************************************************************
//
//! Set SCI interrupt level to 0
//!
//! \param base is the LIN module base address
//! \param intFlags is the bit mask of interrupt sources to be configured
//!
//! In SCI mode only, this function sets the specified interrupt sources to
//! level 0.
//!
//! The \e intFlags parameter can be set to the following value to set
//! all the flag bits:
//! - \b LIN_SCI_INT_ALL - All Interrupts
//!
//! To set individual flags, the \e intFlags parameter can be the logical
//! OR of any of the following:
//! - \b LIN_SCI_INT_BREAK - Break Detect
//! - \b LIN_SCI_INT_WAKEUP - Wakeup
//! - \b LIN_SCI_INT_TX - Transmit Buffer
//! - \b LIN_SCI_INT_RX - Receive Buffer
//! - \b LIN_SCI_INT_TX_DMA - DMA Transmit
//! - \b LIN_SCI_INT_RX_DMA - DMA Receive
//! - \b LIN_SCI_INT_RX_DMA_ALL - DMA Receive All
//! - \b LIN_SCI_INT_PARITY - Parity Error
//! - \b LIN_SCI_INT_OVERRUN - Overrun Error
//! - \b LIN_SCI_INT_FRAME - Framing Error
//!
//! \return None.
//
//*****************************************************************************
static inline void
LIN_setSCIInterruptLevel0(uint32_t base, uint32_t intFlags)
{
//
// Check the arguments.
//
;
;
//
// Clear interrupt levels to 0
//
__byte_peripheral_32((uint32_t *)(base + 0x18U)) |= intFlags;
}
//*****************************************************************************
//
//! Set SCI interrupt level to 1
//!
//! \param base is the LIN module base address
//! \param intFlags is the bit mask of interrupt sources to be configured
//!
//! In SCI mode only, this function sets the specified interrupt sources to
//! level 1.
//!
//! The \e intFlags parameter can be set to the following value to set
//! all the flag bits:
//! - \b LIN_SCI_INT_ALL - All Interrupts
//!
//! To set individual flags, the \e intFlags parameter can be the logical
//! OR of any of the following:
//! - \b LIN_SCI_INT_BREAK - Break Detect
//! - \b LIN_SCI_INT_WAKEUP - Wakeup
//! - \b LIN_SCI_INT_TX - Transmit Buffer
//! - \b LIN_SCI_INT_RX - Receive Buffer
//! - \b LIN_SCI_INT_TX_DMA - DMA Transmit
//! - \b LIN_SCI_INT_RX_DMA - DMA Receive
//! - \b LIN_SCI_INT_RX_DMA_ALL - DMA Receive All
//! - \b LIN_SCI_INT_PARITY - Parity Error
//! - \b LIN_SCI_INT_OVERRUN - Overrun Error
//! - \b LIN_SCI_INT_FRAME - Framing Error
//!
//! \return None.
//
//*****************************************************************************
static inline void
LIN_setSCIInterruptLevel1(uint32_t base, uint32_t intFlags)
{
//
// Check the arguments.
//
;
;
//
// Set interrupt levels to 1
//
__byte_peripheral_32((uint32_t *)(base + 0x14U)) |= intFlags;
}
//*****************************************************************************
//
//! Check if SCI Receiver is Idle
//!
//! \param base is the LIN module base address
//!
//! In SCI mode only, this function checks if the receiver is in an idle state.
//!
//! \return Returns \b true if the state is idle, else returns \b false.
//
//*****************************************************************************
static inline _Bool
LIN_isSCIReceiverIdle(uint32_t base)
{
//
// Check the arguments.
//
;
;
//
// Read Rx Idle flag and return status
//
return(((*((volatile uint16_t *)(base + 0x1CU))) & 0x4U) == 0U);
}
//*****************************************************************************
//
//! Gets the SCI Transmit Frame Type
//!
//! \param base is the LIN module base address
//!
//! In SCI mode only, this function gets the transmit frame type which can be
//! either data or an address.
//!
//! \return Returns \b true if the frame will be an address, and returns
//! \b false if the frame will be data.
//
//*****************************************************************************
static inline _Bool
LIN_getSCITxFrameType(uint32_t base)
{
//
// Check the arguments.
//
;
;
//
// Read Tx Wake flag and return status
//
return(((*((volatile uint16_t *)(base + 0x1CU))) & 0x400U) ==
0x400U);
}
//*****************************************************************************
//
//! Gets the SCI Receiver Frame Type
//!
//! \param base is the LIN module base address
//!
//! In SCI mode only, this function gets the receiver frame type which can be
//! either an address or not an address.
//!
//! \return Returns \b true if the frame is an address, and returns
//! \b false if the frame isn't an address.
//
//*****************************************************************************
static inline _Bool
LIN_getSCIRxFrameType(uint32_t base)
{
//
// Check the arguments.
//
;
;
//
// Read Rx Wake flag and return status
//
return(((*((volatile uint16_t *)(base + 0x1CU))) & 0x1000U) ==
0x1000U);
}
//*****************************************************************************
//
//! Check if SCI Detected a Break Condition
//!
//! \param base is the LIN module base address
//!
//! In SCI mode only, this function checks if the module detected a break
//! condition on the Rx pin.
//!
//! \return Returns \b true if break detected, else returns \b false.
//
//*****************************************************************************
static inline _Bool
LIN_isSCIBreakDetected(uint32_t base)
{
//
// Check the arguments.
//
;
;
//
// Read Break condition flag and return status
//
return(((*((volatile uint16_t *)(base + 0x1CU))) & 0x1U) ==
0x1U);
}
//*****************************************************************************
//
// Prototypes for the LIN and SCI mode APIs.
//
//*****************************************************************************
//*****************************************************************************
//
//! Enables the LIN module.
//!
//! \param base is the LIN module base address
//!
//! In LIN and SCI mode, this function sets the RESET bit of the SCIGCR0
//! register. Registers in this module are not writable until this has been
//! done. Additionally, the transmit and receive pin control functionality is
//! enabled.
//!
//! \return None.
//
//*****************************************************************************
static inline void
LIN_enableModule(uint32_t base)
{
//
// Check the arguments.
//
;
__eallow();
//
// Set reset bit.
//
(*((volatile uint16_t *)(base + 0x0U))) |= 0x1U;
//
// Enable TX and RX pin control functionality
//
(*((volatile uint16_t *)(base + 0x3CU))) |= (0x2U | 0x4U);
__edis();
}
//*****************************************************************************
//
//! Disable the LIN module.
//!
//! \param base is the LIN module base address
//!
//! In LIN and SCI mode, this function clears the RESET bit of the SCIGCR0
//! register. Registers in this module are not writable when this bit is
//! cleared. Additionally, the transmit and receive pin control functionality
//! is disabled.
//!
//! \return None.
//
//*****************************************************************************
static inline void
LIN_disableModule(uint32_t base)
{
//
// Check the arguments.
//
;
__eallow();
//
// Disable TX and RX pin control functionality
//
(*((volatile uint16_t *)(base + 0x3CU))) &= ~(0x2U | 0x4U);
//
// Clear reset bit.
//
(*((volatile uint16_t *)(base + 0x0U))) &= ~0x1U;
__edis();
}
//*****************************************************************************
//
//! Set Baud Rate Prescaler
//!
//! \param base is the LIN module base address
//! \param prescaler is the 24-bit integer prescaler
//! \param divider is the 4-bit fractional divider
//!
//! In LIN and SCI mode, this function is used to set the baudrate based on
//! the \e prescaler and \e divider values.
//!
//! P = Prescaler \n
//! M = Fractional Divider \n
//! Bitrate = (SYSCLOCK) / ((P + 1 + M/16) * 16) \n
//!
//! \return None.
//
//*****************************************************************************
static inline void
LIN_setBaudRatePrescaler(uint32_t base, uint32_t prescaler,
uint32_t divider)
{
//
// Check the arguments.
//
;
;
;
//
// Set baud rate prescaler and divider
//
__byte_peripheral_32((uint32_t *)(base + 0x2CU)) = (prescaler | (divider << 24U));
}
//*****************************************************************************
//
//! Enable Transmit Data Transfer.
//!
//! \param base is the LIN module base address
//!
//! In LIN and SCI mode, this function enables the transfer of data from
//! SCITD or TDy to the transmit shift register.
//!
//! \return None.
//
//*****************************************************************************
static inline void
LIN_enableDataTransmitter(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Enable transmit bit
//
__byte_peripheral_32((uint32_t *)(base + 0x4U)) |= 0x2000000U;
}
//*****************************************************************************
//
//! Disable Transmit Data Transfer.
//!
//! \param base is the LIN module base address
//!
//! In LIN and SCI mode, this function disables the transfer of data from
//! SCITD or TDy to the transmit shift register.
//!
//! \return None.
//
//*****************************************************************************
static inline void
LIN_disableDataTransmitter(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Disable transmit bit
//
__byte_peripheral_32((uint32_t *)(base + 0x4U)) &= ~(0x2000000U);
}
//*****************************************************************************
//
//! Enable Receive Data Transfer.
//!
//! \param base is the LIN module base address
//!
//! In LIN and SCI mode, this function enables the receiver to transfer data
//! from the shift buffer register to the receive buffer or multi-buffer.
//!
//! \return None.
//
//*****************************************************************************
static inline void
LIN_enableDataReceiver(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Enable receive bit
//
__byte_peripheral_32((uint32_t *)(base + 0x4U)) |= 0x1000000U;
}
//*****************************************************************************
//
//! Disable Receive Data Transfer.
//!
//! \param base is the LIN module base address
//!
//! In LIN and SCI mode, this function disables the receiver to transfer data
//! from the shift buffer register to the receive buffer or multi-buffer.
//!
//! \return None.
//
//*****************************************************************************
static inline void
LIN_disableDataReceiver(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Disable receive bit
//
__byte_peripheral_32((uint32_t *)(base + 0x4U)) &= ~(0x1000000U);
}
//*****************************************************************************
//
//! Perform software reset.
//!
//! \param base is the LIN module base address
//!
//! In LIN and SCI mode, this function will reset the LIN state machine and
//! clear all pending flags. It is required to call this function after a
//! wakeup signal has been sent.
//!
//! To enter the reset state separately, use LIN_enterSoftwareReset(). To come
//! out of reset, use LIN_exitSoftwareReset().
//!
//! \return None.
//
//*****************************************************************************
static inline void
LIN_performSoftwareReset(uint32_t base)
{
//
// Check the arguments.
//
;
(*((volatile uint16_t *)(base + 0x4U))) &= ~(0x80U);
(*((volatile uint16_t *)(base + 0x4U))) |= 0x80U;
}
//*****************************************************************************
//
//! Put LIN into its reset state.
//!
//! \param base is the LIN module base address
//!
//! In LIN and SCI mode, this function will reset the LIN state machine and
//! clear all pending flags. It is required to call this function after a
//! wakeup signal has been sent. When in this state, changes to the
//! configuration of this module may be made.
//!
//! To take LIN out of the reset state and back into the ready state, use
//! LIN_exitSoftwareReset().
//!
//! \return None.
//
//*****************************************************************************
static inline void
LIN_enterSoftwareReset(uint32_t base)
{
//
// Check the arguments.
//
;
(*((volatile uint16_t *)(base + 0x4U))) &= ~(0x80U);
}
//*****************************************************************************
//
//! Put LIN into its ready state.
//!
//! \param base is the LIN module base address
//!
//! In LIN and SCI mode, this function will put LIN into its ready state.
//! Transmission and reception can be done in this state. While in the ready
//! state, configuration of the module should not be changed.
//!
//! To put the module into its reset state, use LIN_enterSoftwareReset().
//!
//! \return None.
//
//*****************************************************************************
static inline void
LIN_exitSoftwareReset(uint32_t base)
{
//
// Check the arguments.
//
;
(*((volatile uint16_t *)(base + 0x4U))) |= 0x80U;
}
//*****************************************************************************
//
//! Check if Bus is Busy
//!
//! \param base is the LIN module base address
//!
//! In LIN and SCI mode, this function checks if the receiver bus is busy
//! receiving a frame.
//!
//! \return Returns \b true if the bus is busy, else returns \b false.
//
//*****************************************************************************
static inline _Bool
LIN_isBusBusy(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Read Bus busy flag and return status
//
return(((*((volatile uint16_t *)(base + 0x1CU))) & 0x8U) ==
0x8U);
}
//*****************************************************************************
//
//! Check if the Transmit Buffer is Empty
//!
//! \param base is the LIN module base address
//!
//! In LIN and SCI mode, this function checks if the transmit buffer is empty
//! or not.
//!
//! \return Returns \b true if the Tx buffer is empty, else returns \b false.
//
//*****************************************************************************
static inline _Bool
LIN_isTxBufferEmpty(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Read Tx Empty Flag and return status
//
return(((*((volatile uint16_t *)(base + 0x1CU))) & 0x800U) ==
0x800U);
}
//*****************************************************************************
//
//! Enable External Loopback mode for self test
//!
//! \param base is the LIN module base address
//! \param loopbackType is the loopback type (analog or digital)
//! \param path sets the transmit or receive pin to be included in the
//! communication path (Analog loopback mode only)
//!
//! In LIN and SCI mode, this function enables the external Loopback mode for
//! self test. The \e loopbackType parameter can be one of the following
//! values:
//! - \b LIN_LOOPBACK_DIGITAL - Digital Loopback
//! - \b LIN_LOOPBACK_ANALOG - Analog Loopback
//!
//! The \e path parameter is only applicable in analog loopback mode and can
//! be one of the following values:
//! - \b LIN_ANALOG_LOOP_NONE - Default option for digital loopback mode
//! - \b LIN_ANALOG_LOOP_TX - Enables analog loopback through the Tx pin
//! - \b LIN_ANALOG_LOOP_RX - Enables analog loopback through the Rx pin
//!
//! \return None.
//
//*****************************************************************************
static inline void
LIN_enableExtLoopback(uint32_t base, LIN_LoopbackType loopbackType,
LIN_AnalogLoopback path)
{
//
// Check the arguments.
//
;
__eallow();
//
// Clear the IO DFT Enable Key
//
(*((volatile uint16_t *)(base + 0x90U))) &= ~(0xF00U);
//
// Enable Loopback either in Analog or Digital Mode
//
(*((volatile uint16_t *)(base + 0x90U))) |= (((0xAU) <<
8U) |
(uint16_t)loopbackType |
(uint16_t)path);
__edis();
}
//*****************************************************************************
//
//! Disable External Loopback mode for self test
//!
//! \param base is the LIN module base address
//!
//! In LIN and SCI mode, this function disables the external Loopback mode.
//!
//! \note This function also resets the analog loopback communication path to
//! the default transmit pin.
//!
//! \return None.
//
//*****************************************************************************
static inline void
LIN_disableExtLoopback(uint32_t base)
{
//
// Check the arguments.
//
;
//
//Disable Loopback Mode
//
__eallow();
(*((volatile uint16_t *)(base + 0x90U))) &= ~(0xF00U |
0x2U |
0x1U);
__edis();
}
//*****************************************************************************
//
//! Enable Internal Loopback mode for self test
//!
//! \param base is the LIN module base address
//!
//! In LIN and SCI mode, this function enables the internal Loopback mode for
//! self test.
//!
//! \return None.
//
//*****************************************************************************
static inline void
LIN_enableIntLoopback(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Enable the internal loopback
//
__byte_peripheral_32((uint32_t *)(base + 0x4U)) |= 0x10000U;
}
//*****************************************************************************
//
//! Disable Internal Loopback mode for self test
//!
//! \param base is the LIN module base address
//!
//! In LIN and SCI mode, this function disables the internal Loopback mode for
//! self test.
//!
//! \return None.
//
//*****************************************************************************
static inline void
LIN_disableIntLoopback(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Disable the internal loopback
//
__byte_peripheral_32((uint32_t *)(base + 0x4U)) &= ~(0x10000U);
}
//*****************************************************************************
//
//! Get Interrupt Flags Status
//!
//! \param base is the LIN module base address
//!
//! In LIN and SCI mode, this function returns the interrupt status register.
//!
//! The following flags can be used to mask the value returned:
//! - \b LIN_FLAG_BREAK - Break Detect Flag (SCI mode only)
//! - \b LIN_FLAG_WAKEUP - Wake-up Flag
//! - \b LIN_FLAG_IDLE - Receiver in Idle State (SCI mode only)
//! - \b LIN_FLAG_BUSY - Busy Flag
//! - \b LIN_FLAG_TO - Bus Idle Timeout Flag (LIN mode only)
//! - \b LIN_FLAG_TOAWUS - Timeout after Wakeup Signal (LIN mode only)
//! - \b LIN_FLAG_TOA3WUS - Timeout after 3 Wakeup Signals (LIN mode only)
//! - \b LIN_FLAG_TXRDY - Transmitter Buffer Ready Flag
//! - \b LIN_FLAG_RXRDY - Receiver Buffer Ready Flag
//! - \b LIN_FLAG_TXWAKE - Transmitter Wakeup Method Select (SCI mode only)
//! - \b LIN_FLAG_TXEMPTY - Transmitter Empty Flag
//! - \b LIN_FLAG_RXWAKE - Receiver Wakeup Detect Flag
//! - \b LIN_FLAG_TXID - Identifier on Transmit Flag (LIN mode only)
//! - \b LIN_FLAG_RXID - Identifier on Receive Flag (LIN mode only)
//! - \b LIN_FLAG_PE - Parity Error Flag
//! - \b LIN_FLAG_OE - Overrun Error Flag
//! - \b LIN_FLAG_FE - Framing Error Flag
//! - \b LIN_FLAG_NRE - No-Response Error Flag (LIN mode only)
//! - \b LIN_FLAG_ISFE - Inconsistent Synch Field Error Flag (LIN mode only)
//! - \b LIN_FLAG_CE - Checksum Error Flag (LIN mode only)
//! - \b LIN_FLAG_PBE - Physical Bus Error Flag (LIN mode only)
//! - \b LIN_FLAG_BE - Bit Error Flag (LIN mode only)
//!
//! \return Returns the status flag register.
//
//*****************************************************************************
static inline uint32_t
LIN_getInterruptStatus(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Read and return the flag register
//
return(__byte_peripheral_32((uint32_t *)(base + 0x1CU)));
}
//*****************************************************************************
//
//! Get the Interrupt Level
//!
//! \param base is the LIN module base address
//!
//! In LIN and SCI mode, this function gets the interrupt level status for
//! all interrupt sources.
//!
//! \return Returns the value of the interrupt level register.
//
//*****************************************************************************
static inline uint32_t
LIN_getInterruptLevel(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Gets the interrupt levels for all sources
//
return(__byte_peripheral_32((uint32_t *)(base + 0x14U)));
}
//*****************************************************************************
//
//! Gets the Interrupt Vector Offset for Line 0
//!
//! \param base is the LIN module base address
//!
//! In LIN and SCI mode, this function gets the offset for interrupt line 0.
//! A read to the specified line register updates its value to the next highest
//! priority pending interrupt in the flag register and clears the flag
//! corresponding to the offset that was read.
//!
//! \note The flags for the receive and the transmit interrupts cannot be
//! cleared by reading the corresponding offset vector in this function.
//!
//! The following are values that can be returned:
//! - \b LIN_VECT_NONE - No Interrupt
//! - \b LIN_VECT_WAKEUP - Wakeup
//! - \b LIN_VECT_ISFE - Inconsistent-sync-field Error
//! - \b LIN_VECT_PE - Parity Error
//! - \b LIN_VECT_ID - ID Interrupt
//! - \b LIN_VECT_PBE - Physical Bus Error
//! - \b LIN_VECT_FE - Frame Error
//! - \b LIN_VECT_BREAK - Break detect
//! - \b LIN_VECT_CE - Checksum Error
//! - \b LIN_VECT_OE - Overrun Error
//! - \b LIN_VECT_BE - Bit Error
//! - \b LIN_VECT_RX - Receive Interrupt
//! - \b LIN_VECT_TX - Transmit Interrupt
//! - \b LIN_VECT_NRE - No-response Error
//! - \b LIN_VECT_TOAWUS - Timeout after wakeup signal
//! - \b LIN_VECT_TOA3WUS - Timeout after 3 wakeup signals
//! - \b LIN_VECT_TO - Timeout (Bus Idle)
//!
//! \return Returns the interrupt vector offset for interrupt line 0.
//
//*****************************************************************************
static inline uint16_t
LIN_getInterruptLine0Offset(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Get interrupt vector line offset
//
return((*((volatile uint16_t *)(base + 0x20U))) & 0x1FU);
}
//*****************************************************************************
//
//! Gets the Interrupt Vector Offset for Line 1
//!
//! \param base is the LIN module base address
//!
//! In LIN and SCI mode, this function gets the offset for interrupt line 1.
//! A read to the specified line register updates its value to the next highest
//! priority pending interrupt in the flag register and clears the flag
//! corresponding to the offset that was read.
//!
//! \note The flags for the receive and the transmit interrupts cannot be
//! cleared by reading the corresponding offset vector in this function.
//!
//! The following are values that can be returned:
//! - \b LIN_VECT_NONE - No Interrupt
//! - \b LIN_VECT_WAKEUP - Wakeup
//! - \b LIN_VECT_ISFE - Inconsistent-sync-field Error
//! - \b LIN_VECT_PE - Parity Error
//! - \b LIN_VECT_ID - ID Interrupt
//! - \b LIN_VECT_PBE - Physical Bus Error
//! - \b LIN_VECT_FE - Frame Error
//! - \b LIN_VECT_BREAK - Break detect
//! - \b LIN_VECT_CE - Checksum Error
//! - \b LIN_VECT_OE - Overrun Error
//! - \b LIN_VECT_BE - Bit Error
//! - \b LIN_VECT_RX - Receive Interrupt
//! - \b LIN_VECT_TX - Transmit Interrupt
//! - \b LIN_VECT_NRE - No-response Error
//! - \b LIN_VECT_TOAWUS - Timeout after wakeup signal
//! - \b LIN_VECT_TOA3WUS - Timeout after 3 wakeup signals
//! - \b LIN_VECT_TO - Timeout (Bus Idle)
//!
//! \return Returns the interrupt vector offset for interrupt line 1.
//
//*****************************************************************************
static inline uint16_t
LIN_getInterruptLine1Offset(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Get interrupt vector line offset
//
return((*((volatile uint16_t *)(base + 0x24U))) & 0x1FU);
}
//*****************************************************************************
//
//! Enable Multi-buffer Mode
//!
//! \param base is the LIN module base address
//!
//! In LIN and SCI mode, this function enables the multi-buffer mode.
//!
//! \return None.
//
//*****************************************************************************
static inline void
LIN_enableMultibufferMode(uint32_t base)
{
//
// Check the arguments.
//
;
(*((volatile uint16_t *)(base + 0x4U))) |= 0x400U;
}
//*****************************************************************************
//
//! Disable Multi-buffer Mode
//!
//! \param base is the LIN module base address
//!
//! In LIN and SCI mode, this function disables the multi-buffer mode.
//!
//! \return None.
//
//*****************************************************************************
static inline void
LIN_disableMultibufferMode(uint32_t base)
{
//
// Check the arguments.
//
;
(*((volatile uint16_t *)(base + 0x4U))) &= ~0x400U;
}
//*****************************************************************************
//
//! Set Transmit Pin Delay
//!
//! \param base is the LIN module base address
//! \param delay is number of clock delays for the Tx pin (0 to 7)
//!
//! In LIN and SCI mode, this function sets the delay by which the value on
//! the transmit pin is delayed so that the value on the receive pin is
//! asynchronous.
//!
//! \note This is not applicable to the Start bit.
//!
//! \return None.
//
//*****************************************************************************
static inline void
LIN_setTransmitDelay(uint32_t base, uint16_t delay)
{
//
// Check the arguments.
//
;
;
__eallow();
//
// Clear the IO DFT Enable Key
//
(*((volatile uint16_t *)(base + 0x90U))) &= ~(0xF00U);
//
// Enable write access
//
(*((volatile uint16_t *)(base + 0x90U))) |= ((0xAU) <<
8U);
//
// Clear delay value
//
__byte_peripheral_32((uint32_t *)(base + 0x90U)) &= ~(0x70000U);
//
// Set the delay value
//
__byte_peripheral_32((uint32_t *)(base + 0x90U)) |= ((uint32_t)delay <<
16U);
//
// Clear the IO DFT Enable Key
//
(*((volatile uint16_t *)(base + 0x90U))) &= ~(0xF00U);
__edis();
}
//*****************************************************************************
//
//! Set Pin Sample Mask
//!
//! \param base is the LIN module base address
//! \param mask is the pin sample mask to be set
//!
//! In LIN and SCI mode, this function sets sample number at which the transmit
//! pin value that is being transmitted will be inverted to verify the
//! receive pin samples correctly with the majority detection circuitry.
//! The \e mask parameter can be one of the following values:
//! - \b LIN_PINMASK_NONE - No mask
//! - \b LIN_PINMASK_CENTER - Invert Tx Pin value at T-bit center
//! - \b LIN_PINMASK_CENTER_SCLK - Invert Tx Pin value at T-bit center + SCLK
//! - \b LIN_PINMASK_CENTER_2SCLK - Invert Tx Pin value at T-bit center +
//! 2 SCLK
//!
//! \return None.
//
//*****************************************************************************
static inline void
LIN_setPinSampleMask(uint32_t base, LIN_PinSampleMask mask)
{
//
// Check the arguments.
//
;
__eallow();
//
// Clear the IO DFT Enable Key
//
(*((volatile uint16_t *)(base + 0x90U))) &= ~(0xF00U);
//
// Enable write access
//
(*((volatile uint16_t *)(base + 0x90U))) |= ((0xAU) <<
8U);
//
// Clear pin mask
//
__byte_peripheral_32((uint32_t *)(base + 0x90U)) &= ~(0x180000U);
//
// Set new pin mask value
//
__byte_peripheral_32((uint32_t *)(base + 0x90U)) |= ((uint32_t)mask <<
19U);
//
// Clear the IO DFT Enable Key
//
(*((volatile uint16_t *)(base + 0x90U))) &= ~(0xF00U);
__edis();
}
//*****************************************************************************
//
//! Set the Debug Suspended Mode
//!
//! \param base is the LIN module base address
//! \param mode is the debug mode
//!
//! In LIN and SCI mode, this function sets how the module operates when the
//! program is suspended and being debugged with an emulator. The \e mode
//! parameter can be one of the following values:
//! - \b LIN_DEBUG_FROZEN - The module state machine is frozen; transmissions
//! and LIN counters are halted until debug mode is exited.
//! - \b LIN_DEBUG_COMPLETE - The module continues to operate until the
//! current transmit and receive functions are complete.
//!
//! \return None.
//
//*****************************************************************************
static inline void
LIN_setDebugSuspendMode(uint32_t base, LIN_DebugMode mode)
{
//
// Check the arguments.
//
;
//
// Set the debug suspend mode type
//
if(mode == LIN_DEBUG_FROZEN)
{
__byte_peripheral_32((uint32_t *)(base + 0x4U)) &= ~(0x20000U);
}
else
{
__byte_peripheral_32((uint32_t *)(base + 0x4U)) |= 0x20000U;
}
}
//*****************************************************************************
//
//! Enables a LIN global interrupt.
//!
//! \param base is the LIN module base address
//! \param line is specified interrupt vector line
//!
//! In LIN and SCI mode, this function globally enables an interrupt
//! corresponding to a specified interrupt line. The \e line parameter can be
//! one of the following enumerated values:
//!
//! - \b LIN_INTERRUPT_LINE0 - Interrupt Vector Line 0
//! - \b LIN_INTERRUPT_LINE1 - Interrupt Vector Line 1
//!
//! \return None.
//
//*****************************************************************************
static inline void
LIN_enableGlobalInterrupt(uint32_t base, LIN_InterruptLine line)
{
//
// Check the arguments.
//
;
(*((volatile uint16_t *)(base + 0xE0U))) |= 0x1U <<
(uint16_t)line;
}
//*****************************************************************************
//
//! Disables a LIN global interrupt.
//!
//! \param base is the LIN module base address
//! \param line is specified interrupt vector line
//!
//! In LIN and SCI mode, this function globally disables an interrupt
//! corresponding to a specified interrupt line. The \e line parameter can be
//! one of the following enumerated values:
//!
//! - \b LIN_INTERRUPT_LINE0 - Interrupt Vector Line 0
//! - \b LIN_INTERRUPT_LINE1 - Interrupt Vector Line 1
//!
//! \return None.
//
//*****************************************************************************
static inline void
LIN_disableGlobalInterrupt(uint32_t base, LIN_InterruptLine line)
{
//
// Check the arguments.
//
;
(*((volatile uint16_t *)(base + 0xE0U))) &= ~(0x1U <<
(uint16_t)line);
}
//*****************************************************************************
//
//! Clears a LIN global interrupt flag.
//!
//! \param base is the LIN module base address
//! \param line is specified interrupt vector line
//!
//! In LIN and SCI mode, this function clears the global interrupt flag that
//! corresponds to a specified interrupt line. The \e line parameter can be
//! one of the following enumerated values:
//!
//! - \b LIN_INTERRUPT_LINE0 - Interrupt Vector Line 0
//! - \b LIN_INTERRUPT_LINE1 - Interrupt Vector Line 1
//!
//! \return None.
//
//*****************************************************************************
static inline void
LIN_clearGlobalInterruptStatus(uint32_t base, LIN_InterruptLine line)
{
//
// Check the arguments.
//
;
(*((volatile uint16_t *)(base + 0xE8U))) = (uint16_t)0x1U <<
(uint16_t)line;
}
//*****************************************************************************
//
//! Returns a LIN global interrupt flag status.
//!
//! \param base is the LIN module base address
//! \param line is specified interrupt vector line
//!
//! In LIN and SCI mode, this function returns the status of a global interrupt
//! flag that corresponds to a specified interrupt line. The \e line parameter
//! can be one of the following enumerated values:
//!
//! - \b LIN_INTERRUPT_LINE0 - Interrupt Vector Line 0
//! - \b LIN_INTERRUPT_LINE1 - Interrupt Vector Line 1
//!
//! \return Returns \b true if the interrupt flag is set. Return \b false if
//! not.
//
//*****************************************************************************
static inline _Bool
LIN_getGlobalInterruptStatus(uint32_t base, LIN_InterruptLine line)
{
//
// Check the arguments.
//
;
//
// Read the flag register and return true if the specified flag is set.
//
return(((*((volatile uint16_t *)(base + 0xE4U))) &
(0x1U << (uint16_t)line)) ==
(0x1U << (uint16_t)line));
}
//*****************************************************************************
//
//! Get the Status of LIN TX/RX Pin status.
//!
//! \param base is the LIN module base address
//! \param pin is the type of pin that is being read.
//!
//! In LIN and SCI mode, this function indicates the current status of LINTX
//! and LINRX pins. the \e pin parameter can be either LIN_PINTYPE_TX or
//! LIN_PINTYPE_RX.
//!
//! \return Returns \b true if the pin is high else \b false if low.
//
//*****************************************************************************
static inline _Bool
LIN_getPinStatus(uint32_t base, LIN_PinType pin)
{
//
// Check the arguments.
//
;
//
// Read RX/Tx pin value and return status
//
return(((*((volatile uint16_t *)(base + 0x44U))) & (uint16_t)pin) == (uint16_t)pin);
}
//*****************************************************************************
//
//! Initializes the LIN Driver
//!
//! \param base is the LIN module base address
//!
//! This function initializes the LIN module.
//!
//! \return None.
//
//*****************************************************************************
extern void
LIN_initModule(uint32_t base);
//*****************************************************************************
//
//! Send Data
//!
//! \param base is the LIN module base address
//! \param data is the pointer to data to send
//!
//! In LIN mode only, this function sends a block of data pointed to by 'data'.
//! The number of data to transmit must be set with LIN_setFrameLength()
//! before.
//!
//! \return None.
//
//*****************************************************************************
extern void
LIN_sendData(uint32_t base, uint16_t *data);
//*****************************************************************************
//
//! Read received data
//!
//! \param base is the LIN module base address
//! \param data is the pointer to the data buffer
//!
//! In LIN mode only, this function reads a block of bytes and place it into
//! the data buffer pointed to by 'data'.
//!
//! \return None.
//
//*****************************************************************************
extern void
LIN_getData(uint32_t base, uint16_t * const data);
//*****************************************************************************
//
// Close the Doxygen group.
//! @}
//
//*****************************************************************************
//*****************************************************************************
//
// Mark the end of the C bindings section for C++ compilers.
//
//*****************************************************************************
/*
* Copyright (c) Texas Instruments Incorporated 2016
*
* 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 Texas Instruments Incorporated 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
* OWNER 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.
*
*/
/**
* \file mcan.h
*
* \brief This file contains the prototypes of the APIs present in the
* device abstraction layer file of MCAN.
* This also contains some related macros.
*/
/* ========================================================================== */
/* Include Files */
/* ========================================================================== */
/*
* hw_mcanss.h
*
* Register-level header file for MCANSS2P0
*
* Copyright (C) 2016 Texas Instruments Incorporated - http://www.ti.com/
*
*
* 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 Texas Instruments Incorporated 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
* OWNER 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.
*
*/
/****************************************************************************************************
* Register Definitions
****************************************************************************************************/
// Sub-module base addresses
/****************************************************************************************************
* Field Definition Macros
****************************************************************************************************/
/* User defined ranges */
/**
* \file hw_types.h
*
* \brief This file contains the in-line functions required to read/write
* values from/to the hardware registers. This file also contains field
* manipulation macros to get and set field values.
*
* \copyright Copyright (C) 2013 Texas Instruments Incorporated - www.ti.com
*/
/**
* 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 Texas Instruments Incorporated 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
* OWNER 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.
*
*/
/* ========================================================================== */
/* Include Files */
/* ========================================================================== */
/* ========================================================================== */
/* Macros & Typedefs */
/* ========================================================================== */
/**
* \brief This macro reads a 32-bit value from a hardware register
* and returns the value.
*
* \param addr Address of the memory mapped hardware register.
*
* \return Unsigned 32-bit value read from a register.
*/
/**
* \brief This macro writes a 32-bit value to a hardware register.
*
* \param addr Address of the memory mapped hardware register.
* \param value unsigned 32-bit value which has to be written to the
* register.
*/
/**
* \brief This macro reads a 16-bit value from a hardware register
* and returns the value.
*
* \param addr Address of the memory mapped hardware register.
*
* \return Unsigned 16-bit value read from a register.
*/
/**
* \brief This macro writes a 16-bit value to a hardware register.
*
* \param addr Address of the memory mapped hardware register.
* \param value unsigned 16-bit value which has to be written to the
* register.
*/
/**
* \brief Macro to extract a field value. This macro extracts the field value
* from a 32-bit variable (which contains the register value).
* This macro does not read from actual register address, and only
* extracts the field from a variable.
*
* \param regVal 32-bit variable containing the register value.
* \param REG_FIELD Peripheral register bit field name, whose value has to
* be extracted.
*/
/*TI_INSPECTED 76 S : MISRAC_2012_R.20.11
* "The places in which order of evaluation has no side effects could be a
waiver. This used in SHIFT and MASK to extract specified field value " */
/*TI_INSPECTED 125 S : MISRAC_2012_R.20.12
* "The places in which order of evaluation has no side effects could be a
waiver. ## operator here used in SHIFT and MASK to extract specified field
value " */
/**
* \brief Macro to write a specific field value. This macro first clears the
* specified field value and then performs "OR" of the field value which
* is shifted and masked. This will set the field value at its
* desired position.
*
* \param regVal 32-bit variable containing the register value.
* \param REG_FIELD Peripheral register bit field name, to which specified
* value has to be set.
* \param fieldVal Value of the field which has to be set.
*/
/*TI_INSPECTED 76 S : MISRAC_2012_R.20.11
* "The places in which order of evaluation has no side effects could be a
waiver. This used in SHIFT and MASK to extract specified field value " */
/*TI_INSPECTED 125 S : MISRAC_2012_R.20.12
* "The places in which order of evaluation has no side effects could be a
waiver. ## operator here used in SHIFT and MASK to extract specified field
value " */
/**
* \brief Macro to write a specific field value. This macro first clears the
* specified field value and then performs "OR" of the field value which
* is shifted and masked. This will set the field value at its
* desired position.
*
* \param regVal 16-bit variable containing the register value.
* \param REG_FIELD Peripheral register bit field name, to which specified
* value has to be set.
* \param fieldVal Value of the field which has to be set.
*/
/*TI_INSPECTED 76 S : MISRAC_2012_R.20.11
* "The places in which order of evaluation has no side effects could be a
waiver. This used in SHIFT and MASK to extract specified field value " */
/*TI_INSPECTED 125 S : MISRAC_2012_R.20.12
* "The places in which order of evaluation has no side effects could be a
waiver. ## operator here used in SHIFT and MASK to extract specified field
value " */
/**
* \brief This macro calls read-modify-write API for 32 bit register. It also
* frames the mask and shift from register field macro.
*
* \param regAddr Register Address.
* \param REG_FIELD Peripheral register bit field name, to which specified
* value has to be set.
* \param fieldVal Value of the field which has to be set.
*/
/*TI_INSPECTED 76 S : MISRAC_2012_R.20.11
* "The places in which order of evaluation has no side effects could be a
waiver. This used in SHIFT and MASK to extract specified field value " */
/*TI_INSPECTED 125 S : MISRAC_2012_R.20.12
* "The places in which order of evaluation has no side effects could be a
waiver. ## operator here used in SHIFT and MASK to extract specified field
value " */
/**
* \brief This macro calls read-modify-write API for 16 bit register. It also
* frames the mask and shift from register field macro.
*
* \param regAddr Register Address.
* \param REG_FIELD Peripheral register bit field name, to which specified
* value has to be set.
* \param fieldVal Value of the field which has to be set.
*/
/*TI_INSPECTED 76 S : MISRAC_2012_R.20.11
* "The places in which order of evaluation has no side effects could be a
waiver. This used in SHIFT and MASK to extract specified field value " */
/*TI_INSPECTED 125 S : MISRAC_2012_R.20.12
* "The places in which order of evaluation has no side effects could be a
waiver. ## operator here used in SHIFT and MASK to extract specified field
value " */
/**
* \brief This macro calls read field API for 32 bit register. It also
* frames the mask and shift from register field macro.
*
* \param regAddr Register Address.
* \param REG_FIELD Peripheral register bit field name, from which
* specified bit-field value has to be read.
* \return Value of the bit-field
*/
/*TI_INSPECTED 76 S : MISRAC_2012_R.20.11
* "The places in which order of evaluation has no side effects could be a
waiver. This used in SHIFT and MASK to extract specified field value " */
/*TI_INSPECTED 125 S : MISRAC_2012_R.20.12
* "The places in which order of evaluation has no side effects could be a
waiver. ## operator here used in SHIFT and MASK to extract specified field
value " */
/**
* \brief This macro calls read field API for 16 bit register. It also
* frames the mask and shift from register field macro.
*
* \param regAddr Register Address.
* \param REG_FIELD Peripheral register bit field name, from which
* specified bit-field value has to be read.
* \return Value of the bit-field
*/
/*TI_INSPECTED 76 S : MISRAC_2012_R.20.11
* "The places in which order of evaluation has no side effects could be a
waiver. This used in SHIFT and MASK to extract specified field value " */
/*TI_INSPECTED 125 S : MISRAC_2012_R.20.12
* "The places in which order of evaluation has no side effects could be a
waiver. ## operator here used in SHIFT and MASK to extract specified field
value " */
/* ========================================================================== */
/* Structures and Enums */
/* ========================================================================== */
/* None */
/* ========================================================================== */
/* Global Variables Declarations */
/* ========================================================================== */
/* None */
/* ========================================================================== */
/* Function Declarations */
/* ========================================================================== */
/**
* \brief This function reads a 32-bit value from a hardware register
* and returns the value.
*
* \param addr Address of the memory mapped hardware register.
*
* \return Unsigned 32-bit value read from a register.
*/
static inline uint32_t HW_RD_REG32_RAW(uint32_t addr);
/**
* \brief This function writes a 32-bit value to a hardware register.
*
* \param addr Address of the memory mapped hardware register.
* \param value unsigned 32-bit value which has to be written to the
* register.
*/
static inline void HW_WR_REG32_RAW(uint32_t addr, uint32_t value);
/**
* \brief This function reads a 16-bit value from a hardware register
* and returns the value.
*
* \param addr Address of the memory mapped hardware register.
*
* \return Unsigned 16-bit value read from a register.
*/
static inline uint16_t HW_RD_REG16_RAW(uint32_t addr);
/**
* \brief This function writes a 16-bit value to a hardware register.
*
* \param addr Address of the memory mapped hardware register.
* \param value unsigned 16-bit value which has to be written to the
* register.
*/
static inline void HW_WR_REG16_RAW(uint32_t addr, uint16_t value);
/**
* \brief This function reads a 32 bit register, modifies specific set of
* bits and writes back to the register.
*
* \param addr Address of the memory mapped hardware register.
* \param mask Mask for the bit field.
* \param shift Bit field shift from LSB.
* \param value Value to be written to bit-field.
*/
static inline void HW_WR_FIELD32_RAW(uint32_t addr,
uint32_t mask,
uint32_t shift,
uint32_t value);
/**
* \brief This function reads a 16 bit register, modifies specific set of
* bits and writes back to the register.
*
* \param addr Address of the memory mapped hardware register.
* \param mask Mask for the bit field.
* \param shift Bit field shift from LSB.
* \param value Value to be written to bit-field.
*/
static inline void HW_WR_FIELD16_RAW(uint32_t addr,
uint16_t mask,
uint32_t shift,
uint16_t value);
/**
* \brief This function reads a 32 bit register, masks specific set of bits
* and the left shifted value.
*
* \param addr Address of the memory mapped hardware register.
* \param mask Mask for the bit field.
* \param shift Bit field shift from LSB.
*
* \return Bit-field value (absolute value - shifted to LSB position)
*/
static inline uint32_t HW_RD_FIELD32_RAW(uint32_t addr,
uint32_t mask,
uint32_t shift);
/**
* \brief This function reads a 16 bit register, masks specific set of bits
* and the left shifted value.
*
* \param addr Address of the memory mapped hardware register.
* \param mask Mask for the bit field.
* \param shift Bit field shift from LSB.
*
* \return Bit-field value (absolute value - shifted to LSB position)
*/
static inline uint16_t HW_RD_FIELD16_RAW(uint32_t addr,
uint16_t mask,
uint32_t shift);
/* ========================================================================== */
/* Static Function Definitions */
/* ========================================================================== */
/*TI_INSPECTED 35 S : MISRAC_2012_R.2.1
* "Reason - This function is called using HW_RD_REG32 mcaro " */
/*TI_INSPECTED 101 S : MISRAC_2012_R.10.3
* "Reason - Tool Issue: Not able to understand Inline Function return type " */
/*TI_INSPECTED 102 S : MISRAC_2012_R.8.4
* "Reason - Tool Issue: Not able to understand Inline Function return type " */
static inline uint32_t HW_RD_REG32_RAW(uint32_t addr)
{
/*TI_INSPECTED 440 S : MISRAC_2012_R.11.4
* "Reason - Pointer typecast required here since addr variable holds
* required register value" */
uint32_t regVal = *(volatile uint32_t *) addr;
return (regVal);
}
/*TI_INSPECTED 35 S : MISRAC_2012_R.2.1
* "Reason - This function is called using HW_WR_REG32 mcaro " */
/*TI_INSPECTED 131 S : MISRAC_2012_R.5.3
* "Tool Issue - argument 'value' used here is in same scope " */
/*TI_INSPECTED 14 D 1: MISRAC_2012_R.5.8
* "Tool Issue - Modifying the contents stored at address not the addr itself */
static inline void HW_WR_REG32_RAW(uint32_t addr, uint32_t value)
{
/*TI_INSPECTED 18 D : MISRAC_2012_R.5.3
* "Tool Issue - argument 'value' used here is in same scope " */
*(volatile uint32_t *) addr = value;
return;
}
/*TI_INSPECTED 35 S : MISRAC_2012_R.2.1
* "Reason - This function is called using HW_RD_REG16 mcaro " */
static inline uint16_t HW_RD_REG16_RAW(uint32_t addr)
{
/*TI_INSPECTED 440 S : MISRAC_2012_R.11.4
* "Reason - Pointer typecast required here since addr variable holds
* required register value" */
uint16_t regVal = *(volatile uint16_t *) addr;
return (regVal);
}
/*TI_INSPECTED 35 S : MISRAC_2012_R.2.1
* "Reason - This function is called using HW_WR_REG16 mcaro " */
/*TI_INSPECTED 131 S : MISRAC_2012_R.5.3
* "Tool Issue - argument 'value' used here is in same scope " */
/*TI_INSPECTED 14 D 1: MISRAC_2012_R.5.8
* "Tool Issue - Modifying the contents stored at address not the addr itself */
static inline void HW_WR_REG16_RAW(uint32_t addr, uint16_t value)
{
/*TI_INSPECTED 18 D : MISRAC_2012_R.5.3
* "Tool Issue - argument 'value' used here is in same scope " */
*(volatile uint16_t *) addr = value;
return;
}
/*TI_INSPECTED 35 S : MISRAC_2012_R.2.1
* "Reason - This function is called using HW_WR_FIELD32 mcaro " */
/*TI_INSPECTED 14 D 1: MISRAC_2012_R.5.8
* "Tool Issue - Modifying the contents stored at address not the addr itself */
static inline void HW_WR_FIELD32_RAW(uint32_t addr,
uint32_t mask,
uint32_t shift,
uint32_t value)
{
/*TI_INSPECTED 440 S : MISRAC_2012_R.11.4
* "Reason - Pointer typecast required here since addr variable holds
* required register value" */
uint32_t regVal = *(volatile uint32_t *) addr;
regVal &= (~mask);
regVal |= (value << shift) & mask;
/*TI_INSPECTED 440 S : MISRAC_2012_R.11.4
* "Reason - Pointer typecast required here since addr variable holds
* required register value" */
*(volatile uint32_t *) addr = regVal;
return;
}
/*TI_INSPECTED 35 S : MISRAC_2012_R.2.1
* "Reason - This function is called using HW_WR_FIELD16 mcaro " */
/*TI_INSPECTED 14 D 1: MISRAC_2012_R.5.8
* "Tool Issue - Modifying the contents stored at address not the addr itself */
static inline void HW_WR_FIELD16_RAW(uint32_t addr,
uint16_t mask,
uint32_t shift,
uint16_t value)
{
uint32_t tempVal;
/*TI_INSPECTED 440 S : MISRAC_2012_R.11.4
* "Reason - Pointer typecast required here since addr variable holds
* required register value" */
uint16_t regVal = *(volatile uint16_t *) addr;
tempVal = ((uint32_t) regVal);
tempVal &= (~((uint32_t) mask));
tempVal |= (((uint32_t) value) << shift) & ((uint32_t) mask);
regVal = (uint16_t) tempVal;
/*TI_INSPECTED 440 S : MISRAC_2012_R.11.4
* "Reason - Pointer typecast required here since addr variable holds
* required register value" */
*(volatile uint16_t *) addr = regVal;
return;
}
/*TI_INSPECTED 35 S : MISRAC_2012_R.2.1
* "Reason - This function is called using HW_RD_FIELD32 mcaro " */
static inline uint32_t HW_RD_FIELD32_RAW(uint32_t addr,
uint32_t mask,
uint32_t shift)
{
/*TI_INSPECTED 440 S : MISRAC_2012_R.11.4
* "Reason - Pointer typecast required here since addr variable holds
* required register value" */
uint32_t regVal = *(volatile uint32_t *) addr;
regVal = (regVal & mask) >> shift;
return (regVal);
}
/*TI_INSPECTED 35 S : MISRAC_2012_R.2.1
* "Reason - This function is called using HW_RD_FIELD16 mcaro " */
static inline uint16_t HW_RD_FIELD16_RAW(uint32_t addr,
uint16_t mask,
uint32_t shift)
{
uint32_t tempVal;
/*TI_INSPECTED 440 S : MISRAC_2012_R.11.4
* "Reason - Pointer typecast required here since addr variable holds
* required register value" */
uint16_t regVal = *(volatile uint16_t *) addr;
tempVal = (((uint32_t) regVal & (uint32_t) mask) >> shift);
regVal = (uint16_t) tempVal;
return (regVal);
}
//! \addtogroup mcan_api MCAN
//! @{
/* ========================================================================== */
/* Macros & Typedefs */
/* ========================================================================== */
/**
* \brief MCAN MSG RAM BANK number for ECC AGGR.
*/
/**
* \brief Maximum Number of Rx Buffers.
*/
/**
* \brief Maximum Number of Tx Buffers.
*/
/**
* \brief Macro for standard Message ID filter.
*/
/**
* \brief Macro for extended Message ID filter.
*/
/**
* \brief Macro for Tx Event FIFO element size.
*/
/**
* \brief Macro for Interrupt Line enable mask.
*/
/**
* \brief Macro defines mask for all the interrupts status for MCAN.
*/
/**
* \brief Maximum payload supported by CAN-FD protocol in bytes.
*/
//*****************************************************************************
//
// These macro definitions are used to specify Standard Filter Types to
// set the sft values of the struct MCAN_StdMsgIDFilterElement
// used as a parameter in the function MCAN_addStdMsgIDFilter()
//
//*****************************************************************************
/**< Range Filter from SFID1 to SFID2 */
/**< Dual ID Filter for SFID1 or SFID2 */
/**< Classic Filter: SFID1 = filter, SFID2 = mask */
/**< Filter Element Disabled */
//*****************************************************************************
//
// These macro definitions are used to specify Standard Filter Element
// Configurations to set the sfec values of the struct MCAN_StdMsgIDFilterElement
// used as a parameter in the function MCAN_addStdMsgIDFilter()
//
//*****************************************************************************
/**< Filter Element Disabled */
/**< Store in RX FIFO 0 if filter matches */
/**< Store in RX FIFO 1 if filter matches */
/**< Reject ID if filter matches */
/**< Set priority if filter matches */
/**< Set priority and store in RX FIFO 0 if filter matches */
/**< Set priority and store in RX FIFO 1 if filter matches */
/**< Store in RX Buffer */
/* ========================================================================== */
/* Structures and Enums */
/* ========================================================================== */
/**
* \brief Enum to select the MCAN interrupt lines
*/
typedef enum
{
MCAN_INTR_LINE_NUM_0 = 0U,
/**< MCAN interrupt line 0 */
MCAN_INTR_LINE_NUM_1 = 1U
/**< MCAN interrupt line 1 */
}MCAN_IntrLineNum;
/**
* \brief Enum to represent the MCAN Identifier Type
*/
typedef enum
{
MCAN_ID_TYPE_11_BIT = 0U,
/**< 11bit MCAN Identifier */
MCAN_ID_TYPE_29_BIT = 1U
/**< 29bit MCAN Identifier */
}MCAN_IdType;
/**
* \brief Enum to represent the MCAN mode of operation
*/
typedef enum
{
MCAN_OPERATION_MODE_NORMAL = 0U,
/**< MCAN normal mode */
MCAN_OPERATION_MODE_SW_INIT = 1U
/**< MCAN SW initialization mode */
}MCAN_OperationMode;
/**
* \brief Enum to represent the MCAN Message RAM type.
*/
typedef enum
{
MCAN_MEM_TYPE_BUF = 0U,
/**< MCAN Msg RAM buffers */
MCAN_MEM_TYPE_FIFO = 1U
/**< MCAN Msg RAM FIFO/Queue */
}MCAN_MemType;
/**
* \brief Enum to represent the MCAN Rx FIFO number
*/
typedef enum
{
MCAN_RX_FIFO_NUM_0 = 0U,
/**< MCAN Rx FIFO 0 */
MCAN_RX_FIFO_NUM_1 = 1U
/**< MCAN Rx FIFO 1 */
}MCAN_RxFIFONum;
/**
* \brief Enum to represent the MCAN pin type
*/
typedef enum
{
MCAN_PIN_TYPE_RX = 0U,
/**< MCAN Rx Pin */
MCAN_PIN_TYPE_TX = 1U
/**< MCAN Tx Pin */
}MCAN_PinType;
/**
* \brief Enum to represent FIFO/Buffer element Size
*/
typedef enum
{
MCAN_ELEM_SIZE_8BYTES = 0U,
/**< 8 byte data field */
MCAN_ELEM_SIZE_12BYTES = 1U,
/**< 12 byte data field */
MCAN_ELEM_SIZE_16BYTES = 2U,
/**< 16 byte data field */
MCAN_ELEM_SIZE_20BYTES = 3U,
/**< 20 byte data field */
MCAN_ELEM_SIZE_24BYTES = 4U,
/**< 24 byte data field */
MCAN_ELEM_SIZE_32BYTES = 5U,
/**< 32 byte data field */
MCAN_ELEM_SIZE_48BYTES = 6U,
/**< 48 byte data field */
MCAN_ELEM_SIZE_64BYTES = 7U
/**< 64 byte data field */
}MCAN_ElemSize;
/**
* \brief Enum to represent the MCAN time-out counter configuration
*/
typedef enum
{
MCAN_TIMEOUT_SELECT_CONT = 0U,
/**< Continuous operation Mode */
MCAN_TIMEOUT_SELECT_TX_EVENT_FIFO = 1U,
/**< Timeout controlled by Tx Event FIFO */
MCAN_TIMEOUT_SELECT_RX_FIFO0 = 2U,
/**< Timeout controlled by Rx FIFO 0 */
MCAN_TIMEOUT_SELECT_RX_FIFO1 = 3U
/**< Timeout controlled by Rx FIFO 1 */
}MCAN_TimeOutSelect;
/**
* \brief Enum for MCAN interrupts.
*/
typedef enum
{
MCAN_INTR_SRC_RX_FIFO0_NEW_MSG = (0x00000001U),
/**< Rx FIFO 0 New Message interrupt */
MCAN_INTR_SRC_RX_FIFO0_WATERMARK = (0x00000002U),
/**< Rx FIFO 0 Watermark Reached interrupt */
MCAN_INTR_SRC_RX_FIFO0_FULL = (0x00000004U),
/**< Rx FIFO 0 Full interrupt */
MCAN_INTR_SRC_RX_FIFO0_MSG_LOST = (0x00000008U),
/**< Rx FIFO 0 Message Lost interrupt */
MCAN_INTR_SRC_RX_FIFO1_NEW_MSG = (0x00000010U),
/**< Rx FIFO 1 New Message interrupt */
MCAN_INTR_SRC_RX_FIFO1_WATERMARK = (0x00000020U),
/**< Rx FIFO 1 Watermark Reached interrupt */
MCAN_INTR_SRC_RX_FIFO1_FULL = (0x00000040U),
/**< Rx FIFO 1 Full interrupt */
MCAN_INTR_SRC_RX_FIFO1_MSG_LOST = (0x00000080U),
/**< Rx FIFO 1 Message Lost interrupt */
MCAN_INTR_SRC_HIGH_PRIO_MSG = (0x00000100U),
/**< High Priority Message interrupt */
MCAN_INTR_SRC_TRANS_COMPLETE = (0x00000200U),
/**< Transmission Completed interrupt */
MCAN_INTR_SRC_TRANS_CANCEL_FINISH = (0x00000400U),
/**< Transmission Cancellation Finished interrupt */
MCAN_INTR_SRC_TX_FIFO_EMPTY = (0x00000800U),
/**< Tx FIFO Empty interrupt */
MCAN_INTR_SRC_TX_EVT_FIFO_NEW_ENTRY = (0x00001000U),
/**< Tx Event FIFO New Entry interrupt */
MCAN_INTR_SRC_TX_EVT_FIFO_WATERMARK = (0x00002000U),
/**< Tx Event FIFO Watermark Reached interrupt */
MCAN_INTR_SRC_TX_EVT_FIFO_FULL = (0x00004000U),
/**< Tx Event FIFO Full interrupt */
MCAN_INTR_SRC_TX_EVT_FIFO_ELEM_LOST = (0x00008000U),
/**< Tx Event FIFO Element Lost interrupt */
MCAN_INTR_SRC_TIMESTAMP_WRAPAROUND = (0x00010000U),
/**< Timestamp Wraparound interrupt */
MCAN_INTR_SRC_MSG_RAM_ACCESS_FAILURE = (0x00020000U),
/**< Message RAM Access Failure interrupt */
MCAN_INTR_SRC_TIMEOUT = (0x00040000U),
/**< Timeout Occurred interrupt */
MCAN_INTR_SRC_DEDICATED_RX_BUFF_MSG = (0x00080000U),
/**< Message stored to Dedicated Rx Buffer interrupt */
MCAN_INTR_SRC_BIT_ERR_CORRECTED = (0x00100000U),
/**< Bit Error Corrected interrupt */
MCAN_INTR_SRC_BIT_ERR_UNCORRECTED = (0x00200000U),
/**< Bit Error Uncorrected interrupt */
MCAN_INTR_SRC_ERR_LOG_OVRFLW = (0x00400000U),
/**< Error Logging Overflow interrupt */
MCAN_INTR_SRC_ERR_PASSIVE = (0x00800000U),
/**< Error Passive interrupt */
MCAN_INTR_SRC_WARNING_STATUS = (0x01000000U),
/**< Warning Status interrupt */
MCAN_INTR_SRC_BUS_OFF_STATUS = (0x02000000U),
/**< Bus_Off Status interrupt */
MCAN_INTR_SRC_WATCHDOG = (0x04000000U),
/**< Watchdog Interrupt interrupt */
MCAN_INTR_SRC_PROTOCOL_ERR_ARB = (0x08000000U),
/**< Protocol Error in Arbitration Phase interrupt */
MCAN_INTR_SRC_PROTOCOL_ERR_DATA = (0x10000000U),
/**< Protocol Error in Data Phase interrupt */
MCAN_INTR_SRC_RES_ADDR_ACCESS = (0x20000000U)
/**< Access to Reserved Address interrupt */
}MCAN_IntrSrc;
/**
* \brief Enum to represent the ECC Error Types
*/
typedef enum
{
MCAN_ECC_ERR_TYPE_SEC = 0U,
/**< ECC Single Error Correction */
MCAN_ECC_ERR_TYPE_DED = 1U
/**< ECC Single Error Detection */
}MCAN_ECCErrType;
/**
* \brief Enum to select the MCAN Loopback mode
*/
typedef enum
{
MCAN_LPBK_MODE_INTERNAL = 0U,
/**< Internal Loop Back Mode
* This mode can be used for hot self-test and this mode will not
* affect bus state.
*/
MCAN_LPBK_MODE_EXTERNAL = 1U
/**< External Loop Back Mode
* In this mode, MCAN the M_CAN treats its own
**transmitted messages as
* received messages and stores them (if they
**pass acceptance filtering)
* into an Rx Buffer or an Rx FIFO.
* This mode will affect bus state
*/
}MCAN_LpbkMode;
/**
* \brief Enum to represent MCAN's communication state
*/
typedef enum
{
MCAN_COM_STATE_SYNCHRONIZING = 0U,
/**< MCAN is synchronizing on CAN communication */
MCAN_COM_STATE_IDLE = 1U,
/**< MCAN is neither receiver nor transmitter */
MCAN_COM_STATE_RECEIVER = 2U,
/**< MCAN is operating as receiver */
MCAN_COM_STATE_TRANSMITTER = 3U
/**< MCAN is operating as transmitter */
}MCAN_ComState;
/**
* \brief Enum to represent MCAN's Error Code
*/
typedef enum
{
MCAN_ERR_CODE_NO_ERROR = 0U,
/**< No error occurred since LEC has been reset by
* successful reception or transmission.
*/
MCAN_ERR_CODE_STUFF_ERROR = 1U,
/**< More than 5 equal bits in a sequence have occurred in a part of
* a received message where this is not allowed.
*/
MCAN_ERR_CODE_FORM_ERROR = 2U,
/**< A fixed format part of a received frame has the wrong format. */
MCAN_ERR_CODE_ACK_ERROR = 3U,
/**< The message transmitted by the M_CAN was not acknowledged
* by another node.
*/
MCAN_ERR_CODE_BIT1_ERROR = 4U,
/**< During the transmission of a message (with the exception of
* the arbitration field), the device wanted to send a
* recessive level (bit of logical value ‘1’),
* but the monitored bus value was dominant.
*/
MCAN_ERR_CODE_BIT0_ERROR = 5U,
/**< During the transmission of a message (or acknowledge bit,
* or active error flag, or overload flag), the device wanted to send
* a dominant level (data or identifier bit logical value ‘0’),
* but the monitored bus value was recessive. During Bus_Off recovery
* this status is set each time a sequence of 11 recessive bits has been
* monitored. This enables the CPU to monitor the proceeding of
* the Bus_Off recovery sequence (indicating the bus is not stuck at
* dominant or continuously disturbed).
*/
MCAN_ERR_CODE_CRC_ERROR = 6U,
/**< The CRC check sum of a received message was incorrect.
* The CRC of an incoming message does not match with the
* CRC calculated from the received data.
*/
MCAN_ERR_CODE_NO_CHANGE = 7U
/**< Any read access to the Protocol Status
* Register re-initializes
* the LEC to ‘7’. When the LEC shows the value
****‘7’,
* no CAN bus event was detected since the last
****CPU read access to
* the Protocol Status Register.
*/
}MCAN_ErrCode;
/**
* \brief Enum to determine the clock source that will be set
* up via a call to the MCAN_selectClockSource() API
*/
typedef enum
{
//! Peripheral System Clock Source
MCAN_CLOCK_SOURCE_SYS = 0x0,
//! Auxiliary Clock Input Source
MCAN_CLOCK_SOURCE_AUXIN = 0x2,
//! PLL Raw Clock Source
MCAN_CLOCK_SOURCE_PLLRAW = 0x3
} MCAN_ClockSource;
/**
* \brief Structure for bit timing calculation.
* Bit timing related to data phase will be valid only in case where
* MCAN is put in CAN-FD mode and will be '0' otherwise.
*/
typedef struct
{
uint32_t nomRatePrescalar;
/**< Nominal Baud Rate Pre-scaler
* Range:[0x0-0x1FF]
*/
uint32_t nomTimeSeg1;
/**< Nominal Time segment before sample point
* Range:[0x0-0xFF]
*/
uint32_t nomTimeSeg2;
/**< Nominal Time segment after sample point
* Range:[0x0-0x7F]
*/
uint32_t nomSynchJumpWidth;
/**< Nominal (Re)Synchronization Jump Width
* Range:[0x0-0x7F]
*/
uint32_t dataRatePrescalar;
/**< Data Baud Rate Pre-scaler
* Range:[0x0-0x1F]
*/
uint32_t dataTimeSeg1;
/**< Data Time segment before sample point
* Range:[0x0-0x1F]
*/
uint32_t dataTimeSeg2;
/**< Data Time segment after sample point
* Range:[0x0-0xF]
*/
uint32_t dataSynchJumpWidth;
/**< Data (Re)Synchronization Jump Width
* Range:[0x0-0xF]
*/
}MCAN_BitTimingParams;
/**
* \brief Structure for MCAN Transmitter Delay Compensation parameters.
*/
typedef struct
{
uint32_t tdcf;
/**< Transmitter Delay Compensation Filter Window Length
* Range:[0x0-0x7F]
*/
uint32_t tdco;
/**< Transmitter Delay Compensation Offset
* Range:[0x0-0x7F]
*/
}MCAN_TDCConfig;
/**
* \brief Structure for MCAN Global Filter Configuration parameters.
*/
typedef struct
{
uint32_t rrfe;
/**< Reject Remote Frames Extended
* 0 = Filter remote frames with 29-bit extended IDs
* 1 = Reject all remote frames with 29-bit extended IDs
*/
uint32_t rrfs;
/**< Reject Remote Frames Standard
* 0 = Filter remote frames with 11-bit standard IDs
* 1 = Reject all remote frames with 11-bit standard IDs
*/
uint32_t anfe;
/**< Accept Non-matching Frames Extended
* 0 = Accept in Rx FIFO 0
* 1 = Accept in Rx FIFO 1
* others = Reject
*/
uint32_t anfs;
/**< Accept Non-matching Frames Standard
* 0 = Accept in Rx FIFO 0
* 1 = Accept in Rx FIFO 1
* others = Reject
*/
}MCAN_GlobalFiltConfig;
/**
* \brief Structure for MCAN initialization parameters.
*/
typedef struct
{
uint32_t fdMode;
/**< FD Operation Enable
* 0 = FD operation disabled
* 1 = FD operation enabled
*/
uint32_t brsEnable;
/**< Bit Rate Switch Enable
* This is valid only when opMode = 1.
* 0 = Bit rate switching for transmissions disabled
* 1 = Bit rate switching for transmissions enabled
*/
uint32_t txpEnable;
/**< Transmit Pause
* 0 = Transmit pause disabled
* 1 = Transmit pause enabled
*/
uint32_t efbi;
/**< FEdge Filtering during Bus Integration
* 0 = Edge filtering disabled
* 1 = Two consecutive dominant tq required to detect an edge for
* hard synchronization
*/
uint32_t pxhddisable;
/**< Protocol Exception Handling Disable
* 0 = Protocol exception handling enabled
* 1 = Protocol exception handling disabled
*/
uint32_t darEnable;
/**< Disable Automatic Retransmission
* 0 = Automatic retransmission of messages not transmitted successfully
* enabled
* 1 = Automatic retransmission disabled
*/
uint32_t wkupReqEnable;
/**< Wakeup Request Enable
* 0 = Wakeup request is disabled
* 1 = Wakeup request is enabled
*/
uint32_t autoWkupEnable;
/**< Auto-Wakeup Enable
* 0 = Auto-Wakeup is disabled
* 1 = Auto-Wakeup is enabled
*/
uint32_t emulationEnable;
/**< Emulation/Debug Suspend Enable
* 0 = Emulation/Debug Suspend is disabled
* 1 = Emulation/Debug Suspend is enabled
*/
uint32_t wdcPreload;
/**< Start value of the Message RAM Watchdog Counter
* Range:[0x0-0xFF]
*/
MCAN_TDCConfig tdcConfig;
/**< Transmitter Delay Compensation parameters.
* Refer struct #MCAN_TDCConfig.
*/
uint32_t tdcEnable;
/**< Transmitter Delay Compensation Enable
* 0 = Transmitter Delay Compensation is disabled
* 1 = Transmitter Delay Compensation is enabled
*/
}MCAN_InitParams;
/**
* \brief Structure for MCAN configuration parameters.
*/
typedef struct
{
uint32_t monEnable;
/**< Bus Monitoring Mode
* 0 = Bus Monitoring Mode is disabled
* 1 = Bus Monitoring Mode is enabled
*/
uint32_t asmEnable;
/**< Restricted Operation Mode
* 0 = Normal CAN operation
* 1 = Restricted Operation Mode active
* This mode should not be combined with test modes.
*/
uint32_t tsPrescalar;
/**< Timestamp Counter Prescaler.
* Range:[0x0-0xF]
*/
uint32_t tsSelect;
/**< Timestamp source selection.
* 00= Timestamp counter value always 0x0000
* 01= Timestamp counter value incremented according to tsPrescalar
* 10= External timestamp counter value used
* 11= Same as “00”
*/
uint32_t timeoutSelect;
/**< Time-out counter source select.
* Refer enum #MCAN_TimeOutSelect.
*/
uint32_t timeoutPreload;
/**< Start value of the Timeout Counter (down-counter).
* The Timeout Counter is decremented in multiples of CAN bit times [1-16]
* depending on the configuration of the tsPrescalar.
* Range:[0x0-0xFFFF]
*/
uint32_t timeoutCntEnable;
/**< Time-out Counter Enable
* 0 = Time-out Counter is disabled
* 1 = Time-out Counter is enabled
*/
MCAN_GlobalFiltConfig filterConfig;
/**< Global Filter Configuration parameters.
* Refer struct #MCAN_GlobalFiltConfig.
*/
}MCAN_ConfigParams;
/**
* \brief Structure for MCAN error logging counters status.
*/
typedef struct
{
uint32_t transErrLogCnt;
/**< Transmit Error Counter */
uint32_t recErrCnt;
/**< Receive Error Counter */
uint32_t rpStatus;
/**< Receive Error Passive
* 0 = The Receive Error Counter is below the error passive level(128)
* 1 = The Receive Error Counter has reached the error passive level(128)
*/
uint32_t canErrLogCnt;
/**< CAN Error Logging */
}MCAN_ErrCntStatus;
/**
* \brief Structure for MCAN protocol status.
*/
typedef struct
{
uint32_t lastErrCode;
/**< Last Error Code
* Refer enum #MCAN_ErrCode
*/
uint32_t act;
/**< Activity - Monitors the module’s CAN communication state.
* refer enum #MCAN_ComState
*/
uint32_t errPassive;
/**< Error Passive
* 0 = The M_CAN is in the Error_Active state
* 1 = The M_CAN is in the Error_Passive state
*/
uint32_t warningStatus;
/**< Warning Status
* 0 = Both error counters are below the Error_Warning limit of 96
* 1 = At least one of error counter has reached the Error_Warning
* limit of 96
*/
uint32_t busOffStatus;
/**< Bus_Off Status
* 0 = The M_CAN is not Bus_Off
* 1 = The M_CAN is in Bus_Off state
*/
uint32_t dlec;
/**< Data Phase Last Error Code
* Refer enum #MCAN_ErrCode
*/
uint32_t resi;
/**< ESI flag of last received CAN FD Message
* 0 = Last received CAN FD message did not have its ESI flag set
* 1 = Last received CAN FD message had its ESI flag set
*/
uint32_t rbrs;
/**< BRS flag of last received CAN FD Message
* 0 = Last received CAN FD message did not have its BRS flag set
* 1 = TLast received CAN FD message had its BRS flag set
*/
uint32_t rfdf;
/**< Received a CAN FD Message
* 0 = Since this bit was reset by the CPU, no CAN FD message has been
* received
* 1 = Message in CAN FD format with FDF flag set has been received
*/
uint32_t pxe;
/**< Protocol Exception Event
* 0 = No protocol exception event occurred since last read access
* 1 = Protocol exception event occurred
*/
uint32_t tdcv;
/**< Transmitter Delay Compensation Value */
}MCAN_ProtocolStatus;
/**
* \brief Structure for MCAN Message RAM Configuration Parameters.
* Message RAM can contain following sections:
* Standard ID filters, Extended ID filters, TX FIFO(or TX Q),
* TX Buffers, TX EventFIFO, RX FIFO0, RX FIFO1, RX Buffer.
* Note: If particular section in the RAM is not used then it's size
* should be initialized to '0'
* (Number of buffers in case of Tx/Rx buffer).
*/
typedef struct
{
uint32_t flssa;
/**< Standard ID Filter List Start Address */
uint32_t lss;
/**< List Size: Standard ID
* 0 = No standard Message ID filter
* 1-127 = Number of standard Message ID filter elements
* others = Values greater than 128 are interpreted as 128
*/
uint32_t flesa;
/**< Extended ID Filter List Start Address */
uint32_t lse;
/**< List Size: Extended ID
* 0 = No standard Message ID filter
* 1-64 = Number of standard Message ID filter elements
* others = Values greater than 64 are interpreted as 64
*/
uint32_t txStartAddr;
/**< Tx Buffers Start Address */
uint32_t txBufNum;
/**< Number of Dedicated Transmit Buffers
* 0 = No Dedicated Tx Buffers
* 1-32 = Number of Dedicated Tx Buffers
* others = Values greater than 32 are interpreted as 32
*/
uint32_t txFIFOSize;
/**< Transmit FIFO/Queue Size
* 0 = No Tx FIFO/Queue
* 1-32 = Number of Tx Buffers used for Tx FIFO/Queue
* others = Values greater than 32 are interpreted as 32
*/
uint32_t txBufMode;
/**< Tx FIFO/Queue Mode
* 0 = Tx FIFO operation
* 1 = Tx Queue operation
*/
uint32_t txBufElemSize;
/**< Tx Buffer Element Size */
uint32_t txEventFIFOStartAddr;
/**< Tx Event FIFO Start Address */
uint32_t txEventFIFOSize;
/**< Event FIFO Size
* 0 = Tx Event FIFO disabled
* 1-32 = Number of Tx Event FIFO elements
* others = Values greater than 32 are interpreted as 32
*/
uint32_t txEventFIFOWaterMark;
/**< Tx Event FIFO Watermark
* 0 = Watermark interrupt disabled
* 1-32 = Level for Tx Event FIFO watermark interrupt
* others = Watermark interrupt disabled
*/
uint32_t rxFIFO0startAddr;
/**< Rx FIFO0 Start Address */
uint32_t rxFIFO0size;
/**< Rx FIFO0 Size
* 0 = No Rx FIFO
* 1-64 = Number of Rx FIFO elements
* others = Values greater than 64 are interpreted as 64
*/
uint32_t rxFIFO0waterMark;
/**< Rx FIFO0 Watermark
* 0 = Watermark interrupt disabled
* 1-63 = Level for Rx FIFO 0 watermark interrupt
* others = Watermark interrupt disabled
*/
uint32_t rxFIFO0OpMode;
/**< Rx FIFO0 Operation Mode
* 0 = FIFO blocking mode
* 1 = FIFO overwrite mode
*/
uint32_t rxFIFO1startAddr;
/**< Rx FIFO1 Start Address */
uint32_t rxFIFO1size;
/**< Rx FIFO1 Size
* 0 = No Rx FIFO
* 1-64 = Number of Rx FIFO elements
* others = Values greater than 64 are interpreted as 64
*/
uint32_t rxFIFO1waterMark;
/**< Rx FIFO1 Watermark
* 0 = Watermark interrupt disabled
* 1-63 = Level for Rx FIFO 1 watermark interrupt
* others = Watermark interrupt disabled
*/
uint32_t rxFIFO1OpMode;
/**< Rx FIFO1 Operation Mode
* 0 = FIFO blocking mode
* 1 = FIFO overwrite mode
*/
uint32_t rxBufStartAddr;
/**< Rx Buffer Start Address */
uint32_t rxBufElemSize;
/**< Rx Buffer Element Size */
uint32_t rxFIFO0ElemSize;
/**< Rx FIFO0 Element Size */
uint32_t rxFIFO1ElemSize;
/**< Rx FIFO1 Element Size */
}MCAN_MsgRAMConfigParams;
/**
* \brief Structure for MCAN High Priority Message.
*/
typedef struct
{
uint32_t bufIdx;
/**< Buffer Index
* Only valid when MSI[1] = ‘1’.
*/
uint32_t msi;
/**< Message Storage Indicator
* MSI[1:0]
* 00 = No FIFO selected
* 01 = FIFO message lost
* 10 = Message stored in FIFO 0
* 11 = Message stored in FIFO 1
*/
uint32_t filterIdx;
/**< Filter Index */
uint32_t filterList;
/**< Indicates the filter list of the matching filter element
* 0 = Standard Filter List
* 1 = Extended Filter List
*/
}MCAN_HighPriorityMsgInfo;
/**
* \brief Structure for MCAN new data flag for Rx buffer.
*/
typedef struct
{
uint32_t statusLow;
/**< New data flag for Rx buffer no. 0 to 31 */
uint32_t statusHigh;
/**< New data flag for Rx buffer no. 32 to 63 */
}MCAN_RxNewDataStatus;
/**
* \brief Structure for MCAN Rx FIFO Status.
*/
typedef struct
{
uint32_t num;
/**< Rx FIFO number
* Refer enum #MCAN_RxFIFONum
*/
uint32_t fillLvl;
/**< Rx FIFO Fill Level */
uint32_t getIdx;
/**< Rx FIFO Get Index */
uint32_t putIdx;
/**< Rx FIFO Put Index */
uint32_t fifoFull;
/**< Rx FIFO Full
* 0 = Rx FIFO not full
* 1 = Rx FIFO full
*/
uint32_t msgLost;
/**< Rx FIFO Message Lost */
}MCAN_RxFIFOStatus;
/**
* \brief Structure for MCAN Tx FIFO Status.
*/
typedef struct
{
uint32_t freeLvl;
/**< Tx FIFO Free Level */
uint32_t getIdx;
/**< Tx FIFO Get Index
* Read as zero when Tx Queue operation is configured.
*/
uint32_t putIdx;
/**< Tx FIFO/Queue Put Index */
uint32_t fifoFull;
/**< Tx FIFO/Queue Full
* 0 = Tx FIFO/Queue not full
* 1 = Tx FIFO/Queue full
*/
}MCAN_TxFIFOStatus;
/**
* \brief Structure for MCAN Tx Event FIFO Status.
*/
typedef struct
{
uint32_t fillLvl;
/**< Event FIFO Fill Level */
uint32_t getIdx;
/**< Event FIFO Gut Index */
uint32_t putIdx;
/**< Event FIFO Put Index */
uint32_t fifoFull;
/**< Event FIFO Full
* 0 = Tx Event FIFO not full
* 1 = Tx Event FIFO full
*/
uint32_t eleLost;
/**< Tx Event FIFO Element Lost
* 0 = No Tx Event FIFO element lost
* 1 = Tx Event FIFO element lost, also set after write attempt to
* Tx Event FIFO of size zero.
*/
}MCAN_TxEventFIFOStatus;
/**
* \brief Structure for ECC Error forcing.
*/
typedef struct
{
uint32_t errType;
/**< Error type to be forced
* Refer enum #MCAN_ECCErrType.
*/
uint32_t rowNum;
/**< Row address where error needs to be applied. */
uint32_t bit1;
/**< Column/Data bit that needs to be flipped when
* force_sec or force_ded is set
*/
uint32_t bit2;
/**< Data bit that needs to be flipped when force_ded is set */
uint32_t errOnce;
/**< Force Error once
* 1: The error will inject an error to the specified row only once
*/
uint32_t errForce;
/**< Force error on the next RAM read */
}MCAN_ECCErrForceParams;
/**
* \brief Structure for ECC Error Status.
*/
typedef struct
{
uint32_t secErr;
/**< Single Bit Error Status
* 0 = No Single Bit Error pending
* 1 = Single Bit Error pending
*/
uint32_t dedErr;
/**< Double Bit Error Status
* 0 = No Double Bit Error pending
* 1 = Double Bit Error pending
*/
uint32_t row;
/**< Indicates the row/address where the single or double bit
* error occurred.
*/
uint32_t bit1;
/**< Indicates the bit position in the ram data that is in error
*/
}MCAN_ECCErrStatus;
/**
* \brief Structure for accessing Revision ID and Core Release Info.
* of MCAN module.
*/
typedef struct
{
uint32_t scheme;
/**< Scheme */
uint32_t bu;
/**< Business Unit: 10 = Processors */
uint32_t modId;
/**< Module ID */
uint32_t rtlRev;
/**< RTL revision */
uint32_t major;
/**< Major revision */
uint32_t custom;
/**< Custom revision */
uint32_t minor;
/**< Minor revision */
uint32_t day;
/**< Time Stamp Day. Two digits, BCD-coded. */
uint32_t mon;
/**< Time Stamp Month. Two digits, BCD-coded. */
uint32_t year;
/**< Time Stamp Year. Single digit, BCD-coded. */
uint32_t subStep;
/**< Sub-step of Core Release Single digit, BCD-coded. */
uint32_t step;
/**< Step of Core Release.Two digits, BCD-coded Single digit, BCD-coded. */
uint32_t rel;
/**< Core Release. Single digit, BCD-coded. */
}MCAN_RevisionId;
/**
* \brief Structure for accessing Revision ID of ECC AGGR.
*/
typedef struct
{
uint32_t scheme;
/**< Scheme */
uint32_t bu;
/**< Business Unit: 10 = Processors */
uint32_t modId;
/**< Module ID */
uint32_t rtlRev;
/**< RTL revision */
uint32_t major;
/**< Major revision */
uint32_t custom;
/**< Custom revision */
uint32_t minor;
/**< Minor revision */
}MCAN_ECCAggrRevisionId;
/**
* \brief Structure for MCAN ECC configuration parameters.
*/
typedef struct
{
uint32_t enable;
/**< Enable/disable ECC
* 0 = Disable ECC
* 1 = Enable ECC
*/
uint32_t enableChk;
/**< Enable/disable ECC Check
* 0 = Disable ECC Check
* 1 = Enable ECC Check
*/
uint32_t enableRdModWr;
/**< Enable/disable Read Modify Write operation
* 0 = Disable Read Modify Write operation
* 1 = Enable Read Modify Write operation
*/
}MCAN_ECCConfigParams;
/**
* \brief Structure for accessing Revision ID of ECC wrapper.
*/
typedef struct
{
uint32_t scheme;
/**< Scheme */
uint32_t bu;
/**< Business Unit: 10 = Processors */
uint32_t modId;
/**< Module ID */
uint32_t rtlRev;
/**< RTL revision */
uint32_t major;
/**< Major revision */
uint32_t custom;
/**< Custom revision */
uint32_t minor;
/**< Minor revision */
}MCAN_ECCWrapRevisionId;
/**
* \brief Structure for MCAN Tx Buffer element.
*/
typedef struct
{
uint32_t id;
/**< Identifier */
uint32_t rtr;
/**< Remote Transmission Request
* 0 = Transmit data frame
* 1 = Transmit remote frame
*/
uint32_t xtd;
/**< Extended Identifier
* 0 = 11-bit standard identifier
* 1 = 29-bit extended identifier
*/
uint32_t esi;
/**< Error State Indicator
* 0 = ESI bit in CAN FD format depends only on error passive flag
* 1 = ESI bit in CAN FD format transmitted recessive
*/
uint32_t dlc;
/**< Data Length Code
* 0-8 = CAN + CAN FD: transmit frame has 0-8 data bytes
* 9-15 = CAN: transmit frame has 8 data bytes
* 9-15 = CAN FD: transmit frame has 12/16/20/24/32/48/64 data bytes
*/
uint32_t brs;
/**< Bit Rat Switching
* 0 = CAN FD frames transmitted without bit rate switching
* 1 = CAN FD frames transmitted with bit rate switching
*/
uint32_t fdf;
/**< FD Format
* 0 = Frame transmitted in Classic CAN format
* 1 = Frame transmitted in CAN FD format
*/
uint32_t efc;
/**< Event FIFO Control
* 0 = Don’t store Tx events
* 1 = Store Tx events
*/
uint32_t mm;
/**< Message Marker */
uint16_t data[(64U)];
/**< Data bytes.
* Only first dlc number of bytes are valid.
*/
}MCAN_TxBufElement;
/**
* \brief Structure for MCAN Rx Buffer element.
*/
typedef struct
{
uint32_t id;
/**< Identifier */
uint32_t rtr;
/**< Remote Transmission Request
* 0 = Received frame is a data frame
* 1 = Received frame is a remote frame
*/
uint32_t xtd;
/**< Extended Identifier
* 0 = 11-bit standard identifier
* 1 = 29-bit extended identifier
*/
uint32_t esi;
/**< Error State Indicator
* 0 = Transmitting node is error active
* 1 = Transmitting node is error passive
*/
uint32_t rxts;
/**< Rx Timestamp */
uint32_t dlc;
/**< Data Length Code
* 0-8 = CAN + CAN FD: received frame has 0-8 data bytes
* 9-15 = CAN: received frame has 8 data bytes
* 9-15 = CAN FD: received frame has 12/16/20/24/32/48/64 data bytes
*/
uint32_t brs;
/**< Bit Rat Switching
* 0 = Frame received without bit rate switching
* 1 = Frame received with bit rate switching
*/
uint32_t fdf;
/**< FD Format
* 0 = Standard frame format
* 1 = CAN FD frame format (new DLC-coding and CRC)
*/
uint32_t fidx;
/**< Filter Index */
uint32_t anmf;
/**< Accepted Non-matching Frame
* 0 = Received frame matching filter index FIDX
* 1 = Received frame did not match any Rx filter element
*/
uint16_t data[(64U)];
/**< Data bytes.
* Only first dlc number of bytes are valid.
*/
}MCAN_RxBufElement;
/**
* \brief Structure for MCAN Tx Event FIFO element.
*/
typedef struct
{
uint32_t id;
/**< Identifier */
uint32_t rtr;
/**< Remote Transmission Request
* 0 = Data frame transmitted
* 1 = Remote frame transmitted
*/
uint32_t xtd;
/**< Extended Identifier
* 0 = 11-bit standard identifier
* 1 = 29-bit extended identifier
*/
uint32_t esi;
/**< Error State Indicator
* 0 = Transmitting node is error active
* 1 = Transmitting node is error passive
*/
uint32_t txts;
/**< Tx Timestamp */
uint32_t dlc;
/**< Data Length Code
* 0-8 = CAN + CAN FD: frame with 0-8 data bytes transmitted
* 9-15 = CAN: frame with 8 data bytes transmitted
* 9-15 = CAN FD: frame with 12/16/20/24/32/48/64 data bytes transmitted
*/
uint32_t brs;
/**< Bit Rat Switching
* 0 = Frame transmitted without bit rate switching
* 1 = Frame transmitted with bit rate switching
*/
uint32_t fdf;
/**< FD Format
* 0 = Standard frame format
* 1 = CAN FD frame format (new DLC-coding and CRC)
*/
uint32_t et;
/**< Event Type
* 00 = Reserved
* 01 = Tx event
* 10 = Transmission in spite of cancellation
* (always set for transmissions in DAR mode)
* 11 = Reserved
*/
uint32_t mm;
/**< Message Marker */
}MCAN_TxEventFIFOElement;
/**
* \brief Structure for MCAN Standard Message ID Filter Element.
*/
typedef struct
{
uint32_t sfid2;
/**< Standard Filter ID 2 */
uint32_t sfid1;
/**< Standard Filter ID 1 */
uint32_t sfec;
/**< Standard Filter Element Configuration (macros defined for each value)
* 000 = Disable filter element (MCAN_STDFILTEC_DISABLE)
* 001 = Store in Rx FIFO 0 if filter matches (MCAN_STDFILTEC_FIFO0)
* 010 = Store in Rx FIFO 1 if filter matches (MCAN_STDFILTEC_FIFO1)
* 011 = Reject ID if filter matches (MCAN_STDFILTEC_REJECT)
* 100 = Set priority if filter matches (MCAN_STDFILTEC_PRI)
* 101 = Set priority and store in FIFO 0 if filter matches (MCAN_STDFILTEC_PRI_FIFO0)
* 110 = Set priority and store in FIFO 1 if filter matches (MCAN_STDFILTEC_PRI_FIFO1)
* 111 = Store into Rx Buffer or as debug message, (MCAN_STDFILTEC_RXBUFF)
* configuration of SFT[1:0] ignored.
* If SFEC = “100”, “101”, or “110” a match sets high priority
* message event is generated.
*/
uint32_t sft;
/**< Standard Filter Type (macros defined for each value)
* 00 = Range filter from SFID1 to SFID2 (SFID2 ≥ SFID1) (MCAN_STDFILT_RANGE)
* 01 = Dual ID filter for SFID1 or SFID2 (MCAN_STDFILT_DUAL)
* 10 = Classic filter: SFID1 = filter, SFID2 = mask (MCAN_STDFILT_CLASSIC)
* 11 = Filter element disabled (MCAN_STDFILT_DISABLED)
*/
}MCAN_StdMsgIDFilterElement;
/**
* \brief Structure for MCAN Extended Message ID Filter Element.
*/
typedef struct
{
uint32_t efid1;
/**< Extended Filter ID 1 */
uint32_t efec;
/**< Extended Filter Element Configuration
* 000 = Disable filter element
* 001 = Store in Rx FIFO 0 if filter matches
* 010 = Store in Rx FIFO 1 if filter matches
* 011 = Reject ID if filter matches
* 100 = Set priority if filter matches
* 101 = Set priority and store in FIFO 0 if filter matches
* 110 = Set priority and store in FIFO 1 if filter matches
* 111 = Store into Rx Buffer or as debug message,
* configuration of SFT[1:0] ignored.
* If EFEC = “100”, “101”, or “110” a match sets high priority
* message event is generated.
*/
uint32_t efid2;
/**< Extended Filter ID 2 */
uint32_t eft;
/**< Extended Filter Type
* 00 = Range filter from EFID1 to EFID2 (EFID2 ≥ EFID1)
* 01 = Dual ID filter for EFID1 or EFID2
* 10 = Classic filter: EFID1 = filter, EFID2 = mask
* 11 = Range filter from EFID1 to EFID2 (EFID2 ≥ EFID1),
* XIDAM mask not applied
*/
}MCAN_ExtMsgIDFilterElement;
/* ========================================================================== */
/* Global Variables */
/* ========================================================================== */
/* None */
/* ========================================================================== */
/* Function Declarations */
/* ========================================================================== */
/**
* \brief This function selects the specified clock source for the MCAN controller.
*
* \param baseAddr Base Address of the MCAN Registers.
* \param source Clock source to use for the MCAN controller.
*
* The \e source parameter can be any one of the following:
* - \b MCAN_CLOCK_SOURCE_SYS - Peripheral System Clock
* - \b MCAN_CLOCK_SOURCE_AUXIN - Auxiliary Clock Input
* - \b MCAN_CLOCK_SOURCE_PLLRAW - PLL Raw Clock
*
* \retval None
*/
void MCAN_selectClockSource(uint32_t baseAddr, MCAN_ClockSource source);
/**
* \brief This function checks if the MCAN module is in Reset.
*
* \param baseAddr Base Address of the MCAN Registers.
*
* \retval state Returns TRUE if reset is in progress.
* Else returns FALSE.
*/
uint32_t MCAN_isInReset(uint32_t baseAddr);
/**
* \brief This API will return flexible data rate operation status
* MCAN module.
*
* \param baseAddr Base Address of the MCAN Registers.
*
* \return state Returns TRUE if flexible data rate operation
* is enabled. Else returns FALSE.
*/
uint32_t MCAN_isFDOpEnable(uint32_t baseAddr);
/**
* \brief This function checks if the memory initialization is done for
* MCAN module.
*
* \param baseAddr Base Address of the MCAN Registers.
*
* \retval state Returns TRUE if memory initialization is done.
* Else returns FALSE.
*/
uint32_t MCAN_isMemInitDone(uint32_t baseAddr);
/**
* \brief This API will set MCAN module mode of operation.
*
* \param baseAddr Base Address of the MCAN Registers.
* \param mode Mode of operation.
* Refer enum #MCAN_OperationMode.
*
* \return None.
*/
void MCAN_setOpMode(uint32_t baseAddr, uint32_t mode);
/**
* \brief This API will return MCAN module mode of operation.
*
* \param baseAddr Base Address of the MCAN Registers.
*
* \return mode Mode of operation.
* Refer enum #MCAN_OperationMode.
*/
uint32_t MCAN_getOpMode(uint32_t baseAddr);
/**
* \brief This API will initialize MCAN module.
*
* \param baseAddr Base Address of the MCAN Registers.
* \param initParams Initialization parameters.
* Refer struct #MCAN_InitParams.
*
* \return status Initialization status.
*/
int32_t MCAN_init(uint32_t baseAddr, const MCAN_InitParams *initParams);
/**
* \brief This API will configure MCAN module.
*
* \param baseAddr Base Address of the MCAN Registers.
* \param configParams configuration parameters.
* Refer struct #MCAN_ConfigParams.
*
* \return status Configuration status.
*/
int32_t MCAN_config(uint32_t baseAddr, const MCAN_ConfigParams *configParams);
/**
* \brief This API will enable/disable ECC on the Message RAM.
*
* \param baseAddr Base Address of the MCAN Registers.
* \param configParams MCAN ECC Configuration Parameters.
* Refer #struct MCAN_ECCConfigParams.
*
* \return None.
*/
void MCAN_eccConfig(uint32_t baseAddr,
const MCAN_ECCConfigParams *configParams);
/**
* \brief This API will configure a bit timings for MCAN module.
*
* \param baseAddr Base Address of the MCAN Registers.
* \param configParams Configuration parameters for MCAN bit timing.
* Refer struct #MCAN_BitTimingParams.
*
* \return status Bit Timings configuration status.
*/
int32_t MCAN_setBitTime(uint32_t baseAddr,
const MCAN_BitTimingParams *configParams);
/**
* \brief This API will configure Different sections of Message RAM.
*
* \param baseAddr Base Address of the MCAN Registers.
* \param msgRAMConfigParams
* Message RAM Configuration parameters.
* Refer struct #MCAN_MsgRAMConfigParams.
*
* \return status Configuration Status.
*/
int32_t MCAN_msgRAMConfig(uint32_t baseAddr,
const MCAN_MsgRAMConfigParams *msgRAMConfigParams);
/**
* \brief This API will configure Extended ID AND Mask.
*
* \param baseAddr Base Address of the MCAN Registers.
* \param idMask Configuration parameters for MCAN Extended Id mask.
* This value is 29 bit wide.
*
* \return status Extended ID AND Mask configuration status.
*/
int32_t MCAN_setExtIDAndMask(uint32_t baseAddr, uint32_t idMask);
/**
* \brief This API is used to write Tx message to message RAM.
*
* \param baseAddr Base Address of the MCAN Registers.
* \param memType Part of message ram to which given message to write.
* Refer enum #MCAN_MemType.
* \param bufNum Buffer number where message to write.
* This parameter will ignored if memType is FIFO/Q.
* \param elem Message Object.
* Refer struct #MCAN_TxBufElement.
*
* \return None.
*/
void MCAN_writeMsgRam(uint32_t baseAddr,
uint32_t memType,
uint32_t bufNum,
const MCAN_TxBufElement *elem);
/**
* \brief This API will set Tx Buffer Add Request.
*
* \param baseAddr Base Address of the MCAN Registers.
* \param bufNum Tx Buffer number for which request is to be added.
*
* \return status Configuration Status.
*/
int32_t MCAN_txBufAddReq(uint32_t baseAddr, uint32_t bufNum);
/**
* \brief This API will return New Data Message Status.
*
* \param baseAddr Base Address of the MCAN Registers.
* \param newDataStatus Rx Buffer new data status.
* Refer struct #MCAN_RxNewDataStatus.
*
* \return None.
*/
void MCAN_getNewDataStatus(uint32_t baseAddr,
MCAN_RxNewDataStatus *newDataStatus);
/**
* \brief This API clear New Data Message Status.
*
* \param baseAddr Base Address of the MCAN Registers.
* \param newDataStatus
* Rx Buffer new data status.
* Refer struct #MCAN_RxNewDataStatus.
*
* \return None.
*/
void MCAN_clearNewDataStatus(uint32_t baseAddr,
const MCAN_RxNewDataStatus *newDataStatus);
/**
* \brief This API is used to read received message from Message RAM.
*
* \param baseAddr Base Address of the MCAN Registers.
* \param memType Part of message ram to which given message to write.
* Refer enum #MCAN_MemType.
* \param bufNum Buffer number from where message is to read.
* This parameter will ignored if memType is FIFO/Q.
* \param fifoNum FIFOs number from where message is to read.
* Refer enum #MCAN_RxFIFONum.
* This parameter will ignored if memType is buffer.
* \param elem Message Object.
* Refer struct #MCAN_RxBufElement.
*
* \return None.
*/
void MCAN_readMsgRam(uint32_t baseAddr,
uint32_t memType,
uint32_t bufNum,
uint32_t fifoNum,
MCAN_RxBufElement *elem);
/**
* \brief This API is used to read from Tx Event FIFO.
*
* \param baseAddr Base Address of the MCAN Registers.
* \param txEventElem Tx Event FIFO Message Object.
* Refer struct #MCAN_TxEventFIFOElement.
*
* \return None.
*/
void MCAN_readTxEventFIFO(uint32_t baseAddr,
MCAN_TxEventFIFOElement *txEventElem);
/**
* \brief This API is used to add Standard Message ID Filter Element.
*
* \param baseAddr Base Address of the MCAN Registers.
* \param filtNum Filter number.
* \param elem Filter Object.
* Refer struct #MCAN_StdMsgIDFilterElement.
*
* \return None.
*/
void MCAN_addStdMsgIDFilter(uint32_t baseAddr,
uint32_t filtNum,
const MCAN_StdMsgIDFilterElement *elem);
/**
* \brief This API is used to add Extended Message ID Filter Element.
*
* \param baseAddr Base Address of the MCAN Registers.
* \param filtNum Filter number.
* \param elem Filter Object.
* Refer struct #MCAN_ExtMsgIDFilterElement.
*
* \return None.
*/
void MCAN_addExtMsgIDFilter(uint32_t baseAddr,
uint32_t filtNum,
const MCAN_ExtMsgIDFilterElement *elem);
/**
* \brief This API will enable/disable Loop Back Test Mode for
* MCAN module.
*
* \param baseAddr Base Address of the MCAN Registers.
* \param lpbkMode Loopback mode for MCAN.
* Refer #enum MCAN_LpbkMode.
* \param enable Loop Back Mode is enabled if it is TRUE.
* Loop Back Mode is disabled if it is FALSE.
*
* \return None.
* \note This API can be called only when MCAN is in Software
* Initialization mode of operation.
*/
void MCAN_lpbkModeEnable(uint32_t baseAddr,
uint32_t lpbkMode,
uint32_t enable);
/**
* \brief This API will return error counter status for MCAN module.
*
* \param baseAddr Base Address of the MCAN Registers.
* \param errCounter Error Counter Status.
* Refer struct #MCAN_ErrCntStatus.
*
* \return None.
*/
void MCAN_getErrCounters(uint32_t baseAddr,
MCAN_ErrCntStatus *errCounter);
/**
* \brief This API will return protocol status for MCAN module.
*
* \param baseAddr Base Address of the MCAN Registers.
* \param protStatus Protocol Status.
* Refer struct #MCAN_ProtocolStatus.
*
* \return None.
*/
void MCAN_getProtocolStatus(uint32_t baseAddr,
MCAN_ProtocolStatus *protStatus);
/**
* \brief This API is used to enable/disable interrupts.
*
* \param baseAddr Base Address of the MCAN Registers.
* \param intrMask Interrupts to enable.
* Refer enum #MCAN_IntrSrc.
* \param enable Interrupt is enabled if it is TRUE.
* Interrupt is disabled if it is FALSE.
*
* \return None.
*/
void MCAN_enableIntr(uint32_t baseAddr, uint32_t intrMask, uint32_t enable);
/**
* \brief This API is used to select interrupt line.
*
* \param baseAddr Base Address of the MCAN Registers.
* \param intrMask Interrupt Number for which interrupt
* line is to be selected. Refer enum #MCAN_IntrSrc.
* \param lineNum Interrupt Line to select.
* Refer enum #MCAN_IntrLineNum,
*
* \return None.
*/
void MCAN_selectIntrLine(uint32_t baseAddr,
uint32_t intrMask,
uint32_t lineNum);
/**
* \brief This API is used to get interrupt line selected for each interrupt.
*
* \param baseAddr Base Address of the MCAN Registers.
*
* \return status Interrupt Line Select Status.
*/
uint32_t MCAN_getIntrLineSelectStatus(uint32_t baseAddr);
/**
* \brief This API is used to enable/disable selected interrupt line.
*
* \param baseAddr Base Address of the MCAN Registers.
* \param lineNum Interrupt Line to select.
* Refer enum #MCAN_IntrLineNum,
* \param enable Interrupt Line is enabled if it is 1.
* Interrupt Line is disabled if it is 0.
*
* \return None.
*/
void MCAN_enableIntrLine(uint32_t baseAddr,
uint32_t lineNum,
uint32_t enable);
/**
* \brief This API will return interrupt status.
*
* \param baseAddr Base Address of the MCAN Registers.
*
* \return status Interrupt Status.
*/
uint32_t MCAN_getIntrStatus(uint32_t baseAddr);
/**
* \brief This API is used to clear the interrupt status.
*
* \param baseAddr Base Address of the MCAN Registers.
* \param intrMask Interrupts to clear status.
*
* \return None.
*/
void MCAN_clearIntrStatus(uint32_t baseAddr, uint32_t intrMask);
/**
* \brief This API is used to clear the interrupt.
*
* \param baseAddr Base Address of the MCAN Registers.
* \param intrMask Interrupts to clear.
* 0x00 External TS Interrupt is cleared
* 0x01 Interrupt Line 0 is cleared
* 0x02 Interrupt Line 1 is cleared
* Other writes are ignored
*
* \return None.
*/
void MCAN_clearInterrupt(uint32_t baseAddr, uint16_t intrNum);
/**
* \brief This API will return High Priority Message Status.
*
* \param baseAddr Base Address of the MCAN Registers.
* \param hpm High Priority Message Status.
* Refer struct #MCAN_HighPriorityMsgInfo.
*
* \return None.
*/
void MCAN_getHighPriorityMsgStatus(uint32_t baseAddr,
MCAN_HighPriorityMsgInfo *hpm);
/**
* \brief This API will read the High Priority message object from Message RAM.
*
* \param baseAddr Base Address of the MCAN Registers.
* \param elem Message Object.
* Refer struct #MCAN_RxBufElement.
*
* \return None.
*/
void MCAN_readHighPriorityMsgRam(uint32_t baseAddr,
MCAN_RxBufElement *elem);
/**
* \brief This API will Rx FIFO status.
*
* \param baseAddr Base Address of the MCAN Registers.
* \param fifoStatus Rx FIFO Status.
* Refer struct #MCAN_RxFIFOStatus.
*
* \return None.
*/
void MCAN_getRxFIFOStatus(uint32_t baseAddr,
MCAN_RxFIFOStatus *fifoStatus);
/**
* \brief This API will write Rx FIFO Acknowledgement.
*
* \param baseAddr Base Address of the MCAN Registers.
* Refer enum #MCAN_RxFIFONum.
* \param fifoNum FIFO Number.
* \param idx Rx FIFO Acknowledge Index
*
* \return status Acknowledgement Status.
*/
int32_t MCAN_writeRxFIFOAck(uint32_t baseAddr,
uint32_t fifoNum,
uint32_t idx);
/**
* \brief This API will Tx FIFO status.
*
* \param baseAddr Base Address of the MCAN Registers.
* \param fifoStatus Tx FIFO Status.
* Refer struct #MCAN_TxFIFOStatus.
*
* \return None.
*/
void MCAN_getTxFIFOQueStatus(uint32_t baseAddr,
MCAN_TxFIFOStatus *fifoStatus);
/**
* \brief This API will return Tx Buffer Request Pending status.
*
* \param baseAddr Base Address of the MCAN Registers.
*
* \return status Tx Buffer Request Pending status.
*/
uint32_t MCAN_getTxBufReqPend(uint32_t baseAddr);
/**
* \brief This API will set Tx Buffer Cancellation Request.
*
* \param baseAddr Base Address of the MCAN Registers.
* \param buffNum Tx Buffer number for which request is to be added.
*
* \return status Configuration Status.
*/
int32_t MCAN_txBufCancellationReq(uint32_t baseAddr, uint32_t buffNum);
/**
* \brief This API will return Tx Buffer Transmission Occurred status.
*
* \param baseAddr Base Address of the MCAN Registers.
*
* \return status Tx Buffer Transmission Occurred status.
*/
uint32_t MCAN_getTxBufTransmissionStatus(uint32_t baseAddr);
/**
* \brief This API will return Transmit Buffer Cancellation Finished status.
*
* \param baseAddr Base Address of the MCAN Registers.
*
* \return status Transmit Buffer Cancellation Finished status.
*/
uint32_t MCAN_txBufCancellationStatus(uint32_t baseAddr);
/**
* \brief This API is used to enable/disable Tx Buffer Transmission Interrupt.
*
* \param baseAddr Base Address of the MCAN Registers.
* \param bufNum Buffer number for which interrupt is to enable.
* \param enable Interrupt is enabled if it is TRUE.
* Interrupt is disabled if it is FALSE.
*
* \return status Configuration status.
*/
int32_t MCAN_txBufTransIntrEnable(uint32_t baseAddr,
uint32_t bufNum,
uint32_t enable);
/**
* \brief This API is used to enable/disable Tx Buffer Cancellation Finished
* Interrupt.
*
* \param baseAddr Base Address of the MCAN Registers.
* \param bufNum Buffer number for which interrupt is to enable.
* \param enable Interrupt is enabled if it is TRUE.
* Interrupt is disabled if it is FALSE.
*
* \return status Configuration status.
*/
int32_t MCAN_getTxBufCancellationIntrEnable(uint32_t baseAddr,
uint32_t bufNum,
uint32_t enable);
/**
* \brief This API add clock stop request for MCAN module to put it in
* power down mode.
*
* \param baseAddr Base Address of the MCAN Registers.
* \param enable Add CLock Stop Request.
* Adds Clock Clock stop Request is TRUE otherwise
* removes it.
*
* \return None.
*/
void MCAN_addClockStopRequest(uint32_t baseAddr, uint32_t enable);
/**
* \brief This API will Tx Event FIFO status.
*
* \param baseAddr Base Address of the MCAN Registers.
* \param fifoStatus Tx Event FIFO Status.
* Refer struct #MCAN_TxEventFIFOStatus.
*
* \return None.
*/
void MCAN_getTxEventFIFOStatus(uint32_t baseAddr,
MCAN_TxEventFIFOStatus *fifoStatus);
/**
* \brief This API will write Event FIFO Acknowledge Index.
*
* \param baseAddr Base Address of the MCAN Registers.
* \param idx Event FIFO Acknowledge Index
*
* \return status Acknowledgement Status.
*/
int32_t MCAN_writeTxEventFIFOAck(uint32_t baseAddr, uint32_t idx);
/**
* \brief This API will Force Error on ECC.
*
* \param baseAddr Base Address of the MCAN Registers.
* \param eccErr Force Error on ECC configuration.
* Refer struct #MCAN_ECCErrForceParams.
*
* \return status configuration status.
*/
void MCAN_eccForceError(uint32_t baseAddr,
const MCAN_ECCErrForceParams *eccErr);
/**
* \brief This API will return ECC Error status.
*
* \param baseAddr Base Address of the MCAN Registers.
* \param eccErr ECC error status.
* Refer struct #MCAN_ECCErrStatus.
*
* \return None.
*/
void MCAN_eccGetErrorStatus(uint32_t baseAddr,
MCAN_ECCErrStatus *eccErr);
/**
* \brief This API is used to clear the ECC Error status.
*
* \param baseAddr Base Address of the MCAN Registers.
* \param errType Error type to clear status.
* Refer enum #MCAN_ECCErrType.
*
* \return None.
*/
void MCAN_eccClearErrorStatus(uint32_t baseAddr, uint32_t errType);
/**
* \brief This API is used to write End of Interrupt for ECC interrupt.
*
* \param baseAddr Base Address of the MCAN Registers.
* \param errType Interrupt to enable.
* Refer enum #MCAN_ECCErrType.
*
* \return None.
*/
void MCAN_eccWriteEOI(uint32_t baseAddr, uint32_t errType);
/**
* \brief This API is used to enable ECC interrupt.
*
* \param baseAddr Base Address of the MCAN Registers.
* \param errType Interrupt to enable.
* Refer enum #MCAN_ECCErrType.
* \param enable ECC Interrupt is enabled if it is TRUE.
* ECC Interrupt is disabled if it is FALSE.
*
* \return None.
*/
void MCAN_eccEnableIntr(uint32_t baseAddr, uint32_t errType, uint32_t enable);
/**
* \brief This API is used to get ECC interrupt status.
*
* \param baseAddr Base Address of the MCAN Registers.
* \param errType Interrupt status to read.
* Refer enum #MCAN_ECCErrType.
*
* \return None.
*/
uint32_t MCAN_eccGetIntrStatus(uint32_t baseAddr, uint32_t errType);
/**
* \brief This API is used to clear ECC interrupt status.
*
* \param baseAddr Base Address of the MCAN Registers.
* \param errType Interrupt status to clear.
* Refer enum #MCAN_ECCErrType.
*
* \return None.
*/
void MCAN_eccClearIntrStatus(uint32_t baseAddr, uint32_t errType);
/**
* \brief This API will configure external timestamp counter for MCAN module.
*
* \param baseAddr Base Address of the MCAN Registers.
* \param prescalar Timestamp Counter Prescaler. Range:[0x0-0xFFFFFF]
*
* \return None.
*
* \note Actual value programmed prescalar values is (prescalar - 1).
*/
void MCAN_extTSCounterConfig(uint32_t baseAddr,
uint32_t prescalar);
/**
* \brief This API will enable/disable fast external time stamp counter for
* MCAN module.
*
* \param baseAddr Base Address of the MCAN Registers.
* \param enable External TS is enabled if it is 1.
* External TS is disabled if it is 0.
*
* \return None.
*/
void MCAN_extTSCounterEnable(uint32_t baseAddr, uint32_t enable);
/**
* \brief This API will enable/disable External TimeStamp Counter
* Overflow Interrupt for MCAN module.
*
* \param baseAddr Base Address of the MCAN Registers.
* \param enable External TimeStamp Counter Overflow Interrupt is
* enabled if it is TRUE.
* External TimeStamp Counter Overflow Interrupt is
* disabled if it is FALSE.
*
* \return None.
*/
void MCAN_extTSEnableIntr(uint32_t baseAddr, uint32_t enable);
/**
* \brief This API is used to write End of Interrupt for External TimeStamp
* Counter Overflow Interrupt.
*
* \param baseAddr Base Address of the MCAN Registers.
*
* \return None.
*/
void MCAN_extTSWriteEOI(uint32_t baseAddr);
/**
* \brief This API returns Number of unserviced rollover/overflow
* interrupts for external TimeStamp counter.
*
* \param baseAddr Base Address of the MCAN Registers.
*
* \return status Returns Number of unserviced rollover/overflow
* interrupts for external TimeStamp counter.
* Maximum number of unserviced interrupts is 0xF.
*/
uint32_t MCAN_extTSGetUnservicedIntrCount(uint32_t baseAddr);
/* ========================================================================== */
/* Advance Functions */
/* ========================================================================== */
/**
* \brief This API is check the MCAN base address.
*
* \param baseAddr Base Address of the MCAN Registers.
*
* \return Returns \b true if base address is valid, otherwise \b false
*/
/**
* \brief This API is used get the MCAN revision ID.
*
* \param baseAddr Base Address of the MCAN Registers.
* \param revId Contains Revision ID of MCAN module.
* Refer struct #MCAN_RevisionId.
*
* \return None.
*/
void MCAN_getRevisionId(uint32_t baseAddr, MCAN_RevisionId *revId);
/**
* \brief This API get clock stop acknowledgement for MCAN module.
* It return whether MCAN is power down mode or not.
*
* \param baseAddr Base Address of the MCAN Registers.
*
* \return status Return Clock Stop Acknowledgement status.
* Return '1' if M_CAN is set in power down mode else
* returns '0'.
*/
uint32_t MCAN_getClockStopAck(uint32_t baseAddr);
/**
* \brief This API will set External TimeStamp Counter Overflow Interrupt
* Raw status for MCAN module.
*
* \param baseAddr Base Address of the MCAN Registers.
*
* \return None.
*/
void MCAN_extTSSetRawStatus(uint32_t baseAddr);
/**
* \brief This API will clear External TimeStamp Counter Overflow Interrupt
* raw status for MCAN module.
*
* \param baseAddr Base Address of the MCAN Registers.
*
* \return None.
*/
void MCAN_extTSClearRawStatus(uint32_t baseAddr);
/**
* \brief This API will return Rx pin state of MCAN module.
*
* \param baseAddr Base Address of the MCAN Registers.
*
* \return state MCAN Rx Pin State.
* 0= The CAN bus is dominant
* 1= The CAN bus is recessive
*/
uint32_t MCAN_getRxPinState(uint32_t baseAddr);
/**
* \brief This API will set Tx pin state of MCAN module.
*
* \param baseAddr Base Address of the MCAN Registers.
* \param state MCAN Tx Pin State.
* 00= Reset value
* 01= Sample Point can be monitored at tx pin
* 10= The CAN bus is dominant
* 11= The CAN bus is recessive
* other= It will treated as 11.
*
* \return None.
*/
void MCAN_setTxPinState(uint32_t baseAddr, uint32_t state);
/**
* \brief This API will return Tx pin state of MCAN module.
*
* \param baseAddr Base Address of the MCAN Registers.
*
* \return state MCAN Tx Pin State.
* 00= Reset value
* 01= Sample Point can be monitored at tx pin
* 10= The CAN bus is dominant
* 11= The CAN bus is recessive
*/
uint32_t MCAN_getTxPinState(uint32_t baseAddr);
/**
* \brief This API will return current timestamp counter value.
*
* \param baseAddr Base Address of the MCAN Registers.
*
* \return val Current Timestamp counter value.
*/
uint32_t MCAN_getTSCounterVal(uint32_t baseAddr);
/**
* \brief This API will return clock stop acknowledgement
* for MCAN module.
*
* \param baseAddr Base Address of the MCAN Registers.
*
* \return ack Clock Stop Acknowledge
* 0= No clock stop acknowledged
* 1= M_CAN may be set in power down
*/
uint32_t MCAN_getClkStopAck(uint32_t baseAddr);
/**
* \brief This API will get the configured bit timings for MCAN module.
*
* \param baseAddr Base Address of the MCAN Registers.
* \param configParams Configuration parameters for MCAN bit timing.
* Refer struct #MCAN_BitTimingParams.
*
* \return None.
*/
void MCAN_getBitTime(uint32_t baseAddr,
MCAN_BitTimingParams *configParams);
/**
* \brief This API will reset timestamp counter value.
*
* \param baseAddr Base Address of the MCAN Registers.
*
* \return None.
*/
void MCAN_resetTSCounter(uint32_t baseAddr);
/**
* \brief This API will return current time-out counter value.
*
* \param baseAddr Base Address of the MCAN Registers.
*
* \return val Current Time-out counter value.
*/
uint32_t MCAN_getTOCounterVal(uint32_t baseAddr);
/**
* \brief This API is used get the ECC AGGR revision ID.
*
* \param baseAddr Base Address of the MCAN Registers.
* \param revId Contains Revision ID of ECC AGGR.
* Refer struct #MCAN_ECCAggrRevisionId.
*
* \return None.
*/
void MCAN_eccAggrGetRevisionId(uint32_t baseAddr,
MCAN_ECCAggrRevisionId *revId);
/**
* \brief This API is used get the ECC Wrapper revision ID.
*
* \param baseAddr Base Address of the MCAN Registers.
* \param revId Contains Revision ID of ECC Wrapper
* Refer struct #MCAN_ECCWrapRevisionId.
*
* \return None.
*/
void MCAN_eccWrapGetRevisionId(uint32_t baseAddr,
MCAN_ECCWrapRevisionId *revId);
/**
* \brief This API returns External TimeStamp Counter Overflow Interrupt
* enable status for MCAN module.
*
* \param baseAddr Base Address of the MCAN Registers.
*
* \return status Returns TRUE if External TimeStamp Counter Overflow
* Interrupt is enabled.
* Else returns FALSE.
*/
uint32_t MCAN_extTSIsIntrEnable(uint32_t baseAddr);
/**
* \brief This function return endianness value of MCAN module.
*
* \param baseAddr Base Address of the MCAN Registers.
*
* \retval val Endianness value. (0x87654321)
*/
uint32_t MCAN_getEndianVal(uint32_t baseAddr);
/**
* \brief This API will get the configured Extended ID AND Mask.
*
* \param baseAddr Base Address of the MCAN Registers.
*
* \return idMask Extended ID AND Mask.
*/
uint32_t MCAN_getExtIDANDMask(uint32_t baseAddr);
/**
* \brief This API will return message object size.
*
* \param elemSize Element Size.
*
* \return message object size
* Size of the message object stored in Message RAM.
*/
uint32_t MCAN_getMsgObjSize(uint32_t elemSize);
// Close the Doxygen group.
//! @}
//###########################################################################
//
// FILE: memcfg.h
//
// TITLE: C28x RAM config driver.
//
//###########################################################################
// $Copyright:
// Copyright (C) 2023 Texas Instruments Incorporated - http://www.ti.com/
//
// 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 Texas Instruments Incorporated 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
// OWNER 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.
// $
//###########################################################################
//*****************************************************************************
//
// If building with a C++ compiler, make all of the definitions in this header
// have a C binding.
//
//*****************************************************************************
//*****************************************************************************
//
//! \addtogroup memcfg_api MemCfg
//! @{
//
//*****************************************************************************
//###########################################################################
//
// FILE: hw_memcfg.h
//
// TITLE: Definitions for the MEMCFG registers.
//
//###########################################################################
// $Copyright:
// Copyright (C) 2023 Texas Instruments Incorporated - http://www.ti.com/
//
// 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 Texas Instruments Incorporated 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
// OWNER 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.
// $
//###########################################################################
//*************************************************************************************************
//
// The following are defines for the MEMCFG register offsets
//
//*************************************************************************************************
// Register
// Register
// Clear Register
// Interrupt Enable Register
// Address
// Violation Address
// Violation Address
// Violation Address
// Violation Address
// Violation Address
// Violation Address
// Address
// Register
// Register
// Register
// Enable Register
// Address
// Address
// Address
// Access Violation Address
// Address
// Violation Address
//*************************************************************************************************
//
// The following are defines for the bit fields in the DxLOCK register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the DxCOMMIT register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the DxACCPROT0 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the DxTEST register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the DxINIT register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the DxINITDONE register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the DxRAMTEST_LOCK register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the LSxLOCK register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the LSxCOMMIT register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the LSxMSEL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the LSxCLAPGM register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the LSxACCPROT0 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the LSxACCPROT1 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the LSxTEST register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the LSxINIT register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the LSxINITDONE register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the LSxRAMTEST_LOCK register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the GSxLOCK register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the GSxCOMMIT register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the GSxACCPROT0 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the GSxTEST register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the GSxINIT register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the GSxINITDONE register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the GSxRAMTEST_LOCK register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the MSGxLOCK register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the MSGxCOMMIT register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the MSGxTEST register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the MSGxINIT register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the MSGxINITDONE register
//
//*************************************************************************************************
// MSG RAM
// MSG RAM
// MSG RAM
// MSG RAM
//*************************************************************************************************
//
// The following are defines for the bit fields in the MSGxRAMTEST_LOCK register
//
//*************************************************************************************************
// Configuration
// Configuration
// Configuration
// Configuration
//*************************************************************************************************
//
// The following are defines for the bit fields in the ROM_LOCK register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the ROM_TEST register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the ROM_FORCE_ERROR register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the NMAVFLG register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the NMAVSET register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the NMAVCLR register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the NMAVINTEN register
//
//*************************************************************************************************
// Enable
// Enable
// Enable
// Enable
// Enable
// Enable
// Enable
// Enable
// Enable
// Enable
//*************************************************************************************************
//
// The following are defines for the bit fields in the MAVFLG register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the MAVSET register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the MAVCLR register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the MAVINTEN register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the UCERRFLG register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the UCERRSET register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the UCERRCLR register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the CERRFLG register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the CERRSET register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the CERRCLR register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the CERRTHRES register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the CEINTFLG register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the CEINTCLR register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the CEINTSET register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the CEINTEN register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the CPU_RAM_TEST_ERROR_STS register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the CPU_RAM_TEST_ERROR_STS_CLR register
//
//*************************************************************************************************
//*****************************************************************************
//
// Useful defines used within the driver functions. Not intended for use by
// application code.
//
//*****************************************************************************
//
// Masks to decode memory section defines.
//
//
// Used for access violation functions.
//
//
// Key for writing to memory test config lock registers
//
//*****************************************************************************
//
// Values that can be passed to MemCfg_lockConfig(), MemCfg_unlockConfig(),
// MemCfg_commitConfig(), MemCfg_setProtection(), MemCfg_initSections(),
// MemCfg_setCLAMemType(), MemCfg_setLSRAMControllerSel(),
// MemCfg_getInitStatus() as the memSection(s) or ramSection(s) parameter.
//
//*****************************************************************************
//
// DxRAM - Dedicated RAM config
//
//
// LSxRAM - Local shared RAM config
//
//
// GSxRAM - Global shared RAM config
//
//
// MSGxRAM - Message RAM config
//
//
// ROM memory sections
//
//
// All sections
//
//*****************************************************************************
//
// Values that can be passed to MemCfg_setProtection() as the protectMode
// parameter.
//
//*****************************************************************************
//*****************************************************************************
//
// Values that can be passed to MemCfg_enableViolationInterrupt()
// MemCfg_disableViolationInterrupt(), MemCfg_forceViolationInterrupt(),
// MemCfg_clearViolationInterruptStatus(), and MemCfg_getViolationAddress() as
// the intFlags parameter. They also make up the return value of
// MemCfg_getViolationInterruptStatus().
//
//*****************************************************************************
//*****************************************************************************
//
// Values that can be passed to MemCfg_enableViolationInterrupt()
// MemCfg_disableViolationInterrupt(), MemCfg_forceViolationInterrupt(),
// MemCfg_clearViolationInterruptStatus(), and MemCfg_getViolationAddress() as
// the intFlags parameter. They also make up the return value of
// MemCfg_getViolationInterruptStatus().
//
//*****************************************************************************
//*****************************************************************************
//
// Values that can be passed to MemCfg_forceCorrErrorStatus(),
// MemCfg_clearCorrErrorStatus(), and MemCfg_getCorrErrorAddress() as the
// stsFlag(s) parameter and returned by MemCfg_getCorrErrorStatus().
//
// Note that MEMCFG_CERR_CPUREAD is the only value below that has a
// corresponding interrupt and may be used with the error functions that take
// an intFlag(s) parameter.
//
//*****************************************************************************
//*****************************************************************************
//
// Values that can be passed to MemCfg_forceUncorrErrorStatus(),
// MemCfg_clearUncorrErrorStatus(), and MemCfg_getUncorrErrorAddress() as the
// stsFlag(s) parameter and returned by MemCfg_getUncorrErrorStatus().
//
//*****************************************************************************
//*****************************************************************************
//
// Values that can be passed to MemCfg_clearDiagErrorStatus() as stsFlags
// parameter and returned by MemCfg_getDiagErrorStatus().
//
//*****************************************************************************
//*****************************************************************************
//
//! Values that can be passed to MemCfg_setCLAMemType() as the \e claMemType
//! parameter.
//
//*****************************************************************************
typedef enum
{
MEMCFG_CLA_MEM_DATA, //!< Section is CLA data memory
MEMCFG_CLA_MEM_PROGRAM //!< Section is CLA program memory
} MemCfg_CLAMemoryType;
//*****************************************************************************
//
//! Values that can be passed to MemCfg_setLSRAMControllerSel() as the
//! \e controllerSel parameter.
//
//*****************************************************************************
typedef enum
{
MEMCFG_LSRAMCONTROLLER_CPU_ONLY, //!< CPU is the owner of the section
MEMCFG_LSRAMCONTROLLER_CPU_CLA1 //!< CPU and CLA1 share this section
} MemCfg_LSRAMControllerSel;
//*****************************************************************************
//
//! Values that can be passed to MemCfg_setTestMode() as the \e testMode
//! parameter.
//
//*****************************************************************************
typedef enum
{
//! Functional mode. Test mode is disabled.
MEMCFG_TEST_FUNCTIONAL = 0,
//! Writes allowed to data only
MEMCFG_TEST_WRITE_DATA = 1,
//! Writes allowed to ECC only (for DxRAM/MxRAM)
MEMCFG_TEST_WRITE_ECC = 2,
//! Writes allowed to parity only (for LSxRAM, GSxRAM, and MSGxRAM)
MEMCFG_TEST_WRITE_PARITY = 2,
//! Diagnostic mode, similar to functional mode but NMI is not generated.
MEMCFG_TEST_FUNC_DIAG = 3
} MemCfg_TestMode;
//*****************************************************************************
//
// Prototypes for the APIs.
//
//*****************************************************************************
//*****************************************************************************
//
//! Sets the CLA memory type of the specified RAM section.
//!
//! \param ramSections is the logical OR of the sections to be configured.
//! \param claMemType indicates data memory or program memory.
//!
//! This function sets the CLA memory type configuration of the RAM section. If
//! the \e claMemType parameter is \b MEMCFG_CLA_MEM_DATA, the RAM section will
//! be configured as CLA data memory. If \b MEMCFG_CLA_MEM_PROGRAM, the RAM
//! section will be configured as CLA program memory.
//!
//! The \e ramSections parameter is an OR of the following indicators:
//! \b MEMCFG_SECT_LS0 through \b MEMCFG_SECT_LSx.
//!
//! \note This API only applies to LSx RAM and has no effect if the CLA isn't
//! controller of the memory section.
//!
//! \sa MemCfg_setLSRAControllerSel()
//!
//! \return None.
//
//*****************************************************************************
static inline void
MemCfg_setCLAMemType(uint32_t ramSections, MemCfg_CLAMemoryType claMemType)
{
//
// Check the arguments.
//
;
//
// Write the CLA memory configuration to the appropriate register. Either
// set or clear the bit that determines the function of the RAM section as
// it relates to the CLA.
//
__eallow();
if(claMemType == MEMCFG_CLA_MEM_PROGRAM)
{
//
// Program memory
//
(*((volatile uint32_t *)(0x0005F400U + 0x26U))) |= ramSections;
}
else
{
//
// Data memory
//
(*((volatile uint32_t *)(0x0005F400U + 0x26U))) &= ~ramSections;
}
__edis();
}
//*****************************************************************************
//
//! Enables individual RAM access violation interrupt sources.
//!
//! \param intFlags is a bit mask of the interrupt sources to be enabled.
//! Can be a logical OR any of the following values:
//! - \b MEMCFG_NMVIOL_CPUREAD - Non-controller CPU read access
//! - \b MEMCFG_NMVIOL_CPUWRITE - Non-controller CPU write access
//! - \b MEMCFG_NMVIOL_CPUFETCH - Non-controller CPU fetch access
//! - \b MEMCFG_NMVIOL_DMAWRITE - Non-controller DMA write access
//! - \b MEMCFG_NMVIOL_CLA1READ - Non-controller CLA1 read access
//! - \b MEMCFG_NMVIOL_CLA1WRITE - Non-controller CLA1 write access
//! - \b MEMCFG_NMVIOL_CLA1FETCH - Non-controller CLA1 fetch access
//! - \b MEMCFG_NMVIOL_DMAREAD - Non-controller DMA read access
//! - \b MEMCFG_NMVIOL_HICREAD - Non-controller HIC read access
//! - \b MEMCFG_NMVIOL_HICWRITE - Non-controller HIC write access
//! - \b MEMCFG_MVIOL_CPUFETCH - Controller CPU fetch access
//! - \b MEMCFG_MVIOL_CPUWRITE - Controller CPU write access
//! - \b MEMCFG_MVIOL_DMAWRITE - Controller DMA write access
//! - \b MEMCFG_MVIOL_HICWRITE - Controller HIC write access
//! This function enables the indicated RAM access violation interrupt sources.
//! Only the sources that are enabled can be reflected to the processor
//! interrupt; disabled sources have no effect on the processor.
//!
//! \return None.
//
//*****************************************************************************
static inline void
MemCfg_enableViolationInterrupt(uint32_t intFlags)
{
//
// Enable the specified interrupts.
//
__eallow();
(*((volatile uint32_t *)(0x0005F500U + 0x6U))) |=
intFlags & 0x0000FFFFU;
(*((volatile uint32_t *)(0x0005F500U + 0x26U))) |=
(intFlags & 0x000F0000U) >> 16U;
__edis();
}
//*****************************************************************************
//
//! Disables individual RAM access violation interrupt sources.
//!
//! \param intFlags is a bit mask of the interrupt sources to be disabled.
//! Can be a logical OR any of the following values:
//! - \b MEMCFG_NMVIOL_CPUREAD - Non-controller CPU read access
//! - \b MEMCFG_NMVIOL_CPUWRITE - Non-controller CPU write access
//! - \b MEMCFG_NMVIOL_CPUFETCH - Non-controller CPU fetch access
//! - \b MEMCFG_NMVIOL_DMAWRITE - Non-controller DMA write access
//! - \b MEMCFG_NMVIOL_CLA1READ - Non-controller CLA1 read access
//! - \b MEMCFG_NMVIOL_CLA1WRITE - Non-controller CLA1 write access
//! - \b MEMCFG_NMVIOL_CLA1FETCH - Non-controller CLA1 fetch access
//! - \b MEMCFG_NMVIOL_DMAREAD - Non-controller DMA read access
//! - \b MEMCFG_NMVIOL_HICREAD - Non-controller HIC read access
//! - \b MEMCFG_NMVIOL_HICWRITE - Non-controller HIC write access
//! - \b MEMCFG_MVIOL_CPUFETCH - Controller CPU fetch access
//! - \b MEMCFG_MVIOL_CPUWRITE - Controller CPU write access
//! - \b MEMCFG_MVIOL_DMAWRITE - Controller DMA write access
//! - \b MEMCFG_MVIOL_HICWRITE - Controller HIC write access
//!
//! This function disables the indicated RAM access violation interrupt
//! sources. Only the sources that are enabled can be reflected to the
//! processor interrupt; disabled sources have no effect on the processor.
//!
//! \note Note that only non-controller violations may generate interrupts.
//!
//! \return None.
//
//*****************************************************************************
static inline void
MemCfg_disableViolationInterrupt(uint32_t intFlags)
{
//
// Disable the specified interrupts.
//
__eallow();
(*((volatile uint32_t *)(0x0005F500U + 0x6U))) &=
~(intFlags & 0x0000FFFFU);
(*((volatile uint32_t *)(0x0005F500U + 0x26U))) &=
~((intFlags & 0x000F0000U) >> 16U);
__edis();
}
//*****************************************************************************
//
//! Gets the current RAM access violation status.
//!
//! This function returns the RAM access violation status. This function will
//! return flags for both controller and non-controller access violations
//! although only the non-controller flags have the ability to cause the
//! generation of an interrupt.
//!
//! \return Returns the current violation status, enumerated as a bit field of
//! the values:
//! - \b MEMCFG_NMVIOL_CPUREAD - Non-controller CPU read access
//! - \b MEMCFG_NMVIOL_CPUWRITE - Non-controller CPU write access
//! - \b MEMCFG_NMVIOL_CPUFETCH - Non-controller CPU fetch access
//! - \b MEMCFG_NMVIOL_DMAWRITE - Non-controller DMA write access
//! - \b MEMCFG_NMVIOL_CLA1READ - Non-controller CLA1 read access
//! - \b MEMCFG_NMVIOL_CLA1WRITE - Non-controller CLA1 write access
//! - \b MEMCFG_NMVIOL_CLA1FETCH - Non-controller CLA1 fetch access
//! - \b MEMCFG_NMVIOL_DMAREAD - Non-controller DMA read access
//! - \b MEMCFG_NMVIOL_HICREAD - Non-controller HIC read access
//! - \b MEMCFG_NMVIOL_HICWRITE - Non-controller HIC write access
//! - \b MEMCFG_MVIOL_CPUFETCH - Controller CPU fetch access
//! - \b MEMCFG_MVIOL_CPUWRITE - Controller CPU write access
//! - \b MEMCFG_MVIOL_DMAWRITE - Controller DMA write access
//! - \b MEMCFG_MVIOL_HICWRITE - Controller HIC write access
//*****************************************************************************
static inline uint32_t
MemCfg_getViolationInterruptStatus(void)
{
uint32_t status;
//
// Read and return RAM access status flags.
//
status = ((*((volatile uint32_t *)(0x0005F500U + 0x0U)))) |
((*((volatile uint32_t *)(0x0005F500U + 0x20U))) <<
16U);
return(status);
}
//*****************************************************************************
//
//! Sets the RAM access violation status.
//!
//! \param intFlags is a bit mask of the access violation flags to be set.
//! Can be a logical OR any of the following values:
//! - \b MEMCFG_NMVIOL_CPUREAD - Non-controller CPU read access
//! - \b MEMCFG_NMVIOL_CPUWRITE - Non-controller CPU write access
//! - \b MEMCFG_NMVIOL_CPUFETCH - Non-controller CPU fetch access
//! - \b MEMCFG_NMVIOL_DMAWRITE - Non-controller DMA write access
//! - \b MEMCFG_NMVIOL_CLA1READ - Non-controller CLA1 read access
//! - \b MEMCFG_NMVIOL_CLA1WRITE - Non-controller CLA1 write access
//! - \b MEMCFG_NMVIOL_CLA1FETCH - Non-controller CLA1 fetch access
//! - \b MEMCFG_NMVIOL_DMAREAD - Non-controller DMA read access
//! - \b MEMCFG_NMVIOL_HICREAD - Non-controller HIC read access
//! - \b MEMCFG_NMVIOL_HICWRITE - Non-controller HIC write access
//! - \b MEMCFG_MVIOL_CPUFETCH - Controller CPU fetch access
//! - \b MEMCFG_MVIOL_CPUWRITE - Controller CPU write access
//! - \b MEMCFG_MVIOL_DMAWRITE - Controller DMA write access
//! - \b MEMCFG_MVIOL_HICWRITE - Controller HIC write access
//!
//! This function sets the RAM access violation status. This function will
//! set flags for both controller and non-controller access violations, and an
//! interrupt will be generated if it is enabled.
//!
//! \return None.
//
//*****************************************************************************
static inline void
MemCfg_forceViolationInterrupt(uint32_t intFlags)
{
//
// Shift and mask the flags appropriately and write them to the
// corresponding SET register.
//
__eallow();
(*((volatile uint32_t *)(0x0005F500U + 0x2U))) =
intFlags & 0x0000FFFFU;
(*((volatile uint32_t *)(0x0005F500U + 0x22U))) =
(intFlags & 0x000F0000U) >> 16U;
__edis();
}
//*****************************************************************************
//
//! Clears RAM access violation flags.
//!
//! \param intFlags is a bit mask of the access violation flags to be cleared.
//! Can be a logical OR any of the following values:
//! - \b MEMCFG_NMVIOL_CPUREAD - Non-controller CPU read access
//! - \b MEMCFG_NMVIOL_CPUWRITE - Non-controller CPU write access
//! - \b MEMCFG_NMVIOL_CPUFETCH - Non-controller CPU fetch access
//! - \b MEMCFG_NMVIOL_DMAWRITE - Non-controller DMA write access
//! - \b MEMCFG_NMVIOL_CLA1READ - Non-controller CLA1 read access
//! - \b MEMCFG_NMVIOL_CLA1WRITE - Non-controller CLA1 write access
//! - \b MEMCFG_NMVIOL_CLA1FETCH - Non-controller CLA1 fetch access
//! - \b MEMCFG_NMVIOL_DMAREAD - Non-controller DMA read access
//! - \b MEMCFG_NMVIOL_HICREAD - Non-controller HIC read access
//! - \b MEMCFG_NMVIOL_HICWRITE - Non-controller HIC write access
//! - \b MEMCFG_MVIOL_CPUFETCH - Controller CPU fetch access
//! - \b MEMCFG_MVIOL_CPUWRITE - Controller CPU write access
//! - \b MEMCFG_MVIOL_DMAWRITE - Controller DMA write access
//! - \b MEMCFG_MVIOL_HICWRITE - Controller HIC write access
//!
//! \return None.
//
//*****************************************************************************
static inline void
MemCfg_clearViolationInterruptStatus(uint32_t intFlags)
{
//
// Clear the requested access violation flags.
//
__eallow();
(*((volatile uint32_t *)(0x0005F500U + 0x4U))) |=
intFlags & 0x0000FFFFU;
(*((volatile uint32_t *)(0x0005F500U + 0x24U))) |=
(intFlags & 0x000F0000U) >> 16U;
__edis();
}
//*****************************************************************************
//
//! Sets the correctable error threshold value.
//!
//! \param threshold is the correctable error threshold.
//!
//! This value sets the error-count threshold at which a correctable error
//! interrupt is generated. That is when the error count register reaches the
//! value specified by the \e threshold parameter, an interrupt is
//! generated if it is enabled.
//!
//! \return None.
//
//*****************************************************************************
static inline void
MemCfg_setCorrErrorThreshold(uint32_t threshold)
{
//
// Write the threshold value to the appropriate register.
//
__eallow();
(*((volatile uint32_t *)(0x0005F540U + 0x30U))) = threshold;
__edis();
}
//*****************************************************************************
//
//! Gets the correctable error count.
//!
//! \return Returns the number of correctable error have occurred.
//
//*****************************************************************************
static inline uint32_t
MemCfg_getCorrErrorCount(void)
{
//
// Read and return the number of errors that have occurred.
//
return((*((volatile uint32_t *)(0x0005F540U + 0x2EU))));
}
//*****************************************************************************
//
//! Enables individual RAM correctable error interrupt sources.
//!
//! \param intFlags is a bit mask of the interrupt sources to be enabled. Can
//! take the value \b MEMCFG_CERR_CPUREAD only. Other values are reserved.
//!
//! This function enables the indicated RAM correctable error interrupt
//! sources. Only the sources that are enabled can be reflected to the
//! processor interrupt; disabled sources have no effect on the processor.
//!
//! \note Note that only correctable errors may generate interrupts.
//!
//! \return None.
//
//*****************************************************************************
static inline void
MemCfg_enableCorrErrorInterrupt(uint32_t intFlags)
{
//
// Enable the specified interrupts.
//
__eallow();
(*((volatile uint32_t *)(0x0005F540U + 0x38U))) |= intFlags;
__edis();
}
//*****************************************************************************
//
//! Disables individual RAM correctable error interrupt sources.
//!
//! \param intFlags is a bit mask of the interrupt sources to be disabled. Can
//! take the value \b MEMCFG_CERR_CPUREAD only. Other values are reserved.
//!
//! This function disables the indicated RAM correctable error interrupt
//! sources. Only the sources that are enabled can be reflected to the
//! processor interrupt; disabled sources have no effect on the processor.
//!
//! \note Note that only correctable errors may generate interrupts.
//!
//! \return None.
//
//*****************************************************************************
static inline void
MemCfg_disableCorrErrorInterrupt(uint32_t intFlags)
{
//
// Disable the specified interrupts.
//
__eallow();
(*((volatile uint32_t *)(0x0005F540U + 0x38U))) &= ~(intFlags);
__edis();
}
//*****************************************************************************
//
//! Gets the current RAM correctable error interrupt status.
//!
//! \return Returns the current error interrupt status. Will return a value of
//! \b MEMCFG_CERR_CPUREAD if an interrupt has been generated. If not, the
//! function will return 0.
//
//*****************************************************************************
static inline uint32_t
MemCfg_getCorrErrorInterruptStatus(void)
{
//
// Read and return correctable error interrupt flags.
//
return((*((volatile uint32_t *)(0x0005F540U + 0x32U))));
}
//*****************************************************************************
//
//! Sets the RAM correctable error interrupt status.
//!
//! \param intFlags is a bit mask of the interrupt sources to be set. Can take
//! the value \b MEMCFG_CERR_CPUREAD only. Other values are reserved.
//!
//! This function sets the correctable error interrupt flag.
//!
//! \note Note that only correctable errors may generate interrupts.
//!
//! \return None.
//
//*****************************************************************************
static inline void
MemCfg_forceCorrErrorInterrupt(uint32_t intFlags)
{
//
// Write the flags to the appropriate SET register.
//
__eallow();
(*((volatile uint32_t *)(0x0005F540U + 0x36U))) = intFlags;
__edis();
}
//*****************************************************************************
//
//! Clears the RAM correctable error interrupt status.
//!
//! \param intFlags is a bit mask of the interrupt sources to be cleared. Can
//! take the value \b MEMCFG_CERR_CPUREAD only. Other values are reserved.
//!
//! This function clears the correctable error interrupt flag.
//!
//! \note Note that only correctable errors may generate interrupts.
//!
//! \return None.
//
//*****************************************************************************
static inline void
MemCfg_clearCorrErrorInterruptStatus(uint32_t intFlags)
{
//
// Clear the requested flags.
//
__eallow();
(*((volatile uint32_t *)(0x0005F540U + 0x34U))) |= intFlags;
__edis();
}
//*****************************************************************************
//
//! Gets the current correctable RAM error status.
//!
//! \return Returns the current error status, enumerated as a bit field of
//! \b MEMCFG_CERR_CPUREAD, \b MEMCFG_CERR_DMAREAD, or \b MEMCFG_CERR_CLA1READ
//
//*****************************************************************************
static inline uint32_t
MemCfg_getCorrErrorStatus(void)
{
//
// Read and return RAM error status flags.
//
return((*((volatile uint32_t *)(0x0005F540U + 0x20U))));
}
//*****************************************************************************
//
//! Gets the current uncorrectable RAM error status.
//!
//! \return Returns the current error status, enumerated as a bit field of
//! \b MEMCFG_UCERR_CPUREAD, \b MEMCFG_UCERR_DMAREAD, \b MEMCFG_UCERR_CLA1READ
//! or \b MEMCFG_UCERR_HICREAD.
//
//*****************************************************************************
static inline uint32_t
MemCfg_getUncorrErrorStatus(void)
{
//
// Read and return RAM error status flags.
//
return((*((volatile uint32_t *)(0x0005F540U + 0x0U))));
}
//*****************************************************************************
//
//! Sets the specified correctable RAM error status flag.
//!
//! \param stsFlags is a bit mask of the error sources. This parameter can be
//! any of the following values:
//! \b MEMCFG_CERR_CPUREAD, \b MEMCFG_CERR_DMAREAD, or \b MEMCFG_CERR_CLA1READ
//!
//! This function sets the specified correctable RAM error status flag.
//!
//! \return None.
//
//*****************************************************************************
static inline void
MemCfg_forceCorrErrorStatus(uint32_t stsFlags)
{
//
// Write the flags to the appropriate SET register.
//
__eallow();
(*((volatile uint32_t *)(0x0005F540U + 0x22U))) = stsFlags;
__edis();
}
//*****************************************************************************
//
//! Sets the specified uncorrectable RAM error status flag.
//!
//! \param stsFlags is a bit mask of the error sources. This parameter can be
//! any of the following values:
//! \b MEMCFG_UCERR_CPUREAD, \b MEMCFG_UCERR_DMAREAD, \b MEMCFG_UCERR_CLA1READ
//! or \b MEMCFG_UCERR_HICREAD.
//!
//! This function sets the specified uncorrectable RAM error status flag.
//!
//! \return None.
//
//*****************************************************************************
static inline void
MemCfg_forceUncorrErrorStatus(uint32_t stsFlags)
{
//
// Write the flags to the appropriate SET register.
//
__eallow();
(*((volatile uint32_t *)(0x0005F540U + 0x2U))) = stsFlags;
__edis();
}
//*****************************************************************************
//
//! Clears correctable RAM error flags.
//!
//! \param stsFlags is a bit mask of the status flags to be cleared.
//! This parameter can be any of the following :
//! \b MEMCFG_CERR_CPUREAD, \b MEMCFG_CERR_DMAREAD, or \b MEMCFG_CERR_CLA1READ
//!
//! This function clears the specified correctable RAM error flags.
//!
//! \return None.
//
//*****************************************************************************
static inline void
MemCfg_clearCorrErrorStatus(uint32_t stsFlags)
{
//
// Clear the requested flags.
//
__eallow();
(*((volatile uint32_t *)(0x0005F540U + 0x24U))) |= stsFlags;
__edis();
}
//*****************************************************************************
//
//! Clears uncorrectable RAM error flags.
//!
//! \param stsFlags is a bit mask of the status flags to be cleared.
//! This parameter can be any of the following :
//! \b MEMCFG_UCERR_CPUREAD, \b MEMCFG_UCERR_DMAREAD, \b MEMCFG_UCERR_CLA1READ
//! or \b MEMCFG_UCERR_HICREAD.
//!
//! This function clears the specified uncorrectable RAM error flags.
//!
//! \return None.
//
//*****************************************************************************
static inline void
MemCfg_clearUncorrErrorStatus(uint32_t stsFlags)
{
//
// Clear the requested flags.
//
__eallow();
(*((volatile uint32_t *)(0x0005F540U + 0x4U))) |= stsFlags;
__edis();
}
//*****************************************************************************
//
//! Gets the diagnostics corr/uncorr memory error status in test mode.
//!
//! \return Returns the diagnostics error status in test mode. It can return
//! following values: \b MEMCFG_DIAGERR_UNCORR, and/or \b MEMCFG_DIAGERR_CORR.
//
//*****************************************************************************
static inline uint32_t
MemCfg_getDiagErrorStatus(void)
{
//
// Returns diag error status.
//
return((*((volatile uint32_t *)(0x0005F590U + 0x0U))));
}
//*****************************************************************************
//
//! Clears the diagnostics corr/uncorr memory error status.
//!
//! \param stsFlags is a bit mask of the status flags to be cleared.
//!
//! This function clears the specified diagnostics corr/uncorr RAM/ROM memory
//! error flags in test mode. The param \e stsFlags can be any of the following
//! values: \b MEMCFG_DIAGERR_UNCORR, and/or \b MEMCFG_DIAGERR_CORR.
//!
//! \return None.
//
//*****************************************************************************
static inline void
MemCfg_clearDiagErrorStatus(uint32_t stsFlags)
{
//
// Clear diag error status.
//
(*((volatile uint32_t *)(0x0005F590U + 0x2U))) |= stsFlags;
}
//*****************************************************************************
//
//! Gets address location of diagnostics corr/uncorr memory read/write error.
//!
//! \return Return address location of diagnostics corr/uncorr memory error
//! error in test mode.
//
//*****************************************************************************
static inline uint32_t
MemCfg_getDiagErrorAddress(void)
{
//
// Return diag error address.
//
return((*((volatile uint32_t *)(0x0005F590U + 0x4U))));
}
//*****************************************************************************
//
//! Locks the writes to the configuration of specified memory sections.
//!
//! \param memSections is the logical OR of the sections to be configured.
//!
//! This function locks writes to the access protection and controller select
//! configuration of a memory section.That means calling MemCfg_setProtection()
//! or MemCfg_setLSRAMControllerSel() for a locked memory section will have no
//! effect until MemCfg_unlockConfig() is called.
//!
//! The \e memSections parameter is an OR of one of the following sets of
//! indicators:
//! - \b MEMCFG_SECT_M0 and \b MEMCFG_SECT_M1 or \b MEMCFG_SECT_DX_ALL
//! - \b MEMCFG_SECT_LS0 through \b MEMCFG_SECT_LSx or \b MEMCFG_SECT_LSX_ALL
//! - \b MEMCFG_SECT_GS0 through \b MEMCFG_SECT_GSx or \b MEMCFG_SECT_GSX_ALL
//! - \b MEMCFG_SECT_MSGCLA1TOCPU, \b MEMCFG_SECT_MSGCPUTOCLA1
//! \b MEMCFG_SECT_MSGCLA1TODMA, \b MEMCFG_SECT_MSGDMATOCLA1, or use
//! \b MEMCFG_SECT_MSGX_ALL to configure all message RAM sections.
//! - \b OR use \b MEMCFG_SECT_ALL to configure all possible sections.
//!
//! \return None.
//
//*****************************************************************************
extern void
MemCfg_lockConfig(uint32_t memSections);
//*****************************************************************************
//
//! Unlocks the writes to the configuration of a memory section.
//!
//! \param memSections is the logical OR of the sections to be configured.
//!
//! This function unlocks writes to the access protection and controller select
//! configuration of a memory section that has been locked using
//! MemCfg_lockConfig().
//!
//! The \e memSections parameter is an OR of one of the following sets of
//! indicators:
//! - \b MEMCFG_SECT_M0 and \b MEMCFG_SECT_M1 or \b MEMCFG_SECT_DX_ALL
//! - \b MEMCFG_SECT_LS0 through \b MEMCFG_SECT_LSx or \b MEMCFG_SECT_LSX_ALL
//! - \b MEMCFG_SECT_GS0 through \b MEMCFG_SECT_GSx or \b MEMCFG_SECT_GSX_ALL
//! - \b MEMCFG_SECT_MSGCLA1TOCPU, \b MEMCFG_SECT_MSGCPUTOCLA1
//! \b MEMCFG_SECT_MSGCLA1TODMA, \b MEMCFG_SECT_MSGDMATOCLA1, or use
//! \b MEMCFG_SECT_MSGX_ALL to configure all message RAM sections.
//! - \b OR use \b MEMCFG_SECT_ALL to configure all possible sections.
//!
//! \return None.
//
//*****************************************************************************
extern void
MemCfg_unlockConfig(uint32_t memSections);
//*****************************************************************************
//
//! Permanently locks writes to the configuration of a memory section.
//!
//! \param memSections is the logical OR of the sections to be configured.
//!
//! This function permanently locks writes to the access protection and
//! controller select configuration of a memory section. That means calling
//! MemCfg_setProtection() or MemCfg_setLSRAMControllerSel() for a locked memory
//! section will have no effect. To lock the configuration in a nonpermanent
//! way, use MemCfg_lockConfig().
//!
//! The \e memSections parameter is an OR of one of the following sets of
//! indicators:
//! - \b MEMCFG_SECT_M0 and \b MEMCFG_SECT_M1 or \b MEMCFG_SECT_DX_ALL
//! - \b MEMCFG_SECT_LS0 through \b MEMCFG_SECT_LSx or \b MEMCFG_SECT_LSX_ALL
//! - \b MEMCFG_SECT_GS0 through \b MEMCFG_SECT_GSx or \b MEMCFG_SECT_GSX_ALL
//! - \b MEMCFG_SECT_MSGCLA1TOCPU, \b MEMCFG_SECT_MSGCPUTOCLA1
//! \b MEMCFG_SECT_MSGCLA1TODMA, \b MEMCFG_SECT_MSGDMATOCLA1, or use
//! \b MEMCFG_SECT_MSGX_ALL to configure all message RAM sections.
//! - \b OR use \b MEMCFG_SECT_ALL to configure all possible sections.
//!
//! \return None.
//
//*****************************************************************************
extern void
MemCfg_commitConfig(uint32_t memSections);
//*****************************************************************************
//
//! Sets the access protection mode of a single memory section.
//!
//! \param memSection is the memory section to be configured.
//! \param protectMode is the logical OR of the settings to be applied.
//!
//! This function sets the access protection mode of a specified memory section.
//! The mode is passed into the \e protectMode parameter as the logical OR of
//! the following values:
//! - \b MEMCFG_PROT_ALLOWCPUFETCH or \b MEMCFG_PROT_BLOCKCPUFETCH - CPU fetch
//! - \b MEMCFG_PROT_ALLOWCPUWRITE or \b MEMCFG_PROT_BLOCKCPUWRITE - CPU write
//! - \b MEMCFG_PROT_ALLOWDMAWRITE or \b MEMCFG_PROT_BLOCKDMAWRITE - DMA write
//! - \b MEMCFG_PROT_ALLOWHICWRITE or \b MEMCFG_PROT_BLOCKHICWRITE - HIC write
//!
//! The \e memSection parameter is one of the following indicators:
//! - \b MEMCFG_SECT_M0 or \b MEMCFG_SECT_M1
//! - \b MEMCFG_SECT_LS0 through \b MEMCFG_SECT_LSx
//! - \b MEMCFG_SECT_GS0 through \b MEMCFG_SECT_GSx
//!
//! This function will have no effect if the associated registers have been
//! locked by MemCfg_lockConfig() or MemCfg_commitConfig() or if the memory
//! is configured as CLA program memory.
//!
//! \return None.
//
//*****************************************************************************
extern void
MemCfg_setProtection(uint32_t memSection, uint32_t protectMode);
//*****************************************************************************
//
//! Sets the controller of the specified LSxRAM section.
//!
//! \param ramSection is the LSxRAM section to be configured.
//! \param controllerSel is the sharing selection.
//!
//! This function sets the controller select configuration of the LSxRAM
//! section.
//! If the \e controllerSel parameter is \b MEMCFG_LSRAMCONTROLLER_CPU_ONLY,
//! the LSxRAM section passed into the \e ramSection parameter will be dedicated
//! to the CPU. If \b MEMCFG_LSRAMCONTROLLER_CPU_CLA1, the memory section will
//! be shared between the CPU and the CLA.
//!
//! The \e ramSection parameter should be a value from \b MEMCFG_SECT_LS0
//! through \b MEMCFG_SECT_LSx.
//!
//! This function will have no effect if the associated registers have been
//! locked by MemCfg_lockConfig() or MemCfg_commitConfig().
//!
//! \note This API only applies to LSxRAM.
//!
//! \return None.
//
//*****************************************************************************
extern void
MemCfg_setLSRAMControllerSel(uint32_t ramSection,
MemCfg_LSRAMControllerSel controllerSel);
//*****************************************************************************
//
//! Locks the writes to the test mode configuration of specified memory
//! sections.
//!
//! \param memSections is the logical OR of the sections to be configured.
//!
//! This function locks writes to the test mode configuration of a RAM section.
//! That means calling MemCfg_setTestMode() for a locked RAM section will have
//! no effect until MemCfg_unlockTestConfig() is called.
//!
//! The \e memSections parameter is an OR of one of the following sets of
//! indicators:
//! - \b MEMCFG_SECT_M0, \b MEMCFG_SECT_M1, or use \b MEMCFG_SECT_DX_ALL
//! - \b MEMCFG_SECT_LS0 through \b MEMCFG_SECT_LSx or use
//! \b MEMCFG_SECT_LSX_ALL to configure all possible LSRAM sections.
//! - \b MEMCFG_SECT_GS0 through \b MEMCFG_SECT_GSx or use
//! \b MEMCFG_SECT_GSX_ALL to configure all possible GSRAM sections.
//! - \b MEMCFG_SECT_MSGCPUTOCLA1, \b MEMCFG_SECT_MSGCLA1TOCPU,
//! \b MEMCFG_SECT_MSGCLA1TODMA, \b MEMCFG_SECT_MSGDMATOCLA1, or use
//! \b MEMCFG_SECT_MSGX_ALL to configure all possible message RAM sections.
//! - \b OR use \b MEMCFG_SECT_ALL to configure all possible sections.
//!
//! \return None.
//
//*****************************************************************************
extern void
MemCfg_lockTestConfig(uint32_t memSections);
//*****************************************************************************
//
//! Unlocks the writes to the test mode configuration of specified memory
//! sections.
//!
//! \param memSections is the logical OR of the sections to be configured.
//!
//! This function unlocks writes to the test mode configuration of a RAM
//! section that has been locked using MemCfg_lockTestConfig().
//!
//! The \e memSections parameter is an OR of one of the following sets of
//! indicators:
//! - \b MEMCFG_SECT_M0, \b MEMCFG_SECT_M1, or use \b MEMCFG_SECT_DX_ALL
//! - \b MEMCFG_SECT_LS0 through \b MEMCFG_SECT_LSx or use
//! \b MEMCFG_SECT_LSX_ALL to configure all possible LSRAM sections.
//! - \b MEMCFG_SECT_GS0 through \b MEMCFG_SECT_GSx or use
//! \b MEMCFG_SECT_GSX_ALL to configure all possible GSRAM sections.
//! - \b MEMCFG_SECT_MSGCPUTOCLA1, \b MEMCFG_SECT_MSGCLA1TOCPU,
//! \b MEMCFG_SECT_MSGCLA1TODMA, \b MEMCFG_SECT_MSGDMATOCLA1, or use
//! \b MEMCFG_SECT_MSGX_ALL to configure all possible message RAM sections.
//! - \b OR use \b MEMCFG_SECT_ALL to configure all possible sections.
//!
//! \return None.
//
//*****************************************************************************
extern void
MemCfg_unlockTestConfig(uint32_t memSections);
//*****************************************************************************
//
//! Sets the test mode of the specified memory section.
//!
//! \param memSection is the memory section to be configured.
//! \param testMode is the test mode selected.
//!
//! This function sets the test mode configuration of the RAM section. The
//! \e testMode parameter can take one of the following values:
//! - \b MEMCFG_TEST_FUNCTIONAL
//! - \b MEMCFG_TEST_WRITE_DATA
//! - \b MEMCFG_TEST_WRITE_ECC
//! - \b MEMCFG_TEST_WRITE_PARITY
//! - \b MEMCFG_TEST_FUNC_DIAG
//!
//! The \e memSection parameter is one of the following indicators:
//! - \b MEMCFG_SECT_M0, \b MEMCFG_SECT_M1
//! - \b MEMCFG_SECT_LS0 through \b MEMCFG_SECT_LSx
//! - \b MEMCFG_SECT_GS0 through \b MEMCFG_SECT_GSx
//! - \b MEMCFG_SECT_MSGCPUTOCLA1, \b MEMCFG_SECT_MSGCLA1TOCPU,
//! \b MEMCFG_SECT_MSGCLA1TODMA, \b MEMCFG_SECT_MSGDMATOCLA1
//!
//! \return None.
//
//*****************************************************************************
extern void
MemCfg_setTestMode(uint32_t memSection, MemCfg_TestMode testMode);
//*****************************************************************************
//
//! Starts the initialization the specified RAM sections.
//!
//! \param ramSections is the logical OR of the sections to be initialized.
//!
//! This function starts the initialization of the specified RAM sections. Use
//! MemCfg_getInitStatus() to check if the initialization is done.
//!
//! The \e ramSections parameter is an OR of one of the following sets of
//! indicators:
//! - \b MEMCFG_SECT_M0, \b MEMCFG_SECT_M1, or \b MEMCFG_SECT_DX_ALL
//! - \b MEMCFG_SECT_LS0 through \b MEMCFG_SECT_LSx, or \b MEMCFG_SECT_LSX_ALL
//! - \b MEMCFG_SECT_GS0 through \b MEMCFG_SECT_GSx, or \b MEMCFG_SECT_GSX_ALL
//! - \b MEMCFG_SECT_MSGCPUTOCLA1, \b MEMCFG_SECT_MSGCLA1TOCPU,
//! \b MEMCFG_SECT_MSGCLA1TODMA, \b MEMCFG_SECT_MSGDMATOCLA1, or
//! \b MEMCFG_SECT_MSGX_ALL
//! - \b OR use \b MEMCFG_SECT_ALL to configure all possible sections.
//!
//! \return None.
//
//*****************************************************************************
extern void
MemCfg_initSections(uint32_t ramSections);
//*****************************************************************************
//
//! Get the status of initialized RAM sections.
//!
//! \param ramSections is the logical OR of the sections to be checked.
//!
//! This function gets the initialization status of the RAM sections specified
//! by the \e ramSections parameter.
//!
//! The \e ramSections parameter is an OR of one of the following sets of
//! indicators:
//! - \b MEMCFG_SECT_M0, \b MEMCFG_SECT_M1, or \b MEMCFG_SECT_DX_ALL
//! - \b MEMCFG_SECT_LS0 through \b MEMCFG_SECT_LSx, or \b MEMCFG_SECT_LSX_ALL
//! - \b MEMCFG_SECT_GS0 through \b MEMCFG_SECT_GSx, or \b MEMCFG_SECT_GSX_ALL
//! - \b MEMCFG_SECT_MSGCPUTOCLA1, \b MEMCFG_SECT_MSGCLA1TOCPU,
//! \b MEMCFG_SECT_MSGCLA1TODMA, \b MEMCFG_SECT_MSGDMATOCLA1, or
//! \b MEMCFG_SECT_MSGX_ALL
//! - \b OR use \b MEMCFG_SECT_ALL to get status of all possible sections.
//!
//! \note Use MemCfg_initSections() to start the initialization.
//!
//! \return Returns \b true if all the sections specified by \e ramSections
//! have been initialized and \b false if not.
//
//*****************************************************************************
extern _Bool
MemCfg_getInitStatus(uint32_t ramSections);
//*****************************************************************************
//
//! Get the violation address associated with a intFlag.
//!
//! \param intFlag is the type of access violation as indicated by ONE of
//! these values:
//! - \b MEMCFG_NMVIOL_CPUREAD - Non-controller CPU read access
//! - \b MEMCFG_NMVIOL_CPUWRITE - Non-controller CPU write access
//! - \b MEMCFG_NMVIOL_CPUFETCH - Non-controller CPU fetch access
//! - \b MEMCFG_NMVIOL_DMAWRITE - Non-controller DMA write access
//! - \b MEMCFG_NMVIOL_CLA1READ - Non-controller CLA1 read access
//! - \b MEMCFG_NMVIOL_CLA1WRITE - Non-controller CLA1 write access
//! - \b MEMCFG_NMVIOL_CLA1FETCH - Non-controller CLA1 fetch access
//! - \b MEMCFG_NMVIOL_DMAREAD - Non-controller DMA read access
//! - \b MEMCFG_NMVIOL_HICREAD - Non-controller HIC read access
//! - \b MEMCFG_NMVIOL_HICWRITE - Non-controller HIC write access
//! - \b MEMCFG_MVIOL_CPUFETCH - Controller CPU fetch access
//! - \b MEMCFG_MVIOL_CPUWRITE - Controller CPU write access
//! - \b MEMCFG_MVIOL_DMAWRITE - Controller DMA write access
//! - \b MEMCFG_MVIOL_HICWRITE - Controller HIC write access
//!
//! \return Returns the violation address associated with the \e intFlag.
//
//*****************************************************************************
extern uint32_t
MemCfg_getViolationAddress(uint32_t intFlag);
//*****************************************************************************
//
//! Get the correctable error address associated with a stsFlag.
//!
//! \param stsFlag is the type of error to which the returned address will
//! correspond. It can take following values: \b MEMCFG_CERR_CPUREAD,
//! \b MEMCFG_CERR_CLA1READ, \b MEMCFG_CERR_DMAREAD.
//!
//! \return Returns the error address associated with the stsFlag.
//
//*****************************************************************************
extern uint32_t
MemCfg_getCorrErrorAddress(uint32_t stsFlag);
//*****************************************************************************
//
//! Get the uncorrectable error address associated with a stsFlag.
//!
//! \param stsFlag is the type of error to which the returned address will
//! correspond. It may be passed one of these values:
//! \b MEMCFG_UCERR_CPUREAD, \b MEMCFG_UCERR_DMAREAD, or
//! \b MEMCFG_UCERR_CLA1READ values
//!
//! \return Returns the error address associated with the stsFlag.
//
//*****************************************************************************
extern uint32_t
MemCfg_getUncorrErrorAddress(uint32_t stsFlag);
//*****************************************************************************
//
//! Forces parity error in the selected memory.
//!
//! \param memSections is the logical OR of the sections to be tested.
//!
//! This function forces the parity error in the memories specified
//! by the \e memSections parameter.
//!
//! The \e memSections parameter is an OR of one of the following sets of
//! indicators:
//! - \b MEMCFG_SECT_ROMBOOT, \b MEMCFG_SECT_ROMSECURE ,
//! \b MEMCFG_SECT_ROMCLADATA, \b MEMCFG_SECT_ROM_ALL.
//! - \b OR use \b MEMCFG_SECT_ALL to force parity error in all possible
//! memory sections.
//!
//! \return None.
//
//*****************************************************************************
extern void
MemCfg_forceMemError(uint32_t memSections);
//*****************************************************************************
//
// Close the Doxygen group.
//! @}
//
//*****************************************************************************
//*****************************************************************************
//
// Mark the end of the C bindings section for C++ compilers.
//
//*****************************************************************************
//###########################################################################
//
// FILE: pin_map.h
//
// TITLE: Definitions of pin mux info for gpio.c.
//
//###########################################################################
// $Copyright:
// Copyright (C) 2023 Texas Instruments Incorporated - http://www.ti.com/
//
// 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 Texas Instruments Incorporated 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
// OWNER 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.
// $
//###########################################################################
//*****************************************************************************
// 0x00000003 = MUX register value
// 0x0000000C = GMUX register value
// 0x0000FF00 = Shift amount within mux registers
// 0xFFFF0000 = Offset of MUX register
//*****************************************************************************
//#############################################################################
//
// FILE: pmbus.h
//
// TITLE: C28x PMBUS Driver
//
//#############################################################################
// $Copyright:
// Copyright (C) 2023 Texas Instruments Incorporated - http://www.ti.com/
//
// 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 Texas Instruments Incorporated 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
// OWNER 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.
// $
//#############################################################################
//*****************************************************************************
//
// If building with a C++ compiler, make all of the definitions in this header
// have a C binding.
//
//*****************************************************************************
//*****************************************************************************
//
//! \addtogroup pmbus_api PMBus
//! @{
//
//
// Defines for the API.
//
//*****************************************************************************
//###########################################################################
//
// FILE: hw_pmbus.h
//
// TITLE: Definitions for the PMBUS registers.
//
//###########################################################################
// $Copyright:
// Copyright (C) 2023 Texas Instruments Incorporated - http://www.ti.com/
//
// 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 Texas Instruments Incorporated 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
// OWNER 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.
// $
//###########################################################################
//*************************************************************************************************
//
// The following are defines for the PMBUS register offsets
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the PMBMC register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the PMBACK register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the PMBSTS register
//
//*************************************************************************************************
// Data Register
//*************************************************************************************************
//
// The following are defines for the bit fields in the PMBINTM register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the PMBSC register
//
//*************************************************************************************************
// slave.
// Register
// acknowledge
//*************************************************************************************************
//
// The following are defines for the bit fields in the PMBHSA register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the PMBCTRL register
//
//*************************************************************************************************
// GPIO Mode
// mode
// GPIO Mode
// GPIO mode
// in GPIO Mode
// GPIO mode
// in GPIO Mode
// GPIO mode
//*************************************************************************************************
//
// The following are defines for the bit fields in the PMBTIMCTL register
//
//*************************************************************************************************
// parameters.
//*************************************************************************************************
//
// The following are defines for the bit fields in the PMBTIMCLK register
//
//*************************************************************************************************
// pulse width.
// frequency.
//*************************************************************************************************
//
// The following are defines for the bit fields in the PMBTIMSTSETUP register
//
//*************************************************************************************************
// start edge.
//*************************************************************************************************
//
// The following are defines for the bit fields in the PMBTIMBIDLE register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the PMBTIMLOWTIMOUT register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the PMBTIMHIGHTIMOUT register
//
//*************************************************************************************************
// value
//#############################################################################
//
// FILE: pmbus_common.h
//
// TITLE: C28x PMBUS Driver
//
//###########################################################################
// $Copyright:
// Copyright (C) 2023 Texas Instruments Incorporated - http://www.ti.com/
//
// 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 Texas Instruments Incorporated 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
// OWNER 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.
// $
//###########################################################################
//*****************************************************************************
//
// If building with a C++ compiler, make all of the definitions in this header
// have a C binding.
//
//*****************************************************************************
//*****************************************************************************
//
//! \addtogroup pmbus_api PMBus
//! @{
//
//
// Defines for the API.
//
//*****************************************************************************
//*****************************************************************************
//
//PMBus Version 1.2 command number constants:
//
//*****************************************************************************
//! PMBus Command PAGE
//! PMBus Command OPERATION
//! PMBus Command ON_OFF_CONFIG
//! PMBus Command CLEAR_FAULTS
//! PMBus Command PHASE
//! PMBus Command PAGE_PLUS_WRITE
//! PMBus Command PAGE_PLUS_READ
// 0x07-0x0F Reserved
//! PMBus Command WRITE_PROTECT
//! PMBus Command STORE_DEFAULT_ALL
//! PMBus Command RESTORE_DEFAULT_ALL
//! PMBus Command STORE_DEFAULT_CODE
//! PMBus Command RESTORE_DEFAULT_CODE
//! PMBus Command STORE_USER_ALL
//! PMBus Command RESTORE_USER_ALL
//! PMBus Command STORE_USER_CODE
//! PMBus Command RESTORE_USER_CODE
//! PMBus Command CAPABILITY
//! PMBus Command QUERY
//! PMBus Command SMBALERT_MASK
// 0x1C - 0x1F Reserved
//! PMBus Command VOUT_MODE
//! PMBus Command VOUT_COMMAND
//! PMBus Command VOUT_TRIM
//! PMBus Command VOUT_CAL_OFFSET
//! PMBus Command VOUT_MAX
//! PMBus Command VOUT_MARGIN_HIGH
//! PMBus Command VOUT_MARGIN_LOW
//! PMBus Command VOUT_TRANSITION_RATE
//! PMBus Command VOUT_DROOP
//! PMBus Command VOUT_SCALE_LOOP
//! PMBus Command VOUT_SCALE_MONITOR
// 0x2B - 0x2F Reserved
//! PMBus Command COEFFICIENTS
//! PMBus Command POUT_MAX
//! PMBus Command MAX_DUTY
//! PMBus Command FREQUENCY_SWITCH
// 0x34 Reserved
//! PMBus Command VIN_ON
//! PMBus Command VIN_OFF
//! PMBus Command INTERLEAVE
//! PMBus Command IOUT_CAL_GAIN
//! PMBus Command IOUT_CAL_OFFSET
//! PMBus Command FAN_CONFIG_1_2
//! PMBus Command FAN_COMMAND_1
//! PMBus Command FAN_COMMAND_2
//! PMBus Command FAN_CONFIG_3_4
//! PMBus Command FAN_COMMAND_3
//! PMBus Command FAN_COMMAND_4
//! PMBus Command VOUT_OV_FAULT_LIMIT
//! PMBus Command VOUT_OV_FAULT_RESPONSE
//! PMBus Command VOUT_OV_WARN_LIMIT
//! PMBus Command VOUT_UV_WARN_LIMIT
//! PMBus Command VOUT_UV_FAULT_LIMIT
//! PMBus Command VOUT_UV_FAULT_RESPONSE
//! PMBus Command IOUT_OC_FAULT_LIMIT
//! PMBus Command IOUT_OC_FAULT_RESPONSE
//! PMBus Command IOUT_OC_LV_FAULT_LIMIT
//! PMBus Command IOUT_OC_LV_FAULT_RESPONSE
//! PMBus Command IOUT_OC_WARN_LIMIT
//! PMBus Command IOUT_UC_FAULT_LIMIT
//! PMBus Command IOUT_UC_FAULT_RESPONSE
// 0x4D – 0x4E Reserved
//! PMBus Command OT_FAULT_LIMIT
//! PMBus Command OT_FAULT_RESPONSE
//! PMBus Command OT_WARN_LIMIT
//! PMBus Command UT_WARN_LIMIT
//! PMBus Command UT_FAULT_LIMIT
//! PMBus Command UT_FAULT_RESPONSE
//! PMBus Command VIN_OV_FAULT_LIMIT
//! PMBus Command VIN_OV_FAULT_RESPONSE
//! PMBus Command VIN_OV_WARN_LIMIT
//! PMBus Command VIN_UV_WARN_LIMIT
//! PMBus Command VIN_UV_FAULT_LIMIT
//! PMBus Command VIN_UV_FAULT_RESPONSE
//! PMBus Command IIN_OC_FAULT_LIMIT (For CBC current limit)
//! PMBus Command IIN_OC_FAULT_RESPONSE
//! PMBus Command IIN_OC_WARN_LIMIT
//! PMBus Command POWER_GOOD_ON
//! PMBus Command POWER_GOOD_OFF
//! PMBus Command TON_DELAY
//! PMBus Command TON_RISE
//! PMBus Command TON_MAX_FAULT_LIMIT
//! PMBus Command TON_MAX_FAULT_RESPONSE
//! PMBus Command TOFF_DELAY
//! PMBus Command TOFF_FALL
//! PMBus Command TOFF_MAX_WARN_LIMIT
// 0x67 Rsvd Deleted PMBus v1.1
//! PMBus Command POUT_OP_FAULT_LIMIT
//! PMBus Command POUT_OP_FAULT_RESPONSE
//! PMBus Command POUT_OP_WARN_LIMIT
//! PMBus Command PIN_OP_WARN_LIMIT
// 0x6C - 0x77 Reserved
//! PMBus Command STATUS_BYTE
//! PMBus Command STATUS_WORD
//! PMBus Command STATUS_VOUT
//! PMBus Command STATUS_IOUT
//! PMBus Command STATUS_INPUT
//! PMBus Command STATUS_TEMPERATURE
//! PMBus Command STATUS_CML
//! PMBus Command STATUS_OTHER
//! PMBus Command STATUS_MFR_SPECIFIC
//! PMBus Command STATUS_FANS_1_2
//! PMBus Command STATUS_FANS_3_4
// 0x83 - 0x85 Reserved
//! PMBus Command READ_EIN
//! PMBus Command READ_EOUT
//! PMBus Command READ_VIN
//! PMBus Command READ_IIN
//! PMBus Command READ_VCAP
//! PMBus Command READ_VOUT
//! PMBus Command READ_IOUT
//! PMBus Command READ_TEMPERATURE_1
//! PMBus Command READ_TEMPERATURE_2
//! PMBus Command READ_TEMPERATURE_3
//! PMBus Command READ_FAN_SPEED_1
//! PMBus Command READ_FAN_SPEED_2
//! PMBus Command READ_FAN_SPEED_3
//! PMBus Command READ_FAN_SPEED_4
//! PMBus Command READ_DUTY_CYCLE
//! PMBus Command READ_FREQUENCY
//! PMBus Command READ_POUT
//! PMBus Command READ_PIN
//! PMBus Command PMBUS_REVISION
//! PMBus Command MFR_ID
//! PMBus Command MFR_MODEL
//! PMBus Command MFR_REVISION
//! PMBus Command MFR_LOCATION
//! PMBus Command MFR_DATE
//! PMBus Command MFR_SERIAL
//! PMBus Command APP_PROFILE_SUPPORT
//! PMBus Command MFR_VIN_MIN
//! PMBus Command MFR_VIN_MAX
//! PMBus Command MFR_IIN_MAX
//! PMBus Command MFR_PIN_MAX
//! PMBus Command MFR_VOUT_MIN
//! PMBus Command MFR_VOUT_MAX
//! PMBus Command MFR_IOUT_MAX
//! PMBus Command MFR_POUT_MAX
//! PMBus Command MFR_TAMBIENT_MAX
//! PMBus Command MFR_TAMBIENT_MIN
//! PMBus Command MFR_EFFICIENCY_LL
//! PMBus Command MFR_EFFICIENCY_HL
//! PMBus Command MFR_PIN_ACURRACY
//! PMBus Command MFR_IC_DEVICE
//! PMBus Command MFR_IC_DEVICE_REV
// 0xAF Reserved
//! PMBus Command USER_DATA_00
//! PMBus Command USER_DATA_01
//! PMBus Command USER_DATA_02
//! PMBus Command USER_DATA_03
//! PMBus Command USER_DATA_04
//! PMBus Command USER_DATA_05
//! PMBus Command USER_DATA_06
//! PMBus Command USER_DATA_07
//! PMBus Command USER_DATA_08
//! PMBus Command USER_DATA_09
//! PMBus Command USER_DATA_10
//! PMBus Command USER_DATA_11
//! PMBus Command USER_DATA_12
//! PMBus Command USER_DATA_13
//! PMBus Command USER_DATA_14
//! PMBus Command USER_DATA_15
//! PMBus Command MFR_MAX_TEMP_1
//! PMBus Command MFR_MAX_TEMP_2
//! PMBus Command MFR_MAX_TEMP_3
// 0xC3-0xCF Reserved
//! PMBus Command MFR_LIGHT_LOAD_ENB
//! PMBus Command MFR_SPECIFIC_01
//! PMBus Command MFR_SPECIFIC_02
//! PMBus Command MFR_SPECIFIC_03
//! PMBus Command MFR_SPECIFIC_04
//! PMBus Command MFR_SPECIFIC_05
//! PMBus Command MFR_SPECIFIC_06
//! PMBus Command MFR_SPECIFIC_07
//! PMBus Command MFR_SPECIFIC_08
//! PMBus Command ROM_MODE
//! PMBus Command USER_RAM_00
//! PMBus Command MFR_PHASE_CONTROL
//! PMBus Command MFR_IOUT_OC_FAULT_LIMIT_LOW
//! PMBus Command MFR_VIN_SCALE
//! PMBus Command MFR_VIN_OFFSET
//! PMBus Command MFR_READ_TEMPERATURE_4
//! PMBus Command MFR_OT_LIMIT_1
//! PMBus Command MFR_OT_LIMIT_2
//! PMBus Command MFR_PARM_INFO
//! PMBus Command MFR_PARM_VALUE
//! PMBus Command MFR_CMDS_DCDC_PAGED
//! PMBus Command MFR_CMDS_DCDC_NONPAGED
//! PMBus Command MFR_CMDS_PFC
//! PMBus Command MFR_SETUP_ID
//! PMBus Command MFR_OT_LIMIT_3
//! PMBus Command MFR_OT_LIMIT_4
//! PMBus Command MFR_DEADBAND_CONFIG
//! PMBus Command MFR_PIN_CAL_A
//! PMBus Command MFR_PIN_CAL_B
//! PMBus Command MFR_PIN_CAL_C
//! PMBus Command MFR_PIN_CAL_D
//! PMBus Command MFR_TEMP_CAL_OFFSET
//! PMBus Command MFR_DEBUG_BUFFER
//! PMBus Command MFR_TEMP_CAL_GAIN
//! PMBus Command MFR_STATUS_BIT_MASK
//! PMBus Command MFR_SPECIFIC_35
//! PMBus Command MFR_SPECIFIC_36
//! PMBus Command MFR_SPECIFIC_37
//! PMBus Command MFR_SPECIFIC_38
//! PMBus Command MFR_SPECIFIC_39
//! PMBus Command MFR_VOUT_CAL_MONITOR
//! PMBus Command ROM_MODE_WITH_PASSWORD
//! PMBus Command MFR_SPECIFIC_42
//! PMBus Command MFR_SPECIFIC_43
//! PMBus Command MFR_SPECIFIC_44
//! PMBus Command MFR_DEVICE_ID
//! PMBus Command MFR_SPECIFIC_COMMAND
//! PMBus Command PMBUS_COMMAND_EXT
//*****************************************************************************
//
//! Transaction Descriptor
//!
//! Defines the transaction type, used in the command object
//! and passed to PMBus_configTransfer()
//
//*****************************************************************************
typedef enum{
PMBUS_TRANSACTION_NONE = 0U, //!< No Transaction
PMBUS_TRANSACTION_QUICKCOMMAND = 1U, //!< Quick Command
PMBUS_TRANSACTION_WRITEBYTE = 2U, //!< Write single byte
PMBUS_TRANSACTION_READBYTE = 3U, //!< Read single byte
PMBUS_TRANSACTION_SENDBYTE = 4U, //!< Send Byte
PMBUS_TRANSACTION_RECEIVEBYTE = 5U, //!< Receive Byte
PMBUS_TRANSACTION_BLOCKWRITE = 6U, //!< Block Write (up to 255 bytes)
PMBUS_TRANSACTION_BLOCKREAD = 7U, //!< Block Read (up to 255 bytes)
PMBUS_TRANSACTION_WRITEWORD = 8U, //!< Write word
PMBUS_TRANSACTION_READWORD = 9U, //!< Read word
PMBUS_TRANSACTION_BLOCKWRPC = 10U //!< Block write, then process call
}PMBus_Transaction;
//! Specifies whether to include the CRC8 table in the
//! library build
//*****************************************************************************
//
// PCBCCR Commands -> used in PMBus_configControlleer()
//
//*****************************************************************************
//! Enable Process call message
//! Enable Group command message
//! Enable PEC byte
//! Enable Extended command
//! Enable Command word
//! Enable read
//*****************************************************************************
//
// PMBINTM Commands -> used in PMBus_enableInterrupt() and
// PMBus_disableInterrupt()
//
//*****************************************************************************
//! Bus Free Interrupt
//! Clock Low Time-out Interrupt
//! Data Ready Interrupt
//! Data Request Interrupt
//! Target Address Ready Interrupt
//! End of Message Interrupt
//! Alert Detection Interrupt
//! Control Detection Interrupt
//! Lost Arbitration Interrupt
//! Clock High Detection Interrupt
//! all PMBus interrupts
//*****************************************************************************
//
// PMBSTS Commands -> returned by PMBus_getInterruptStatus()
//
//*****************************************************************************
//! Bus Free Interrupt
//! Clock Low Time-out Interrupt
//! Data Ready Interrupt
//! Data Request Interrupt
//! Target Address Ready Interrupt
//! End of Message Interrupt
//! Alert Detection Interrupt
//! Control Detection Interrupt
//! Lost Arbitration Interrupt
//! Clock High Detection Interrupt
//*****************************************************************************
//
// PMBSC Commands -> They are used in the configWord passed to
// PMBus_configTarget()
//
//*****************************************************************************
//! Enable manual target ack modes
//! Enable PEC byte processing
//! Transmit PEC at end of transaction
//! Data Request flag generated after
//! receipt of command code, firmware
//! required to issue ACK to continue message
//! any bits cleared in target address mask
//! make that bit a don't care
//! Target will auto acknowledge every
//! received byte
//! Target will auto acknowledge every
//! 2 received bytes
//! Target will auto acknowledge every
//! 3 received bytes
//! Target will auto acknowledge every
//! 4 received bytes
//*****************************************************************************
//
// PMBCTRL Commands
//
//*****************************************************************************
//! Reset control state machines
//! Enable Target Alert
//! Set Clock Low Time-out Interrupt
//! generation on falling edge
//! Set Control Interrupt to be
//! generated on rising edge
//! Enable PMBus Current Source A Control
//! Enable PMBus Current Source B Control
//! Disable Clock Low Time-out
//! Enable PMBus Target Enable
//! Enable PMBus Controller Enable
//*****************************************************************************
//
// PMBUS Module Clock defines
//
//*****************************************************************************
//! Min SYSCLK input to PMBus module
//! Max SYSCLK input to PMBus module
//! Max module frequency of 20 MHz
//! Min module frequency = min_sys_freq / 32
//*****************************************************************************
//
//! Clock Mode Descriptor
//!
//! Used in PMBus_configBusClock() to set up the bus speed. There are two
//! possible modes of operation:
//! -# Standard Mode 100 kHz
//! -# Fast Mode 400 kHz
//
//*****************************************************************************
typedef enum{
PMBUS_CLOCKMODE_STANDARD = 0U, //!< Standard mode 100 kHz
PMBUS_CLOCKMODE_FAST = 1U, //!< Fast Mode 400 kHz
}PMBus_ClockMode;
//*****************************************************************************
//
//! Access Type Descriptor
//!
//! Used in PMBus_getCurrentAccessType() to determine if the device, in target
//! mode, was accessed with read or write enabled.
//
//*****************************************************************************
typedef enum{
PMBUS_ACCESSTYPE_WRITE = 0U, //!< Target last address for write transaction
PMBUS_ACCESSTYPE_READ = 1U //!< Target last address for read transaction
}PMBus_accessType;
//*****************************************************************************
//
//! Interrupt Edge Descriptor
//!
//! Used in PMBus_setCtrlIntEdge() and PMBus_setClkLowTimeoutIntEdge() to set
//! the edge, falling or rising, that triggers an interrupt
//
//*****************************************************************************
typedef enum{
PMBUS_INTEDGE_FALLING = 0U, //!< Interrupt generated on falling edge
PMBUS_INTEDGE_RISING = 1U //!< Interrupt generated on rising edge
}PMBus_intEdge;
//*****************************************************************************
//
// globals
//
//*****************************************************************************
//! CRC table for the polynomial x^8+x^2+x^1+1 or 0x7 (File scope only)
extern const uint16_t PMBus_crc8Table[256U];
//*****************************************************************************
//
// Prototypes for the APIs.
//
//*****************************************************************************
//*****************************************************************************
//
//! \internal
//! Checks a PMBus base address.
//!
//! \param base is the base address of the PMBus instance used.
//!
//! This function determines if a PMBus module base address is valid.
//!
//! \return Returns \b true if the base address is valid and \b false
//! otherwise.
//
//*****************************************************************************
//*****************************************************************************
//
//! Disables the PMBus module.
//!
//! \param base is the base address of the PMBus instance used.
//!
//! This function resets the internal state machine of the PMBus module and
//! holds it in that state
//!
//! \return None.
//
//*****************************************************************************
static inline void PMBus_disableModule(uint32_t base)
{
//
// Check the arguments.
//
;
__eallow();
(*((volatile uint32_t *)(base + 0x10U))) |= 0x00000001UL;
__edis();
}
//*****************************************************************************
//
//! Enables the PMBus module.
//!
//! \param base is the base address of the PMBus instance used.
//!
//! This function enables operation of the PMBus module by removing it from the
//! reset state
//!
//! \return None.
//
//*****************************************************************************
static inline void PMBus_enableModule(uint32_t base)
{
//
// Check the arguments.
//
;
__eallow();
(*((volatile uint32_t *)(base + 0x10U))) &= ~(uint32_t)0x00000001UL;
__edis();
}
//*****************************************************************************
//
//! Enables PMBus interrupt sources.
//!
//! \param base is the base address of the PMBus instance used.
//! \param intFlags is the bit mask of the interrupt sources to be enabled.
//!
//! This function enables the indicated PMBus interrupt sources. Only the
//! sources that are enabled can be reflected to the processor interrupt.
//! Disabled sources have no effect on the processor.
//!
//! The \e intFlags parameter is the logical OR of any of the following:
//!
//! - \b PMBUS_INT_BUS_FREE - Bus Free Interrupt
//! - \b PMBUS_INT_CLK_LOW_TIMEOUT - Clock Low Time-out Interrupt
//! - \b PMBUS_INT_DATA_READY - Data Ready Interrupt
//! - \b PMBUS_INT_DATA_REQUEST - Data Request Interrupt
//! - \b PMBUS_INT_TARGET_ADDR_READY - Target Address Ready Interrupt
//! - \b PMBUS_INT_EOM - End of Message Interrupt
//! - \b PMBUS_INT_ALERT - Alert Detection Interrupt
//! - \b PMBUS_INT_CONTROL - Control Detection Interrupt
//! - \b PMBUS_INT_LOST_ARB - Lost Arbitration Interrupt
//! - \b PMBUS_INT_CLK_HIGH_DETECT - Clock High Detection Interrupt
//! - \b PMBUS_INT_ALL - all PMBus interrupts
//!
//! \return None.
//
//*****************************************************************************
static inline void PMBus_enableInterrupt(uint32_t base, uint32_t intFlags)
{
//
// Check the arguments.
//
;
__eallow();
//
// Enable the desired basic interrupts, that is, clear their mask bits
// in PMBINTM
//
(*((volatile uint32_t *)(base + 0xAU))) &= ~(intFlags & 0x03FFU);
__edis();
}
//*****************************************************************************
//
//! Disables PMBus interrupt sources.
//!
//! \param base is the base address of the PMBus instance used.
//! \param intFlags is the bit mask of the interrupt sources to be disabled.
//!
//! This function disables the indicated PMBus interrupt sources. Only
//! the sources that are enabled can be reflected to the processor interrupt.
//! Disabled sources have no effect on the processor.
//!
//! The \e intFlags parameter has the same definition as the \e intFlags
//! parameter to PMBus_enableInterrupt().
//!
//! \return None.
//
//*****************************************************************************
static inline void PMBus_disableInterrupt(uint32_t base, uint32_t intFlags)
{
//
// Check the arguments.
//
;
__eallow();
//
// Disable the desired interrupts
//
(*((volatile uint32_t *)(base + 0xAU))) |= (intFlags & 0x03FFU);
__edis();
}
//*****************************************************************************
//
//! Indicates whether or not the PMBus bus is busy.
//!
//! \param status the value of the status register (PMBUS_O_PMBSTS)
//!
//! This function returns an indication of whether or not the PMBus bus is busy
//!
//! \note The status register is cleared each time it is read, therefore, it
//! should be read once at the beginning of an interrupt service routine using
//! PMBus_getInterruptStatus() and saved to a temporary variable for further
//! processing.
//!
//! \return Returns \b true if the PMBus bus is busy; otherwise, returns
//! \b false.
//
//*****************************************************************************
static inline _Bool PMBus_isBusBusy(uint32_t status)
{
return(((status & 0x2000U) == 0U) ? 1 : 0);
}
//*****************************************************************************
//
//! Indicates whether or not the PEC is valid
//!
//! \param status the value of the status register (PMBUS_O_PMBSTS)
//!
//! This function returns an indication of whether or not the received PEC
//! was valid
//!
//! \note The status register is cleared each time it is read, therefore, it
//! should be read once at the beginning of an interrupt service routine using
//! PMBus_getStatus() and saved to a temporary variable for further
//! processing.
//!
//! \return Returns \b true if the PEC is valid; otherwise, returns
//! \b false.
//
//*****************************************************************************
static inline _Bool PMBus_isPECValid(uint32_t status)
{
return(((status & 0x80U) != 0U) ? 1 : 0);
}
//*****************************************************************************
//
//! Enable I2C mode
//!
//! \param base is the base address of the PMBus instance used.
//!
//! Set the PMBus module to work in I2C mode
//!
//! \return None.
//
//*****************************************************************************
static inline void PMBus_enableI2CMode(uint32_t base)
{
//
// Locals
//
uint32_t interruptState;
//
// Check the arguments.
//
;
__eallow();
//
// Save off the interrupt state and disable them
//
interruptState = (*((volatile uint32_t *)(base + 0xAU)));
(*((volatile uint32_t *)(base + 0xAU))) = 0x000003FFUL;
//
// Set module to I2C mode
//
(*((volatile uint32_t *)(base + 0x10U))) |= 0x80000000U;
//
// Restore the interrupt status
//
(*((volatile uint32_t *)(base + 0xAU))) = interruptState;
__edis();
}
//*****************************************************************************
//
//! Disable I2C mode
//!
//! \param base is the base address of the PMBus instance used.
//!
//! Set the PMBus module to work in PMBus mode
//!
//! \return None.
//
//*****************************************************************************
static inline void PMBus_disableI2CMode(uint32_t base)
{
//
// Locals
//
uint32_t interruptState;
//
// Check the arguments.
//
;
__eallow();
//
// Save off the interrupt state and disable them
//
interruptState = (*((volatile uint32_t *)(base + 0xAU)));
(*((volatile uint32_t *)(base + 0xAU))) = 0x000003FFUL;
//
// Set module to PMBUS mode
//
(*((volatile uint32_t *)(base + 0x10U))) &= ~(uint32_t)0x80000000U;
//
// Restore the interrupt status
//
(*((volatile uint32_t *)(base + 0xAU))) = interruptState;
__edis();
}
//*****************************************************************************
//
//! Read the status register
//!
//! \param base is the base address of the PMBus instance used.
//!
//! \return Contents of the status register.
//
//*****************************************************************************
static inline uint32_t PMBus_getStatus(uint32_t base)
{
//
// Check the arguments.
//
;
return((*((volatile uint32_t *)(base + 0x8U))));
}
//*****************************************************************************
//
//! Acknowledge the transaction by writing to the PMBACK register
//!
//! \param base is the base address of the PMBus instance used.
//!
//! \return None.
//
//*****************************************************************************
static inline void PMBus_ackTransaction(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Acknowledge
//
(*((volatile uint32_t *)(base + 0x6U))) |= 0x1U;
}
//*****************************************************************************
//
//! Nack the transaction by writing to the PMBACK register
//!
//! \param base is the base address of the PMBus instance used.
//!
//! \return None.
//
//*****************************************************************************
static inline void PMBus_nackTransaction(uint32_t base)
{
//
// Check the arguments.
//
;
//
// NACK
//
(*((volatile uint32_t *)(base + 0x6U))) &= ~(uint32_t)0x1U;
}
//*****************************************************************************
//
//! Alert the controller by asserting the ALERT line
//!
//! \param base is the base address of the PMBus instance used.
//!
//! A target PMBus can alert the controller by pulling the alert line low.
//! This triggers an Alert Response from the controller`, where the ,controller issues
//! the \b Alert \b Response \b Address on the bus with a read bit and the
//! alerting target is required to reply with its address.
//!
//! \note The alerting device should be in target mode.
//!
//! \return None.
//
//*****************************************************************************
static inline void PMBus_assertAlertLine(uint32_t base)
{
//
// Check the arguments.
//
;
__eallow();
//
//Pull the alert line low
//
(*((volatile uint32_t *)(base + 0x10U))) |= 0x2U;
__edis();
}
//*****************************************************************************
//
//! De-assert the alert line
//!
//! \param base is the base address of the PMBus instance used.
//!
//! \return None.
//
//*****************************************************************************
static inline void PMBus_deassertAlertLine(uint32_t base)
{
//
// Check the arguments.
//
;
__eallow();
//
//Pull the alert line low
//
(*((volatile uint32_t *)(base + 0x10U))) &= ~(uint32_t)0x2U;
__edis();
}
//*****************************************************************************
//
//! Configure the PMBus operation in Controller Mode.
//!
//! \param base is the base address of the PMBus instance used.
//! \param targetAddress address of the Target device
//! \param byteCount number of bytes transmitted (or read) in the message
//! (up to 255)
//! \param configWord can be a combination of the following
//! -# PMBUS_CONTROLLER_ENABLE_PRC_CALL
//! -# PMBUS_CONTROLLER_ENABLE_GRP_CMD
//! -# PMBUS_CONTROLLER_ENABLE_PEC
//! -# PMBUS_CONTROLLER_ENABLE_EXT_CMD
//! -# PMBUS_CONTROLLER_ENABLE_CMD
//! -# PMBUS_CONTROLLER_ENABLE_READ
//!
//! Assuming the PMBus module is set to Controller mode this function will
//! configure the PMBCCR register. It overwrites the contents of the PMBCCR
//! register.
//! \note
//! -# Writing to the PMBCCR register initiates a message on the bus once
//! the bus is free. In the event of a write the TXBUF must be loaded prior
//! to configuration, or very quickly after configuration, before the module
//! starts the bus clock.
//! -# If the user does not specify an option for example,
//! PMBUS_CONTROLLER_ENABLE_READ, the code will write a 0 (a write) in its
//! bit field.
//! -# setting byteCount to 0U (on a write) triggers a quick command; there
//! is no need to precede this command with the PMBus_putControllerData()
//! -# If transmitting with a non-zero byteCount the user must precede this
//! with the PMBus_putControlllerData(), supplying it with the location of the data
//! and the number of bytes (<= 4). For block transmissions the user will have
//! to call PMBus_putControllerData(), PMBus_configController() and then continue
//! calling PMBus_putControllerData() transmitting 4 (or less for the final
//! transmit) bytes at a time till all the data bytes are transmitted.
//! -# If receiving the user must follow up with the PMBus_getData(),
//! supplying it with the location of an empty buffer and the status byte
//! -# In cases where the controller must transmit for example, process call,
//! the user must call PMBus_putControllerData(), then configure the controlller to
//! transmit the command and two bytes, then call PMBus_getData() to
//! read two bytes from the target. The controller module need not be reconfigured
//! between write and read whenever a repeated start is involved in the
//! transaction
//! \return None.
//
//*****************************************************************************
static inline void PMBus_configController(uint32_t base, uint16_t targetAddress,
uint16_t byteCount, uint32_t configWord)
{
//
// Locals
// Form a bit mask of the bit fields configWord changes
//
const uint32_t bitmask = (0x1U | 0x10000U |
0x20000U | 0x40000U |
0x80000U | 0x100000U);
//
// Check the arguments.
//
;
;
;
__eallow();
//
// Write the user configured bit fields (passed in configWord) as well
// as target address and message byte counts. Writing to PMBMC triggers
// activity on the bus, once the bus is free (PMBSTS.BUS_FREE = 1)
//
(*((volatile uint32_t *)(base + 0x0U))) = ((configWord & bitmask) |
(((uint32_t)targetAddress << 1U) &
0xFEU) |
(((uint32_t)byteCount << 8U) &
0xFF00U));
__edis();
}
//*****************************************************************************
//
//! Get the address that the PMBus module will respond to (in target mode)
//!
//! \param base is the base address of the PMBus instance used.
//!
//! This function will query the PMBUS_O_PMBHTA register, this
//! will be the address of the module when used in Target Mode.
//! \return Address of the PMBus device (in slave mode).
//
//*****************************************************************************
static inline uint16_t PMBus_getOwnAddress(uint32_t base)
{
//
// Check the arguments.
//
;
return(((*((volatile uint32_t *)(base + 0xEU))) & 0xFEU) >> 1U);
}
//*****************************************************************************
//
//! Set the current device address
//!
//! \param base is the base address of the PMBus instance used.
//! \param address : Address to be configured.
//!
//! This function configures the current device address, this
//! will be the own address of the module.
//! \return None.
//
//*****************************************************************************
static inline void PMBus_setOwnAddress(uint32_t base, uint16_t Ownaddress)
{
//
// Check the arguments.
//
;
;
__eallow();
//
// Write the address to the PMBSC register (bits 6:0)
//
(*((volatile uint32_t *)(base + 0xCU)))|= Ownaddress;
__edis();
}
//*****************************************************************************
//
//! Set the target address
//!
//! \param base is the base address of the PMBus instance used.
//! \param address : Target Address to be configured.
//!
//! This function configures the current device address, this
//! will be the target address.
//! \return None.
//
//*****************************************************************************
static inline void PMBus_setTargetAddress(uint32_t base, uint16_t targetAddress)
{
//
// Check the arguments.
//
;
;
__eallow();
//
// Write the target address to PMBMC register
//
(*((volatile uint32_t *)(base + 0x0U))) |= (((uint32_t)targetAddress << 1U) &
0xFEU);
__edis();
}
//*****************************************************************************
//
//! Determine the current access (read/write) type
//!
//! \param base is the base address of the PMBus instance used.
//!
//! This function will query the PMBUS_O_PMBHTA register, to determine if
//! the current access type was a read or write access. This bit is relevant
//! only when the PMBus module is addressed as a target.
//!
//! \return an enum of the type PMBus_accessType which specifies if the device,
//! in target mode, was addressed for a read or write operation
//
//*****************************************************************************
static inline PMBus_accessType PMBus_getCurrentAccessType(uint32_t base)
{
//
// Check the arguments.
//
;
return((PMBus_accessType)((*((volatile uint32_t *)(base + 0xEU))) & 0x01U));
}
//*****************************************************************************
//
//! Sets the triggering edge of the Control Interrupt
//!
//! \param base is the base address of the PMBus instance used.
//! \param intEdge interrupt to trigger on rising or falling edge
//!
//! \return None.
//
//*****************************************************************************
static inline void PMBus_setCtrlIntEdge(uint32_t base, PMBus_intEdge intEdge)
{
//
// Check the arguments.
//
;
__eallow();
if(intEdge == PMBUS_INTEDGE_FALLING)
{
//
// Clear bit
//
(*((volatile uint32_t *)(base + 0x10U))) &=
~(uint32_t)0x20U;
}
else // PMBUS_INTEDGE_RISING
{
//
// Set bit
//
(*((volatile uint32_t *)(base + 0x10U))) |= 0x20U;
}
__edis();
}
//*****************************************************************************
//
//! Sets the triggering edge of the Clock Low Time-out Interrupt
//!
//! \param base is the base address of the PMBus instance used.
//! \param intEdge interrupt to trigger on rising or falling edge
//!
//! \return None.
//
//*****************************************************************************
static inline
void PMBus_setClkLowTimeoutIntEdge(uint32_t base, PMBus_intEdge intEdge)
{
//
// Check the arguments.
//
;
__eallow();
if(intEdge == PMBUS_INTEDGE_FALLING)
{
//
// Set bit
//
(*((volatile uint32_t *)(base + 0x10U))) |= 0x4U;
}
else // PMBUS_INTEDGE_RISING
{
//
// Clear bit
//
(*((volatile uint32_t *)(base + 0x10U))) &=
~(uint32_t)0x4U;
}
__edis();
}
//*****************************************************************************
//
//! Initializes the PMBus to Target Mode.
//!
//! \param base is the base address of the PMBus instance used.
//! \param address Target address
//! \param mask Target address mask - Used in address detection, the Target
//! mask enables acknowledgement of multiple device addresses by the Target.
//! Writing a '0' to a bit within the Target mask enables the corresponding bit
//! in the Target address to be either '1' or '0' and still allow for a match.
//! Writing a '0' to all bits in the mask enables the PMBus Interface to
//! acknowledge any device address. Upon power-up, the controller mask defaults to
//! 7Fh, indicating the controller will only acknowledge the address programmed
//! into the Controller Address (Bits 6-0).
//! Set to PMBUS_DISABLE_TARGET_ADDRESS_MASK if you do not wish to have a mask
//!
//! This function sets up the PMBus in target mode and also configures the target
//! address for the PMBus module
//!
//! \return None.
//
//*****************************************************************************
extern
void PMBus_initTargetMode(uint32_t base, uint16_t address, uint16_t mask);
//*****************************************************************************
//
//! Configure the PMBus operation in Target Mode.
//!
//! \param base is the base address of the PMBus instance used.
//! \param configWord can be a combination of the following
//! -# PMBUS_CONTROLLER_ENABLE_MANUAL_ACK
//! -# PMBUS_CONTROLLER_ENABLE_PEC_PROCESSING
//! -# PMBUS_CONTROLLER_ENABLE_MANUAL_CMD_ACK
//! -# PMBUS_CONTROLLER_AUTO_ACK_1_BYTES
//! -# PMBUS_CONTROLLER_AUTO_ACK_2_BYTES
//! -# PMBUS_CONTROLLER_AUTO_ACK_3_BYTES
//! -# PMBUS_CONTROLLER_AUTO_ACK_4_BYTES
//!
//! Assuming the PMBus module is set to target mode, this function will
//! configure the PMBSC register. It overwrites the contents of the PMBSC
//! register, with the exception of the address, target mask, TXPEC and byte
//! count bit fields.
//! \note If the user does not specify an option, for example,
//! PMBUS_TARGET_ENABLE_PEC_PROCESSING, the code will write a 0 (a write) in
//! its bit field.
//!
//! \return None.
//
//*****************************************************************************
extern void PMBus_configTarget(uint32_t base, uint32_t configWord);
//*****************************************************************************
//
//! Gets the current PMBus interrupt status.
//!
//! \param base is the base address of the PMBus instance used.
//!
//! This function returns the interrupt status for the PMBus module.
//!
//! \return The current interrupt status, as a bit field of
//! - \b PMBUS_INTSRC_BUS_FREE
//! - \b PMBUS_INTSRC_CLK_LOW_TIMEOUT
//! - \b PMBUS_INTSRC_DATA_READY
//! - \b PMBUS_INTSRC_DATA_REQUEST
//! - \b PMBUS_INTSRC_TARGET_ADDR_READY
//! - \b PMBUS_INTSRC_EOM
//! - \b PMBUS_INTSRC_ALERT
//! - \b PMBUS_INTSRC_CONTROL
//! - \b PMBUS_INTSRC_LOST_ARB
//! - \b PMBUS_INTSRC_CLK_HIGH_DETECT
//
//*****************************************************************************
extern uint32_t PMBus_getInterruptStatus(uint32_t base);
//*****************************************************************************
//
//! Read the receive buffer (Target or Controller mode)
//!
//! \param base is the base address of the PMBus instance used.
//! \param buffer pointer to the message buffer where the received bytes
//! will be written to
//! \param status the value of the status register (PMBUS_O_PMBSTS)
//!
//! This function can read up to 4 bytes in the receive buffer.
//! \note
//! -# The status register is cleared each time it is read, therefore, it
//! should be read once at the beginning of an interrupt service routine using
//! PMBus_getStatus() and saved to a temporary variable for further
//! processing.
//!
//! -# The buffer should be at least 4 words long; anything smaller will
//! lead to the possibility of memory overrun when a transaction of 4 bytes
//! happens.
//!
//! \return Returns the number of byte(s) received by the PMBus in the
//! array pointed to by buffer.
//
//*****************************************************************************
extern uint16_t
PMBus_getData(uint32_t base, uint16_t *buffer, uint32_t status);
//*****************************************************************************
//
//! write to the transmit buffer (Target mode)
//!
//! \param base is the base address of the PMBus instance used.
//! \param buffer pointer to the message buffer where the transmit bytes
//! are stored
//! \param nBytes number of transmit bytes, up to 4
//! \param txPEC 1 transmit PEC at end of message, 0 no PEC
//!
//! This function can write up to 4 bytes in the transmit buffer.
//!
//! \note
//! -# The user must check the UNIT_BUSY bit before attempting a transmission.
//! -# The buffer should be at least 4 words long; anything smaller will
//! lead to the possibility of memory overrun when a transaction of 4 bytes
//! happens.
//!
//! \return None.
//
//*****************************************************************************
extern void
PMBus_putTargetData(uint32_t base, uint16_t *buffer, uint16_t nBytes,
_Bool txPEC);
//*****************************************************************************
//
//! Manual acknowledgement of the target address
//!
//! \param base is the base address of the PMBus instance used.
//! \param address address of the target
//! \param status the value of the status register (PMBUS_O_PMBSTS)
//! \param buffer pointer to a buffer to store the received data
//!//! This function will read the address that was put on the bus, compare it
//! with address passed to this function and then acknowledge on a match (or
//! nack on mismatch). For this function to work, TARGET_ADDR_READY bit in
//! PBINTM must be enabled. This function checks the TARGET_ADDR_READY bit in
//! the status register before acknowledging so it would be preferable to use
//! this function in an interrupt handler that responds to the TARGET_ADDR_READY
//! interrupt.
//!
//! \note
//! -# The status register is cleared each time it is read, therefore, it
//! should be read once at the beginning of an interrupt service routine using
//! PMBus_getStatus() and saved to a temporary variable for further
//! processing.
//! -# The buffer should be at least 4 words long; anything smaller will
//! lead to the possibility of memory overrun when a transaction of 4 bytes
//! happens.
//!
//! \return None.
//
//*****************************************************************************
extern void PMBus_ackAddress(uint32_t base, uint32_t address, uint32_t status,
uint16_t *buffer);
//*****************************************************************************
//
//! Manual acknowledgement of a command
//!
//! \param base is the base address of the PMBus instance used.
//! \param command command to manually acknowledge - it can be any of the
//! commands listed in this header file. All commands have the common
//! prefix \b PMBUS_CMD.
//! \param status contents of the status register PMBUS_O_PMBSTS
//! \param buffer pointer to a buffer to store the received data
//!
//! This function will read the command that was put on the bus, compare it
//! with command passed to this function and then acknowledge on a match (or
//! nack on mismatch). For this function to work, DATA_READY bit in PBINTM
//! must be enabled. This function checks the DATA_READY bit in the status
//! register before acknowledging so it would be preferable to use this
//! function in an interrupt handler that responds to the DATA_READY interrupt.
//!
//! \note
//! -# The status register is cleared each time it is read, therefore, it
//! should be read once at the beginning of an interrupt service routine using
//! PMBus_getStatus() and saved to a temporary variable for further
//! processing.
//! -# The buffer should be at least 4 words long; anything smaller will
//! lead to the possibility of memory overrun when a transaction of 4 bytes
//! happens.
//!
//! \return None.
//
//*****************************************************************************
extern void PMBus_ackCommand(uint32_t base, uint32_t command, uint32_t status,
uint16_t *buffer);
//*****************************************************************************
//
//! Generate a CRC table at run time
//!
//! \param crcTable points to the CRC8 Table (must be size 256)
//!
//! This function generates a CRC lookup table to run a CRC on the
//! received data. The table is generated from the polynomial
//! x^8 + x^2 + x^1 + 1 (0x7 - leading 1 is implicit)
//!
//! \return None.
//
//*****************************************************************************
extern void PMBus_generateCRCTable(uint16_t *crcTable);
//*****************************************************************************
//
//! Run a CRC on the received data and check against the
//! received PEC to validate the integrity of the data
//!
//! \param base is the base address of the PMBus instance used.
//! \param buffer points to the received message
//! \param crcTable points to the CRC8 Table
//! \param byteCount size of the message, does not include the PEC byte
//! \param pec is the received PEC to check against
//!
//! This function uses a CRC lookup table to run a CRC on the
//! received data. The table was generated from the polynomial
//! x^8 + x^2 + x^1 + 1 (0x7 - leading 1 is implicit)
//!
//! \note The buffer should be at least 4 words long; anything smaller will
//! lead to the possibility of memory overrun when a transaction of 4 bytes
//! happens.
//!
//! \return \b true if the calculated CRC is equal to the PEC, \b false
//! otherwise.
//
//*****************************************************************************
extern _Bool PMBus_verifyPEC(uint32_t base, uint16_t *buffer,
const uint16_t *crcTable, uint16_t byteCount, uint16_t pec);
//*****************************************************************************
//
//! Initializes the PMBus to Controller Mode.
//!
//! \param base is the base address of the PMBus instance used.
//!
//! This function sets up the PMBus in controller mode.
//!
//! \return None.
//
//*****************************************************************************
extern void PMBus_initControllerMode(uint32_t base);
//*****************************************************************************
//
//! write to the transmit buffer (Controller mode)
//!
//! \param base is the base address of the PMBus instance used.
//! \param buffer pointer to the message buffer where the transmit bytes
//! are stored
//! \param nBytes number of transmit bytes, up to 255
//!
//! This function can write up to 255 bytes in the transmit buffer.
//!
//! \note
//! -# The user must check the UNIT_BUSY bit before attempting the
//! first transmission.
//! -# The buffer should be at least 4 words long; anything smaller will
//! lead to the possibility of memory overrun when a transaction of 4 bytes
//! happens.
//!
//! \return None.
//
//*****************************************************************************
extern void
PMBus_putControllerData(uint32_t base, uint16_t *buffer, uint16_t nBytes);
//*****************************************************************************
//
//! Configure the PMBus module clock
//!
//! \param base is the base address of the PMBus instance used.
//! \param moduleFrequency desired module frequency; can range from
//! PMBUS_MODULE_FREQ_MIN Hz to PMBUS_MODULE_FREQ_MAX Hz. Please input the
//! frequency in Hz, for example, 312500 for 312.4 kHz
//! \param sysFrequency Frequency of the system clock (input to PMBus). The
//! values may range anywhere from PMBUS_SYS_FREQ_MIN Hz to PMBUS_SYS_FREQ_MAX
//! Hz. Please input the frequency in Hz, for example, 100000000 for 100 MHz.
//!
//! The frequency to the PMBus module may not exceed PMBUS_MODULE_FREQ_MAX Hz,
//! the appropriate clock divider is chosen to bring the module clock to the
//! desired frequency - this value is then returned by the function.
//! In the event that the desired bus frequency is unattainable, the clock
//! divider is set to the maximum possible value
//!
//! \return module frequency calculated from the system frequency and clock
//! divider.
//
//*****************************************************************************
extern uint32_t
PMBus_configModuleClock(uint32_t base, uint32_t moduleFrequency,
uint32_t sysFrequency);
//*****************************************************************************
//
//! Configure the bus clock by overriding the default settings
//!
//! \param base is the base address of the PMBus instance used.
//! \param mode is the operating mode for the PMBus, can be
//! - Standard Mode
//! - Fast Mode
//! \param moduleFrequency desired module frequency; can range from
//! PMBUS_MODULE_FREQ_MIN Hz to PMBUS_MODULE_FREQ_MAX Hz. Please input the
//! frequency in Hz, for example, 312500 for 312.4 kHz.
//!
//! The frequency to the PMBus module may not exceed PMBUS_MODULE_FREQ_MAX Hz.
//!
//! \note
//! -# The module comes out of reset with preprogrammed values that allow
//! it to work in standard mode with a module clock of 10MHz. The module clock
//! is set to 10MHz at power cycle, therefore, the user does not have to call
//! this function unless they wish to change the operating frequency of the
//! module clock from the default 10 MHz.
//!
//! \return \b true for successful override, \b false on failure.
//
//*****************************************************************************
extern _Bool
PMBus_configBusClock(uint32_t base, PMBus_ClockMode mode,
uint32_t moduleFrequency);
//*****************************************************************************
//
// Close the Doxygen group.
//! @}
//
// Mark the end of the C bindings section for C++ compilers.
//
//*****************************************************************************
//###########################################################################
//
// FILE: sci.h
//
// TITLE: C28x SCI driver.
//
//###########################################################################
// $Copyright:
// Copyright (C) 2023 Texas Instruments Incorporated - http://www.ti.com/
//
// 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 Texas Instruments Incorporated 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
// OWNER 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.
// $
//###########################################################################
//*****************************************************************************
//
// If building with a C++ compiler, make all of the definitions in this header
// have a C binding.
//
//*****************************************************************************
//*****************************************************************************
//
//! \addtogroup sci_api SCI
//! @{
//
//*****************************************************************************
//###########################################################################
//
// FILE: hw_sci.h
//
// TITLE: Definitions for the SCI registers.
//
//###########################################################################
// $Copyright:
// Copyright (C) 2023 Texas Instruments Incorporated - http://www.ti.com/
//
// 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 Texas Instruments Incorporated 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
// OWNER 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.
// $
//###########################################################################
//*************************************************************************************************
//
// The following are defines for the SCI register offsets
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the SCICCR register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the SCICTL1 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the SCIHBAUD register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the SCILBAUD register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the SCICTL2 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the SCIRXST register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the SCIRXEMU register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the SCIRXBUF register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the SCITXBUF register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the SCIFFTX register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the SCIFFRX register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the SCIFFCT register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the SCIPRI register
//
//*************************************************************************************************
//*****************************************************************************
//
// Values that can be passed to SCI_enableInterrupt, SCI_disableInterrupt, and
// SCI_clearInterruptStatus as the intFlags parameter, and returned from
// SCI_getInterruptStatus.
//
//*****************************************************************************
//*****************************************************************************
//
// Values that can be passed to SCI_setConfig as the config parameter
// and returned by SCI_getConfig in the config parameter.
// Additionally, the SCI_CONFIG_PAR_* enum subset can be passed to
// SCI_setParityMode as the parity parameter, and are returned by
// SCI_getParityMode.
//
//*****************************************************************************
//*****************************************************************************
//
//! Values that can be used with SCI_setParityMode() and SCI_getParityMode() to
//! describe the parity of the SCI communication.
//
//*****************************************************************************
typedef enum
{
SCI_CONFIG_PAR_NONE = 0x0000U, //!< No parity
SCI_CONFIG_PAR_EVEN = 0x0060U, //!< Even parity
SCI_CONFIG_PAR_ODD = 0x0020U //!< Odd parity
} SCI_ParityType;
//*****************************************************************************
//
//! Values that can be passed to SCI_setFIFOInterruptLevel() as the txLevel
//! parameter and returned by SCI_getFIFOInteruptLevel() and
//! SCI_getTxFIFOStatus().
//
//*****************************************************************************
typedef enum
{
SCI_FIFO_TX0 = 0x0000U, //!< Transmit interrupt empty
SCI_FIFO_TX1 = 0x0001U, //!< Transmit interrupt 1/16 full
SCI_FIFO_TX2 = 0x0002U, //!< Transmit interrupt 2/16 full
SCI_FIFO_TX3 = 0x0003U, //!< Transmit interrupt 3/16 full
SCI_FIFO_TX4 = 0x0004U, //!< Transmit interrupt 4/16 full
SCI_FIFO_TX5 = 0x0005U, //!< Transmit interrupt 5/16 full
SCI_FIFO_TX6 = 0x0006U, //!< Transmit interrupt 6/16 full
SCI_FIFO_TX7 = 0x0007U, //!< Transmit interrupt 7/16 full
SCI_FIFO_TX8 = 0x0008U, //!< Transmit interrupt 8/16 full
SCI_FIFO_TX9 = 0x0009U, //!< Transmit interrupt 9/16 full
SCI_FIFO_TX10 = 0x000AU, //!< Transmit interrupt 10/16 full
SCI_FIFO_TX11 = 0x000BU, //!< Transmit interrupt 11/16 full
SCI_FIFO_TX12 = 0x000CU, //!< Transmit interrupt 12/16 full
SCI_FIFO_TX13 = 0x000DU, //!< Transmit interrupt 13/16 full
SCI_FIFO_TX14 = 0x000EU, //!< Transmit interrupt 14/16 full
SCI_FIFO_TX15 = 0x000FU, //!< Transmit interrupt 15/16 full
SCI_FIFO_TX16 = 0x0010U //!< Transmit interrupt full
} SCI_TxFIFOLevel;
//*****************************************************************************
//
//! Values that can be passed to SCI_setFIFOInterruptLevel() as the rxLevel
//! parameter and returned by SCI_getFIFOInterruptLevel() and
//! SCI_getRxFIFOStatus().
//
//*****************************************************************************
typedef enum
{
SCI_FIFO_RX0 = 0x0000U, //!< Receive interrupt empty
SCI_FIFO_RX1 = 0x0001U, //!< Receive interrupt 1/16 full
SCI_FIFO_RX2 = 0x0002U, //!< Receive interrupt 2/16 full
SCI_FIFO_RX3 = 0x0003U, //!< Receive interrupt 3/16 full
SCI_FIFO_RX4 = 0x0004U, //!< Receive interrupt 4/16 full
SCI_FIFO_RX5 = 0x0005U, //!< Receive interrupt 5/16 full
SCI_FIFO_RX6 = 0x0006U, //!< Receive interrupt 6/16 full
SCI_FIFO_RX7 = 0x0007U, //!< Receive interrupt 7/16 full
SCI_FIFO_RX8 = 0x0008U, //!< Receive interrupt 8/16 full
SCI_FIFO_RX9 = 0x0009U, //!< Receive interrupt 9/16 full
SCI_FIFO_RX10 = 0x000AU, //!< Receive interrupt 10/16 full
SCI_FIFO_RX11 = 0x000BU, //!< Receive interrupt 11/16 full
SCI_FIFO_RX12 = 0x000CU, //!< Receive interrupt 12/16 full
SCI_FIFO_RX13 = 0x000DU, //!< Receive interrupt 13/16 full
SCI_FIFO_RX14 = 0x000EU, //!< Receive interrupt 14/16 full
SCI_FIFO_RX15 = 0x000FU, //!< Receive interrupt 15/16 full
SCI_FIFO_RX16 = 0x0010U //!< Receive interrupt full
} SCI_RxFIFOLevel;
//*****************************************************************************
//
// Values returned from SCI_getRxStatus(). These correspond to the different
// bits and flags of the SCIRXST register.
//
//*****************************************************************************
//*****************************************************************************
//
// API Function prototypes
//
//*****************************************************************************
//*****************************************************************************
//
//! \internal
//! Checks a SCI base address.
//!
//! \param base is the base address of the SCI port.
//!
//! This function determines if a SCI port base address is valid.
//!
//! \return Returns \b true if the base address is valid and \b false
//! otherwise.
//
//*****************************************************************************
//*****************************************************************************
//
//! Sets the type of parity.
//!
//! \param base is the base address of the SCI port.
//! \param parity specifies the type of parity to use.
//!
//! Sets the type of parity to use for transmitting and expect when receiving.
//! The \e parity parameter must be one of the following:
//! \b SCI_CONFIG_PAR_NONE, \b SCI_CONFIG_PAR_EVEN, \b SCI_CONFIG_PAR_ODD.
//!
//! \return None.
//
//*****************************************************************************
static inline void
SCI_setParityMode(uint32_t base, SCI_ParityType parity)
{
//
// Check the arguments.
//
;
//
// Set the parity mode.
//
(*((volatile uint16_t *)(base + 0x0U))) = (((*((volatile uint16_t *)(base + 0x0U))) &
~(0x0060U)) | (uint16_t)parity);
}
//*****************************************************************************
//
//! Gets the type of parity currently being used.
//!
//! \param base is the base address of the SCI port.
//!
//! This function gets the type of parity used for transmitting data and
//! expected when receiving data.
//!
//! \return Returns the current parity settings, specified as one of the
//! following:
//! \b SCI_CONFIG_PAR_NONE, \b SCI_CONFIG_PAR_EVEN, \b SCI_CONFIG_PAR_ODD.
//
//*****************************************************************************
static inline SCI_ParityType
SCI_getParityMode(uint32_t base)
{
uint16_t parity;
//
// Check the arguments.
//
;
//
// Return the current parity setting.
//
parity = ((*((volatile uint16_t *)(base + 0x0U))) & (0x0060U));
return((SCI_ParityType)parity);
}
//*****************************************************************************
//
//! Sets the multiprocessor protocol to address-bit mode.
//!
//! \param base is the base address of the SCI port.
//!
//! This function sets the multi-processor protocol to address-bit mode.
//!
//! \return None.
//
//*****************************************************************************
static inline void
SCI_setAddrMultiProcessorMode(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Enable the address-bit mode protocol
//
(*((volatile uint16_t *)(base + 0x0U))) |= 0x8U;
}
//*****************************************************************************
//
//! Sets the multiprocessor protocol to idle-line mode.
//!
//! \param base is the base address of the SCI port.
//!
//! This function sets the multi-processor protocol to idle-line protocol.
//!
//! \return None.
//
//*****************************************************************************
static inline void
SCI_setIdleMultiProcessorMode(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Disable the address-bit mode protocol
//
(*((volatile uint16_t *)(base + 0x0U))) &= ~0x8U;
}
//*****************************************************************************
//
//! Locks Autobaud.
//!
//! \param base is the base address of the SCI port.
//!
//! This function performs an autobaud lock for the SCI.
//!
//! \return None.
//
//*****************************************************************************
static inline void
SCI_lockAutobaud(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Prime the baud register
//
(*((volatile uint16_t *)(base + 0x2U))) = 0x0U;
(*((volatile uint16_t *)(base + 0x3U))) = 0x1U;
//
// Prepare for autobaud detection.
// Set the CDC bit to enable autobaud detection and clear the ABD bit.
//
(*((volatile uint16_t *)(base + 0xCU))) |= 0x2000U;
(*((volatile uint16_t *)(base + 0xCU))) |= 0x4000U;
//
// Wait until we correctly read an 'A' or 'a' and lock
//
while(((*((volatile uint16_t *)(base + 0xCU))) & 0x8000U) != 0x8000U)
{
}
//
// After autobaud lock, clear the ABD and CDC bits
//
(*((volatile uint16_t *)(base + 0xCU))) |= 0x4000U;
(*((volatile uint16_t *)(base + 0xCU))) &= ~0x2000U;
}
//*****************************************************************************
//
//! Sets the FIFO interrupt level at which interrupts are generated.
//!
//! \param base is the base address of the SCI port.
//! \param txLevel is the transmit FIFO interrupt level, specified as one of
//! the following:
//! \b SCI_FIFO_TX0, \b SCI_FIFO_TX1, \b SCI_FIFO_TX2, . . . or
//! \b SCI_FIFO_TX15.
//! \param rxLevel is the receive FIFO interrupt level, specified as one of
//! the following
//! \b SCI_FIFO_RX0, \b SCI_FIFO_RX1, \b SCI_FIFO_RX2, ... or \b SCI_FIFO_RX15.
//!
//! This function sets the FIFO level at which transmit and receive interrupts
//! are generated.
//!
//! \return None.
//
//*****************************************************************************
static inline void
SCI_setFIFOInterruptLevel(uint32_t base, SCI_TxFIFOLevel txLevel,
SCI_RxFIFOLevel rxLevel)
{
//
// Check the arguments.
//
;
//
// Set the FIFO interrupt levels.
//
(*((volatile uint16_t *)(base + 0xAU))) = ((*((volatile uint16_t *)(base + 0xAU))) &
(~0x1FU)) | (uint16_t)txLevel;
(*((volatile uint16_t *)(base + 0xBU))) = ((*((volatile uint16_t *)(base + 0xBU))) &
(~0x1FU)) | (uint16_t)rxLevel;
}
//*****************************************************************************
//
//! Gets the FIFO interrupt level at which interrupts are generated.
//!
//! \param base is the base address of the SCI port.
//! \param txLevel is a pointer to storage for the transmit FIFO interrupt
//! level, returned as one of the following:
//! \b SCI_FIFO_TX0, \b SCI_FIFO_TX1, \b SCI_FIFO_TX2, ... or \b SCI_FIFO_TX15.
//! \param rxLevel is a pointer to storage for the receive FIFO interrupt
//! level, returned as one of the following:
//! \b SCI_FIFO_RX0, \b SCI_FIFO_RX1, \b SCI_FIFO_RX2, ... or \b SCI_FIFO_RX15.
//!
//! This function gets the FIFO level at which transmit and receive interrupts
//! are generated.
//!
//! \return None.
//
//*****************************************************************************
static inline void
SCI_getFIFOInterruptLevel(uint32_t base, SCI_TxFIFOLevel *txLevel,
SCI_RxFIFOLevel *rxLevel)
{
//
// Check the arguments.
//
;
//
// Extract the transmit and receive FIFO levels.
//
*txLevel = (SCI_TxFIFOLevel)((*((volatile uint16_t *)(base + 0xAU))) &
0x1FU);
*rxLevel = (SCI_RxFIFOLevel)((*((volatile uint16_t *)(base + 0xBU))) &
0x1FU);
}
//*****************************************************************************
//
//! Gets the current configuration of a SCI.
//!
//! \param base is the base address of the SCI port.
//! \param lspclkHz is the rate of the clock supplied to the SCI module. This
//! is the LSPCLK.
//! \param baud is a pointer to storage for the baud rate.
//! \param config is a pointer to storage for the data format.
//!
//! The baud rate and data format for the SCI is determined, given an
//! explicitly provided peripheral clock (hence the ExpClk suffix). The
//! returned baud rate is the actual baud rate; it may not be the exact baud
//! rate requested or an ``official'' baud rate. The data format returned in
//! \e config is enumerated the same as the \e config parameter of
//! SCI_setConfig().
//!
//! The peripheral clock is the low speed peripheral clock. This will be
//! the value returned by SysCtl_getLowSeedClock(), or it can be explicitly
//! hard coded if it is constant and known (to save the code/execution overhead
//! of a call to SysCtl_getLowSpeedClock()).
//!
//! \return None.
//
//*****************************************************************************
static inline void
SCI_getConfig(uint32_t base, uint32_t lspclkHz, uint32_t *baud,
uint32_t *config)
{
//
// Check the arguments.
//
;
//
// Compute the baud rate.
//
*baud = lspclkHz /
((1U + (((uint32_t)(*((volatile uint16_t *)(base + 0x2U))) << 8U) |
(*((volatile uint16_t *)(base + 0x3U))))) * 8U);
//
// Get the parity, data length, and number of stop bits.
//
*config = (uint32_t)(*((volatile uint16_t *)(base + 0x0U))) & (0x0060U |
0x0080U |
0x0007U);
}
//*****************************************************************************
//
//! Enables transmitting and receiving.
//!
//! \param base is the base address of the SCI port.
//!
//! Enables SCI by taking SCI out of the software reset. Sets the TXENA, and
//! RXENA bits which enables transmit and receive.
//!
//! \return None.
//
//*****************************************************************************
static inline void
SCI_enableModule(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Enable RX, TX, and the SCI.
//
(*((volatile uint16_t *)(base + 0x1U))) |= (0x2U | 0x1U |
0x20U);
}
//*****************************************************************************
//
//! Disables transmitting and receiving.
//!
//! \param base is the base address of the SCI port.
//!
//! Clears the SCIEN, TXE, and RXE bits. The user should ensure that all the
//! data has been sent before disable the module during transmission.
//!
//! \return None.
//
//*****************************************************************************
static inline void
SCI_disableModule(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Disable the FIFO.
//
(*((volatile uint16_t *)(base + 0xAU))) &= ~(0x4000U);
//
// Disable the SCI.
//
(*((volatile uint16_t *)(base + 0x1U))) &= ~(0x2U | 0x1U);
}
//*****************************************************************************
//
//! Enables transmitting.
//!
//! \param base is the base address of the SCI port.
//!
//! Enables SCI by taking SCI out of the software reset. Sets the TXENA bit
//! which enables transmit.
//!
//! \return None.
//
//*****************************************************************************
static inline void
SCI_enableTxModule(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Enable TX and the SCI.
//
(*((volatile uint16_t *)(base + 0x1U))) |= (0x2U | 0x20U);
}
//*****************************************************************************
//
//! Disables transmitting.
//!
//! \param base is the base address of the SCI port.
//!
//! Disables SCI by taking SCI out of the software reset. Clears the TXENA bit
//! which disables transmit.
//!
//! \return None.
//
//*****************************************************************************
static inline void
SCI_disableTxModule(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Disable TX.
//
(*((volatile uint16_t *)(base + 0x1U))) &= ~0x2U;
}
//*****************************************************************************
//
//! Enables receiving.
//!
//! \param base is the base address of the SCI port.
//!
//! Enables SCI by taking SCI out of the software reset. Sets the RXENA bit
//! which enables receive.
//!
//! \return None.
//
//*****************************************************************************
static inline void
SCI_enableRxModule(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Enable RX and the SCI.
//
(*((volatile uint16_t *)(base + 0x1U))) |= (0x1U | 0x20U);
}
//*****************************************************************************
//
//! Disables receiving.
//!
//! \param base is the base address of the SCI port.
//!
//! Disables SCI by taking SCI out of the software reset. Clears the RXENA bit
//! which disables receive.
//!
//! \return None.
//
//*****************************************************************************
static inline void
SCI_disableRxModule(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Disable RX.
//
(*((volatile uint16_t *)(base + 0x1U))) &= ~0x1U;
}
//*****************************************************************************
//
//! Enables Sleep Mode
//!
//! \param base is the base address of the SCI port.
//!
//! Enables the sleep mode in SCI by setting the SLEEP bit in SCICTL1 register
//!
//! \return None.
//
//*****************************************************************************
static inline void
SCI_enableSleepMode(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Set sleep bit
//
(*((volatile uint16_t *)(base + 0x1U))) |= 0x4U;
}
//*****************************************************************************
//
//! Disables Sleep Mode
//!
//! \param base is the base address of the SCI port.
//!
//! Disables the sleep mode in SCI by clearing the SLEEP bit in SCICTL1 register
//!
//! \return None.
//
//*****************************************************************************
static inline void
SCI_disableSleepMode(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Clear sleep bit
//
(*((volatile uint16_t *)(base + 0x1U))) &= ~0x4U;
}
//*****************************************************************************
//
//! Enables the transmit and receive FIFOs.
//!
//! \param base is the base address of the SCI port.
//!
//! This functions enables the transmit and receive FIFOs in the SCI.
//!
//! \return None.
//
//*****************************************************************************
static inline void
SCI_enableFIFO(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Enable the FIFO.
//
(*((volatile uint16_t *)(base + 0xAU))) |= 0x8000U;
(*((volatile uint16_t *)(base + 0xAU))) |= 0x4000U | 0x2000U;
(*((volatile uint16_t *)(base + 0xBU))) |= 0x2000U;
}
//*****************************************************************************
//
//! Disables the transmit and receive FIFOs.
//!
//! \param base is the base address of the SCI port.
//!
//! This functions disables the transmit and receive FIFOs in the SCI.
//!
//! \return None.
//
//*****************************************************************************
static inline void
SCI_disableFIFO(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Disable the FIFO.
//
(*((volatile uint16_t *)(base + 0xAU))) &= ~0x4000U;
}
//*****************************************************************************
//
//! Determines if the FIFO enhancement is enabled.
//!
//! \param base is the base address of the SCI port.
//!
//! This function returns a flag indicating whether or not the FIFO enhancement
//! is enabled.
//!
//! \return Returns \b true if the FIFO enhancement is enabled or \b false
//! if the FIFO enhancement is disabled.
//
//*****************************************************************************
static inline _Bool
SCI_isFIFOEnabled(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Return true if the FIFO is enabled and false if it is disabled.
//
return((((*((volatile uint16_t *)(base + 0xAU))) & 0x4000U) ==
0x4000U) ? 1 : 0);
}
//*****************************************************************************
//
//! Resets the receive FIFO.
//!
//! \param base is the base address of the SCI port.
//!
//! This functions resets the receive FIFO of the SCI.
//!
//! \return None.
//
//*****************************************************************************
static inline void
SCI_resetRxFIFO(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Reset the specified FIFO.
//
(*((volatile uint16_t *)(base + 0xBU))) &= ~0x2000U;
(*((volatile uint16_t *)(base + 0xBU))) |= 0x2000U;
}
//*****************************************************************************
//
//! Resets the transmit FIFO.
//!
//! \param base is the base address of the SCI port.
//!
//! This functions resets the transmit FIFO of the SCI.
//!
//! \return None.
//
//*****************************************************************************
static inline void
SCI_resetTxFIFO(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Reset the specified FIFO.
//
(*((volatile uint16_t *)(base + 0xAU))) &= ~0x2000U;
(*((volatile uint16_t *)(base + 0xAU))) |= 0x2000U;
}
//*****************************************************************************
//
//! Resets the SCI Transmit and Receive Channels
//!
//! \param base is the base address of the SCI port.
//!
//! This functions resets transmit and receive channels in the SCI.
//!
//! \return None.
//
//*****************************************************************************
static inline void
SCI_resetChannels(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Reset the Tx and Rx Channels
//
(*((volatile uint16_t *)(base + 0xAU))) &= ~0x8000U;
(*((volatile uint16_t *)(base + 0xAU))) |= 0x8000U;
}
//*****************************************************************************
//
//! Determines if there are any characters in the receive buffer when the
//! FIFO enhancement is not enabled.
//!
//! \param base is the base address of the SCI port.
//!
//! This function returns a flag indicating whether or not there is data
//! available in the receive buffer.
//!
//! \return Returns \b true if there is data in the receive buffer or \b false
//! if there is no data in the receive buffer.
//
//*****************************************************************************
static inline _Bool
SCI_isDataAvailableNonFIFO(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Return the availability of characters with FIFO disabled.
//
return((((*((volatile uint16_t *)(base + 0x5U))) & 0x40U) ==
0x40U) ? 1 : 0);
}
//*****************************************************************************
//
//! Determines if there is any space in the transmit buffer when the FIFO
//! enhancement is not enabled.
//!
//! \param base is the base address of the SCI port.
//!
//! This function returns a flag indicating whether or not there is space
//! available in the transmit buffer when not using the FIFO enhancement.
//!
//! \return Returns \b true if there is space available in the transmit buffer
//! or \b false if there is no space available in the transmit buffer.
//
//*****************************************************************************
static inline _Bool
SCI_isSpaceAvailableNonFIFO(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Return the availability of space.
//
return((((*((volatile uint16_t *)(base + 0x4U))) & 0x80U) ==
0x80U) ? 1 : 0);
}
//*****************************************************************************
//
//! Get the transmit FIFO status
//!
//! \param base is the base address of the SCI port.
//!
//! This functions gets the current number of words in the transmit FIFO.
//!
//! \return Returns the current number of words in the transmit FIFO specified
//! as one of the following:
//! \b SCI_FIFO_TX0, \b SCI_FIFO_TX1, \b SCI_FIFO_TX2, \b SCI_FIFO_TX3
//! \b SCI_FIFO_TX4, ..., or \b SCI_FIFO_TX16
//
//*****************************************************************************
static inline SCI_TxFIFOLevel
SCI_getTxFIFOStatus(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Get the current FIFO status
//
return((SCI_TxFIFOLevel)(((*((volatile uint16_t *)(base + 0xAU))) & 0x1F00U) >>
8U));
}
//*****************************************************************************
//
//! Get the receive FIFO status
//!
//! \param base is the base address of the SCI port.
//!
//! This functions gets the current number of words in the receive FIFO.
//!
//! \return Returns the current number of words in the receive FIFO specified
//! as one of the following:
//! \b SCI_FIFO_RX0, \b SCI_FIFO_RX1, \b SCI_FIFO_RX2, \b SCI_FIFO_RX3
//! \b SCI_FIFO_RX4, ..., or \b SCI_FIFO_RX16
//
//*****************************************************************************
static inline SCI_RxFIFOLevel
SCI_getRxFIFOStatus(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Get the current FIFO status
//
return((SCI_RxFIFOLevel)(((*((volatile uint16_t *)(base + 0xBU))) & 0x1F00U) >>
8U));
}
//*****************************************************************************
//
//! Determines whether the SCI transmitter is busy or not.
//!
//! \param base is the base address of the SCI port.
//!
//! Allows the caller to determine whether all transmitted bytes have cleared
//! the transmitter hardware when the FIFO is not enabled. When the FIFO is
//! enabled, this function allows the caller to determine whether there is any
//! data in the FIFO.
//!
//! Without the FIFO enabled, if \b false is returned, the transmit buffer and
//! shift registers are empty and the transmitter is not busy. With the FIFO
//! enabled, if \b false is returned, the FIFO is empty. This does not
//! necessarily mean that the transmitter is not busy. The empty FIFO does not
//! reflect the status of the transmitter shift register. The FIFO may be empty
//! while the transmitter is still transmitting data.
//!
//! \return Returns \b true if the SCI is transmitting or \b false if
//! transmissions are complete.
//
//*****************************************************************************
static inline _Bool
SCI_isTransmitterBusy(uint32_t base)
{
//
// Check the argument.
//
;
//
// Check if FIFO enhancement is enabled.
//
if(SCI_isFIFOEnabled(base))
{
//
// With FIFO enhancement, determine if the SCI is busy.
//
return((((*((volatile uint16_t *)(base + 0xAU))) & 0x1F00U) !=
0U) ? 1 : 0);
}
else
{
//
// Without FIFO enhancement, determine if the SCI is busy.
// Check if the transmit buffer and shift register empty.
//
return((((*((volatile uint16_t *)(base + 0x4U))) & 0x40U) ==
0x40U) ? 0 : 1);
}
}
//*****************************************************************************
//
//! Waits to send a character from the specified port when the FIFO enhancement
//! is enabled.
//!
//! \param base is the base address of the SCI port.
//! \param data is the character to be transmitted.
//!
//! Sends the character \e data to the transmit buffer for the specified port.
//! If there is no space available in the transmit FIFO, this function waits
//! until there is space available before returning. \e data is a uint16_t but
//! only 8 bits are written to the SCI port. SCI only transmits 8 bit
//! characters.
//!
//! \return None.
//
//*****************************************************************************
static inline void
SCI_writeCharBlockingFIFO(uint32_t base, uint16_t data)
{
//
// Check the arguments.
//
;
//
// Wait until space is available in the transmit FIFO.
//
while(SCI_getTxFIFOStatus(base) == SCI_FIFO_TX16)
{
}
//
// Send a char.
//
(*((volatile uint16_t *)(base + 0x9U))) = data;
}
//*****************************************************************************
//
//! Waits to send a character from the specified port.
//!
//! \param base is the base address of the SCI port.
//! \param data is the character to be transmitted.
//!
//! Sends the character \e data to the transmit buffer for the specified port.
//! If there is no space available in the transmit buffer, or the transmit
//! FIFO if it is enabled, this function waits until there is space available
//! before returning. \e data is a uint16_t but only 8 bits are written to the
//! SCI port. SCI only transmits 8 bit characters.
//!
//! \return None.
//
//*****************************************************************************
static inline void
SCI_writeCharBlockingNonFIFO(uint32_t base, uint16_t data)
{
//
// Check the arguments.
//
;
//
// Wait until space is available in the transmit buffer.
//
while(!SCI_isSpaceAvailableNonFIFO(base))
{
}
//
// Send a char.
//
(*((volatile uint16_t *)(base + 0x9U))) = data;
}
//*****************************************************************************
//
//! Sends a character to the specified port.
//!
//! \param base is the base address of the SCI port.
//! \param data is the character to be transmitted.
//!
//! Writes the character \e data to the transmit buffer for the specified port.
//! This function does not block and only writes to the transmit buffer.
//! The user should use SCI_isSpaceAvailableNonFIFO() or SCI_getTxFIFOStatus()
//! to determine if the transmit buffer or FIFO have space available.
//! \e data is a uint16_t but only 8 bits are written to the SCI port. SCI
//! only transmits 8 bit characters.
//!
//! This function replaces the original SCICharNonBlockingPut() API and
//! performs the same actions. A macro is provided in sci.h to map
//! the original API to this API.
//!
//! \return None.
//
//*****************************************************************************
static inline void
SCI_writeCharNonBlocking(uint32_t base, uint16_t data)
{
//
// Check the arguments.
//
;
//
// Send a char.
//
(*((volatile uint16_t *)(base + 0x9U))) = data;
}
//*****************************************************************************
//
//! Gets current receiver status flags.
//!
//! \param base is the base address of the SCI port.
//!
//! This function returns the current receiver status flags. The returned
//! error flags are equivalent to the error bits returned via the previous
//! reading or receiving of a character with the exception that the overrun
//! error is set immediately the overrun occurs rather than when a character
//! is next read.
//!
//! \return Returns a bitwise OR combination of the receiver status flags,
//! \b SCI_RXSTATUS_WAKE, \b SCI_RXSTATUS_PARITY, \b SCI_RXSTATUS_OVERRUN,
//! \b SCI_RXSTATUS_FRAMING, \b SCI_RXSTATUS_BREAK, \b SCI_RXSTATUS_READY,
//! and \b SCI_RXSTATUS_ERROR.
//
//*****************************************************************************
static inline uint16_t
SCI_getRxStatus(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Return the current value of the receive status register.
//
return((*((volatile uint16_t *)(base + 0x5U))));
}
//*****************************************************************************
//
//! Waits for a character from the specified port when the FIFO enhancement
//! is enabled.
//!
//! \param base is the base address of the SCI port.
//!
//! Gets a character from the receive FIFO for the specified port. If there
//! are no characters available, this function waits until a character is
//! received before returning. Returns immediately in case of Error.
//!
//! \return Returns the character read from the specified port as \e uint16_t
//! or 0x0 in case of Error. The application must use
//! SCI_getRxStatus() API to check if some error occurred before
//! consuming the data
//
//*****************************************************************************
static inline uint16_t
SCI_readCharBlockingFIFO(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Wait until a character is available in the receive FIFO.
//
while(SCI_getRxFIFOStatus(base) == SCI_FIFO_RX0)
{
//
//If there is any error return
//
if((SCI_getRxStatus(base) & 0x0080U) != 0U)
{
return(0U);
}
}
//
// Return the character from the receive buffer.
//
return((uint16_t)((*((volatile uint16_t *)(base + 0x7U))) & 0xFFU));
}
//*****************************************************************************
//
//! Waits for a character from the specified port when the FIFO enhancement
//! is not enabled.
//!
//! \param base is the base address of the SCI port.
//!
//! Gets a character from the receive buffer for the specified port. If there
//! is no characters available, this function waits until a character is
//! received before returning.
//!
//! \return Returns the character read from the specified port as \e uint16_t.
//
//*****************************************************************************
static inline uint16_t
SCI_readCharBlockingNonFIFO(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Wait until a character is available in the receive FIFO.
//
while(!SCI_isDataAvailableNonFIFO(base))
{
}
//
// Return the character from the receive buffer.
//
return((uint16_t)((*((volatile uint16_t *)(base + 0x7U))) & 0xFFU));
}
//*****************************************************************************
//
//! Receives a character from the specified port.
//!
//! \param base is the base address of the SCI port.
//!
//! Gets a character from the receive buffer for the specified port. This
//! function does not block and only reads the receive buffer. The user should
//! use SCI_isDataAvailableNonFIFO() or SCI_getRxFIFOStatus() to determine if
//! the receive buffer or FIFO have data available.
//!
//! This function replaces the original SCICharNonBlockingGet() API and
//! performs the same actions. A macro is provided in sci.h to map
//! the original API to this API.
//!
//! \return Returns \e uin16_t which is read from the receive buffer.
//
//*****************************************************************************
static inline uint16_t
SCI_readCharNonBlocking(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Return the character from the receive buffer.
//
return((uint16_t)((*((volatile uint16_t *)(base + 0x7U))) & 0xFFU));
}
//*****************************************************************************
//
//! Performs a software reset of the SCI and Clears all reported receiver
//! status flags.
//!
//! \param base is the base address of the SCI port.
//!
//! This function performs a software reset of the SCI port. It affects the
//! operating flags of the SCI, but it neither affects the configuration bits
//! nor restores the reset values.
//!
//! \return None.
//
//*****************************************************************************
static inline void
SCI_performSoftwareReset(uint32_t base)
{
//
// Check the arguments.
//
;
//
// To clear all errors a sw reset of the module is required
//
(*((volatile uint16_t *)(base + 0x1U))) &= ~0x20U;
(*((volatile uint16_t *)(base + 0x1U))) |= 0x20U;
}
//*****************************************************************************
//
//! Enables Loop Back Test Mode
//!
//! \param base is the base address of the SCI port.
//!
//! Enables the loop back test mode where the Tx pin is internally connected
//! to the Rx pin.
//!
//! \return None.
//
//*****************************************************************************
static inline void
SCI_enableLoopback(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Set the loop back mode.
//
(*((volatile uint16_t *)(base + 0x0U))) |= 0x10U;
}
//*****************************************************************************
//
//! Disables Loop Back Test Mode
//!
//! \param base is the base address of the SCI port.
//!
//! Disables the loop back test mode where the Tx pin is no longer internally
//! connected to the Rx pin.
//!
//! \return None.
//
//*****************************************************************************
static inline void
SCI_disableLoopback(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Clear the loop back mode.
//
(*((volatile uint16_t *)(base + 0x0U))) &= ~0x10U;
}
//*****************************************************************************
//
//! Get the receive FIFO Overflow flag status
//!
//! \param base is the base address of the SCI port.
//!
//! This functions gets the receive FIFO overflow flag status.
//!
//! \return Returns \b true if overflow has occurred, else returned \b false if
//! an overflow hasn't occurred.
//
//*****************************************************************************
static inline _Bool
SCI_getOverflowStatus(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Return the current FIFO overflow status
//
return(((*((volatile uint16_t *)(base + 0xBU))) & 0x8000U) == 0x8000U);
}
//*****************************************************************************
//
//! Clear the receive FIFO Overflow flag status
//!
//! \param base is the base address of the SCI port.
//!
//! This functions clears the receive FIFO overflow flag status.
//!
//! \return None.
//
//*****************************************************************************
static inline void
SCI_clearOverflowStatus(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Clear the current FIFO overflow status
//
(*((volatile uint16_t *)(base + 0xBU))) |= 0x4000U;
}
//*****************************************************************************
//
//! Sets the configuration of a SCI.
//!
//! \param base is the base address of the SCI port.
//! \param lspclkHz is the rate of the clock supplied to the SCI module. This
//! is the LSPCLK.
//! \param baud is the desired baud rate.
//! \param config is the data format for the port (number of data bits,
//! number of stop bits, and parity).
//!
//! This function configures the SCI for operation in the specified data
//! format. The baud rate is provided in the \e baud parameter and the data
//! format in the \e config parameter.
//!
//! The \e config parameter is the bitwise OR of three values: the number of
//! data bits, the number of stop bits, and the parity. \b SCI_CONFIG_WLEN_8,
//! \b SCI_CONFIG_WLEN_7, \b SCI_CONFIG_WLEN_6, \b SCI_CONFIG_WLEN_5,
//! \b SCI_CONFIG_WLEN_4, \b SCI_CONFIG_WLEN_3, \b SCI_CONFIG_WLEN_2, and
//! \b SCI_CONFIG_WLEN_1. Select from eight to one data bits per byte
//! (respectively).
//! \b SCI_CONFIG_STOP_ONE and \b SCI_CONFIG_STOP_TWO select one or two stop
//! bits (respectively). \b SCI_CONFIG_PAR_NONE, \b SCI_CONFIG_PAR_EVEN,
//! \b SCI_CONFIG_PAR_ODD, select the parity mode (no parity bit, even parity
//! bit, odd parity bit respectively).
//!
//! The peripheral clock is the low speed peripheral clock. This will be
//! the value returned by SysCtl_getLowSpeedClock(), or it can be explicitly
//! hard coded if it is constant and known (to save the code/execution overhead
//! of a call to SysCtl_getLowSpeedClock()).
//!
//! A baud rate divider (BRR) is used in this function to calculate the
//! baud rate. The value of BRR is calculated in float and type casted as int
//! to be fed in the \b SCIHBAUD and \b SCILBAUD registers. This conversion
//! brings an error in the calculated baud rate and the requested. Error will
//! be significant when operating at higher baud rates. The error is due to
//! lower BRR integer value granularity at higher baud rates.
//!
//! \return None.
//
//*****************************************************************************
extern void
SCI_setConfig(uint32_t base, uint32_t lspclkHz, uint32_t baud,
uint32_t config);
//*****************************************************************************
//
//! Waits to send an array of characters from the specified port.
//!
//! \param base is the base address of the SCI port.
//! \param array is the address of the array of characters to be transmitted.
//! It is pointer to the array of characters to be transmitted.
//! \param length is the length of the array, or number of characters in the
//! array to be transmitted.
//!
//! Sends the number of characters specified by \e length, starting at the
//! address \e array, out of the transmit buffer for the specified port.
//! If there is no space available in the transmit buffer, or the transmit
//! FIFO if it is enabled, this function waits until there is space available
//! and \e length number of characters are transmitted before returning.
//! \e array is a pointer to uint16_ts but only the least significant 8 bits
//! are written to the SCI port. SCI only transmits 8 bit characters.
//!
//! \return None.
//
//*****************************************************************************
extern void
SCI_writeCharArray(uint32_t base, const uint16_t * const array,
uint16_t length);
//*****************************************************************************
//
//! Waits to receive an array of characters from the specified port.
//!
//! \param base is the base address of the SCI port.
//! \param array is the address of the array of characters to be received.
//! It is a pointer to the array of characters to be received.
//! \param length is the length of the array, or number of characters in the
//! array to be received.
//!
//! Receives an array of characters from the receive buffer for the specified
//! port, and stores them as an array of characters starting at address
//! \e array. This function waits until the \e length number of characters are
//! received before returning.
//!
//! \return None.
//
//*****************************************************************************
extern void
SCI_readCharArray(uint32_t base, uint16_t * const array, uint16_t length);
//*****************************************************************************
//
//! Enables individual SCI interrupt sources.
//!
//! \param base is the base address of the SCI port.
//! \param intFlags is the bit mask of the interrupt sources to be enabled.
//!
//! Enables the indicated SCI interrupt sources. Only the sources that are
//! enabled can be reflected to the processor interrupt; disabled sources have
//! no effect on the processor.
//!
//! The \e intFlags parameter is the bitwise OR of any of the following:
//!
//! - \b SCI_INT_RXERR - RXERR Interrupt
//! - \b SCI_INT_RXRDY_BRKDT - RXRDY/BRKDT Interrupt
//! - \b SCI_INT_TXRDY - TXRDY Interrupt
//! - \b SCI_INT_TXFF - TX FIFO Level Interrupt
//! - \b SCI_INT_RXFF - RX FIFO Level Interrupt
//! - \b SCI_INT_FE - Frame Error
//! - \b SCI_INT_OE - Overrun Error
//! - \b SCI_INT_PE - Parity Error
//!
//! \return None.
//
//*****************************************************************************
extern void
SCI_enableInterrupt(uint32_t base, uint32_t intFlags);
//*****************************************************************************
//
//! Disables individual SCI interrupt sources.
//!
//! \param base is the base address of the SCI port.
//! \param intFlags is the bit mask of the interrupt sources to be disabled.
//!
//! Disables the indicated SCI interrupt sources. Only the sources that are
//! enabled can be reflected to the processor interrupt; disabled sources have
//! no effect on the processor.
//!
//! The \e intFlags parameter has the same definition as the \e intFlags
//! parameter to SCI_enableInterrupt().
//!
//! \return None.
//
//*****************************************************************************
extern void
SCI_disableInterrupt(uint32_t base, uint32_t intFlags);
//*****************************************************************************
//
//! Gets the current interrupt status.
//!
//! \param base is the base address of the SCI port.
//!
//! \return Returns the current interrupt status, enumerated as a bit field of
//! values described in SCI_enableInterrupt().
//
//*****************************************************************************
extern uint32_t
SCI_getInterruptStatus(uint32_t base);
//*****************************************************************************
//
//! Clears SCI interrupt sources.
//!
//! \param base is the base address of the SCI port.
//! \param intFlags is a bit mask of the interrupt sources to be cleared.
//!
//! The specified SCI interrupt sources are cleared, so that they no longer
//! assert. This function must be called in the interrupt handler to keep the
//! interrupt from being recognized again immediately upon exit.
//!
//! The \e intFlags parameter has the same definition as the \e intFlags
//! parameter to SCI_enableInterrupt().
//!
//! \return None.
//
//*****************************************************************************
extern void
SCI_clearInterruptStatus(uint32_t base, uint32_t intFlags);
//*****************************************************************************
//
//! Sets SCI Baud rate.
//!
//! \param base is the base address of the SCI port.
//! \param lspclkHz is the rate of the clock supplied to the SCI module. This
//! is the LSPCLK.
//! \param baud is the desired baud rate.
//!
//! This function configures the SCI for operation in the specified baud rate
//! The baud rate is provided in the \e baud parameter.
//!
//! The peripheral clock is the low speed peripheral clock. This will be
//! the value returned by SysCtl_getLowSpeedClock()
//!
//! \return None.
//
//*****************************************************************************
extern void
SCI_setBaud(uint32_t base, uint32_t lspclkHz, uint32_t baud);
//*****************************************************************************
//
//! Sets the SCI TXWAKE flag
//!
//! \param base is the base address of the SCI port.
//!
//! This function sets the TXWAKE flag bit to indicate that the next frame
//! is an address frame.
//! TXWAKE bit controls selection of data-transmit feature based on
//! which mode is selected from idle-line and address-bit.
//!
//! \return None.
//
//*****************************************************************************
extern void
SCI_setWakeFlag(uint32_t base);
//*****************************************************************************
//
// Close the Doxygen group.
//! @}
//
//*****************************************************************************
//*****************************************************************************
//
// Mark the end of the C bindings section for C++ compilers.
//
//*****************************************************************************
//###########################################################################
//
// FILE: sdfm.h
//
// TITLE: C28x SDFM Driver
//
//###########################################################################
// $Copyright:
// Copyright (C) 2023 Texas Instruments Incorporated - http://www.ti.com/
//
// 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 Texas Instruments Incorporated 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
// OWNER 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.
// $
//###########################################################################
//*****************************************************************************
//
// If building with a C++ compiler, make all of the definitions in this header
// have a C binding.
//
//*****************************************************************************
//*****************************************************************************
//
//! \addtogroup sdfm_api SDFM
//! @{
//
//*****************************************************************************
//###########################################################################
//
// FILE: hw_sdfm.h
//
// TITLE: Definitions for the SDFM registers.
//
//###########################################################################
// $Copyright:
// Copyright (C) 2023 Texas Instruments Incorporated - http://www.ti.com/
//
// 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 Texas Instruments Incorporated 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
// OWNER 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.
// $
//###########################################################################
//*************************************************************************************************
//
// The following are defines for the SDFM register offsets
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the SDIFLG register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the SDIFLGCLR register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the SDCTL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the SDMFILEN register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the SDSTATUS register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the SDCTLPARM1 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the SDDFPARM1 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the SDDPARM1 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the SDFLT1CMPH1 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the SDFLT1CMPL1 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the SDCPARM1 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the SDDATA1 register
//
//*************************************************************************************************
// mode
//*************************************************************************************************
//
// The following are defines for the bit fields in the SDDATFIFO1 register
//
//*************************************************************************************************
// mode
//*************************************************************************************************
//
// The following are defines for the bit fields in the SDFLT1CMPH2 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the SDFLT1CMPHZ register
//
//*************************************************************************************************
// output
//*************************************************************************************************
//
// The following are defines for the bit fields in the SDFIFOCTL1 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the SDSYNC1 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the SDFLT1CMPL2 register
//
//*************************************************************************************************
// output.
//*************************************************************************************************
//
// The following are defines for the bit fields in the SDCTLPARM2 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the SDDFPARM2 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the SDDPARM2 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the SDFLT2CMPH1 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the SDFLT2CMPL1 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the SDCPARM2 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the SDDATA2 register
//
//*************************************************************************************************
// mode
//*************************************************************************************************
//
// The following are defines for the bit fields in the SDDATFIFO2 register
//
//*************************************************************************************************
// mode
//*************************************************************************************************
//
// The following are defines for the bit fields in the SDFLT2CMPH2 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the SDFLT2CMPHZ register
//
//*************************************************************************************************
// output
//*************************************************************************************************
//
// The following are defines for the bit fields in the SDFIFOCTL2 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the SDSYNC2 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the SDFLT2CMPL2 register
//
//*************************************************************************************************
// output.
//*************************************************************************************************
//
// The following are defines for the bit fields in the SDCTLPARM3 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the SDDFPARM3 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the SDDPARM3 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the SDFLT3CMPH1 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the SDFLT3CMPL1 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the SDCPARM3 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the SDDATA3 register
//
//*************************************************************************************************
// mode
//*************************************************************************************************
//
// The following are defines for the bit fields in the SDDATFIFO3 register
//
//*************************************************************************************************
// mode
//*************************************************************************************************
//
// The following are defines for the bit fields in the SDFLT3CMPH2 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the SDFLT3CMPHZ register
//
//*************************************************************************************************
// output
//*************************************************************************************************
//
// The following are defines for the bit fields in the SDFIFOCTL3 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the SDSYNC3 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the SDFLT3CMPL2 register
//
//*************************************************************************************************
// output.
//*************************************************************************************************
//
// The following are defines for the bit fields in the SDCTLPARM4 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the SDDFPARM4 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the SDDPARM4 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the SDFLT4CMPH1 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the SDFLT4CMPL1 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the SDCPARM4 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the SDDATA4 register
//
//*************************************************************************************************
// mode
//*************************************************************************************************
//
// The following are defines for the bit fields in the SDDATFIFO4 register
//
//*************************************************************************************************
// mode
//*************************************************************************************************
//
// The following are defines for the bit fields in the SDFLT4CMPH2 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the SDFLT4CMPHZ register
//
//*************************************************************************************************
// output
//*************************************************************************************************
//
// The following are defines for the bit fields in the SDFIFOCTL4 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the SDSYNC4 register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the SDFLT4CMPL2 register
//
//*************************************************************************************************
// output.
//*************************************************************************************************
//
// The following are defines for the bit fields in the SDCOMP1CTL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the SDCOMP1EVT2FLTCTL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the SDCOMP1EVT2FLTCLKCTL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the SDCOMP1EVT1FLTCTL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the SDCOMP1EVT1FLTCLKCTL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the SDCOMP1LOCK register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the SDCOMP2CTL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the SDCOMP2EVT2FLTCTL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the SDCOMP2EVT2FLTCLKCTL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the SDCOMP2EVT1FLTCTL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the SDCOMP2EVT1FLTCLKCTL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the SDCOMP2LOCK register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the SDCOMP3CTL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the SDCOMP3EVT2FLTCTL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the SDCOMP3EVT2FLTCLKCTL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the SDCOMP3EVT1FLTCTL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the SDCOMP3EVT1FLTCLKCTL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the SDCOMP3LOCK register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the SDCOMP4CTL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the SDCOMP4EVT2FLTCTL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the SDCOMP4EVT2FLTCLKCTL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the SDCOMP4EVT1FLTCTL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the SDCOMP4EVT1FLTCLKCTL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the SDCOMP4LOCK register
//
//*************************************************************************************************
//*****************************************************************************
//
// Defines for the API.
//
//*****************************************************************************
//! Macro to get the low threshold
//!
//! Macro to get the high threshold
//!
//! Macro to get the high threshold 1 & 2 to be passed as lowThreshold
//! parameter to SDFM_setCompFilterLowThreshold().
//!
//! Macro to get the high threshold 1 & 2 to be passed as highThreshold
//! parameter to SDFM_setCompFilterHighThreshold().
//!
//! Macro to convert comparator over sampling ratio to acceptable bit location
//!
//! Macro to convert the data shift bit values to acceptable bit location
//!
//! Macro to combine high threshold and low threshold values
//!
//! Macro to set the FIFO level to acceptable bit location
//!
//! Macro to set and enable the zero cross threshold value.
//!
//! Macros to enable or disable filter.
//!
//*****************************************************************************
//
// Defines for SDFM register offsets. Added for internal use. Not to be used by
// application.
//
//*****************************************************************************
//!< SD filter offset
//!< Event Digital filter offset
//!< Offset between high threshold 1 & 2 registers
//!< Offset between low threshold 1 & 2 registers
//*****************************************************************************
//
// Define to mask out the bits in the SDCOMPHFILCTL register that aren't
// associated with comparator event filter configurations. Added for internal
// use, not to be used in application code.
//
//*****************************************************************************
//*****************************************************************************
//
// Define to mask out the bits in the SDCOMPLOCK register that aren't
// associated with lock configuration. Added for internal use, not to be used
// in application code.
//
//*****************************************************************************
//*****************************************************************************
//
// Values that can be passed to SDFM_enableSynchronizer() or
// SDFM_disableSynchronizer() as syncConfig parameter.
//
//*****************************************************************************
//! Define for Clock synchronizer Configuration
//! Define for Data Synchronizer Configuration
//*****************************************************************************
//
//! Values that can be returned from SDFM_getThresholdStatus()
//
//*****************************************************************************
typedef enum
{
SDFM_OUTPUT_WITHIN_THRESHOLD = 0, //!< SDFM output is within threshold
SDFM_OUTPUT_ABOVE_THRESHOLD = 1, //!< SDFM output is above threshold
SDFM_OUTPUT_BELOW_THRESHOLD = 2 //!< SDFM output is below threshold
} SDFM_OutputThresholdStatus;
//*****************************************************************************
//
//! Values that can be passed to all functions as the \e filterNumber
//! parameter.
//
//*****************************************************************************
typedef enum
{
SDFM_FILTER_1 = 0, //!< Digital filter 1
SDFM_FILTER_2 = 1, //!< Digital filter 2
SDFM_FILTER_3 = 2, //!< Digital filter 3
SDFM_FILTER_4 = 3 //!< Digital filter 4
} SDFM_FilterNumber;
//*****************************************************************************
//
//! Values that can be passed to SDFM_setFilterType(),
//! SDFM_setComparatorFilterType() as the \e filterType parameter.
//
//*****************************************************************************
typedef enum
{
//! Digital filter with SincFast structure.
SDFM_FILTER_SINC_FAST = 0x00,
//! Digital filter with Sinc1 structure
SDFM_FILTER_SINC_1 = 0x10,
//! Digital filter with Sinc3 structure.
SDFM_FILTER_SINC_2 = 0x20,
//! Digital filter with Sinc4 structure.
SDFM_FILTER_SINC_3 = 0x30
} SDFM_FilterType;
//*****************************************************************************
//
//! Values that can be passed to SDFM_setupModulatorClock(),as the
//! \e clockMode parameter.
//
//*****************************************************************************
typedef enum
{
//! Modulator clock is identical to the data rate
SDFM_MODULATOR_CLK_EQUAL_DATA_RATE = 0,
} SDFM_ModulatorClockMode;
//*****************************************************************************
//
//! Values that can be passed to SDFM_setOutputDataFormat(),as the
//! \e dataFormat parameter.
//
//*****************************************************************************
typedef enum
{
//! Filter output is in 16 bits 2's complement format.
SDFM_DATA_FORMAT_16_BIT = 0,
//! Filter output is in 32 bits 2's complement format.
SDFM_DATA_FORMAT_32_BIT = 1
} SDFM_OutputDataFormat;
//*****************************************************************************
//
//! Values that can be passed to SDFM_setDataReadyInterruptSource(),as the
//! \e dataReadySource parameter.
//
//*****************************************************************************
typedef enum
{
//! Data ready interrupt source is direct (non -FIFO).
SDFM_DATA_READY_SOURCE_DIRECT = 0,
//! Data ready interrupt source is FIFO.
SDFM_DATA_READY_SOURCE_FIFO = 1
} SDFM_DataReadyInterruptSource;
//*****************************************************************************
//
//! Values that can be passed to SDFM_setPWMSyncSource(),as the
//! \e syncSource parameter.
//
//*****************************************************************************
typedef enum
{
SDFM_SYNC_PWM1_SOCA = 0, //!< SDFM sync source is PWM1 SOCA
SDFM_SYNC_PWM1_SOCB = 1, //!< SDFM sync source is PWM1 SOCB
SDFM_SYNC_PWM2_SOCA = 4, //!< SDFM sync source is PWM2 SOCA
SDFM_SYNC_PWM2_SOCB = 5, //!< SDFM sync source is PWM2 SOCB
SDFM_SYNC_PWM3_SOCA = 8, //!< SDFM sync source is PWM3 SOCA
SDFM_SYNC_PWM3_SOCB = 9, //!< SDFM sync source is PWM3 SOCB
SDFM_SYNC_PWM4_SOCA = 12, //!< SDFM sync source is PWM4 SOCA
SDFM_SYNC_PWM4_SOCB = 13, //!< SDFM sync source is PWM4 SOCB
SDFM_SYNC_PWM5_SOCA = 16, //!< SDFM sync source is PWM5 SOCA
SDFM_SYNC_PWM5_SOCB = 17, //!< SDFM sync source is PWM5 SOCB
SDFM_SYNC_PWM6_SOCA = 20, //!< SDFM sync source is PWM6 SOCA
SDFM_SYNC_PWM6_SOCB = 21, //!< SDFM sync source is PWM6 SOCB
SDFM_SYNC_PWM7_SOCA = 24, //!< SDFM sync source is PWM7 SOCA
SDFM_SYNC_PWM7_SOCB = 25, //!< SDFM sync source is PWM7 SOCB
SDFM_SYNC_PWM8_SOCA = 28, //!< SDFM sync source is PWM8 SOCA
SDFM_SYNC_PWM8_SOCB = 29 //!< SDFM sync source is PWM8 SOCB
} SDFM_PWMSyncSource;
//*****************************************************************************
//
//! Values that can be passed to SDFM_setFIFOClearOnSyncMode(),as the
//! \e fifoClearSyncMode parameter.
//
//*****************************************************************************
typedef enum
{
//! SDFM FIFO buffer is not cleared on Sync signal
SDFM_FIFO_NOT_CLEARED_ON_SYNC = 0,
//! SDFM FIFO buffer is cleared on Sync signal
SDFM_FIFO_CLEARED_ON_SYNC = 1
} SDFM_FIFOClearSyncMode;
//*****************************************************************************
//
//! Values that can be passed to SDFM_setWaitForSyncClearMode(),as the
//! \e syncClearMode parameter.
//
//*****************************************************************************
typedef enum
{
//! Wait for sync cleared using software.
SDFM_MANUAL_CLEAR_WAIT_FOR_SYNC = 0,
//! Wait for sync cleared automatically
SDFM_AUTO_CLEAR_WAIT_FOR_SYNC = 1
} SDFM_WaitForSyncClearMode;
//*****************************************************************************
//
//! Values that can be passed to SDFM_selectCompEventSource() as the
//! \e compEventNum parameter.
//
//*****************************************************************************
typedef enum
{
SDFM_COMP_EVENT_1 = 11U, //!< Selects CEVT1
SDFM_COMP_EVENT_2 = 14U //!< Selects CEVT2
} SDFM_CompEventNumber;
//*****************************************************************************
//
//! Values that can be passed to SDFM_selectCompEventSource() as the
//! \e compEventSource parameter.
//
//*****************************************************************************
typedef enum
{
SDFM_COMP_EVENT_SRC_COMPH1 = 0, //!< COMPH1 event is the source
SDFM_COMP_EVENT_SRC_COMPH1_L1 = 1, //!< Either of COMPH1 or COMPL1 event
//!< can be the source
SDFM_COMP_EVENT_SRC_COMPH2 = 2, //!< COMPH2 event is the source
SDFM_COMP_EVENT_SRC_COMPH2_L2 = 3, //!< Either of COMPH2 or COMPL2 event
//!< can be the source
SDFM_COMP_EVENT_SRC_COMPL1 = 0, //!< COMPL1 event is the source
SDFM_COMP_EVENT_SRC_COMPL2 = 2 //!< COMPL2 event is the source
} SDFM_CompEventSource;
//*****************************************************************************
//
//! Values that can be passed to SDFM_selectClockSource() as the \e clkSource
//! parameter.
//
//*****************************************************************************
typedef enum
{
//! Source is respective channel clock
SDFM_CLK_SOURCE_CHANNEL_CLK = 0x0,
//! Source is SD1 channel clock is the source
SDFM_CLK_SOURCE_SD1_CLK = 0x8U
} SDFM_ClockSource;
//*****************************************************************************
//
//! Values that can be passed to SDFM_selectCompEventHighSource() as the
//! \e source parameter.
//
//*****************************************************************************
typedef enum
{
//! Comparator event high source is unfiltered event
SDFM_COMPHOUT_SOURCE_COMPHIN = 0x0,
//! Comparator event high source is filtered event
SDFM_COMPHOUT_SOURCE_FILTER = 0x8
} SDFM_CompEventHighSource;
//*****************************************************************************
//
//! Values that can be passed to SDFM_selectCompEventLowSource() as the
//! \e source parameter.
//
//*****************************************************************************
typedef enum
{
//! Comparator event low source is unfiltered event
SDFM_COMPLOUT_SOURCE_COMPLIN = 0x000,
//! Comparator event low source is filtered event
SDFM_COMPLOUT_SOURCE_FILTER = 0x800
} SDFM_CompEventLowSource;
//*****************************************************************************
//
//! Values that can be passed to SDFM_configCompEventLowFilter() &
//! SDFM_configCompEventHighFilter() as the \e filterNumber.
//
//*****************************************************************************
typedef struct
{
uint16_t sampleWindow; //!< Sample window size
uint16_t threshold; //!< Majority voting threshold
uint16_t clkPrescale; //!< Sample clock pre-scale
} SDFM_CompEventFilterConfig;
//*****************************************************************************
//
// Values that can be passed to SDFM_enableInterrupt and SDFM_disableInterrupt
// as intFlags parameter
//
//*****************************************************************************
//! Interrupt is generated if Modulator fails.
//!
//! Interrupt on Comparator low-level threshold.
//!
//! Interrupt on Comparator high-level threshold.
//!
//! Interrupt on Acknowledge flag
//!
//! Interrupt on FIFO level
//!
//! Interrupt on FIFO overflow
//!
//*****************************************************************************
//
// Values that can be passed to SDFM_clearInterruptFlag flags parameter
//
//*****************************************************************************
//! Main interrupt flag
//!
//! Filter 1 high -level threshold flag
//!
//! Filter 1 low -level threshold flag
//!
//! Filter 2 high -level threshold flag
//!
//! Filter 2 low -level threshold flag
//!
//! Filter 3 high -level threshold flag
//!
//! Filter 3 low -level threshold flag
//!
//! Filter 4 high -level threshold flag
//!
//! Filter 4 low -level threshold flag
//!
//! Filter 1 modulator failed flag
//!
//! Filter 2 modulator failed flag
//!
//! Filter 3 modulator failed flag
//!
//! Filter 4 modulator failed flag
//!
//! Filter 1 new data flag
//!
//! Filter 2 new data flag
//!
//! Filter 3 new data flag
//!
//! Filter 4 new data flag
//!
//! Filter 1 FIFO overflow flag
//!
//! Filter 2 FIFO overflow flag
//!
//! Filter 3 FIFO overflow flag
//!
//! Filter 4 FIFO overflow flag
//!
//! Filter 1 FIFO overflow flag
//!
//! Filter 2 FIFO overflow flag
//!
//! Filter 3 FIFO overflow flag
//!
//! Filter 4 FIFO overflow flag
//!
//*****************************************************************************
//
//! \internal
//! Checks SDFM base address.
//!
//! \param base specifies the SDFM module base address.
//!
//! This function determines if SDFM module base address is valid.
//!
//! \return Returns \b true if the base address is valid and \b false
//! otherwise.
//
//*****************************************************************************
//*****************************************************************************
//
//! Enable external reset
//!
//! \param base is the base address of the SDFM module
//! \param filterNumber is the filter number.
//!
//! This function enables data filter to be reset by an external source (PWM
//! compare output).
//!
//! \return None.
//
//*****************************************************************************
static inline void
SDFM_enableExternalReset(uint32_t base, SDFM_FilterNumber filterNumber)
{
;
//
// Set the SDSYNCEN bit
//
__eallow();
(*((volatile uint16_t *)(base + 0x11U + ((uint32_t)filterNumber * 16U)))) |=
0x1000U;
__edis();
}
//*****************************************************************************
//
//! Disable external reset
//!
//! \param base is the base address of the SDFM module
//! \param filterNumber is the filter number.
//!
//! This function disables data filter from being reset by an external source
//! (PWM compare output).
//!
//! \return None.
//*****************************************************************************
static inline void
SDFM_disableExternalReset(uint32_t base, SDFM_FilterNumber filterNumber)
{
;
//
// Clear the SDSYNCEN bit
//
__eallow();
(*((volatile uint16_t *)(base + 0x11U + ((uint32_t)filterNumber * 16U)))) &=
~0x1000U;
__edis();
}
//*****************************************************************************
//
//! Enable filter
//!
//! \param base is the base address of the SDFM module
//! \param filterNumber is the filter number.
//!
//! This function enables the filter specified by the \e filterNumber variable.
//!
//! \return None.
//
//*****************************************************************************
static inline void
SDFM_enableFilter(uint32_t base, SDFM_FilterNumber filterNumber)
{
;
//
// Set the FEN bit
//
__eallow();
(*((volatile uint16_t *)(base + 0x11U + ((uint32_t)filterNumber * 16U)))) |=
0x100U;
__edis();
}
//*****************************************************************************
//
//! Disable filter
//!
//! \param base is the base address of the SDFM module
//! \param filterNumber is the filter number.
//!
//! This function disables the filter specified by the \e filterNumber
//! variable.
//!
//! \return None.
//*****************************************************************************
static inline void
SDFM_disableFilter(uint32_t base, SDFM_FilterNumber filterNumber)
{
;
//
// Clear the FEN bit
//
__eallow();
(*((volatile uint16_t *)(base + 0x11U + ((uint32_t)filterNumber * 16U)))) &=
~0x100U;
__edis();
}
//*****************************************************************************
//
//! Enable FIFO buffer
//!
//! \param base is the base address of the SDFM module
//! \param filterNumber is the filter number.
//!
//! This function enables the filter FIFO buffer specified by the
//! \e filterNumber variable.
//!
//! \return None.
//
//*****************************************************************************
static inline void
SDFM_enableFIFOBuffer(uint32_t base, SDFM_FilterNumber filterNumber)
{
;
//
// Set the FFEN bit
//
__eallow();
(*((volatile uint16_t *)(base + 0x1DU + ((uint32_t)filterNumber * 16U)))) |=
0x2000U;
__edis();
}
//*****************************************************************************
//
//! Disable FIFO buffer
//!
//! \param base is the base address of the SDFM module
//! \param filterNumber is the filter number.
//!
//! This function disables the filter FIFO buffer specified by the
//! \e filterNumber variable.
//!
//! \return None.
//
//*****************************************************************************
static inline void
SDFM_disableFIFOBuffer(uint32_t base, SDFM_FilterNumber filterNumber)
{
;
//
// Clear the FFEN bit
//
__eallow();
(*((volatile uint16_t *)(base + 0x1DU + ((uint32_t)filterNumber * 16U)))) &=
~0x2000U;
__edis();
}
//*****************************************************************************
//
//! Return the Zero Cross Trip status
//!
//! \param base is the base address of the SDFM module
//! \param filterNumber is the filter number.
//!
//! This function returns the Zero Cross Trip status for the filter
//! specified by filterNumber variable.
//!
//! \return \b true if Comparator filter output >= High-level threshold (Z)
//! \b false if Comparator filter output < High-level threshold (Z)
//
//*****************************************************************************
static inline _Bool
SDFM_getZeroCrossTripStatus(uint32_t base, SDFM_FilterNumber filterNumber)
{
;
return((((*((volatile uint16_t *)(base + 0x7U))) >> (uint16_t)filterNumber) &
0x1U) == 1U);
}
//*****************************************************************************
//
//! Clear the Zero Cross Trip status
//!
//! \param base is the base address of the SDFM module
//! \param filterNumber is the filter number.
//!
//! This function clears the Zero Cross Trip status for the filter
//! specified by filterNumber variable.
//!
//! \return None.
//
//*****************************************************************************
static inline void
SDFM_clearZeroCrossTripStatus(uint32_t base, SDFM_FilterNumber filterNumber)
{
;
//
// Set SDCTL MIE bit
//
__eallow();
(*((volatile uint16_t *)(base + 0x4U))) |= ((uint16_t)1U << (uint16_t)filterNumber);
__edis();
}
//*****************************************************************************
//
//! Enable Comparator.
//!
//! \param base is the base address of the SDFM module
//! \param filterNumber is the filter number.
//!
//! This function enables the Comparator for the selected filter.
//!
//! \return None.
//
//*****************************************************************************
static inline void
SDFM_enableComparator(uint32_t base, SDFM_FilterNumber filterNumber)
{
;
//
// Set CEN bit
//
__eallow();
(*((volatile uint16_t *)(base + 0x15U + ((uint32_t)filterNumber * 16U)))) |=
0x2000U;
__edis();
}
//*****************************************************************************
//
//! Disable Comparator.
//!
//! \param base is the base address of the SDFM module
//! \param filterNumber is the filter number.
//!
//! This function disables the Comparator for the selected filter.
//!
//! \return None.
//
//*****************************************************************************
static inline void
SDFM_disableComparator(uint32_t base, SDFM_FilterNumber filterNumber)
{
;
//
// Clear CEN bit
//
__eallow();
(*((volatile uint16_t *)(base + 0x15U + ((uint32_t)filterNumber * 16U)))) &=
~0x2000U;
__edis();
}
//*****************************************************************************
//
//! Selects Comparator Event Source.
//!
//! \param base is the base address of the SDFM module
//! \param filterNumber is the filter number
//! \param compEventNum is the event number
//! \param compEventSource is the event source
//!
//! This function selects the comparator event source. Valid values for
//! \e compEventNum are:
//! - SDFM_COMP_EVENT_1 - Selects comparator event 1
//! - SDFM_COMP_EVENT_2 - Selects comparator event 2
//! Valid values for \e SDFM_COMP_EVENT_1 are:
//! - SDFM_COMP_EVENT_SRC_COMPH1 - COMPH1 event is the source for selected event
//! - SDFM_COMP_EVENT_SRC_COMPH1_L1 - Either of COMPH1 or COMPL1 event can be
//! the source for selected event
//! - SDFM_COMP_EVENT_SRC_COMPH2 - COMPH2 event is the source for selected event
//! - SDFM_COMP_EVENT_SRC_COMPH2_L2 - Either of COMPH2 or COMPL2 event can be
//! the source for selected event
//!
//! Valid values for \e SDFM_COMP_EVENT_2 are:
//! - SDFM_COMP_EVENT_SRC_COMPL1 - COMPL1 event is the source for selected event
//! - SDFM_COMP_EVENT_SRC_COMPH1_L1 - Either of COMPH1 or COMPL1 event can be
//! the source for selected event
//! - SDFM_COMP_EVENT_SRC_COMPL2 - COMPL2 event is the source for selected event
//! - SDFM_COMP_EVENT_SRC_COMPH2_L2 - Either of COMPH2 or COMPL2 event can be
//! the source for selected event
//!
//! \return None.
//
//*****************************************************************************
static inline void
SDFM_selectCompEventSource(uint32_t base, SDFM_FilterNumber filterNumber,
SDFM_CompEventNumber compEventNum,
SDFM_CompEventSource compEventSource)
{
uint32_t address;
;
address = base + 0x15U + ((uint32_t)filterNumber *
(0x20U - 0x10U));
//
// Select source for selected comparator event
//
__eallow();
(*((volatile uint16_t *)(address))) = ((*((volatile uint16_t *)(address))) & ~((uint16_t)0x2U <<
(uint16_t)compEventNum)) |
((uint16_t)compEventSource << (uint16_t)compEventNum) ;
__edis();
}
//*****************************************************************************
//
//! Set filter type.
//!
//! \param base is the base address of the SDFM module
//! \param filterNumber is the filter number.
//! \param filterType is the filter type or structure.
//!
//! This function sets the filter type or structure to be used as specified by
//! filterType for the selected filter number as specified by filterNumber.
//!
//! \return None.
//*****************************************************************************
static inline void
SDFM_setFilterType(uint32_t base, SDFM_FilterNumber filterNumber,
SDFM_FilterType filterType)
{
uint32_t address;
;
address = base + 0x11U + ((uint32_t)filterNumber * 16U);
//
// Write to SST bits
//
__eallow();
(*((volatile uint16_t *)(address))) = ((*((volatile uint16_t *)(address))) & (~0xC00U)) |
((uint16_t)filterType << 6U);
__edis();
}
//*****************************************************************************
//
//! Set data filter over sampling ratio.
//!
//! \param base is the base address of the SDFM module
//! \param filterNumber is the filter number.
//! \param overSamplingRatio is the data filter over sampling ratio.
//!
//! This function sets the filter oversampling ratio for the filter specified
//! by the filterNumber variable.Valid values for the variable
//! overSamplingRatio are 0 to 255 inclusive. The actual oversampling ratio
//! will be this value plus one.
//!
//! \return None.
//*****************************************************************************
static inline void
SDFM_setFilterOverSamplingRatio(uint32_t base, SDFM_FilterNumber filterNumber,
uint16_t overSamplingRatio)
{
uint32_t address;
;
;
address = base + 0x11U + ((uint32_t)filterNumber * 16U);
//
// Write to DOSR bits
//
__eallow();
(*((volatile uint16_t *)(address))) = ((*((volatile uint16_t *)(address))) & (~0xFFU)) |
overSamplingRatio;
__edis();
}
//*****************************************************************************
//
//! Set modulator clock mode.
//!
//! \param base is the base address of the SDFM module
//! \param filterNumber is the filter number.
//! \param clockMode is the modulator clock mode.
//!
//! This function sets the modulator clock mode specified by clockMode
//! for the filter specified by filterNumber.
//!
//! \note This function also enables the data and clock synchronizers for
//! the specified filter.
//!
//! \return None.
//*****************************************************************************
static inline void
SDFM_setupModulatorClock(uint32_t base, SDFM_FilterNumber filterNumber,
SDFM_ModulatorClockMode clockMode)
{
uint32_t address;
;
address = base + 0x10U + ((uint32_t)filterNumber * 16U);
//
// Write to MOD bits
//
__eallow();
(*((volatile uint16_t *)(address))) = ((*((volatile uint16_t *)(address))) & (~0x3U)) |
(uint16_t)clockMode;
//
// Enable data and clock synchronizer
//
(*((volatile uint16_t *)(base + 0x10U + ((uint32_t)filterNumber * (0x20U - 0x10U))))) |=
(0x10U | 0x40U);
__edis();
}
//*****************************************************************************
//
//! Set the output data format
//!
//! \param base is the base address of the SDFM module
//! \param filterNumber is the filter number.
//! \param dataFormat is the output data format.
//!
//! This function sets the output data format for the filter specified by
//! filterNumber.
//!
//! \return None.
//
//*****************************************************************************
static inline void
SDFM_setOutputDataFormat(uint32_t base, SDFM_FilterNumber filterNumber,
SDFM_OutputDataFormat dataFormat)
{
uint32_t address;
;
address = base + 0x12U + ((uint32_t)filterNumber * 16U);
//
// Write to DR bit
//
__eallow();
(*((volatile uint16_t *)(address))) = ((*((volatile uint16_t *)(address))) & (~0x400U)) |
((uint16_t)dataFormat << 10U);
__edis();
}
//*****************************************************************************
//
//! Set data shift value.
//!
//! \param base is the base address of the SDFM module
//! \param filterNumber is the filter number.
//! \param shiftValue is the data shift value.
//!
//! This function sets the shift value for the 16 bit 2's complement data
//! format. The valid maximum value for shiftValue is 31.
//!
//! \b Note: Use this function with 16 bit 2's complement data format only.
//!
//! \return None.
//
//*****************************************************************************
static inline void
SDFM_setDataShiftValue(uint32_t base, SDFM_FilterNumber filterNumber,
uint16_t shiftValue)
{
uint32_t address;
;
;
address = base + 0x12U + ((uint32_t)filterNumber * 16U);
//
// Write to SH bit
//
__eallow();
(*((volatile uint16_t *)(address))) = ((*((volatile uint16_t *)(address))) & (~0xF800U)) |
(shiftValue << 11U);
__edis();
}
//*****************************************************************************
//
//! Set Filter output high-level threshold.
//!
//! \param base is the base address of the SDFM module
//! \param filterNumber is the filter number.
//! \param highThreshold is the high-level threshold 1 & 2.
//!
//! This function sets the unsigned high-level threshold value for the
//! Comparator filter output. If the output value of the filter exceeds
//! highThreshold and interrupt generation is enabled, an interrupt will be
//! issued. The param \b highThreshold takes both high threshold 1 & 2 values.
//! The upper 16-bits represent the high threshold 2 value while lower 16-bits
//! represent the threshold 1 values.
//!
//! \return None.
//
//*****************************************************************************
static inline void
SDFM_setCompFilterHighThreshold(uint32_t base, SDFM_FilterNumber filterNumber,
uint32_t highThreshold)
{
uint32_t address;
;
;
;
address = base + 0x13U +
((uint32_t)filterNumber * (0x20U - 0x10U));
//
// Write to HLT bit
//
__eallow();
(*((volatile uint16_t *)(address))) = ((*((volatile uint16_t *)(address))) & ~0x7FFFU) |
(uint16_t)highThreshold;
(*((volatile uint16_t *)(address + (0x1BU - 0x13U)))) =
((*((volatile uint16_t *)(address + (0x1BU - 0x13U)))) &
~0x7FFFU) |
(uint16_t)(highThreshold >> 16U);
__edis();
}
//*****************************************************************************
//
//! Set Filter output low-level threshold.
//!
//! \param base is the base address of the SDFM module
//! \param filterNumber is the filter number
//! \param lowThreshold is the low-level threshold
//!
//! This function sets the unsigned low-level threshold value 1 or 2 for the
//! Comparator filter output. If the output value of the filter gets below
//! lowThreshold and interrupt generation is enabled, an interrupt will be
//! issued. The param \b lowThreshold takes both low threshold 1 & 2 values.
//! The upper 16-bits represent the low threshold 2 value while lower 16-bits
//! represent the threshold 1 values.
//!
//! \return None.
//
//*****************************************************************************
static inline void
SDFM_setCompFilterLowThreshold(uint32_t base, SDFM_FilterNumber filterNumber,
uint32_t lowThreshold)
{
uint32_t address;
;
;
;
address = base + 0x14U +
((uint32_t)filterNumber * (0x20U - 0x10U));
//
// Write to LLT bit.
//
__eallow();
(*((volatile uint16_t *)(address))) = ((*((volatile uint16_t *)(address))) & ~0x7FFFU) |
(uint16_t)lowThreshold;
(*((volatile uint16_t *)(address + (0x1FU - 0x14U)))) =
((*((volatile uint16_t *)(address + (0x1FU - 0x14U)))) &
~0x7FFFU) |
(uint16_t)(lowThreshold >> 16U);
__edis();
}
//*****************************************************************************
//
//! Set Filter output zero-cross threshold.
//!
//! \param base is the base address of the SDFM module
//! \param filterNumber is the filter number.
//! \param zeroCrossThreshold is the zero-cross threshold.
//!
//! This function sets the unsigned zero-cross threshold value for the
//! Comparator filter output.
//!
//! \return None.
//
//*****************************************************************************
static inline void
SDFM_setCompFilterZeroCrossThreshold(uint32_t base,
SDFM_FilterNumber filterNumber,
uint16_t zeroCrossThreshold)
{
uint32_t address;
;
;
address = base + 0x1CU + ((uint32_t)filterNumber * 16U);
//
// Write to ZCT bit
//
__eallow();
(*((volatile uint16_t *)(address))) = ((*((volatile uint16_t *)(address))) & ~0x7FFFU) |
zeroCrossThreshold;
__edis();
}
//*****************************************************************************
//
//! Enable zero-cross Edge detect mode.
//!
//! \param base is the base address of the SDFM module
//! \param filterNumber is the filter number.
//!
//! This function enables Zero Cross Edge detection.
//!
//! \return None.
//
//*****************************************************************************
static inline void
SDFM_enableZeroCrossEdgeDetect(uint32_t base, SDFM_FilterNumber filterNumber)
{
;
//
// Set ZCEN bit
//
__eallow();
(*((volatile uint16_t *)(base + 0x15U + ((uint32_t)filterNumber * 16U)))) |=
0x400U;
__edis();
}
//*****************************************************************************
//
//! Disable zero-cross Edge detect mode.
//!
//! \param base is the base address of the SDFM module
//! \param filterNumber is the filter number.
//!
//! This function disables Zero Cross Edge detection.
//!
//! \return None.
//
//*****************************************************************************
static inline void
SDFM_disableZeroCrossEdgeDetect(uint32_t base, SDFM_FilterNumber filterNumber)
{
;
//
// Clear ZCEN bit
//
__eallow();
(*((volatile uint16_t *)(base + 0x15U + ((uint32_t)filterNumber * 16U)))) &=
~0x400U;
__edis();
}
//*****************************************************************************
//
//! Enable SDFM interrupts.
//!
//! \param base is the base address of the SDFM module
//! \param filterNumber is the filter number.
//! \param intFlags is the interrupt source.
//!
//! This function enables the low threshold , high threshold or modulator
//! failure interrupt as determined by intFlags for the filter specified
//! by filterNumber.
//! Valid values for intFlags are:
//! SDFM_MODULATOR_FAILURE_INTERRUPT , SDFM_LOW_LEVEL_THRESHOLD_INTERRUPT,
//! SDFM_HIGH_LEVEL_THRESHOLD_INTERRUPT, SDFM_FIFO_INTERRUPT,
//! SDFM_FIFO_OVERFLOW_INTERRUPT,SDFM_DATA_FILTER_ACKNOWLEDGE_INTERRUPT
//!
//! \return None.
//
//*****************************************************************************
static inline void
SDFM_enableInterrupt(uint32_t base, SDFM_FilterNumber filterNumber,
uint16_t intFlags)
{
uint16_t offset;
;
offset = (uint16_t)filterNumber * 16U;
__eallow();
//
// Low, high threshold, Modulator failure
//
if((intFlags & (0x200U |
0x40U |
0x20U)) != 0U)
{
//
// Set IEL or IEH or MFIE bit of SDFM_O_SDCPARMx
//
(*((volatile uint16_t *)(base + 0x15U + offset))) |=
(intFlags & (0x200U |
0x40U |
0x20U));
}
//
// Data filter acknowledge interrupt
//
if((intFlags & 0x1U) != 0U)
{
(*((volatile uint16_t *)(base + 0x11U + offset))) |= 0x200U;
}
//
// FIFO , FIFO overflow interrupt
//
if((intFlags & (0x1000U | 0x8000U)) != 0U)
{
//
// Set OVFIEN or FFIEN bits of SDFM_O_SDFIFOCTLx
//
(*((volatile uint16_t *)(base + 0x1DU + offset))) |=
(intFlags & (0x1000U |
0x8000U));
}
__edis();
}
//*****************************************************************************
//
//! Disable SDFM interrupts.
//!
//! \param base is the base address of the SDFM module
//! \param filterNumber is the filter number.
//! \param intFlags is the interrupt source.
//!
//! This function disables the low threshold , high threshold or modulator
//! failure interrupt as determined by intFlags for the filter
//! specified by filterNumber.
//! Valid values for intFlags are:
//! SDFM_MODULATOR_FAILURE_INTERRUPT , SDFM_LOW_LEVEL_THRESHOLD_INTERRUPT,
//! SDFM_HIGH_LEVEL_THRESHOLD_INTERRUPT, SDFM_FIFO_INTERRUPT,
//! SDFM_FIFO_OVERFLOW_INTERRUPT,SDFM_DATA_FILTER_ACKNOWLEDGE_INTERRUPT
//!
//! \return None.
//
//*****************************************************************************
static inline void
SDFM_disableInterrupt(uint32_t base, SDFM_FilterNumber filterNumber,
uint16_t intFlags)
{
uint16_t offset;
;
offset = (uint16_t)filterNumber * 16U;
__eallow();
//
// Low, high threshold, modulator failure interrupts
//
if((intFlags & (0x200U |
0x40U |
0x20U)) != 0U)
{
//
// Set IEL or IEH or MFIE bit of SDFM_O_SDCPARMx
//
(*((volatile uint16_t *)(base + 0x15U + offset))) &=
~(intFlags & (0x200U |
0x40U |
0x20U));
}
//
// Data filter acknowledge interrupt
//
if((intFlags & 0x1U) != 0U)
{
(*((volatile uint16_t *)(base + 0x11U + offset))) &= ~0x200U;
}
//
// FIFO , FIFO overflow interrupt
//
if((intFlags & (0x1000U | 0x8000U)) != 0U)
{
//
// Set OVFIEN or FFIEN bits of SDFM_O_SDFIFOCTLx
//
(*((volatile uint16_t *)(base + 0x1DU + offset))) &=
~(intFlags & (0x1000U | 0x8000U));
}
__edis();
}
//*****************************************************************************
//
//! Set the comparator filter type.
//!
//! \param base is the base address of the SDFM module
//! \param filterNumber is the filter number.
//! \param filterType is the comparator filter type or structure.
//!
//! This function sets the Comparator filter type or structure to be used as
//! specified by filterType for the selected filter number as specified by
//! filterNumber.
//!
//! \return None.
//*****************************************************************************
static inline void
SDFM_setComparatorFilterType(uint32_t base, SDFM_FilterNumber filterNumber,
SDFM_FilterType filterType)
{
uint32_t address;
;
address = base + 0x15U + ((uint32_t)filterNumber * 16U);
//
// Write to CS1_CS0 bits
//
__eallow();
(*((volatile uint16_t *)(address))) = ((*((volatile uint16_t *)(address))) & (~0x180U)) |
((uint16_t)filterType << 3U);
__edis();
}
//*****************************************************************************
//
//! Set Comparator filter over sampling ratio.
//!
//! \param base is the base address of the SDFM module
//! \param filterNumber is the filter number.
//! \param overSamplingRatio is the comparator filter over sampling ration.
//!
//! This function sets the comparator filter oversampling ratio for the filter
//! specified by the filterNumber.Valid values for the variable
//! overSamplingRatio are 0 to 31 inclusive.
//! The actual oversampling ratio will be this value plus one.
//!
//! \return None.
//*****************************************************************************
static inline void
SDFM_setCompFilterOverSamplingRatio(uint32_t base,
SDFM_FilterNumber filterNumber,
uint16_t overSamplingRatio)
{
uint32_t address;
;
;
address = base + 0x15U + ((uint32_t)filterNumber * 16U);
//
// Write to COSR bits
//
__eallow();
(*((volatile uint16_t *)(address))) = ((*((volatile uint16_t *)(address))) & (~0x1FU)) |
overSamplingRatio;
__edis();
}
//*****************************************************************************
//
//! Get the filter data output.
//!
//! \param base is the base address of the SDFM module
//! \param filterNumber is the filter number.
//!
//! This function returns the latest data filter output. Depending on the
//! filter data output format selected, the valid value will be the lower 16
//! bits or the whole 32 bits of the returned value.
//!
//! \return Returns the latest data filter output.
//*****************************************************************************
static inline uint32_t
SDFM_getFilterData(uint32_t base, SDFM_FilterNumber filterNumber)
{
;
//
// Read SDDATA bits
//
return((*((volatile uint32_t *)(base + 0x16U + ((uint32_t)filterNumber * 16U)))));
}
//*****************************************************************************
//
//! Get the Comparator threshold status.
//!
//! \param base is the base address of the SDFM module
//! \param filterNumber is the filter number.
//!
//! This function returns the Comparator output threshold status for the given
//! filterNumber.
//!
//! \return Returns the following status flags.
//! - \b SDFM_OUTPUT_WITHIN_THRESHOLD if the output is within the
//! specified threshold.
//! - \b SDFM_OUTPUT_ABOVE_THRESHOLD if the output is above the high
//! threshold
//! - \b SDFM_OUTPUT_BELOW_THRESHOLD if the output is below the low
//! threshold.
//!
//*****************************************************************************
static inline SDFM_OutputThresholdStatus
SDFM_getThresholdStatus(uint32_t base, SDFM_FilterNumber filterNumber)
{
;
//
// Read SDIFLG high/low threshold bits
//
return((SDFM_OutputThresholdStatus)(((*((volatile uint32_t *)(base + 0x0U))) >>
(2U * (uint16_t)filterNumber)) & 0x3U));
}
//*****************************************************************************
//
//! Get the Modulator status.
//!
//! \param base is the base address of the SDFM module
//! \param filterNumber is the filter number.
//!
//! This function returns the Modulator status.
//!
//! \return Returns true if the Modulator is operating normally
//! Returns false if the Modulator has failed
//!
//*****************************************************************************
static inline _Bool
SDFM_getModulatorStatus(uint32_t base, SDFM_FilterNumber filterNumber)
{
;
//
// Read SDIFLG MF1, MF2, MF3 OR MF4 bits
//
return((((*((volatile uint32_t *)(base + 0x0U))) >> ((uint16_t)filterNumber + 8U)) &
0x1U) != 0x1U);
}
//*****************************************************************************
//
//! Check if new Filter data is available.
//!
//! \param base is the base address of the SDFM module
//! \param filterNumber is the filter number.
//!
//! This function returns new filter data status.
//!
//! \return Returns \b true if new filter data is available
//! Returns \b false if no new filter data is available
//!
//*****************************************************************************
static inline _Bool
SDFM_getNewFilterDataStatus(uint32_t base, SDFM_FilterNumber filterNumber)
{
;
//
// Read SDIFLG AF1, AF2, AF3 OR AF4 bits
//
return((((*((volatile uint32_t *)(base + 0x0U))) >> ((uint16_t)filterNumber + 12U)) &
0x1U) == 0x1U);
}
//*****************************************************************************
//
//! Check if FIFO buffer is overflowed.
//!
//! \param base is the base address of the SDFM module
//! \param filterNumber is the filter number.
//!
//! This function returns the status of the FIFO buffer overflow for the given
//! filter value.
//!
//! \return Returns \b true if FIFO buffer is overflowed
//! Returns \b false if FIFO buffer is not overflowed
//!
//*****************************************************************************
static inline _Bool
SDFM_getFIFOOverflowStatus(uint32_t base, SDFM_FilterNumber filterNumber)
{
;
//
// Read SDIFLG SDFFOVF1, SDFFOVF2, SDFFOVF3 OR SDFFOVF4 bits
//
return((((*((volatile uint32_t *)(base + 0x0U))) >> ((uint16_t)filterNumber + 16U)) &
0x1U) == 0x1U);
}
//*****************************************************************************
//
//! Check FIFO buffer interrupt status.
//!
//! \param base is the base address of the SDFM module
//! \param filterNumber is the filter number.
//!
//! This function returns the status of the FIFO buffer interrupt for the given
//! filter.
//!
//! \return Returns \b true if FIFO buffer interrupt has occurred.
//! Returns \b false if FIFO buffer interrupt has not occurred.
//!
//*****************************************************************************
static inline _Bool
SDFM_getFIFOISRStatus(uint32_t base, SDFM_FilterNumber filterNumber)
{
;
//
// Read SDIFLG SDFFINT1, SDFFINT2, SDFFINT3 OR SDFFINT4 bits
//
return((((*((volatile uint32_t *)(base + 0x0U))) >> ((uint16_t)filterNumber + 20U)) &
0x1U) == 0x1U);
}
//*****************************************************************************
//
//! Get pending interrupt.
//!
//! \param base is the base address of the SDFM module
//!
//! This function returns any pending interrupt status.
//!
//! \return Returns \b true if there is a pending interrupt.
//! Returns \b false if no interrupt is pending.
//!
//*****************************************************************************
static inline _Bool
SDFM_getIsrStatus(uint32_t base)
{
;
//
// Read SDIFLG MIF
//
return(((*((volatile uint32_t *)(base + 0x0U))) >> 31U) == 0x1U);
}
//*****************************************************************************
//
//! Clear pending flags.
//!
//! \param base is the base address of the SDFM module
//! \param flag is the SDFM status
//!
//! This function clears the specified pending interrupt flag.
//! Valid values are
//! SDFM_MAIN_INTERRUPT_FLAG,SDFM_FILTER_1_NEW_DATA_FLAG,
//! SDFM_FILTER_2_NEW_DATA_FLAG,SDFM_FILTER_3_NEW_DATA_FLAG,
//! SDFM_FILTER_4_NEW_DATA_FLAG,SDFM_FILTER_1_MOD_FAILED_FLAG,
//! SDFM_FILTER_2_MOD_FAILED_FLAG,SDFM_FILTER_3_MOD_FAILED_FLAG,
//! SDFM_FILTER_4_MOD_FAILED_FLAG,SDFM_FILTER_1_HIGH_THRESHOLD_FLAG,
//! SDFM_FILTER_1_LOW_THRESHOLD_FLAG,SDFM_FILTER_2_HIGH_THRESHOLD_FLAG,
//! SDFM_FILTER_2_LOW_THRESHOLD_FLAG,SDFM_FILTER_3_HIGH_THRESHOLD_FLAG,
//! SDFM_FILTER_3_LOW_THRESHOLD_FLAG,SDFM_FILTER_4_HIGH_THRESHOLD_FLAG,
//! SDFM_FILTER_4_LOW_THRESHOLD_FLAG,SDFM_FILTER_1_FIFO_OVERFLOW_FLAG,
//! SDFM_FILTER_2_FIFO_OVERFLOW_FLAG,SDFM_FILTER_3_FIFO_OVERFLOW_FLAG
//! SDFM_FILTER_4_FIFO_OVERFLOW_FLAG,SDFM_FILTER_1_FIFO_INTERRUPT_FLAG,
//! SDFM_FILTER_2_FIFO_INTERRUPT_FLAG,SDFM_FILTER_3_FIFO_INTERRUPT_FLAG
//! SDFM_FILTER_4_FIFO_INTERRUPT_FLAG or any combination of the above flags.
//!
//! \return None
//!
//*****************************************************************************
static inline void
SDFM_clearInterruptFlag(uint32_t base, uint32_t flag)
{
;
;
//
// Write to SDIFLGCLR register
//
(*((volatile uint32_t *)(base + 0x2U))) |= flag;
}
//*****************************************************************************
//
//! Enable main interrupt.
//!
//! \param base is the base address of the SDFM module
//!
//! This function enables the main SDFM interrupt.
//!
//! \return None
//!
//*****************************************************************************
static inline void
SDFM_enableMainInterrupt(uint32_t base)
{
;
//
// Set SDCTL MIE bit
//
__eallow();
(*((volatile uint16_t *)(base + 0x4U))) |= 0x2000U;
__edis();
}
//*****************************************************************************
//
//! Disable main interrupt.
//!
//! \param base is the base address of the SDFM module
//!
//! This function disables the main SDFM interrupt.
//!
//! \return None
//!
//*****************************************************************************
static inline void
SDFM_disableMainInterrupt(uint32_t base)
{
;
//
// Clear SDCTL MIE bit
//
__eallow();
(*((volatile uint16_t *)(base + 0x4U))) &= ~0x2000U;
__edis();
}
//*****************************************************************************
//
//! Enable main filter.
//!
//! \param base is the base address of the SDFM module
//!
//! This function enables main filter.
//!
//! \return None
//!
//*****************************************************************************
static inline void
SDFM_enableMainFilter(uint32_t base)
{
;
//
// Set SDMFILEN MFE bit
//
__eallow();
(*((volatile uint16_t *)(base + 0x6U))) |= 0x800U;
__edis();
}
//*****************************************************************************
//
//! Disable main filter.
//!
//! \param base is the base address of the SDFM module
//!
//! This function disables main filter.
//!
//! \return None
//!
//*****************************************************************************
static inline void
SDFM_disableMainFilter(uint32_t base)
{
;
//
// Clear SDMFILEN MFE bit
//
__eallow();
(*((volatile uint16_t *)(base + 0x6U))) &= ~0x800U;
__edis();
}
//*****************************************************************************
//
//! Return the FIFO data count
//!
//! \param base is the base address of the SDFM module
//! \param filterNumber is the filter number.
//!
//! This function returns the FIFO data count.
//!
//! \return Returns the number of data words available in FIFO buffer.
//
//*****************************************************************************
static inline uint16_t
SDFM_getFIFODataCount(uint32_t base, SDFM_FilterNumber filterNumber)
{
;
//
// Read SDFFST
//
return(((*((volatile uint16_t *)(base + 0x1DU + ((uint32_t)filterNumber * 16U)))) & 0x7C0U) >>
6U);
}
//*****************************************************************************
//
//! Return the Comparator sinc filter data
//!
//! \param base is the base address of the SDFM module
//! \param filterNumber is the filter number.
//!
//! This function returns the Comparator sinc filter data output.
//!
//! \return Returns the Comparator sinc filter data output.
//!
//
//*****************************************************************************
static inline uint16_t
SDFM_getComparatorSincData(uint32_t base, SDFM_FilterNumber filterNumber)
{
;
//
// Read SDCDATA
//
return((*((volatile uint16_t *)(base + 0x1AU + ((uint32_t)filterNumber * 16U)))));
}
//*****************************************************************************
//
//! Return the FIFO data
//!
//! \param base is the base address of the SDFM module
//! \param filterNumber is the filter number.
//!
//! This function returns the latest FIFO data.
//!
//! \return Returns the latest FIFO data.
//!
//! \note Discard the upper 16 bits if the output data format is 16bits.
//
//*****************************************************************************
static inline uint32_t
SDFM_getFIFOData(uint32_t base, SDFM_FilterNumber filterNumber)
{
;
//
// Read SDDATFIFO
//
return((*((volatile uint32_t *)(base + 0x18U + ((uint32_t)filterNumber * 16U)))));
}
//*****************************************************************************
//
//! Set the FIFO interrupt level.
//!
//! \param base is the base address of the SDFM module
//! \param filterNumber is the filter number.
//! \param fifoLevel is the FIFO interrupt level.
//!
//! This function sets the FIFO interrupt level. Interrupt is generated when
//! the FIFO buffer word count gets to or exceeds the value of \e fifoLevel.
//! Maximum value for \e fifoLevel is 16.
//!
//! \return None.
//
//*****************************************************************************
static inline void
SDFM_setFIFOInterruptLevel(uint32_t base, SDFM_FilterNumber filterNumber,
uint16_t fifoLevel)
{
uint32_t address;
;
;
address = base + 0x1DU + ((uint32_t)filterNumber * 16U);
//
// Write to SDFFIL bit
//
__eallow();
(*((volatile uint16_t *)(address))) =
(((*((volatile uint16_t *)(address))) & (~0x1FU)) | fifoLevel);
__edis();
}
//*****************************************************************************
//
//! Set data ready interrupt source.
//!
//! \param base is the base address of the SDFM module
//! \param filterNumber is the filter number.
//! \param dataReadySource is the data ready interrupt source.
//!
//! This function sets the data ready interrupt source.
//! Valid values for \e dataReadySource:
//! - SDFM_DATA_READY_SOURCE_DIRECT - Direct data ready
//! - SDFM_DATA_READY_SOURCE_FIFO - FIFO data ready.
//!
//! \return None.
//
//*****************************************************************************
static inline void
SDFM_setDataReadyInterruptSource(uint32_t base, SDFM_FilterNumber filterNumber,
SDFM_DataReadyInterruptSource dataReadySource)
{
uint32_t address;
;
address = base + 0x1DU + ((uint32_t)filterNumber * 16U);
//
// Write to DRINTSEL
//
__eallow();
(*((volatile uint16_t *)(address))) = ((*((volatile uint16_t *)(address))) & ~0x4000U) |
((uint16_t)dataReadySource << 14U);
__edis();
}
//*****************************************************************************
//
//! Get the wait-for-sync event status.
//!
//! \param base is the base address of the SDFM module
//! \param filterNumber is the filter number.
//!
//! This function returns the Wait-for-Sync event status.
//!
//! \return Returns true if sync event has occurred.
//! Returns false if sync event has not occurred.
//
//*****************************************************************************
static inline _Bool
SDFM_getWaitForSyncStatus(uint32_t base, SDFM_FilterNumber filterNumber)
{
;
//
// Read WTSYNFLG bit
//
return((((*((volatile uint16_t *)(base + 0x1EU + ((uint32_t)filterNumber * 16U)))) &
0x80U) >> 7U) == 0x1U);
}
//*****************************************************************************
//
//! Clear the Wait-for-sync event status.
//!
//! \param base is the base address of the SDFM module
//! \param filterNumber is the filter number.
//!
//! This function clears the Wait-for-sync event status.
//!
//! \return None.
//
//*****************************************************************************
static inline void
SDFM_clearWaitForSyncFlag(uint32_t base, SDFM_FilterNumber filterNumber)
{
;
__eallow();
//
// Clear WTSYNCLR bit
//
(*((volatile uint16_t *)(base + 0x1EU + ((uint32_t)filterNumber * 16U)))) |=
0x100U;
__edis();
}
//*****************************************************************************
//
//! Enable wait for sync mode.
//!
//! \param base is the base address of the SDFM module
//! \param filterNumber is the filter number.
//!
//! This function enables the wait for sync mode. Data to FIFO will be written
//! only after PWM sync event.
//!
//! \return None.
//
//*****************************************************************************
static inline void
SDFM_enableWaitForSync(uint32_t base, SDFM_FilterNumber filterNumber)
{
;
__eallow();
//
// Set WTSYNCEN bit
//
(*((volatile uint16_t *)(base + 0x1EU + ((uint32_t)filterNumber * 16U)))) |=
0x40U;
__edis();
}
//*****************************************************************************
//
//! Disable wait for sync mode.
//!
//! \param base is the base address of the SDFM module
//! \param filterNumber is the filter number.
//!
//! This function disables the wait for sync mode. Data to FIFO will be written
//! every Data ready event.
//!
//! \return None.
//
//*****************************************************************************
static inline void
SDFM_disableWaitForSync(uint32_t base, SDFM_FilterNumber filterNumber)
{
;
__eallow();
//
// Clear WTSYNCEN bit
//
(*((volatile uint16_t *)(base + 0x1EU + ((uint32_t)filterNumber * 16U)))) &=
~0x40U;
__edis();
}
//*****************************************************************************
//
//! Set the PWM sync mode.
//!
//! \param base is the base address of the SDFM module
//! \param filterNumber is the filter number.
//! \param syncSource is the PWM sync source.
//!
//! This function sets the PWM sync source for the specific SDFM filter. Valid
//! values for syncSource are SDFM_SYNC_PWMx_CMPy. Where x ranges from 1 to 8
//! Representing PWM1 to PWM8 respectively and y ranges from A to D
//! representing PWM comparators A to D.
//!
//! \return None.
//
//*****************************************************************************
static inline void
SDFM_setPWMSyncSource(uint32_t base, SDFM_FilterNumber filterNumber,
SDFM_PWMSyncSource syncSource)
{
uint32_t address;
;
address = base + 0x1EU + ((uint32_t)filterNumber * 16U);
__eallow();
//
// Write to SYNCSEL bits
//
(*((volatile uint16_t *)(address))) =
((*((volatile uint16_t *)(address))) & ~0x3FU) | (uint16_t)syncSource;
__edis();
//
//Enable SDSYNC reset to data filter
//
SDFM_enableExternalReset(base, filterNumber);
}
//*****************************************************************************
//
//! Set FIFO clear on sync mode.
//!
//! \param base is the base address of the SDFM module
//! \param filterNumber is the filter number.
//! \param fifoClearSyncMode is the FIFO clear on sync mode.
//!
//! This function sets the FIFO clear mode for the specified filter when a sync
//! happens depending on the value of fifoClearSyncMode.
//! Valid values for fifoClearSyncMode are:
//! - SDFM_FIFO_NOT_CLEARED_ON_SYNC - FIFO is not cleared on sync.
//! - SDFM_FIFO_CLEARED_ON_SYNC - FIFO is cleared on sync.
//!
//! \return None.
//
//*****************************************************************************
static inline void
SDFM_setFIFOClearOnSyncMode(uint32_t base, SDFM_FilterNumber filterNumber,
SDFM_FIFOClearSyncMode fifoClearSyncMode)
{
uint32_t address;
;
address = base + 0x1EU + ((uint32_t)filterNumber * 16U);
__eallow();
//
// Write to FFSYNCCLREN bit
//
(*((volatile uint16_t *)(address))) = ((*((volatile uint16_t *)(address))) & ~0x200U) |
((uint16_t)fifoClearSyncMode << 9U);
__edis();
}
//*****************************************************************************
//
//! Set Wait-for-sync clear mode.
//!
//! \param base is the base address of the SDFM module
//! \param filterNumber is the filter number.
//! \param syncClearMode is the wait-for-sync clear mode.
//!
//! This function sets the Wait-For-sync clear mode depending on the value of
//! syncClearMode.
//! Valid values for syncClearMode are:
//! - SDFM_MANUAL_CLEAR_WAIT_FOR_SYNC - Wait-for-sync flag is cleared by
//! invoking SDFM_clearWaitForSyncFlag().
//! - SDFM_AUTO_CLEAR_WAIT_FOR_SYNC - Wait-for-sync flag is cleared
//! automatically on FIFO interrupt.
//!
//! \return None.
//
//*****************************************************************************
static inline void
SDFM_setWaitForSyncClearMode(uint32_t base, SDFM_FilterNumber filterNumber,
SDFM_WaitForSyncClearMode syncClearMode)
{
uint32_t address;
;
address = base + 0x1EU + ((uint32_t)filterNumber * 16U);
__eallow();
//
// Write to WTSCLREN bit
//
(*((volatile uint16_t *)(address))) = ((*((volatile uint16_t *)(address))) & ~0x400U) |
((uint16_t)syncClearMode << 10U);
__edis();
}
//*****************************************************************************
//
//! Selects clock source for SDFM channels.
//!
//! \param base is the base address of the SDFM module
//! \param filterNumber is the filter number.
//! \param clkSource is the clock source
//!
//! This function selects the clock for SDFM module filter channels.
//! Valid values for clkSource are:
//! - SDFM_CLK_SOURCE_CHANNEL_CLK - Respective channel's clk is the source
//! - SDFM_CLK_SOURCE_SD1_CLK - Filter 1 clock is the source
//!
//! \return None.
//
//*****************************************************************************
static inline void
SDFM_selectClockSource(uint32_t base, SDFM_FilterNumber filterNumber,
SDFM_ClockSource clkSource)
{
uint32_t address;
;
address = base + 0x10U +
((uint32_t)filterNumber * (0x20U - 0x10U));
//
// Select SDFM clock source.
//
__eallow();
(*((volatile uint16_t *)(address))) = ((*((volatile uint16_t *)(address))) & ~(0x8U)) |
(uint16_t)clkSource;
__edis();
}
//*****************************************************************************
//
//! Enables Input Synchronizer.
//!
//! \param base is the base address of the SDFM module
//! \param filterNumber is the filter number.
//! \param syncConfig defines which synchronizer to be enabled
//!
//! This function enables either data or clock or both synchronizer.
//! Valid values for syncConfig can be the logical OR of any of the values:
//! - SDFM_CLOCK_SYNCHRONIZER - Enable SDFM input clock synchronizer
//! - SDFM_DATA_SYNCHRONIZER - Enable SDFM input data synchronizer
//!
//! \return None.
//
//*****************************************************************************
static inline void
SDFM_enableSynchronizer(uint32_t base, SDFM_FilterNumber filterNumber,
uint16_t syncConfig)
{
;
//
// Select SDFM clock source.
//
__eallow();
(*((volatile uint16_t *)(base + 0x10U + ((uint32_t)filterNumber * (0x20U - 0x10U))))) |= syncConfig;
__edis();
}
//*****************************************************************************
//
//! Disables Input Synchronizer.
//!
//! \param base is the base address of the SDFM module
//! \param filterNumber is the filter number.
//! \param syncConfig defines which synchronizer to be disabled
//!
//! This function disables either data or clock or both synchronizer.
//! Valid values for syncConfig can be the logical OR of any of the values:
//! - SDFM_CLOCK_SYNCHRONIZER - Disable SDFM input clock synchronizer
//! - SDFM_DATA_SYNCHRONIZER - Disable SDFM input data synchronizer
//!
//! \return None.
//
//*****************************************************************************
static inline void
SDFM_disableSynchronizer(uint32_t base, SDFM_FilterNumber filterNumber,
uint16_t syncConfig)
{
;
//
// Select SDFM clock source.
//
__eallow();
(*((volatile uint16_t *)(base + 0x10U + ((uint32_t)filterNumber * (0x20U - 0x10U))))) &= ~syncConfig;
__edis();
}
//*****************************************************************************
//
//! Selects comparator event high source.
//!
//! \param base is the base address of the SDFM module
//! \param filterNumber is the filter number.
//! \param source is the comparator event high source
//!
//! This function selects the source for comparator event high.
//! Valid values for source are:
//! - SDFM_COMPHOUT_SOURCE_COMPHIN - Original COMPHIN/CEVT1 signal is source
//! - SDFM_COMPHOUT_SOURCE_FILTER - Filtered COMPHIN/CEVT1 signal is source
//!
//! \return None.
//
//*****************************************************************************
static inline void
SDFM_selectCompEventHighSource(uint32_t base, SDFM_FilterNumber filterNumber,
SDFM_CompEventHighSource source)
{
uint32_t address;
;
address = base + 0x60U +
((uint32_t)filterNumber * (0x68U - 0x60U));
//
// Set COMPHOUT source.
//
__eallow();
(*((volatile uint16_t *)(address))) = ((*((volatile uint16_t *)(address))) & ~0xCU) |
(uint16_t)source;
__edis();
}
//*****************************************************************************
//
//! Selects comparator event low source.
//!
//! \param base is the base address of the SDFM module
//! \param filterNumber is the filter number.
//! \param source is the comparator event low source
//!
//! This function selects the source for comparator event low.
//! Valid values for source are:
//! - SDFM_COMPLOUT_SOURCE_COMPLIN - Original COMPLIN/CEVT2 signal is source
//! - SDFM_COMPHOUT_SOURCE_FILTER - Filtered COMPLIN/CEVT2 signal is source
//!
//! \return None.
//
//*****************************************************************************
static inline void
SDFM_selectCompEventLowSource(uint32_t base, SDFM_FilterNumber filterNumber,
SDFM_CompEventLowSource source)
{
uint32_t address;
;
address = base + 0x60U +
((uint32_t)filterNumber * (0x68U - 0x60U));
//
// Set COMPLOUT source.
//
__eallow();
(*((volatile uint16_t *)(address))) = ((*((volatile uint16_t *)(address))) & ~0xC00U) |
(uint16_t)source;
__edis();
}
//*****************************************************************************
//
//! Initializes Comparator Event Low Filter.
//!
//! \param base is the base address of the SDFM module
//! \param filterNumber is the filter number.
//!
//! This function initializes Comparator Event Low Filter.
//!
//! \return None.
//
//*****************************************************************************
static inline void
SDFM_initCompEventLowFilter(uint32_t base, SDFM_FilterNumber filterNumber)
{
;
//
// Initialize comparator event low filter.
//
__eallow();
(*((volatile uint16_t *)(base + 0x61U + ((uint32_t)filterNumber * (0x68U - 0x60U))))) |=
(uint16_t)0x8000U;
__edis();
}
//*****************************************************************************
//
//! Initializes Comparator Event High Filter.
//!
//! \param base is the base address of the SDFM module
//! \param filterNumber is the filter number.
//!
//! This function initializes Comparator Event High Filter.
//!
//! \return None.
//
//*****************************************************************************
static inline void
SDFM_initCompEventHighFilter(uint32_t base, SDFM_FilterNumber filterNumber)
{
;
//
// Initialize comparator event high filter.
//
__eallow();
(*((volatile uint16_t *)(base + 0x63U + ((uint32_t)filterNumber * (0x68U - 0x60U))))) |=
(uint16_t)0x8000U;
__edis();
}
//*****************************************************************************
//
//! Lock Comparator Event Filter Configurations
//!
//! \param base is the base address of the SDFM module
//! \param filterNumber is the filter number.
//! \param lockConfig defines the configurations to be locked
//!
//! This function locks the comparator event filter configurations. Valid
//! values of the lockConfig can be logical OR of any of the following values:
//! - SDFM_SDCOMPLOCK_SDCOMPCTL - Locks write access to SDCOMPCTL register
//! - SDFM_SDCOMPLOCK_COMP - Locks write access to SDCOMPxFILCTL &
//! SDCOMPxFILCLKCTL register
//!
//! \return None.
//
//*****************************************************************************
static inline void
SDFM_lockCompEventFilterConfig(uint32_t base, SDFM_FilterNumber filterNumber,
uint16_t lockConfig)
{
;
//
// Lock comparator event filter related configurations.
//
__eallow();
(*((volatile uint16_t *)(base + 0x67U + ((uint32_t)filterNumber * (0x68U - 0x60U))))) |= lockConfig;
__edis();
}
//*****************************************************************************
//
// Prototypes for the APIs.
//
//*****************************************************************************
//*****************************************************************************
//
//! Configures SDFM comparator for filter config & threshold values
//!
//! \param base is the base address of the SDFM module
//! \param config1 is the filter number, filter type and over sampling ratio.
//! \param config2 is high-level and low-level threshold 1 values.
//! \param config3 is the zero-cross threshold value.
//!
//! This function configures the comparator filter for filter config and
//! threshold values based on provided inputs.
//!
//! The config1 parameter is the logical OR of the filter number, filter type
//! and oversampling ratio.
//! The bit definitions for config1 are as follow:
//! - config1.[3:0] filter number
//! - config1.[7:4] filter type
//! - config1.[15:8] Over sampling Ratio
//! Valid values for filter number and filter type are defined in
//! SDFM_FilterNumber and SDFM_FilterType enumerations respectively.
//! SDFM_SET_OSR(X) macro can be used to set the value of the oversampling
//! ratio ,which ranges [1,32] inclusive, in the appropriate bit location.
//! For example the value
//! (SDFM_FILTER_1 | SDFM_FILTER_SINC_2 | SDFM_SET_OSR(16))
//! will select Filter 1, SINC 2 type with an oversampling ratio of 16.
//!
//! The config2 parameter is the logical OR of the filter high and low
//! threshold 1 values.
//! The bit definitions for config2 are as follow:
//! - config2.[15:0] low threshold 1
//! - config2.[31:16] high threshold 1
//! The upper 16 bits define the high threshold 1 and the lower 16 bits define
//! the low threshold 1. SDFM_THRESHOLD(H,L) can be used to combine the high
//! and low thresholds.
//! The config3 parameter is the logical OR of the zero cross threshold
//! enable flag and the zero-cross threshold value.
//! The bit definitions for config3 are as follow:
//! - config3.[15] - Enable or disable zero cross threshold. Valid values
//! are 1 or 0 to enable or disable the zero cross threshold
//! respectively.
//! -config3.[14:0] - Zero Cross Threshold value.
//! The SDFM_SET_ZERO_CROSS_THRESH_VALUE(X) macro can be used to specify the
//! zero-cross threshold value and OR the 1 to enable it.
//!
//! \return None.
//!
//*****************************************************************************
extern void
SDFM_configComparator(uint32_t base, uint16_t config1,
uint32_t config2, uint16_t config3);
//*****************************************************************************
//
//! Configure SDFM enhanced comparator for filter config & threshold values
//!
//! \param base is the base address of the SDFM module
//! \param filterConfig is the filter number, filter type & over sampling ratio.
//! \param highLowThreshold1 is high-level and low-level threshold 1 values.
//! \param highLowThreshold2 is high-level and low-level threshold 2 values.
//! \param zeroCrossThreshold is the zero-cross threshold value.
//!
//! This function configures the comparator filter for filter config and
//! threshold values based on input parameters.
//!
//! The filterConfig parameter is the logical OR of the filter number, filter
//! type and oversampling ratio.
//! The bit definitions for filterConfig are as follow:
//! - filterConfig.[3:0] filter number
//! - filterConfig.[7:4] filter type
//! - filterConfig.[15:8] Over sampling Ratio
//! Valid values for filter number and filter type are defined in
//! SDFM_FilterNumber and SDFM_FilterType enumerations respectively.
//! SDFM_SET_OSR(X) macro can be used to set the value of the oversampling
//! ratio ,which ranges [1,32] inclusive, in the appropriate bit location.
//! For example the value
//! (SDFM_FILTER_1 | SDFM_FILTER_SINC_2 | SDFM_SET_OSR(16))
//! will select Filter 1, SINC 2 type with an oversampling ratio of 16.
//!
//! The highLowThreshold1 parameter is the logical OR of the filter high & low
//! threshold 1 values.
//! The bit definitions for highLowThreshold1 are as follow:
//! - highLowThreshold1.[15:0] low threshold 1
//! - highLowThreshold1.[31:16] high threshold 1
//! The upper 16 bits define the high threshold and the lower 16 bits define
//! the low threshold. SDFM_THRESHOLD(H,L) can be used to combine the high and
//! low thresholds.
//!
//! The highLowThreshold2 parameter is the logical OR of the filter high & low
//! threshold 2 values.
//! The bit definitions for highLowThreshold2 are as follow:
//! - highLowThreshold2.[15:0] low threshold 2
//! - highLowThreshold2.[31:16] high threshold 2
//! The upper 16 bits define the high threshold and the lower 16 bits define
//! the low threshold. SDFM_THRESHOLD(H,L) can be used to combine the high &
//! low thresholds.
//!
//! The zeroCrossThreshold parameter is the logical OR of the zero cross
//! threshold enable flag and the zero-cross threshold value. The bit
//! definitions for zeroCrossThreshold are as follows:
//! - zeroCrossThreshold.[15] - Enable or disable zero cross threshold. Valid
//! values are 1 or 0 to enable or disable the zero cross threshold
//! respectively.
//! - zeroCrossThreshold.[14:0] - Zero Cross Threshold value.
//! The SDFM_SET_ZERO_CROSS_THRESH_VALUE(X) macro can be used as parameter
//! zeroCrossThreshold to enable & specify the zero-cross threshold value.
//!
//! \return None.
//!
//*****************************************************************************
extern void
SDFM_configEnhancedComparator(uint32_t base, uint16_t filterConfig,
uint32_t highLowThreshold1,
uint32_t highLowThreshold2,
uint16_t zeroCrossThreshold);
//*****************************************************************************
//
//! Configure SDFM data filter
//!
//! \param base is the base address of the SDFM module
//! \param config1 is the filter number, filter type and over sampling ratio
//! configuration.
//! \param config2 is filter switch, data representation and data shift values
//! configuration.
//!
//! This function configures the data filter based on configurations
//! config1 and config2.
//!
//! The config1 parameter is the logical OR of the filter number, filter type
//! and oversampling ratio.
//! The bit definitions for config1 are as follow:
//! - config1.[3:0] Filter number
//! - config1.[7:4] Filter type
//! - config1.[15:8] Over sampling Ratio
//! Valid values for filter number and filter type are defined in
//! SDFM_FilterNumber and SDFM_FilterType enumerations respectively.
//! SDFM_SET_OSR(X) macro can be used to set the value of the oversampling
//! ratio , which ranges [1,256] inclusive , in the appropriate bit location
//! for config1. For example the value
//! (SDFM_FILTER_2 | SDFM_FILTER_SINC_3 | SDFM_SET_OSR(64))
//! will select Filter 2 , SINC 3 type with an oversampling ratio of 64.
//!
//! The config2 parameter is the logical OR of data representation, filter
//! switch, and data shift values
//! The bit definitions for config2 are as follow:
//! - config2.[0] Data representation
//! - config2.[1] Filter switch
//! - config2.[15:2] Shift values
//! Valid values for data representation are given in SDFM_OutputDataFormat
//! enumeration. SDFM_FILTER_DISABLE or SDFM_FILTER_ENABLE will define the
//! filter switch values.SDFM_SHIFT_VALUE(X) macro can be used to set the value
//! of the data shift value,which ranges [0,31] inclusive, in the appropriate
//! bit location for config2.
//! The shift value is valid only in SDFM_DATA_FORMAT_16_BIT data
//! representation format.
//!
//! \return None.
//!
//*****************************************************************************
extern void
SDFM_configDataFilter(uint32_t base, uint16_t config1, uint16_t config2);
//*****************************************************************************
//
//! Configure SDFM comparator Zero Cross threshold
//!
//! \param base is the base address of the SDFM module
//! \param config1 is the filter number, filter type and over sampling ratio.
//! \param config2 is the zero cross threshold value.
//!
//! This function configures the comparator filter zero cross threshold values
//! based on configurations config1 and config2.
//!
//! The config1 parameter is the logical OR of the filter number, filter type
//! and oversampling ratio.
//! The bit definitions for config1 are as follow:
//! - config1.[3:0] filter number
//! - config1.[7:4] filter type
//! - config1.[15:8] Over sampling Ratio
//! Valid values for filter number and filter type are defined in
//! SDFM_FilterNumber and SDFM_FilterType enumerations respectively.
//! SDFM_SET_OSR(X) macro can be used to set the value of the oversampling
//! ratio ,which ranges [1,32] inclusive, in the appropriate bit location.
//! For example the value
//! (SDFM_FILTER_1 | SDFM_FILTER_SINC_2 | SDFM_SET_OSR(16))
//! will select Filter 1 , SINC 2 type with an oversampling ratio of 16.
//!
//! The config2 parameter is the value of the zero cross threshold. The maximum
//! acceptable value is 32767.
//!
//! \return None.
//!
//*****************************************************************************
extern void
SDFM_configZeroCrossComparator(uint32_t base, uint16_t config1,
uint16_t config2);
//*****************************************************************************
//
//! Configure SDFM data filter FIFO
//!
//! \param base is the base address of the SDFM module
//! \param config1 is the filter number, filter type and over sampling ratio
//! configuration.
//! \param config2 is filter switch, data representation and data shift values
//! and FIFO level configuration.
//!
//! This function enables and configures the data filter FIFO based on
//! configurations config1 and config2.
//!
//! The config1 parameter is the logical OR of the filter number, filter type
//! and oversampling ratio.
//! The bit definitions for config1 are as follow:
//! - config1.[3:0] filter number
//! - config1.[7:4] filter type
//! - config1.[15:8] Over sampling Ratio
//! Valid values for filter number and filter type are defined in
//! SDFM_FilterNumber and SDFM_FilterType enumerations respectively.
//! SDFM_SET_OSR(X) macro can be used to set the value of the oversampling
//! ratio , which ranges [1,256] inclusive , in the appropriate bit location
//! for config1. For example the value
//! (SDFM_FILTER_2 | SDFM_FILTER_SINC_3 | SDFM_SET_OSR(64))
//! will select Filter 2 , SINC 3 type with an oversampling ratio of 64.
//!
//! The config2 parameter is the logical OR of data representation, filter
//! switch, data shift value, and FIFO level
//! The bit definitions for config2 are as follow:
//! - config2.[0] Data representation
//! - config2.[1] filter switch.
//! - config2.[6:2] shift values.
//! - config2.[15:7] FIFO level
//! Valid values for data representation are given in SDFM_OutputDataFormat
//! enumeration. SDFM_FILTER_DISABLE or SDFM_FILTER_ENABLE will define the
//! filter switch values.SDFM_SHIFT_VALUE(X) macro can be used to set the value
//! of the data shift value,which ranges [0,31] inclusive, in the appropriate
//! bit location for config2.
//! The value of FIFO level ranges [1,16] inclusive. The macro
//! SDFM_SET_FIFO_LEVEL(X) can be used to set the value of the FIFO level.
//!
//! \return None.
//!
//*****************************************************************************
extern void
SDFM_configDataFilterFIFO(uint32_t base, uint16_t config1, uint16_t config2);
//*****************************************************************************
//
//! Configure Comparator Event Low Filter
//!
//! \param base is the base address of the SDFM module
//! \param filterNumber is the filter number.
//! \param config is the comparator event low source
//!
//! This function configures the sample window, threshold and clock prescale
//! configurations for the comparator event low filter.
//!
//! \return None.
//
//*****************************************************************************
extern void
SDFM_configCompEventLowFilter(uint32_t base, SDFM_FilterNumber filterNumber,
const SDFM_CompEventFilterConfig *config);
//*****************************************************************************
//
//! Configure Comparator Event High Filter
//!
//! \param base is the base address of the SDFM module.
//! \param filterNumber is the filter number.
//! \param config is the comparator event high source
//!
//! This function configures the sample window, threshold and clock prescale
//! configurations for the comparator event high filter.
//!
//! \return None.
//
//*****************************************************************************
extern void
SDFM_configCompEventHighFilter(uint32_t base, SDFM_FilterNumber filterNumber,
const SDFM_CompEventFilterConfig *config);
//*****************************************************************************
//
// Close the Doxygen group.
//! @}
//
//*****************************************************************************
//*****************************************************************************
//
// Mark the end of the C bindings section for C++ compilers.
//
//*****************************************************************************
//###########################################################################
//
// FILE: spi.h
//
// TITLE: C28x SPI driver.
//
//###########################################################################
// $Copyright:
// Copyright (C) 2023 Texas Instruments Incorporated - http://www.ti.com/
//
// 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 Texas Instruments Incorporated 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
// OWNER 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.
// $
//###########################################################################
//*****************************************************************************
//
// If building with a C++ compiler, make all of the definitions in this header
// have a C binding.
//
//*****************************************************************************
//*****************************************************************************
//
//! \addtogroup spi_api SPI
//! \brief This module is used for SPI configurations.
//! @{
//
//*****************************************************************************
//###########################################################################
//
// FILE: hw_spi.h
//
// TITLE: Definitions for the SPI registers.
//
//###########################################################################
// $Copyright:
// Copyright (C) 2023 Texas Instruments Incorporated - http://www.ti.com/
//
// 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 Texas Instruments Incorporated 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
// OWNER 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.
// $
//###########################################################################
//*************************************************************************************************
//
// The following are defines for the SPI register offsets
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the SPICCR register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the SPICTL register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the SPISTS register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the SPIBRR register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the SPIFFTX register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the SPIFFRX register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the SPIFFCT register
//
//*************************************************************************************************
//*************************************************************************************************
//
// The following are defines for the bit fields in the SPIPRI register
//
//*************************************************************************************************
//*****************************************************************************
//
// Values that can be passed to SPI_enableInterrupt(), SPI_disableInterrupt(),
// and SPI_clearInterruptStatus() as the intFlags parameter, and returned by
// SPI_getInterruptStatus().
//
//*****************************************************************************
//*****************************************************************************
//
//! This macro definition is used to transmit a byte of data
//!
//! \param base specifies the SPI module base address.
//! \param txData is the data to be transmitted over SPI
//!
//! This macro definition is to transmit a byte of data.
//! This macro uses SPI_pollingNonFIFOTransaction function
//! SPI character length is hardcoded to 8 (1 byte = 8 bits)of character length
//!
//! \return None.
//
//*****************************************************************************
//*****************************************************************************
//
//! This macro definition is used to transmit a 16-bit word of data
//!
//! \param base specifies the SPI module base address.
//! \param txData is the data to be transmitted over SPI
//!
//! This macro definition is to transmit a 16-bit word of data.
//! This macro uses SPI_pollingNonFIFOTransaction function
//! SPI character length is hardcoded to 16 (16bit word) of character length
//!
//! \return None.
//
//*****************************************************************************
//*****************************************************************************
//
//! This macro definition can be used to transmit 'N' bytes of data
//!
//! \param base specifies the SPI module base address.
//! \param txBuffer is the transmit buffer to be transmitted over SPI
//! \param numOfWords is the number of bytes to be transmitted
//! \param txDelay specifies the number of serial clock cycles delay time after
//! completion of perious word
//!
//! This macro definition can be used to transmit 'N' bytes of data.
//! This macro definition uses SPI_pollingFIFOTransaction function.
//!
//! SPI character length is hardcoded to 8 (8bits) of character length
//!
//! \return None.
//
//*****************************************************************************
//*****************************************************************************
//
//! This macro definition can be used to transmit 'N' 16-bit words of data
//!
//! \param base specifies the SPI module base address.
//! \param txBuffer is the transmit buffer to be transmitted over SPI
//! \param numOfWords is the number of 16-bit word to be transmitted
//! \param txDelay specifies the number of serial clock cycles delay time after
//! completion of perious word
//!
//! This function can be used to transmit 'N' 16-bit words of data.
//! This function uses SPI_pollingFIFOTransaction function.
//! SPI character length is hardcoded to 16 (16-bit word)
//!
//! \return None.
//
//*****************************************************************************
//*****************************************************************************
//
//! This macro definition can be used to transmit 'N' with configurable
//! SPI character length
//!
//! \param base specifies the SPI module base address
//! \param charLength specifies the SPI character length
//! \param txBuffer is the transmit buffer to be transmitted over SPI
//! \param numOfWords is the number of 16-bit word to be transmitted
//! \param txDelay specifies the number of serial clock cycles delay time after
//! completion of perious word
//!
//! This macro definition can be used to transmit 'N' with configurable
//! SPI character length.
//!
//! This macro uses SPIpolling_FIFO_Transaction function.
//! SPI character length is configurable using charLength variable.
//!
//! \return None.
//
//*****************************************************************************
//*****************************************************************************
//
//! This macro definition is used to receive a byte of data
//!
//! \param base specifies the SPI module base address.
//! \param dummyData is the data which is transmitted to initiate
//! SPI transaction to receive SPI data
//!
//! This macro definition is to receive a byte of data.
//! This macro uses SPI_pollingNonFIFOTransaction function
//! SPI character length is hardcoded to 8 (1byte = 8bits) of character length
//!
//! \return the received byte.
//
//*****************************************************************************
//*****************************************************************************
//
//! This macro is used to receive 'N' bytes of data
//!
//! \param base specifies the SPI module base address.
//! \param rxBuffer specifies receive buffer which will store the received bytes
//! \param numOfWords specifies the number of bytes to be received
//! \param txDelay specifies the number of serial clock cycles delay time after
//! completion of perious word
//!
//! This function is used to receive 'N' bytes of data
//! This function uses SPIpolling_FIFO_Transaction function.
//! SPI character length is hardcoded to 8 (1 byte = 8 bits)
//!
//! \return None.
//
//*****************************************************************************
//*****************************************************************************
//
//! This macro is used to receive 'N' 16-bits words of data
//!
//! \param base specifies the SPI module base address.
//! \param rxBuffer specifies receive buffer which will store the received bytes
//! \param numOfWords specifies the number of 16-bit words to be received
//! \param txDelay specifies the number of serial clock cycles delay time after
//! completion of perious word
//!
//! This function is used to receive 'N' 16-bit words of data
//! This function uses SPIpolling_FIFO_Transaction function.
//! SPI character length is hardcoded to 16bits
//!
//! \return None.
//
//*****************************************************************************
//*****************************************************************************
//
//! This macro is used to receive 'N' words with specified character length
//!
//! \param base specifies the SPI module base address.
//! \param charLength specifies the SPI character length of SPI transaction
//! \param rxBuffer specifies receive buffer which will store the received bytes
//! \param numOfWords specifies the number of words with specified character
//! length
//! \param txDelay specifies the number of serial clock cycles delay time after
//! completion of perious word
//!
//! This function is used to receive 'N' words with specified character length
//! This function uses SPIpolling_FIFO_Transaction function.
//! SPI character length is configurable using charLength variable
//!
//! \return None.
//
//*****************************************************************************
//*****************************************************************************
//
//! Values that can be passed to SPI_setConfig() as the \e protocol parameter.
//
//*****************************************************************************
typedef enum
{
//! Mode 0. Polarity 0, phase 0. Rising edge without delay.
SPI_PROT_POL0PHA0 = 0x0000U,
//! Mode 1. Polarity 0, phase 1. Rising edge with delay.
SPI_PROT_POL0PHA1 = 0x0002U,
//! Mode 2. Polarity 1, phase 0. Falling edge without delay.
SPI_PROT_POL1PHA0 = 0x0001U,
//! Mode 3. Polarity 1, phase 1. Falling edge with delay.
SPI_PROT_POL1PHA1 = 0x0003U
} SPI_TransferProtocol;
//*****************************************************************************
//
//! Values that can be passed to SPI_setConfig() as the \e mode parameter.
//
//*****************************************************************************
typedef enum
{
SPI_MODE_PERIPHERAL = 0x0002U, //!< SPI peripheral
SPI_MODE_CONTROLLER = 0x0006U, //!< SPI controller
SPI_MODE_PERIPHERAL_OD = 0x0000U, //!< SPI peripheral w/ output disabled
SPI_MODE_CONTROLLER_OD = 0x0004U //!< SPI controller w/ output disabled
} SPI_Mode;
//*****************************************************************************
//
//! Values that can be passed to SPI_setFIFOInterruptLevel() as the \e txLevel
//! parameter, returned by SPI_getFIFOInterruptLevel() in the \e txLevel
//! parameter, and returned by SPI_getTxFIFOStatus().
//
//*****************************************************************************
typedef enum
{
SPI_FIFO_TXEMPTY = 0x0000U, //!< Transmit FIFO empty
SPI_FIFO_TX0 = 0x0000U, //!< Transmit FIFO empty
SPI_FIFO_TX1 = 0x0001U, //!< Transmit FIFO 1/16 full
SPI_FIFO_TX2 = 0x0002U, //!< Transmit FIFO 2/16 full
SPI_FIFO_TX3 = 0x0003U, //!< Transmit FIFO 3/16 full
SPI_FIFO_TX4 = 0x0004U, //!< Transmit FIFO 4/16 full
SPI_FIFO_TX5 = 0x0005U, //!< Transmit FIFO 5/16 full
SPI_FIFO_TX6 = 0x0006U, //!< Transmit FIFO 6/16 full
SPI_FIFO_TX7 = 0x0007U, //!< Transmit FIFO 7/16 full
SPI_FIFO_TX8 = 0x0008U, //!< Transmit FIFO 8/16 full
SPI_FIFO_TX9 = 0x0009U, //!< Transmit FIFO 9/16 full
SPI_FIFO_TX10 = 0x000AU, //!< Transmit FIFO 10/16 full
SPI_FIFO_TX11 = 0x000BU, //!< Transmit FIFO 11/16 full
SPI_FIFO_TX12 = 0x000CU, //!< Transmit FIFO 12/16 full
SPI_FIFO_TX13 = 0x000DU, //!< Transmit FIFO 13/16 full
SPI_FIFO_TX14 = 0x000EU, //!< Transmit FIFO 14/16 full
SPI_FIFO_TX15 = 0x000FU, //!< Transmit FIFO 15/16 full
SPI_FIFO_TX16 = 0x0010U, //!< Transmit FIFO full
SPI_FIFO_TXFULL = 0x0010U //!< Transmit FIFO full
} SPI_TxFIFOLevel;
//*****************************************************************************
//
//! Values that can be passed to SPI_setFIFOInterruptLevel() as the \e rxLevel
//! parameter, returned by SPI_getFIFOInterruptLevel() in the \e rxLevel
//! parameter, and returned by SPI_getRxFIFOStatus().
//
//*****************************************************************************
typedef enum
{
SPI_FIFO_RXEMPTY = 0x0000U, //!< Receive FIFO empty
SPI_FIFO_RX0 = 0x0000U, //!< Receive FIFO empty
SPI_FIFO_RX1 = 0x0001U, //!< Receive FIFO 1/16 full
SPI_FIFO_RX2 = 0x0002U, //!< Receive FIFO 2/16 full
SPI_FIFO_RX3 = 0x0003U, //!< Receive FIFO 3/16 full
SPI_FIFO_RX4 = 0x0004U, //!< Receive FIFO 4/16 full
SPI_FIFO_RX5 = 0x0005U, //!< Receive FIFO 5/16 full
SPI_FIFO_RX6 = 0x0006U, //!< Receive FIFO 6/16 full
SPI_FIFO_RX7 = 0x0007U, //!< Receive FIFO 7/16 full
SPI_FIFO_RX8 = 0x0008U, //!< Receive FIFO 8/16 full
SPI_FIFO_RX9 = 0x0009U, //!< Receive FIFO 9/16 full
SPI_FIFO_RX10 = 0x000AU, //!< Receive FIFO 10/16 full
SPI_FIFO_RX11 = 0x000BU, //!< Receive FIFO 11/16 full
SPI_FIFO_RX12 = 0x000CU, //!< Receive FIFO 12/16 full
SPI_FIFO_RX13 = 0x000DU, //!< Receive FIFO 13/16 full
SPI_FIFO_RX14 = 0x000EU, //!< Receive FIFO 14/16 full
SPI_FIFO_RX15 = 0x000FU, //!< Receive FIFO 15/16 full
SPI_FIFO_RX16 = 0x0010U, //!< Receive FIFO full
SPI_FIFO_RXFULL = 0x0010U, //!< Receive FIFO full
SPI_FIFO_RXDEFAULT = 0x001FU //!< To prevent interrupt at reset
} SPI_RxFIFOLevel;
//*****************************************************************************
//
//! Values that can be passed to SPI_setEmulationMode() as the \e mode
//! parameter.
//
//*****************************************************************************
typedef enum
{
//! Transmission stops after midway in the bit stream
SPI_EMULATION_STOP_MIDWAY = 0x0000U,
//! Continue SPI operation regardless
SPI_EMULATION_FREE_RUN = 0x0010U,
//! Transmission will stop after a started transmission completes
SPI_EMULATION_STOP_AFTER_TRANSMIT = 0x0020U
} SPI_EmulationMode;
//*****************************************************************************
//
//! Values that can be passed to SPI_setPTESignalPolarity() as the \e polarity
//! parameter.
//
//*****************************************************************************
typedef enum
{
SPI_PTE_ACTIVE_LOW = 0x0000U, //!< SPIPTE is active low (normal)
SPI_PTE_ACTIVE_HIGH = 0x2U //!< SPIPTE is active high (inverted)
} SPI_PTEPolarity;
//*****************************************************************************
//
//! Values that can be passed to SPI_receive16Bits(), SPI_receive24Bits(),
//! SPI_receive32Bits()
//
//*****************************************************************************
typedef enum
{
SPI_DATA_LITTLE_ENDIAN = 0U, //!< LITTLE ENDIAN
SPI_DATA_BIG_ENDIAN = 1U, //!< BIG ENDIAN
} SPI_endianess;
//*****************************************************************************
//
// Prototypes for the APIs.
//
//*****************************************************************************
//*****************************************************************************
//
//! \internal
//! Checks an SPI base address.
//!
//! \param base specifies the SPI module base address.
//!
//! This function determines if a SPI module base address is valid.
//!
//! \return Returns \b true if the base address is valid and \b false
//! otherwise.
//
//*****************************************************************************
//*****************************************************************************
//
//! Enables the serial peripheral interface.
//!
//! \param base specifies the SPI module base address.
//!
//! This function enables operation of the serial peripheral interface. The
//! serial peripheral interface must be configured before it is enabled.
//!
//! \return None.
//
//*****************************************************************************
static inline void
SPI_enableModule(uint32_t base)
{
//
// Check the arguments.
//
;
(*((volatile uint16_t *)(base + 0x0U))) |= 0x80U;
}
//*****************************************************************************
//
//! Disables the serial peripheral interface.
//!
//! \param base specifies the SPI module base address.
//!
//! This function disables operation of the serial peripheral interface. Call
//! this function before doing any configuration.
//!
//! \return None.
//
//*****************************************************************************
static inline void
SPI_disableModule(uint32_t base)
{
//
// Check the arguments.
//
;
(*((volatile uint16_t *)(base + 0x0U))) &= ~(0x80U);
}
//*****************************************************************************
//
//! Sets the character length of SPI transaction
//!
//! \param base specifies the SPI module base address.
//! \param charLength specifies the character length of SPI transaction
//!
//! This function configures the character length of SPI transaction.
//! SPI character length can be from anywhere between 1-bit word to 16 bit word
//! of character length
//!
//! \return None.
//
//*****************************************************************************
static inline void
SPI_setcharLength(uint32_t base, uint16_t charLength)
{
;
SPI_disableModule(base);
(*((volatile uint16_t *)(base + 0x0U))) = ((*((volatile uint16_t *)(base + 0x0U))) & ~0xFU) |
(charLength - 1U);
SPI_enableModule(base);
}
//*****************************************************************************
//
//! Enables the transmit and receive FIFOs.
//!
//! \param base is the base address of the SPI port.
//!
//! This functions enables the transmit and receive FIFOs in the SPI.
//!
//! \return None.
//
//*****************************************************************************
static inline void
SPI_enableFIFO(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Enable the FIFO.
//
(*((volatile uint16_t *)(base + 0xAU))) |= 0x4000U | 0x2000U;
(*((volatile uint16_t *)(base + 0xBU))) |= 0x2000U;
}
//*****************************************************************************
//
//! Disables the transmit and receive FIFOs.
//!
//! \param base is the base address of the SPI port.
//!
//! This functions disables the transmit and receive FIFOs in the SPI.
//!
//! \return None.
//
//*****************************************************************************
static inline void
SPI_disableFIFO(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Disable the FIFO.
//
(*((volatile uint16_t *)(base + 0xAU))) &= ~(0x4000U | 0x2000U);
(*((volatile uint16_t *)(base + 0xBU))) &= ~0x2000U;
}
//*****************************************************************************
//
//! Resets the transmit FIFO.
//!
//! \param base is the base address of the SPI port.
//!
//! This function resets the transmit FIFO, setting the FIFO pointer back to
//! zero.
//!
//! \return None.
//
//*****************************************************************************
static inline void
SPI_resetTxFIFO(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Reset the TX FIFO.
//
(*((volatile uint16_t *)(base + 0xAU))) &= ~0x2000U;
(*((volatile uint16_t *)(base + 0xAU))) |= 0x2000U;
}
//*****************************************************************************
//
//! Resets the receive FIFO.
//!
//! \param base is the base address of the SPI port.
//!
//! This function resets the receive FIFO, setting the FIFO pointer back to
//! zero.
//!
//! \return None.
//
//*****************************************************************************
static inline void
SPI_resetRxFIFO(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Reset the RX FIFO.
//
(*((volatile uint16_t *)(base + 0xBU))) &= ~0x2000U;
(*((volatile uint16_t *)(base + 0xBU))) |= 0x2000U;
}
//*****************************************************************************
//
//! Sets the FIFO level at which interrupts are generated.
//!
//! \param base is the base address of the SPI port.
//! \param txLevel is the transmit FIFO interrupt level, specified as
//! \b SPI_FIFO_TX0, \b SPI_FIFO_TX1, \b SPI_FIFO_TX2, . . . or
//! \b SPI_FIFO_TX16.
//! \param rxLevel is the receive FIFO interrupt level, specified as
//! \b SPI_FIFO_RX0, \b SPI_FIFO_RX1, \b SPI_FIFO_RX2, . . . or
//! \b SPI_FIFO_RX16.
//!
//! This function sets the FIFO level at which transmit and receive interrupts
//! are generated.
//!
//! \return None.
//
//*****************************************************************************
static inline void
SPI_setFIFOInterruptLevel(uint32_t base, SPI_TxFIFOLevel txLevel,
SPI_RxFIFOLevel rxLevel)
{
//
// Check the arguments.
//
;
//
// Set the FIFO interrupt levels.
//
(*((volatile uint16_t *)(base + 0xAU))) = ((*((volatile uint16_t *)(base + 0xAU))) &
(~0x1FU)) | (uint16_t)txLevel;
(*((volatile uint16_t *)(base + 0xBU))) = ((*((volatile uint16_t *)(base + 0xBU))) &
(~0x1FU)) | (uint16_t)rxLevel;
}
//*****************************************************************************
//
//! Gets the FIFO level at which interrupts are generated.
//!
//! \param base is the base address of the SPI port.
//! \param txLevel is a pointer to storage for the transmit FIFO level,
//! returned as one of \b SPI_FIFO_TX0, \b SPI_FIFO_TX1,
//! \b SPI_FIFO_TX2, . . . or \b SPI_FIFO_TX16.
//! \param rxLevel is a pointer to storage for the receive FIFO level,
//! returned as one of \b SPI_FIFO_RX0, \b SPI_FIFO_RX1,
//! \b SPI_FIFO_RX2, . . . or \b SPI_FIFO_RX16.
//!
//! This function gets the FIFO level at which transmit and receive interrupts
//! are generated.
//!
//! \return None.
//
//*****************************************************************************
static inline void
SPI_getFIFOInterruptLevel(uint32_t base, SPI_TxFIFOLevel *txLevel,
SPI_RxFIFOLevel *rxLevel)
{
//
// Check the arguments.
//
;
//
// Extract the transmit and receive FIFO levels.
//
*txLevel = (SPI_TxFIFOLevel)((uint16_t)((*((volatile uint16_t *)(base + 0xAU))) &
0x1FU));
*rxLevel = (SPI_RxFIFOLevel)((uint16_t)((*((volatile uint16_t *)(base + 0xBU))) &
0x1FU));
}
//*****************************************************************************
//
//! Get the transmit FIFO status
//!
//! \param base is the base address of the SPI port.
//!
//! This function gets the current number of words in the transmit FIFO.
//!
//! \return Returns the current number of words in the transmit FIFO specified
//! as one of the following:
//! \b SPI_FIFO_TX0, \b SPI_FIFO_TX1, \b SPI_FIFO_TX2, \b SPI_FIFO_TX3,
//! ..., or \b SPI_FIFO_TX16
//
//*****************************************************************************
static inline SPI_TxFIFOLevel
SPI_getTxFIFOStatus(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Get the current FIFO status
//
return((SPI_TxFIFOLevel)((uint16_t)(((*((volatile uint16_t *)(base + 0xAU))) & 0x1F00U) >>
8U)));
}
//*****************************************************************************
//
//! Get the receive FIFO status
//!
//! \param base is the base address of the SPI port.
//!
//! This function gets the current number of words in the receive FIFO.
//!
//! \return Returns the current number of words in the receive FIFO specified
//! as one of the following:
//! \b SPI_FIFO_RX0, \b SPI_FIFO_RX1, \b SPI_FIFO_RX2, \b SPI_FIFO_RX3,
//! ..., or \b SPI_FIFO_RX16
//
//*****************************************************************************
static inline SPI_RxFIFOLevel
SPI_getRxFIFOStatus(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Get the current FIFO status
//
return((SPI_RxFIFOLevel)((uint16_t)(((*((volatile uint16_t *)(base + 0xBU))) & 0x1F00U) >>
8U)));
}
//*****************************************************************************
//
//! Determines whether the SPI transmitter is busy or not.
//!
//! \param base is the base address of the SPI port.
//!
//! This function allows the caller to determine whether all transmitted bytes
//! have cleared the transmitter hardware. If \b false is returned, then the
//! transmit FIFO is empty and all bits of the last transmitted word have left
//! the hardware shift register. This function is only valid when operating in
//! FIFO mode.
//!
//! \return Returns \b true if the SPI is transmitting or \b false if all
//! transmissions are complete.
//
//*****************************************************************************
static inline _Bool
SPI_isBusy(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Determine if the SPI is busy.
//
return(((*((volatile uint16_t *)(base + 0xAU))) & 0x1F00U) != 0U);
}
//*****************************************************************************
//
//! Puts a data element into the SPI transmit buffer.
//!
//! \param base specifies the SPI module base address.
//! \param data is the left-justified data to be transmitted over SPI.
//!
//! This function places the supplied data into the transmit buffer of the
//! specified SPI module.
//!
//! \note The data being sent must be left-justified in \e data. The lower
//! 16 - N bits will be discarded where N is the data width selected in
//! SPI_setConfig(). For example, if configured for a 6-bit data width, the
//! lower 10 bits of data will be discarded.
//!
//! \return None.
//
//*****************************************************************************
static inline void
SPI_writeDataNonBlocking(uint32_t base, uint16_t data)
{
//
// Check the arguments.
//
;
//
// Write data to the transmit buffer.
//
(*((volatile uint16_t *)(base + 0x8U))) = data;
}
//*****************************************************************************
//
//! Gets a data element from the SPI receive buffer.
//!
//! \param base specifies the SPI module base address.
//!
//! This function gets received data from the receive buffer of the specified
//! SPI module and returns it.
//!
//! \note Only the lower N bits of the value written to \e data contain valid
//! data, where N is the data width as configured by SPI_setConfig(). For
//! example, if the interface is configured for 8-bit data width, only the
//! lower 8 bits of the value written to \e data contain valid data.
//!
//! \return Returns the word of data read from the SPI receive buffer.
//
//*****************************************************************************
static inline uint16_t
SPI_readDataNonBlocking(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Check for data to read.
//
return((*((volatile uint16_t *)(base + 0x7U))));
}
//*****************************************************************************
//
//! Waits for space in the FIFO and then puts data into the transmit buffer.
//!
//! \param base specifies the SPI module base address.
//! \param data is the left-justified data to be transmitted over SPI.
//!
//! This function places the supplied data into the transmit buffer of the
//! specified SPI module once space is available in the transmit FIFO. This
//! function should only be used when the FIFO is enabled.
//!
//! \note The data being sent must be left-justified in \e data. The lower
//! 16 - N bits will be discarded where N is the data width selected in
//! SPI_setConfig(). For example, if configured for a 6-bit data width, the
//! lower 10 bits of data will be discarded.
//!
//! \return None.
//
//*****************************************************************************
static inline void
SPI_writeDataBlockingFIFO(uint32_t base, uint16_t data)
{
//
// Check the arguments.
//
;
//
// Wait until space is available in the receive FIFO.
//
while(SPI_getTxFIFOStatus(base) == SPI_FIFO_TXFULL)
{
}
//
// Write data to the transmit buffer.
//
(*((volatile uint16_t *)(base + 0x8U))) = data;
}
//*****************************************************************************
//
//! Waits for data in the FIFO and then reads it from the receive buffer.
//!
//! \param base specifies the SPI module base address.
//!
//! This function waits until there is data in the receive FIFO and then reads
//! received data from the receive buffer. This function should only be used
//! when FIFO mode is enabled.
//!
//! \note Only the lower N bits of the value written to \e data contain valid
//! data, where N is the data width as configured by SPI_setConfig(). For
//! example, if the interface is configured for 8-bit data width, only the
//! lower 8 bits of the value written to \e data contain valid data.
//!
//! \return Returns the word of data read from the SPI receive buffer.
//
//*****************************************************************************
static inline uint16_t
SPI_readDataBlockingFIFO(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Wait until data is available in the receive FIFO.
//
while(SPI_getRxFIFOStatus(base) == SPI_FIFO_RXEMPTY)
{
}
//
// Check for data to read.
//
return((*((volatile uint16_t *)(base + 0x7U))));
}
//*****************************************************************************
//
//! Waits for the transmit buffer to empty and then writes data to it.
//!
//! \param base specifies the SPI module base address.
//! \param data is the left-justified data to be transmitted over SPI.
//!
//! This function places the supplied data into the transmit buffer of the
//! specified SPI module once it is empty. This function should not be used
//! when FIFO mode is enabled.
//!
//! \note The data being sent must be left-justified in \e data. The lower
//! 16 - N bits will be discarded where N is the data width selected in
//! SPI_setConfig(). For example, if configured for a 6-bit data width, the
//! lower 10 bits of data will be discarded.
//!
//! \return None.
//
//*****************************************************************************
static inline void
SPI_writeDataBlockingNonFIFO(uint32_t base, uint16_t data)
{
//
// Check the arguments.
//
;
//
// Wait until the transmit buffer is not full.
//
while(((*((volatile uint16_t *)(base + 0x2U))) & 0x20U) != 0U)
{
}
//
// Write data to the transmit buffer.
//
(*((volatile uint16_t *)(base + 0x8U))) = data;
}
//*****************************************************************************
//
//! Waits for data to be received and then reads it from the buffer.
//!
//! \param base specifies the SPI module base address.
//!
//! This function waits for data to be received and then reads it from the
//! receive buffer of the specified SPI module. This function should not be
//! used when FIFO mode is enabled.
//!
//! \note Only the lower N bits of the value written to \e data contain valid
//! data, where N is the data width as configured by SPI_setConfig(). For
//! example, if the interface is configured for 8-bit data width, only the
//! lower 8 bits of the value written to \e data contain valid data.
//!
//! \return Returns the word of data read from the SPI receive buffer.
//
//*****************************************************************************
static inline uint16_t
SPI_readDataBlockingNonFIFO(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Wait until data has been received.
//
while(((*((volatile uint16_t *)(base + 0x2U))) & 0x40U) == 0U)
{
}
//
// Check for data to read.
//
return((*((volatile uint16_t *)(base + 0x7U))));
}
//*****************************************************************************
//
//! Enables SPI 3-wire mode.
//!
//! \param base is the base address of the SPI port.
//!
//! This function enables 3-wire mode. When in controller mode, this allows
//! SPIPICO to become SPICOCI and SPIPOCI to become free for non-SPI use.
//! When in peripheral mode, SPIPOCI because the SPIPIPO pin and SPIPICO is
//! free for non-SPI use.
//!
//! \return None.
//
//*****************************************************************************
static inline void
SPI_enableTriWire(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Set the tri-wire bit to enable 3-wire mode.
//
(*((volatile uint16_t *)(base + 0xFU))) |= 0x1U;
}
//*****************************************************************************
//
//! Disables SPI 3-wire mode.
//!
//! \param base is the base address of the SPI port.
//!
//! This function disables 3-wire mode. SPI will operate in normal 4-wire mode.
//!
//! \return None.
//
//*****************************************************************************
static inline void
SPI_disableTriWire(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Clear the tri-wire bit to disable 3-wire mode.
//
(*((volatile uint16_t *)(base + 0xFU))) &= ~0x1U;
}
//*****************************************************************************
//
//! Enables SPI loopback mode.
//!
//! \param base is the base address of the SPI port.
//!
//! This function enables loopback mode. This mode is only valid during
//! controller mode and is helpful during device testing as it internally
//! connects PICO and POCI.
//!
//! \return None.
//
//*****************************************************************************
static inline void
SPI_enableLoopback(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Set the bit that enables loopback mode.
//
(*((volatile uint16_t *)(base + 0x0U))) |= 0x10U;
}
//*****************************************************************************
//
//! Disables SPI loopback mode.
//!
//! \param base is the base address of the SPI port.
//!
//! This function disables loopback mode. Loopback mode is disabled by default
//! after reset.
//!
//! \return None.
//
//*****************************************************************************
static inline void
SPI_disableLoopback(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Clear the bit that enables loopback mode.
//
(*((volatile uint16_t *)(base + 0x0U))) &= ~0x10U;
}
//*****************************************************************************
//
//! Set the peripheral select (SPIPTE) signal polarity.
//!
//! \param base is the base address of the SPI port.
//! \param polarity is the SPIPTE signal polarity.
//!
//! This function sets the polarity of the peripheral select (SPIPTE) signal.
//! The two modes to choose from for the \e polarity parameter are
//! \b SPI_PTE_ACTIVE_LOW for active-low polarity (typical) and
//! \b SPI_PTE_ACTIVE_HIGH for active-high polarity (considered inverted).
//!
//! \note This has no effect on the PTE signal when in controller mode. It is
//! only applicable to peripheral mode.
//!
//! \return None.
//
//*****************************************************************************
static inline void
SPI_setPTESignalPolarity(uint32_t base, SPI_PTEPolarity polarity)
{
//
// Check the arguments.
//
;
//
// Write the polarity of the SPIPTE signal to the register.
//
(*((volatile uint16_t *)(base + 0xFU))) = ((*((volatile uint16_t *)(base + 0xFU))) & ~0x2U) |
(uint16_t)polarity;
}
//*****************************************************************************
//
//! Enables SPI high speed mode.
//!
//! \param base is the base address of the SPI port.
//!
//! This function enables high speed mode.
//!
//! \return None.
//
//*****************************************************************************
static inline void
SPI_enableHighSpeedMode(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Set the bit that enables high speed mode.
//
(*((volatile uint16_t *)(base + 0x0U))) |= 0x20U;
}
//*****************************************************************************
//
//! Disables SPI high speed mode.
//!
//! \param base is the base address of the SPI port.
//!
//! This function disables high speed mode. High speed mode is disabled by
//! default after reset.
//!
//! \return None.
//
//*****************************************************************************
static inline void
SPI_disableHighSpeedMode(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Clear the bit that enables high speed mode.
//
(*((volatile uint16_t *)(base + 0x0U))) &= ~0x20U;
}
//*****************************************************************************
//
//! Sets SPI emulation mode.
//!
//! \param base is the base address of the SPI port.
//! \param mode is the emulation mode.
//!
//! This function sets the behavior of the SPI operation when an emulation
//! suspend occurs. The \e mode parameter can be one of the following:
//!
//! - \b SPI_EMULATION_STOP_MIDWAY - Transmission stops midway through the bit
//! stream. The rest of the bits will be transmitting after the suspend is
//! deasserted.
//! - \b SPI_EMULATION_STOP_AFTER_TRANSMIT - If the suspend occurs before the
//! first SPICLK pulse, the transmission will not start. If it occurs later,
//! the transmission will be completed.
//! - \b SPI_EMULATION_FREE_RUN - SPI operation continues regardless of a
//! the suspend.
//!
//! \return None.
//
//*****************************************************************************
static inline void
SPI_setEmulationMode(uint32_t base, SPI_EmulationMode mode)
{
//
// Check the arguments.
//
;
//
// Write the desired emulation mode to the register.
//
(*((volatile uint16_t *)(base + 0xFU))) = ((*((volatile uint16_t *)(base + 0xFU))) &
~(0x10U | 0x20U)) |
(uint16_t)mode;
}
//*****************************************************************************
//
//! Configures the FIFO Transmit Delay
//!
//! \param base is the base address of the SPI port.
//! \param delay Tx FIFO delay to be configured in cycles (0..0xFF)
//!
//! This function sets the delay between every transfer from FIFO
//! transmit buffer to transmit shift register. The delay is defined in
//! number SPI serial clock cycles.
//!
//! \return None
//
//*****************************************************************************
static inline void
SPI_setTxFifoTransmitDelay(uint32_t base, uint16_t delay)
{
//
// Check the arguments.
//
;
;
//
// Configure the FIFO Transmit Delay Bits
//
(*((volatile uint16_t *)(base + 0xCU))) = delay;
}
//*****************************************************************************
//
//! Returns the Emulation Buffer Received Data
//!
//! \param base is the base address of the SPI port.
//!
//! This function returns the Emulation Buffer Received Data
//!
//! \return Rx emulation buffer data
//
//*****************************************************************************
static inline uint16_t
SPI_readRxEmulationBuffer(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Return Emulation Buffer Received Data
//
return((*((volatile uint16_t *)(base + 0x6U))));
}
//*****************************************************************************
//
//! Enable Trasnmit
//!
//! \param base is the base address of the SPI port.
//!
//! This function sets the TALK bit enabling the data trasnmission.
//! This bit is enabled by SPI_setConfig if the parameter \r mode is selected as
//! SPI_MODE_PERIPHERAL or SPI_MODE_CONTROLLER.
//!
//! \return None
//
//*****************************************************************************
static inline void
SPI_enableTalk(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Set the TALK bit
//
(*((volatile uint16_t *)(base + 0x1U))) |= 0x2U;
}
//*****************************************************************************
//
//! Disable Trasnmit
//!
//! \param base is the base address of the SPI port.
//!
//! This function clears the TALK bit disabling the data trasnmission. The
//! output pin will be put in high-impedance state.
//! This bit is enabled by SPI_setConfig if the parameter \r mode is selected as
//! SPI_MODE_PERIPHERAL or SPI_MODE_CONTROLLER.
//!
//! \return None
//
//*****************************************************************************
static inline void
SPI_disableTalk(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Set the TALK bit
//
(*((volatile uint16_t *)(base + 0x1U))) &= ~0x2U;
}
//*****************************************************************************
//
//! Reset SPI transmit and receive channels
//!
//! \param base is the base address of the SPI port.
//!
//! This function resets the SPI transmit and receive channels.
//!
//! \return None
//
//*****************************************************************************
static inline void
SPI_reset(uint32_t base)
{
//
// Check the arguments.
//
;
//
// Write to SPRST bit the TX FIFO.
//
(*((volatile uint16_t *)(base + 0xAU))) &= ~0x8000U;
(*((volatile uint16_t *)(base + 0xAU))) |= 0x8000U;
}
//*****************************************************************************
//
//! Configures the serial peripheral interface.
//!
//! \param base specifies the SPI module base address.
//! \param lspclkHz is the rate of the clock supplied to the SPI module
//! (LSPCLK) in Hz.
//! \param protocol specifies the data transfer protocol.
//! \param mode specifies the mode of operation.
//! \param bitRate specifies the clock rate in Hz.
//! \param dataWidth specifies number of bits transferred per frame.
//!
//! This function configures the serial peripheral interface. It sets the SPI
//! protocol, mode of operation, bit rate, and data width.
//!
//! The \e protocol parameter defines the data frame format. The \e protocol
//! parameter can be one of the following values: \b SPI_PROT_POL0PHA0,
//! \b SPI_PROT_POL0PHA1, \b SPI_PROT_POL1PHA0, or
//! \b SPI_PROT_POL1PHA1. These frame formats encode the following polarity
//! and phase configurations:
//!
//!
//! Polarity Phase Mode
//! 0 0 SPI_PROT_POL0PHA0
//! 0 1 SPI_PROT_POL0PHA1
//! 1 0 SPI_PROT_POL1PHA0
//! 1 1 SPI_PROT_POL1PHA1
//!
//!
//! The \e mode parameter defines the operating mode of the SPI module. The
//! SPI module can operate as a controller or peripheral; the SPI can also be be
//! configured to disable output on its serial output line. The \e mode
//! parameter can be one of the following values: \b SPI_MODE_CONTROLLER,
//! \b SPI_MODE_PERIPHERAL, \b SPI_MODE_CONTROLLER_OD or
//! \b SPI_MODE_PERIPHERAL_OD ("OD" indicates "output disabled").
//!
//! The \e bitRate parameter defines the bit rate for the SPI. This bit rate
//! must satisfy the following clock ratio criteria:
//!
//! - \e bitRate can be no greater than lspclkHz divided by 4.
//! - \e lspclkHz / \e bitRate cannot be greater than 128.
//!
//! The \e dataWidth parameter defines the width of the data transfers and
//! can be a value between 1 and 16, inclusive.
//!
//! The peripheral clock is the low speed peripheral clock. This value is
//! returned by SysCtl_getLowSpeedClock(), or it can be explicitly hard coded
//! if it is constant and known (to save the code/execution overhead of a call
//! to SysCtl_getLowSpeedClock()).
//!
//! \note SPI operation should be disabled via SPI_disableModule() before any
//! changes to its configuration.
//!
//! \return None.
//
//*****************************************************************************
extern void
SPI_setConfig(uint32_t base, uint32_t lspclkHz, SPI_TransferProtocol protocol,
SPI_Mode mode, uint32_t bitRate, uint16_t dataWidth);
//*****************************************************************************
//
//! Configures the baud rate of the serial peripheral interface.
//!
//! \param base specifies the SPI module base address.
//! \param lspclkHz is the rate of the clock supplied to the SPI module
//! (LSPCLK) in Hz.
//! \param bitRate specifies the clock rate in Hz.
//!
//! This function configures the SPI baud rate. The \e bitRate parameter
//! defines the bit rate for the SPI. This bit rate must satisfy the following
//! clock ratio criteria:
//!
//! - \e bitRate can be no greater than \e lspclkHz divided by 4.
//! - \e lspclkHz / \e bitRate cannot be greater than 128.
//!
//! The peripheral clock is the low speed peripheral clock. This value is
//! returned by SysCtl_getLowSpeedClock(), or it can be explicitly hard coded
//! if it is constant and known (to save the code/execution overhead of a call
//! to SysCtl_getLowSpeedClock()).
//!
//! \note SPI_setConfig() also sets the baud rate. Use SPI_setBaudRate()
//! if you wish to configure it separately from protocol and mode.
//!
//! \return None.
//
//*****************************************************************************
extern void
SPI_setBaudRate(uint32_t base, uint32_t lspclkHz, uint32_t bitRate);
//*****************************************************************************
//
//! Enables individual SPI interrupt sources.
//!
//! \param base specifies the SPI module base address.
//! \param intFlags is a bit mask of the interrupt sources to be enabled.
//!
//! This function enables the indicated SPI interrupt sources. Only the sources
//! that are enabled can be reflected to the processor interrupt; disabled
//! sources have no effect on the processor. The \e intFlags parameter can be
//! any of the following values:
//! - \b SPI_INT_RX_OVERRUN - Receive overrun interrupt
//! - \b SPI_INT_RX_DATA_TX_EMPTY - Data received, transmit empty
//! - \b SPI_INT_RXFF (also enables \b SPI_INT_RXFF_OVERFLOW) - RX FIFO level
//! interrupt (and RX FIFO overflow)
//! - \b SPI_INT_TXFF - TX FIFO level interrupt
//!
//! \note \b SPI_INT_RX_OVERRUN, \b SPI_INT_RX_DATA_TX_EMPTY,
//! \b SPI_INT_RXFF_OVERFLOW, and \b SPI_INT_RXFF are associated with
//! \b SPIRXINT; \b SPI_INT_TXFF is associated with \b SPITXINT.
//!
//! \return None.
//
//*****************************************************************************
extern void
SPI_enableInterrupt(uint32_t base, uint32_t intFlags);
//*****************************************************************************
//
//! Disables individual SPI interrupt sources.
//!
//! \param base specifies the SPI module base address.
//! \param intFlags is a bit mask of the interrupt sources to be disabled.
//!
//! This function disables the indicated SPI interrupt sources. The
//! \e intFlags parameter can be any of the following values:
//! - \b SPI_INT_RX_OVERRUN
//! - \b SPI_INT_RX_DATA_TX_EMPTY
//! - \b SPI_INT_RXFF (also disables \b SPI_INT_RXFF_OVERFLOW)
//! - \b SPI_INT_TXFF
//!
//! \note \b SPI_INT_RX_OVERRUN, \b SPI_INT_RX_DATA_TX_EMPTY,
//! \b SPI_INT_RXFF_OVERFLOW, and \b SPI_INT_RXFF are associated with
//! \b SPIRXINT; \b SPI_INT_TXFF is associated with \b SPITXINT.
//!
//! \return None.
//
//*****************************************************************************
extern void
SPI_disableInterrupt(uint32_t base, uint32_t intFlags);
//*****************************************************************************
//
//! Gets the current interrupt status.
//!
//! \param base specifies the SPI module base address.
//!
//! This function returns the interrupt status for the SPI module.
//!
//! \return The current interrupt status, enumerated as a bit field of the
//! following values:
//! - \b SPI_INT_RX_OVERRUN - Receive overrun interrupt
//! - \b SPI_INT_RX_DATA_TX_EMPTY - Data received, transmit empty
//! - \b SPI_INT_RXFF - RX FIFO level interrupt
//! - \b SPI_INT_RXFF_OVERFLOW - RX FIFO overflow
//! - \b SPI_INT_TXFF - TX FIFO level interrupt
//
//*****************************************************************************
extern uint32_t
SPI_getInterruptStatus(uint32_t base);
//*****************************************************************************
//
//! Clears SPI interrupt sources.
//!
//! \param base specifies the SPI module base address.
//! \param intFlags is a bit mask of the interrupt sources to be cleared.
//!
//! This function clears the specified SPI interrupt sources so that they no
//! longer assert. This function must be called in the interrupt handler to
//! keep the interrupts from being triggered again immediately upon exit. The
//! \e intFlags parameter can consist of a bit field of the following values:
//! - \b SPI_INT_RX_OVERRUN
//! - \b SPI_INT_RX_DATA_TX_EMPTY
//! - \b SPI_INT_RXFF
//! - \b SPI_INT_RXFF_OVERFLOW
//! - \b SPI_INT_TXFF
//!
//! \note \b SPI_INT_RX_DATA_TX_EMPTY is cleared by a read of the receive
//! receive buffer, so it usually doesn't need to be cleared using this
//! function.
//!
//! \note Also note that \b SPI_INT_RX_OVERRUN, \b SPI_INT_RX_DATA_TX_EMPTY,
//! \b SPI_INT_RXFF_OVERFLOW, and \b SPI_INT_RXFF are associated with
//! \b SPIRXINT; \b SPI_INT_TXFF is associated with \b SPITXINT.
//!
//! \return None.
//
//*****************************************************************************
extern void
SPI_clearInterruptStatus(uint32_t base, uint32_t intFlags);
//*****************************************************************************
//
//! This function can be used to transmit a 24-bit word of data
//!
//! \param base specifies the SPI module base address.
//! \param txData is the data to be transmitted over SPI
//! \param txDelay specifies the number of serial clock cycles delay time after
//! completion of perious word
//!
//! This function can be used to transmit a 24-bit word of data.
//! 24-bit word data is divided into three bytes of data.
//!
//! This function uses SPI_pollingFIFOTransaction function.
//! SPI character length is hardcoded to 8 (8bits) of character length
//!
//! \return None.
//
//*****************************************************************************
extern void
SPI_transmit24Bits(uint32_t base, uint32_t data, uint16_t txDelay);
//*****************************************************************************
//
//! This function can be used to transmit a 32-bit word of data
//!
//! \param base specifies the SPI module base address.
//! \param txData is the data to be transmitted over SPI
//! \param txDelay specifies the number of serial clock cycles delay time after
//! completion of perious word
//!
//! This function can be used to transmit a 32-bit word of data.
//! 32-bit word data is divided into four bytes of data.
//!
//! This function uses SPI_pollingFIFOTransaction function.
//! SPI character length is hardcoded to 8 (8bits) of character length
//!
//! \return None.
//
//*****************************************************************************
extern void
SPI_transmit32Bits(uint32_t base, uint32_t data, uint16_t txDelay);
//*****************************************************************************
//
//! This function is used to receive a 16-bit word of data
//!
//! \param base specifies the SPI module base address.
//! \param endianness specifies the endianess of received data
//! \param dummyData is the data which is transmitted to initiate
//! SPI transaction to receive SPI data
//! \param txDelay specifies the number of serial clock cycles delay time after
//! completion of perious word
//!
//! This function is used to receive a 16-bit word of data.
//! This function uses SPIpolling_FIFO_Transaction function.
//! SPI character length is hardcoded to 8 (1 byte = 8 bits)of character length
//!
//! \return the received 16-bit word.
//
//*****************************************************************************
extern uint16_t
SPI_receive16Bits(uint32_t base, SPI_endianess endianness, uint16_t dummyData,
uint16_t txDelay);
//*****************************************************************************
//
//! This function is used to receive a 24-bit word of data
//!
//! \param base specifies the SPI module base address.
//! \param endianness specifies the endianess of received data
//! \param dummyData is the data which is transmitted to initiate
//! SPI transaction to receive SPI data
//! \param txDelay specifies the number of serial clock cycles delay time after
//! completion of perious word
//!
//! This function is used to receive a 24-bit word of data.
//! This function uses SPIpolling_FIFO_Transaction function.
//! SPI character length is hardcoded to 8 (1 byte = 8 bits)of character length
//!
//! \return the received 24-bit word.
//
//*****************************************************************************
extern uint32_t
SPI_receive24Bits(uint32_t base, SPI_endianess endianness, uint16_t dummyData,
uint16_t txDelay);
//*****************************************************************************
//
//! This function is used to receive a 32-bit word of data
//!
//! \param base specifies the SPI module base address.
//! \param endianness specifies the endianess of received data
//! \param dummyData is the data which is transmitted to initiate
//! SPI transaction to receive SPI data
//! \param txDelay specifies the number of serial clock cycles delay time after
//! completion of perious word
//!
//! This function is used to receive a 32-bit word of data.
//! This function uses SPIpolling_FIFO_Transaction function.
//! SPI character length is hardcoded to 8 (1 byte = 8 bits)of character length
//!
//! \return the received 32-bit word.
//
//*****************************************************************************
extern uint32_t
SPI_receive32Bits(uint32_t base, SPI_endianess endianness, uint16_t dummyData,
uint16_t txDelay);
//*****************************************************************************
//
//! This function is used to initiate SPI transaction of specified character
//! length
//!
//! \param base specifies the SPI module base address.
//! \param charLength specifies the SPI character length of SPI transaction
//! \param data specified the data to be transmitted
//!
//! This function is used to initiate SPI transaction of specified character.
//! SPI character length is configurable using charLength variable
//!
//! \return .
//
//*****************************************************************************
extern uint16_t
SPI_pollingNonFIFOTransaction(uint32_t base, uint16_t charLength,
uint16_t data);
//*****************************************************************************
//
//! This function is used to initiate SPI transaction of specified character
//! length and 'N' words of transaction
//!
//! \param base specifies the SPI module base address.
//! \param charLength specifies the SPI character length of SPI transaction
//! \param pTxBuffer specifies the pointer to transmit buffer
//! \param pRxBuffer specifies the pointer to receive buffer
//! \param numOfWords specified the number of data to be transmitted / received
//!
//! SPI character length is configurable using charLength variable
//!
//! \return none
//
//*****************************************************************************
extern void
SPI_pollingFIFOTransaction(uint32_t base, uint16_t charLength,
uint16_t *pTxBuffer, uint16_t *pRxBuffer,
uint16_t numOfWords, uint16_t txDelay);
//*****************************************************************************
//
// Close the Doxygen group.
//! @}
//
//*****************************************************************************
//*****************************************************************************
//
// Mark the end of the C bindings section for C++ compilers.
//
//*****************************************************************************
//###########################################################################
//
// FILE: version.h
//
// TITLE: API to return the version number of the driverlib.lib in use.
//
//###########################################################################
// $Copyright:
// Copyright (C) 2023 Texas Instruments Incorporated - http://www.ti.com/
//
// 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 Texas Instruments Incorporated 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
// OWNER 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.
// $
//###########################################################################
//*****************************************************************************
//
// If building with a C++ compiler, make all of the definitions in this header
// have a C binding.
//
//*****************************************************************************
//*****************************************************************************
//
//! \addtogroup version_api Version
//! @{
//
//*****************************************************************************
//! Version number to be returned by Version_getLibVersion()
//!
//*****************************************************************************
//
//! Returns the driverlib version number
//!
//! This function can be used to check the version number of the driverlib.lib
//! that is in use. The version number will take the format x.xx.xx.xx, so for
//! example, if the function returns 2100200, the driverlib version being used
//! is 2.10.02.00.
//!
//! \return Returns an integer value indicating the driverlib version.
//
//*****************************************************************************
extern uint32_t
Version_getLibVersion(void);
//*****************************************************************************
//
// Close the Doxygen group.
//! @}
//
//*****************************************************************************
//*****************************************************************************
//
// Mark the end of the C bindings section for C++ compilers.
//
//*****************************************************************************
//*****************************************************************************
// CLB
//*****************************************************************************
//*****************************************************************************
// FSI
//*****************************************************************************
//*****************************************************************************
// LIN
//*****************************************************************************
//*****************************************************************************
// SPI
//*****************************************************************************
//*****************************************************************************
// Interrupt
//*****************************************************************************
//*****************************************************************************
// SysCtrl
//*****************************************************************************
//*****************************************************************************
// GPIO
//*****************************************************************************
//*****************************************************************************
// Memcfg
//*****************************************************************************
//*****************************************************************************
// I2C
//*****************************************************************************
//*****************************************************************************
// PMBUS
//*****************************************************************************
//*****************************************************************************
// SDFM
//*****************************************************************************
//#############################################################################
//
// FILE: device.h
//
// TITLE: Device setup for examples.
//
//#############################################################################
//
//
// $Copyright:
// Copyright (C) 2023 Texas Instruments Incorporated - http://www.ti.com/
//
// 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 Texas Instruments Incorporated 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
// OWNER 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.
// $
//#############################################################################
//
// Included Files
//
//
// Check for invalid compile flags
//
//*****************************************************************************
//
// Defines for pin numbers
//
//*****************************************************************************
//
// ControlCARD
//
//
// LEDs
//
//
// CANA
//
//
// SCI for USB-to-UART adapter on FTDI chip
//
//
// MCAN
//
//
// LINA
//
//
// LINB
//
//
// I2C
//
//I2CB GPIO pins
//
// FSI
//
//*****************************************************************************
//
// Defines related to clock configuration
//
//*****************************************************************************
//
// To use INTOSC as the clock source, comment the #define USE_PLL_SRC_XTAL,
// and uncomment the #define USE_PLL_SRC_INTOSC
//
//#define USE_PLL_SRC_INTOSC
//
// 20MHz XTAL on controlCARD is used as the PLL source.
// For use with SysCtl_getClock().
//
//
// Define to pass to SysCtl_setClock(). Will configure the clock as follows:
// PLLSYSCLK = 20MHz (XTAL_OSC) * 48 (IMULT) / (2 (REFDIV) * 4 (ODIV) * 1(SYSDIV))
//
//
// 120MHz SYSCLK frequency based on the above DEVICE_SETCLOCK_CFG. Update the
// code below if a different clock configuration is used!
//
//
// 30MHz LSPCLK frequency based on the above DEVICE_SYSCLK_FREQ and a default
// low speed peripheral clock divider of 4. Update the code below if a
// different LSPCLK divider is used!
//
//*****************************************************************************
//
// Macro to call SysCtl_delay() to achieve a delay in microseconds. The macro
// will convert the desired delay in microseconds to the count value expected
// by the function. \b x is the number of microseconds to delay.
//
//*****************************************************************************
//
// Defines for setting FSI clock speeds
//
//*****************************************************************************
//
// Defines, Globals, and Header Includes related to Flash Support
//
//*****************************************************************************
/*****************************************************************************/
/* stddef.h */
/* */
/* Copyright (c) 1993 Texas Instruments Incorporated */
/* http://www.ti.com/ */
/* */
/* 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 Texas Instruments Incorporated 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 */
/* OWNER 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. */
/* */
/*****************************************************************************/
_Pragma("diag_push")
_Pragma("CHECK_MISRA(\"-19.7\")") /* macros required for implementation */
_Pragma("CHECK_MISRA(\"-20.1\")") /* standard headers must define standard names */
_Pragma("CHECK_MISRA(\"-20.2\")") /* standard headers must define standard names */
typedef long ptrdiff_t;
typedef unsigned long size_t;
typedef unsigned long wchar_t;
/*----------------------------------------------------------------------------*/
/* C++11 and C11 required max_align_t to be defined. The libc++ cstddef */
/* header expects the macro __DEFINED_max_align_t to be defined if it is to */
/* use the definintion of max_align_t from stddef.h. Only define it if */
/* compiling for C11 or we're in non strict ansi mode. */
/*----------------------------------------------------------------------------*/
typedef long double max_align_t;
_Pragma("diag_push")
_Pragma("CHECK_MISRA(\"-19.10\")") /* need types as macro arguments */
_Pragma("diag_pop")
_Pragma("diag_pop")
extern uint16_t RamfuncsLoadStart;
extern uint16_t RamfuncsLoadEnd;
extern uint16_t RamfuncsLoadSize;
extern uint16_t RamfuncsRunStart;
extern uint16_t RamfuncsRunEnd;
extern uint16_t RamfuncsRunSize;
//*****************************************************************************
//
// Function Prototypes
//
//*****************************************************************************
//*****************************************************************************
//
//! \addtogroup device_api
//! @{
//
//*****************************************************************************
//*****************************************************************************
//
//! @brief Function to initialize the device. Primarily initializes system
//! control to aknown state by disabling the watchdog, setting up the
//! SYSCLKOUT frequency, and enabling the clocks to the peripherals.
//!
//! \param None.
//! \return None.
//
//*****************************************************************************
extern void Device_init(void);
//*****************************************************************************
//
//!
//! @brief Function to verify the XTAL frequency
//! \param freq is the XTAL frequency in MHz
//! \return The function return true if the the actual XTAL frequency matches with the
//! input value
//
//*****************************************************************************
extern _Bool Device_verifyXTAL(float freq);
//*****************************************************************************
//!
//!
//! @brief Function to turn on all peripherals, enabling reads and writes to the
//! peripherals' registers.
//!
//! Note that to reduce power, unused peripherals should be disabled.
//!
//! @param None
//! @return None
//
//*****************************************************************************
extern void Device_enableAllPeripherals(void);
//*****************************************************************************
//!
//!
//! @brief Function to disable pin locks on GPIOs.
//!
//! @param None
//! @return None
//
//*****************************************************************************
extern void Device_initGPIO(void);
//*****************************************************************************
//!
//! @brief Error handling function to be called when an ASSERT is violated
//!
//! @param *filename File name in which the error has occurred
//! @param line Line number within the file
//! @return None
//
//*****************************************************************************
extern void __error__(const char *filename, uint32_t line);
//*****************************************************************************
//
// Close the Doxygen group.
//! @}
//
//*****************************************************************************
//
// Defines
//
struct myDataStruct_s{
float data1;
float data2;
float data3;
float data4;
float data5;
float data6;
float data7;
float data8;
float data9;
float data10;
float data11;
float data12;
float data13;
float data14;
float data15;
float data16;
float data17;
float data18;
float data19;
float data20;
};
volatile extern struct myDataStruct_s mds_cpu2cla;
//
// Globals
//
//Task 1 (C) Variables
extern float duty;
//Task 2 (C) Variables
//Task 3 (C) Variables
//Task 4 (C) Variables
//Task 5 (C) Variables
//Task 6 (C) Variables
//Task 7 (C) Variables
//Task 8 (C) Variables
//Common (C) Variables
//
// Function Prototypes
//
__attribute__((interrupt)) void Cla1Task1();
__attribute__((interrupt)) void Cla1Task2();
__attribute__((interrupt)) void Cla1Task3();
__attribute__((interrupt)) void Cla1Task4();
__attribute__((interrupt)) void Cla1Task5();
__attribute__((interrupt)) void Cla1Task6();
__attribute__((interrupt)) void Cla1Task7();
__attribute__((interrupt)) void Cla1Task8();
//
// End of File
//
/*
* Copyright (c) 2020 Texas Instruments Incorporated - http://www.ti.com
* 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 Texas Instruments Incorporated 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 OWNER 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.
*
*/
//*****************************************************************************
//
// If building with a C++ compiler, make all of the definitions in this header
// have a C binding.
//
//*****************************************************************************
//
// Included Files
//
//*****************************************************************************
//
// PinMux Configurations
//
//*****************************************************************************
//*****************************************************************************
//
// CLA Configurations
//
//*****************************************************************************
//
// The following are symbols defined in the CLA assembly code
// Including them in the shared header file makes them global
// and the main CPU can make use of them.
//
__attribute__((interrupt)) void Cla1Task1();
__attribute__((interrupt)) void Cla1Task2();
__attribute__((interrupt)) void Cla1Task3();
__attribute__((interrupt)) void Cla1Task4();
__attribute__((interrupt)) void Cla1Task5();
__attribute__((interrupt)) void Cla1Task6();
__attribute__((interrupt)) void Cla1Task7();
__attribute__((interrupt)) void Cla1Task8();
void myCLA0_init();
//*****************************************************************************
//
// MEMCFG Configurations
//
//*****************************************************************************
//*****************************************************************************
//
// Board Configurations
//
//*****************************************************************************
void Board_init();
void CLA_init();
void MEMCFG_init();
void PinMux_init();
//*****************************************************************************
//
// Mark the end of the C bindings section for C++ compilers.
//
//*****************************************************************************
//
// Function Prototypes
//
void initEPWM(void);
void initCLA(void);
extern uint32_t LUTLOADSTART;
extern uint32_t LUTRUNSTART;
extern uint32_t LUTLOADSIZE;
volatile struct myDataStruct_s mds_cpu2cla;
#pragma DATA_SECTION(mds_cpu2cla,"CpuToCla1MsgRAM")
//
// Main
//
void main(void)
{
//
// Initialize device clock and peripherals
//
Device_init();
//
// Disable pin locks and enable internal pullups.
//
Device_initGPIO();
//
// GPIO0 is set to EPWM1A
// GPIO1 is set to EPWM1B
//
// GPIO_setControllerCore(0, GPIO_CORE_CPU1);
// GPIO_setPadConfig(0,GPIO_PIN_TYPE_STD);
// GPIO_setPinConfig(GPIO_0_EPWM1_A);
// GPIO_setControllerCore(1, GPIO_CORE_CPU1);
// GPIO_setPadConfig(1,GPIO_PIN_TYPE_STD);
// GPIO_setPinConfig(GPIO_1_EPWM1_B);
//
// Initialize PIE and clear PIE registers. Disables CPU interrupts.
//
Interrupt_initModule();
//
// Initialize the PIE vector table with pointers to the shell Interrupt
// Service Routines (ISR).
//
Interrupt_initVectorTable();
//
// Disable sync(Freeze clock to PWM as well)
//
SysCtl_disablePeripheral(SYSCTL_PERIPH_CLK_TBCLKSYNC);
//
// Initialize EPWM module
//
initEPWM();
//
// Initialize resources
//
Board_init();
initCLA();
//
// Enable global interrupts.
//
__asm(" clrc INTM");
//
// Enable sync and clock to PWM
//
SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_TBCLKSYNC);
for(;;)
{
}
}
//
// EPWM Initialization
// EPWM1 : generates output of frequency EPWM1_FREQ (100 KHz)
// EPWM4 : Triggers CLA task at frequency EPWM4_FREQ (10 KHz)
//
void initEPWM(void)
{
//
// Set up EPWM1 to
// - run on a base clock of SYSCLK
// - have a period of EPWM1_PERIOD
// - run in count up-down mode
//
EPWM_setClockPrescaler(0x00004000U, EPWM_CLOCK_DIVIDER_1,
EPWM_HSCLOCK_DIVIDER_1);
EPWM_setTimeBasePeriod(0x00004000U, (uint16_t)(((20000000U * 48) / (2 * 4 * 1)) / (2 * 100000UL)));
EPWM_setCounterCompareValue(0x00004000U, EPWM_COUNTER_COMPARE_A, (uint16_t)(((20000000U * 48) / (2 * 4 * 1)) / (2 * 100000UL))/10U);
EPWM_setTimeBaseCounterMode(0x00004000U, EPWM_COUNTER_MODE_UP_DOWN);
EPWM_setTimeBaseCounter(0x00004000U, 0U);
//
// Configuring action-qualifiers for EPWM1 to generate symmetric
// and complementary outputs on channel A and B
//
EPWM_setActionQualifierAction(0x00004000U, EPWM_AQ_OUTPUT_A,
EPWM_AQ_OUTPUT_LOW, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA);
EPWM_setActionQualifierAction(0x00004000U, EPWM_AQ_OUTPUT_A,
EPWM_AQ_OUTPUT_HIGH, EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPA);
EPWM_setActionQualifierAction(0x00004000U, EPWM_AQ_OUTPUT_B,
EPWM_AQ_OUTPUT_HIGH, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA);
EPWM_setActionQualifierAction(0x00004000U, EPWM_AQ_OUTPUT_B,
EPWM_AQ_OUTPUT_LOW, EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPA);
//
// Enabling Counter Compare shadow mode
//
EPWM_setCounterCompareShadowLoadMode(0x00004000U, EPWM_COUNTER_COMPARE_A, EPWM_COMP_LOAD_ON_SYNC_CNTR_ZERO);
//
// Set up EPWM4 to
// - run on a base clock of SYSCLK
// - have a period of EPWM4_PERIOD
// - run in count up mode
EPWM_setClockPrescaler(0x00004300U, EPWM_CLOCK_DIVIDER_1,
EPWM_HSCLOCK_DIVIDER_1);
EPWM_setTimeBasePeriod(0x00004300U, (uint16_t)(((20000000U * 48) / (2 * 4 * 1)) / 10000UL));
EPWM_setTimeBaseCounterMode(0x00004300U, EPWM_COUNTER_MODE_UP);
EPWM_setTimeBaseCounter(0x00004300U, 0U);
//
// Enabling EPWM4 interrupt at TBCTR = 0 to trigger
// CLA task
//
EPWM_setInterruptSource(0x00004300U, 1U);
EPWM_enableInterrupt(0x00004300U);
EPWM_setInterruptEventCount(0x00004300U, 1U);
EPWM_setClockPrescaler(0x00004200U, EPWM_CLOCK_DIVIDER_1,
EPWM_HSCLOCK_DIVIDER_1);
EPWM_setTimeBasePeriod(0x00004200U, 32000U);
EPWM_setCounterCompareValue(0x00004200U,EPWM_COUNTER_COMPARE_A,0);
EPWM_setTimeBaseCounterMode(0x00004200U, EPWM_COUNTER_MODE_UP);
EPWM_setTimeBaseCounter(0x00004200U, 0U);
//
// EPWM 1 and 4 should run freely in emulation mode
//
EPWM_setEmulationMode(0x00004000U, EPWM_EMULATION_FREE_RUN);
EPWM_setEmulationMode(0x00004200U, EPWM_EMULATION_FREE_RUN);
EPWM_setEmulationMode(0x00004300U, EPWM_EMULATION_FREE_RUN);
}
//
// CLA Initialization
//
void initCLA(void)
{
memcpy((uint32_t *)&LUTRUNSTART, (uint32_t *)&LUTLOADSTART,
(uint32_t)&LUTLOADSIZE );
//
// Force task 8, the one time initialization task
//
CLA_forceTasks(0x00001400U, (0x80U));
}