empty_project_28377D/device/driverlib/can.h

1921 lines
62 KiB
C

//###########################################################################
//
// FILE: can.h
//
// TITLE: C28x CAN driver.
//
//###########################################################################
// $Copyright:
// Copyright (C) 2022 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.
// $
//###########################################################################
#ifndef CAN_H
#define CAN_H
//*****************************************************************************
//
// If building with a C++ compiler, make all of the definitions in this header
// have a C binding.
//
//*****************************************************************************
#ifdef __cplusplus
extern "C"
{
#endif
#ifdef __TMS320C28XX__
//*****************************************************************************
//
//! \addtogroup can_api CAN
//! @{
//
//*****************************************************************************
#include <stdint.h>
#include <stdbool.h>
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "inc/hw_can.h"
#include "debug.h"
#include "sysctl.h"
//
// The key value for RAM initialization
//
#define CAN_RAM_INIT_KEY (0xAU)
//
// RAM Initialization Register Mask
//
#define CAN_RAM_INIT_MASK (0x003FU)
//
// The Parity disable key value
//
#define CAN_INIT_PARITY_DISABLE (0x1400U)
#ifndef DOXYGEN_PDF_IGNORE
//*****************************************************************************
//
// 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.
#define CAN_MSG_OBJ_TX_INT_ENABLE CAN_IF1MCTL_TXIE
//! This indicates that receive interrupts should be enabled, or are
//! enabled.
#define CAN_MSG_OBJ_RX_INT_ENABLE CAN_IF1MCTL_RXIE
//! This indicates that a message object will use or is using filtering
//! based on the object's message identifier.
#define CAN_MSG_OBJ_USE_ID_FILTER (0x00000001U)
//! This indicates that a message object will use or is using filtering
//! based on the direction of the transfer.
#define CAN_MSG_OBJ_USE_DIR_FILTER CAN_IF1MSK_MDIR
//! This indicates that a message object will use or is using message
//! identifier filtering based on the extended identifier.
#define CAN_MSG_OBJ_USE_EXT_FILTER CAN_IF1MSK_MXTD
//! This indicates that this message object is part of a FIFO structure and
//! not the final message object in a FIFO.
#define CAN_MSG_OBJ_FIFO (0x00000002U)
//! This indicates that a message object has no flags set.
#define CAN_MSG_OBJ_NO_FLAGS (0x00000000U)
//*****************************************************************************
//
// 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.
#define CAN_INT_ERROR (0x00000008UL)
//! This flag is used to allow a CAN controller to generate status
//! interrupts.
#define CAN_INT_STATUS (0x00000004UL)
//! This flag is used to allow a CAN controller to generate interrupts
//! on interrupt line 0
#define CAN_INT_IE0 (0x00000002UL)
//! This flag is used to allow a CAN controller to generate interrupts
//! on interrupt line 1
#define CAN_INT_IE1 (0x00020000UL)
//*****************************************************************************
//
// 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.
#define CAN_STATUS_PERR (0x00000100U)
//! CAN controller has entered a Bus Off state.
#define CAN_STATUS_BUS_OFF (0x00000080U)
//! CAN controller error level has reached warning level.
#define CAN_STATUS_EWARN (0x00000040U)
//! CAN controller error level has reached error passive level.
#define CAN_STATUS_EPASS (0x00000020U)
//! A message was received successfully since the last read of this status.
#define CAN_STATUS_RXOK (0x00000010U)
//! A message was transmitted successfully since the last read of this
//! status.
#define CAN_STATUS_TXOK (0x00000008U)
//! This is the mask for the last error code field.
#define CAN_STATUS_LEC_MSK (0x00000007U)
//! There was no error.
#define CAN_STATUS_LEC_NONE (0x00000000U)
//! A bit stuffing error has occurred.
#define CAN_STATUS_LEC_STUFF (0x00000001U)
//! A formatting error has occurred.
#define CAN_STATUS_LEC_FORM (0x00000002U)
//! An acknowledge error has occurred.
#define CAN_STATUS_LEC_ACK (0x00000003U)
//! The bus remained a bit level of 1 for longer than is allowed.
#define CAN_STATUS_LEC_BIT1 (0x00000004U)
//! The bus remained a bit level of 0 for longer than is allowed.
#define CAN_STATUS_LEC_BIT0 (0x00000005U)
//! A CRC error has occurred.
#define CAN_STATUS_LEC_CRC (0x00000006U)
//*****************************************************************************
//
// The following macros are added for the Global Interrupt EN/FLG/CLR
// register
//
//*****************************************************************************
//! CANINT0 global interrupt bit
#define CAN_GLOBAL_INT_CANINT0 (0x00000001U)
//! CANINT1 global interrupt bit
#define CAN_GLOBAL_INT_CANINT1 (0x00000002U)
//*****************************************************************************
//
// The following macros are added for accessing the interrupt register and
// the standard arbitration ID in the interface registers.
//
//*****************************************************************************
//! Status of INT0ID
#define CAN_INT_INT0ID_STATUS (0x8000U)
//! IF1 Arbitration Standard ID Shift Offset
#define CAN_IF1ARB_STD_ID_S (18U)
//! IF1 Arbitration Standard ID Mask
#define CAN_IF1ARB_STD_ID_M (0x1FFC0000U)
//! IF2 Arbitration Standard ID Shift Offset
#define CAN_IF2ARB_STD_ID_S (18U)
//! IF2 Arbitration Standard ID Mask
#define CAN_IF2ARB_STD_ID_M (0x1FFC0000U)
#endif // DOXYGEN_PDF_IGNORE
//*****************************************************************************
//
//! 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.
//
//*****************************************************************************
#ifdef DEBUG
static inline bool
CAN_isBaseValid(uint32_t base)
{
return(
(base == CANA_BASE) ||
(base == CANB_BASE)
);
}
#endif
//*****************************************************************************
//
//! \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.
//
ASSERT(dataReg != 0U);
//
// Loop always copies 1 byte per iteration.
//
for(idx = 0U; idx < size; idx++)
{
//
// Write out the data 8 bits at a time.
//
HWREGB(dataReg) = 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.
//
ASSERT(dataReg != 0U);
//
// Loop always copies 1 byte per iteration.
//
for(idx = 0U; idx < size; idx++)
{
//
// Write out the data 8 bits at a time.
//
HWREGB(dataReg) = (uint32_t)((data[idx / 2]) >> ((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.
//
ASSERT(dataReg != 0U);
//
// Loop always copies 1 byte per iteration.
//
for(idx = 0U; idx < size; idx++)
{
//
// Write out the data 8 bits at a time.
//
HWREGB(dataReg) = ((data[idx / 4]) >> ((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] = HWREGB(dataReg);
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.
//
ASSERT(CAN_isBaseValid(base));
HWREGH(base + CAN_O_RAM_INIT) = CAN_RAM_INIT_CAN_RAM_INIT |
CAN_RAM_INIT_KEY;
while(!((HWREGH(base + CAN_O_RAM_INIT) & CAN_RAM_INIT_MASK) ==
(CAN_RAM_INIT_RAM_INIT_DONE | CAN_RAM_INIT_KEY2 |
CAN_RAM_INIT_KEY0)))
{
//
// 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.
//
ASSERT(CAN_isBaseValid(base));
//
// Determine the CAN controller and set specified clock source
//
EALLOW;
switch(base)
{
case CANA_BASE:
HWREGH(CLKCFG_BASE + SYSCTL_O_CLKSRCCTL2) &=
~SYSCTL_CLKSRCCTL2_CANABCLKSEL_M;
HWREGH(CLKCFG_BASE + SYSCTL_O_CLKSRCCTL2) |= ((uint16_t)source <<
SYSCTL_CLKSRCCTL2_CANABCLKSEL_S);
break;
case CANB_BASE:
HWREGH(CLKCFG_BASE + SYSCTL_O_CLKSRCCTL2) &=
~SYSCTL_CLKSRCCTL2_CANBBCLKSEL_M;
HWREGH(CLKCFG_BASE + SYSCTL_O_CLKSRCCTL2) |= ((uint16_t)source <<
SYSCTL_CLKSRCCTL2_CANBBCLKSEL_S);
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.
//
ASSERT(CAN_isBaseValid(base));
//
// Clear Init and CCE bits
//
HWREGH(base + CAN_O_CTL) &= ~(CAN_CTL_INIT | CAN_CTL_CCE);
}
//*****************************************************************************
//
//! 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.
//
ASSERT(CAN_isBaseValid(base));
//
// Clear the init bit in the control register.
//
HWREGH(base + CAN_O_CTL) &= ~CAN_CTL_INIT;
}
//*****************************************************************************
//
//! 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.
//
ASSERT(CAN_isBaseValid(base));
//
// Set the init bit in the control register.
//
HWREGH(base + CAN_O_CTL) |= CAN_CTL_INIT;
}
//*****************************************************************************
//
//! 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.
//
ASSERT(CAN_isBaseValid(base));
ASSERT((mode & (CAN_TEST_LBACK | CAN_TEST_EXL)) !=
(CAN_TEST_LBACK | CAN_TEST_EXL));
//
// Clear the bits in the test register.
//
HWREGH(base + CAN_O_TEST) &= ~((uint16_t)CAN_TEST_SILENT |
(uint16_t)CAN_TEST_LBACK |
(uint16_t)CAN_TEST_EXL);
//
// Enable test mode and set the bits in the test register.
//
HWREGH(base + CAN_O_CTL) |= CAN_CTL_TEST;
HWREGH(base + CAN_O_TEST) |= 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.
//
ASSERT(CAN_isBaseValid(base));
//
// Clear the bits in the test register.
//
HWREGH(base + CAN_O_TEST) &= ~((uint16_t)CAN_TEST_SILENT |
(uint16_t)CAN_TEST_LBACK |
(uint16_t)CAN_TEST_EXL);
//
// Clear the test mode enable bit
//
HWREGH(base + CAN_O_CTL) &= ~CAN_CTL_TEST;
}
//*****************************************************************************
//
//! 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.
//
ASSERT(CAN_isBaseValid(base));
//
// Read and return BTR register
//
return(HWREG_BP(base + CAN_O_BTR));
}
//*****************************************************************************
//
//! 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.
//
ASSERT(CAN_isBaseValid(base));
//
// Set the RAM direct access bit
//
HWREGH(base + CAN_O_TEST) |= CAN_TEST_RDA;
}
//*****************************************************************************
//
//! 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.
//
ASSERT(CAN_isBaseValid(base));
//
// Clear the RAM direct access bit
//
HWREGH(base + CAN_O_TEST) &= ~CAN_TEST_RDA;
}
//*****************************************************************************
//
//! 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.
//
ASSERT(CAN_isBaseValid(base));
if(enable)
{
//
// Enable interrupt debug support
//
HWREGH(base + CAN_O_CTL) |= CAN_CTL_IDS;
}
else
{
//
// Disable interrupt debug support
//
HWREGH(base + CAN_O_CTL) &= ~CAN_CTL_IDS;
}
}
//*****************************************************************************
//
//! 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.
//
ASSERT(CAN_isBaseValid(base));
//
// Clear the ABO bit in the control register.
//
HWREGH(base + CAN_O_CTL) &= ~CAN_CTL_ABO;
}
//*****************************************************************************
//
//! 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.
//
ASSERT(CAN_isBaseValid(base));
//
// Set the ABO bit in the control register.
//
HWREGH(base + CAN_O_CTL) |= CAN_CTL_ABO;
}
//*****************************************************************************
//
//! 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.
//
ASSERT(CAN_isBaseValid(base));
//
// Set bus-off timer value
//
HWREG_BP(base + CAN_O_ABOTR) = 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.
//
ASSERT(CAN_isBaseValid(base));
ASSERT((intFlags & ~(CAN_INT_ERROR | CAN_INT_STATUS | CAN_INT_IE0 |
CAN_INT_IE1)) == 0U);
//
// Enable the specified interrupts.
//
HWREG_BP(base + CAN_O_CTL) |= 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.
//
ASSERT(CAN_isBaseValid(base));
ASSERT((intFlags & ~(CAN_INT_ERROR | CAN_INT_STATUS | CAN_INT_IE0 |
CAN_INT_IE1)) == 0U);
//
// Disable the specified interrupts.
//
HWREG_BP(base + CAN_O_CTL) &= ~(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.
//
ASSERT(CAN_isBaseValid(base));
//
// Get the interrupt muxing for the CAN peripheral
//
return(HWREG_BP(base + CAN_O_IP_MUX21));
}
//*****************************************************************************
//
//! 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.
//
ASSERT(CAN_isBaseValid(base));
//
// Set the interrupt muxing for the CAN peripheral
//
HWREG_BP(base + CAN_O_IP_MUX21) = 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.
//
ASSERT(CAN_isBaseValid(base));
//
// Clearing the DAR bit tells the controller to not disable the
// auto-retry of messages which were not transmitted or received
// correctly.
//
HWREGH(base + CAN_O_CTL) &= ~CAN_CTL_DAR;
}
//*****************************************************************************
//
//! 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.
//
ASSERT(CAN_isBaseValid(base));
//
// Setting the DAR bit tells the controller to disable the auto-retry
// of messages which were not transmitted or received correctly.
//
HWREGH(base + CAN_O_CTL) |= CAN_CTL_DAR;
}
//*****************************************************************************
//
//! 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.
//
ASSERT(CAN_isBaseValid(base));
//
// Read the disable automatic retry setting from the CAN controller.
//
return((bool)((HWREGH(base + CAN_O_CTL) & CAN_CTL_DAR) != CAN_CTL_DAR));
}
//*****************************************************************************
//
//! 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.
//
ASSERT(CAN_isBaseValid(base));
//
// Read the current count of transmit/receive errors.
//
canError = HWREG_BP(base + CAN_O_ERRC);
//
// Extract the error numbers from the register value.
//
*rxCount = (canError & CAN_ERRC_REC_M) >> CAN_ERRC_REC_S;
*txCount = (canError & CAN_ERRC_TEC_M) >> CAN_ERRC_TEC_S;
return((bool)((canError & CAN_ERRC_RP) != 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.
//
ASSERT(CAN_isBaseValid(base));
//
// Return error and status register value
//
return(HWREGH(base + CAN_O_ES));
}
//*****************************************************************************
//
//! 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.
//
ASSERT(CAN_isBaseValid(base));
//
// Return Tx requests register value
//
return(HWREG_BP(base + CAN_O_TXRQ_21));
}
//*****************************************************************************
//
//! 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.
//
ASSERT(CAN_isBaseValid(base));
//
// Return new data register value
//
return(HWREG_BP(base + CAN_O_NDAT_21));
}
//*****************************************************************************
//
//! 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.
//
ASSERT(CAN_isBaseValid(base));
//
// Return the valid message register value
//
return(HWREG_BP(base + CAN_O_MVAL_21));
}
//*****************************************************************************
//
//! 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.
//
ASSERT(CAN_isBaseValid(base));
//
// Read interrupt identifier status
//
return(HWREG_BP(base + CAN_O_INT));
}
//*****************************************************************************
//
//! 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.
//
ASSERT(CAN_isBaseValid(base));
//
// Read message object interrupt status
//
return(HWREG_BP(base + CAN_O_IPEN_21));
}
//*****************************************************************************
//
//! 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.
//
ASSERT(CAN_isBaseValid(base));
ASSERT((intFlags & ~(CAN_GLOBAL_INT_CANINT0 |
CAN_GLOBAL_INT_CANINT1)) == 0U);
//
// Enable the requested interrupts
//
HWREGH(base + CAN_O_GLB_INT_EN) |= 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.
//
ASSERT(CAN_isBaseValid(base));
ASSERT((intFlags & ~(CAN_GLOBAL_INT_CANINT0 |
CAN_GLOBAL_INT_CANINT1)) == 0U);
//
// Disable the requested interrupts
//
HWREGH(base + CAN_O_GLB_INT_EN) &= ~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.
//
ASSERT(CAN_isBaseValid(base));
ASSERT((intFlags & ~(CAN_GLOBAL_INT_CANINT0 |
CAN_GLOBAL_INT_CANINT1)) == 0U);
//
// Clear the requested interrupts
//
HWREGH(base + CAN_O_GLB_INT_CLR) |= 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.
//
ASSERT(CAN_isBaseValid(base));
ASSERT((intFlags & ~(CAN_GLOBAL_INT_CANINT0 |
CAN_GLOBAL_INT_CANINT1)) == 0U);
//
// Read and return the global interrupt flag register
//
return((bool)((HWREGH(base + CAN_O_GLB_INT_FLG) & 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
//! - \b CAN_MSG_OBJ_USE_EXT_FILTER - Use filtering based on the Extended
//! Message ID
//! - \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, the value
//! \b CAN_MSG_OBJ_USE_ID_FILTER has to be logically ORed with the \e flag
//! parameter and \b CAN_MSG_OBJ_USE_EXT_FILTER also has to be ORed for
//! message identifier filtering to be based on the extended identifier.
//!
//! \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 data transfer. False is Message RAM
//! to IF, True is IF to Message RAM.
//!
//! This function transfers the contents of the interface registers to message
//! RAM or vice versa depending on the value passed to direction.
//!
//! \return None.
//
//*****************************************************************************
extern void
CAN_transferMessage(uint32_t base, uint16_t interface, uint32_t objID,
bool direction);
//*****************************************************************************
//
//! 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.
//! @}
//
//*****************************************************************************
#endif // #ifdef __TMS320C28XX__
//*****************************************************************************
//
// Mark the end of the C bindings section for C++ compilers.
//
//*****************************************************************************
#ifdef __cplusplus
}
#endif
#endif // CAN_H