mirror of
https://github.com/hathach/tinyusb.git
synced 2025-01-17 05:32:55 +08:00
247 lines
7.4 KiB
C
247 lines
7.4 KiB
C
|
/**********************************************************************
|
|||
|
* $Id$ lpc43xx_can.h 2011-06-02
|
|||
|
*//**
|
|||
|
* @file lpc43xx_can.h
|
|||
|
* @brief Contains all macro definitions and function prototypes
|
|||
|
* support for CAN firmware library on lpc43xx
|
|||
|
* @version 1.0
|
|||
|
* @date 02. June. 2011
|
|||
|
* @author NXP MCU SW Application Team
|
|||
|
*
|
|||
|
* Copyright(C) 2011, NXP Semiconductor
|
|||
|
* All rights reserved.
|
|||
|
*
|
|||
|
***********************************************************************
|
|||
|
* Software that is described herein is for illustrative purposes only
|
|||
|
* which provides customers with programming information regarding the
|
|||
|
* products. This software is supplied "AS IS" without any warranties.
|
|||
|
* NXP Semiconductors assumes no responsibility or liability for the
|
|||
|
* use of the software, conveys no license or title under any patent,
|
|||
|
* copyright, or mask work right to the product. NXP Semiconductors
|
|||
|
* reserves the right to make changes in the software without
|
|||
|
* notification. NXP Semiconductors also make no representation or
|
|||
|
* warranty that such application will be suitable for the specified
|
|||
|
* use without further testing or modification.
|
|||
|
* Permission to use, copy, modify, and distribute this software and its
|
|||
|
* documentation is hereby granted, under NXP Semiconductors<EFBFBD>
|
|||
|
* relevant copyright in the software, without fee, provided that it
|
|||
|
* is used in conjunction with NXP Semiconductors microcontrollers. This
|
|||
|
* copyright, permission, and disclaimer notice must appear in all copies of
|
|||
|
* this code.
|
|||
|
**********************************************************************/
|
|||
|
|
|||
|
/* Peripheral group ----------------------------------------------------------- */
|
|||
|
/** @defgroup C_CAN C_CAN (Controller Area Network)
|
|||
|
* @ingroup LPC4300CMSIS_FwLib_Drivers
|
|||
|
* @{
|
|||
|
*/
|
|||
|
|
|||
|
#ifndef __lpc43xx_CAN_H
|
|||
|
#define __lpc43xx_CAN_H
|
|||
|
|
|||
|
/* Includes ------------------------------------------------------------------- */
|
|||
|
#include "LPC43xx.h"
|
|||
|
#include "lpc_types.h"
|
|||
|
|
|||
|
|
|||
|
#ifdef __cplusplus
|
|||
|
extern "C"
|
|||
|
{
|
|||
|
#endif
|
|||
|
|
|||
|
/* Public Macros -------------------------------------------------------------- */
|
|||
|
/** @defgroup C_CAN_Public_Macros C_CAN Public Macros
|
|||
|
* @{
|
|||
|
*/
|
|||
|
|
|||
|
/** In BASIC_MODE IF1 registers are used directly as TX buffer, IF2 registers are used as RX buffer.
|
|||
|
* If not BASIC_MODE use message objects and IF registers to communicate with message buffers
|
|||
|
*/
|
|||
|
#define BASIC_MODE 0
|
|||
|
|
|||
|
/** In Silent Mode, the CAN controller is able to receive valid data frames and valid remote
|
|||
|
* frames, but it sends only recessive bits on the CAN bus, and it cannot start a transmission
|
|||
|
*/
|
|||
|
#define SILENT_MODE 0
|
|||
|
|
|||
|
/** In Loop-back Mode, the CAN Core treats its own transmitted messages as received messages
|
|||
|
* and stores them (if they pass acceptance filtering) into a Receive Buffer.
|
|||
|
*/
|
|||
|
#define LOOPBACK_MODE 0
|
|||
|
|
|||
|
/** Enables receiving remote frame requests */
|
|||
|
#define REMOTE_ENABLE 1
|
|||
|
|
|||
|
/**
|
|||
|
* @}
|
|||
|
*/
|
|||
|
|
|||
|
/* Private Macros -------------------------------------------------------------- */
|
|||
|
/** @defgroup C_CAN_Private_Macros C_CAN Private Macros
|
|||
|
* @{
|
|||
|
*/
|
|||
|
|
|||
|
/** MAX CAN message obj */
|
|||
|
#define CAN_MSG_OBJ_MAX 0x0020
|
|||
|
/** MAX data length */
|
|||
|
#define CAN_DLC_MAX 8
|
|||
|
|
|||
|
/********************************************************************//**
|
|||
|
* BRP+1 = Fpclk/(CANBitRate * QUANTAValue)
|
|||
|
* QUANTAValue = 1 + (Tseg1+1) + (Tseg2+1)
|
|||
|
* QUANTA value varies based on the Fpclk and sample point
|
|||
|
* e.g. (1) sample point is 87.5%, Fpclk is 48Mhz
|
|||
|
* the QUANTA should be 16
|
|||
|
* (2) sample point is 90%, Fpclk is 12.5Mhz
|
|||
|
* the QUANTA should be 10
|
|||
|
* Fpclk = Fclk /APBDIV
|
|||
|
* or
|
|||
|
* BitRate = Fcclk/(APBDIV * (BRP+1) * ((Tseg1+1)+(Tseg2+1)+1))
|
|||
|
*/
|
|||
|
|
|||
|
/*********************************************************************//**
|
|||
|
* @brief CAN Bit Timing Values definitions at 8Mhz
|
|||
|
**********************************************************************/
|
|||
|
/** Bitrate: 100K */
|
|||
|
#define CAN_BITRATE100K12MHZ 0x00004509
|
|||
|
/** Bitrate: 125K */
|
|||
|
#define CAN_BITRATE125K12MHZ 0x00004507
|
|||
|
/** Bitrate: 250K */
|
|||
|
#define CAN_BITRATE250K12MHZ 0x00004503
|
|||
|
/** Bitrate: 500K */
|
|||
|
#define CAN_BITRATE500K12MHZ 0x00004501
|
|||
|
/** Bitrate: 1000K */
|
|||
|
#define CAN_BITRATE1000K12MHZ 0x00004500
|
|||
|
|
|||
|
/*********************************************************************//**
|
|||
|
* @brief CAN Bit Timing Values definitions at 16Mhz
|
|||
|
**********************************************************************/
|
|||
|
/** Bitrate: 100K */
|
|||
|
#define CAN_BITRATE100K16MHZ 0x00005809
|
|||
|
/** Bitrate: 125K */
|
|||
|
#define CAN_BITRATE125K16MHZ 0x00005807
|
|||
|
/** Bitrate: 250K */
|
|||
|
#define CAN_BITRATE250K16MHZ 0x00005803
|
|||
|
/** Bitrate: 500K */
|
|||
|
#define CAN_BITRATE500K16MHZ 0x00005801
|
|||
|
|
|||
|
|
|||
|
/*********************************************************************//**
|
|||
|
* @brief CAN Bit Timing Values definitions at 24Mhz
|
|||
|
**********************************************************************/
|
|||
|
/** Bitrate: 100K */
|
|||
|
#define CAN_BITRATE100K24MHZ 0x00007E09
|
|||
|
/** Bitrate: 125K */
|
|||
|
#define CAN_BITRATE125K24MHZ 0x0000450F
|
|||
|
/** Bitrate: 250K */
|
|||
|
#define CAN_BITRATE250K24MHZ 0x00004507
|
|||
|
/** Bitrate: 500K */
|
|||
|
#define CAN_BITRATE500K24MHZ 0x00004503
|
|||
|
/** Bitrate: 1000K */
|
|||
|
#define CAN_BITRATE1000K24MHZ 0x00004501
|
|||
|
|
|||
|
/**
|
|||
|
* @}
|
|||
|
*/
|
|||
|
|
|||
|
|
|||
|
/* Public Types --------------------------------------------------------------- */
|
|||
|
/** @defgroup CAN_Public_Types CAN Public Types
|
|||
|
* @{
|
|||
|
*/
|
|||
|
|
|||
|
/*********************************************************************//**
|
|||
|
* @brief CAN enumeration
|
|||
|
**********************************************************************/
|
|||
|
|
|||
|
/**
|
|||
|
* @brief CAN interface register type definition
|
|||
|
*/
|
|||
|
typedef enum CCAN_IFREG
|
|||
|
{
|
|||
|
CMDREQ = 0, /**< Command request */
|
|||
|
CMDMSK = 1, /**< Command mask */
|
|||
|
MSK1 = 2, /**< Mask 1 */
|
|||
|
MSK2 = 3, /**< Mask 2 */
|
|||
|
ARB1 = 4, /**< Arbitration 1 */
|
|||
|
ARB2 = 5, /**< Arbitration 2 */
|
|||
|
MCTRL = 6, /**< Message control */
|
|||
|
DA1 = 7, /**< Data A1 */
|
|||
|
DA2 = 8, /**< Data A2 */
|
|||
|
DB1 = 9, /**< Data B1 */
|
|||
|
DB2 = 10 /**< Data B2 */
|
|||
|
}CCAN_IFREG_Type;
|
|||
|
|
|||
|
/**
|
|||
|
* @brief CAN Clock division rate type definition
|
|||
|
*/
|
|||
|
typedef enum CCAN_CLKDIV
|
|||
|
{
|
|||
|
CLKDIV1 = 0,
|
|||
|
CLKDIV2 = 1,
|
|||
|
CLKDIV3 = 2,
|
|||
|
CLKDIV5 = 3,
|
|||
|
CLKDIV9 = 4,
|
|||
|
CLKDIV17 = 5,
|
|||
|
CLKDIV33 = 6,
|
|||
|
CLKDIV65 = 7
|
|||
|
}CCAN_CLKDIV_Type;
|
|||
|
|
|||
|
|
|||
|
/********************************************************************//**
|
|||
|
* @brief Data structure definition for a CAN message
|
|||
|
**********************************************************************/
|
|||
|
/**
|
|||
|
* @brief CAN message object structure
|
|||
|
*/
|
|||
|
typedef struct
|
|||
|
{
|
|||
|
uint32_t id; /**< ID of message, if bit 30 is set then this is extended frame */
|
|||
|
uint32_t dlc; /**< Message data length */
|
|||
|
uint8_t data[8]; /**< Message data */
|
|||
|
} message_object;
|
|||
|
|
|||
|
/**
|
|||
|
* @brief CAN call-back function
|
|||
|
*/
|
|||
|
typedef void (*MSG_CB)(uint32_t msg_no);
|
|||
|
|
|||
|
/**
|
|||
|
* @}
|
|||
|
*/
|
|||
|
|
|||
|
|
|||
|
|
|||
|
/* Public Functions ----------------------------------------------------------- */
|
|||
|
/** @defgroup CAN_Public_Functions CAN Public Functions
|
|||
|
* @{
|
|||
|
*/
|
|||
|
|
|||
|
void CAN_IRQHandler (void);
|
|||
|
void CAN_Init( uint32_t BitClk, CCAN_CLKDIV_Type ClkDiv , MSG_CB Tx_cb, MSG_CB Rx_cb);
|
|||
|
|
|||
|
void CAN_ConfigureRxMessageObjects( void );
|
|||
|
void CAN_RxInt_MessageProcess( uint8_t MsgObjNo );
|
|||
|
void CAN_TxInt_MessageProcess( uint8_t MsgObjNo );
|
|||
|
|
|||
|
void CAN_Send(uint8_t msg_no, uint32_t *msg_ptr );
|
|||
|
void CAN_Recv(uint8_t msg_no, uint32_t *msg_ptr, Bool RemoteEnable);
|
|||
|
void CAN_ReadMsg(uint32_t msg_no, message_object* buff);
|
|||
|
/**
|
|||
|
* @}
|
|||
|
*/
|
|||
|
|
|||
|
#ifdef __cplusplus
|
|||
|
}
|
|||
|
#endif
|
|||
|
|
|||
|
|
|||
|
#endif /* __lpc43xx_CAN_H */
|
|||
|
|
|||
|
/**
|
|||
|
* @}
|
|||
|
*/
|
|||
|
/*****************************************************************************
|
|||
|
** End Of File
|
|||
|
******************************************************************************/
|